Browse Source

Merge pull request #3607 from prusa3d/MK3_MMU2_fix1

MK3S/+: support for new MMU2S
DRracer 1 year ago
parent
commit
d15246adde
100 changed files with 18341 additions and 10778 deletions
  1. 0 1
      CMakeLists.txt
  2. 0 79
      Firmware/AutoDeplete.cpp
  3. 0 17
      Firmware/AutoDeplete.h
  4. 56 0
      Firmware/Configuration_adv.h
  5. 2 10
      Firmware/Dcodes.cpp
  6. 2 2
      Firmware/Dcodes.h
  7. 525 0
      Firmware/Filament_sensor.cpp
  8. 214 0
      Firmware/Filament_sensor.h
  9. 8 5
      Firmware/Marlin.h
  10. 582 652
      Firmware/Marlin_main.cpp
  11. 2 2
      Firmware/Prusa_farm.cpp
  12. 2 0
      Firmware/Prusa_farm.h
  13. 82 0
      Firmware/SpoolJoin.cpp
  14. 60 0
      Firmware/SpoolJoin.h
  15. 105 0
      Firmware/Tcodes.cpp
  16. 5 0
      Firmware/Tcodes.h
  17. 2 0
      Firmware/adc.h
  18. 29 60
      Firmware/cmdqueue.cpp
  19. 7 2
      Firmware/config.h
  20. 2 0
      Firmware/eeprom.cpp
  21. 11 7
      Firmware/eeprom.h
  22. 3 3
      Firmware/first_lay_cal.cpp
  23. 0 734
      Firmware/fsensor.cpp
  24. 0 124
      Firmware/fsensor.h
  25. 2 2
      Firmware/lcd.h
  26. 2 6
      Firmware/mesh_bed_calibration.cpp
  27. 9 4
      Firmware/messages.cpp
  28. 7 2
      Firmware/messages.h
  29. 0 1267
      Firmware/mmu.cpp
  30. 0 120
      Firmware/mmu.h
  31. 926 0
      Firmware/mmu2.cpp
  32. 291 0
      Firmware/mmu2.h
  33. 37 0
      Firmware/mmu2/buttons.h
  34. 109 0
      Firmware/mmu2/error_codes.h
  35. 353 0
      Firmware/mmu2/errors_list.h
  36. 45 0
      Firmware/mmu2/progress_codes.h
  37. 22 0
      Firmware/mmu2_crc.cpp
  38. 43 0
      Firmware/mmu2_crc.h
  39. 294 0
      Firmware/mmu2_error_converter.cpp
  40. 48 0
      Firmware/mmu2_error_converter.h
  41. 10 0
      Firmware/mmu2_fsensor.cpp
  42. 17 0
      Firmware/mmu2_fsensor.h
  43. 17 0
      Firmware/mmu2_log.cpp
  44. 39 0
      Firmware/mmu2_log.h
  45. 34 0
      Firmware/mmu2_power.cpp
  46. 11 0
      Firmware/mmu2_power.h
  47. 72 0
      Firmware/mmu2_progress_converter.cpp
  48. 9 0
      Firmware/mmu2_progress_converter.h
  49. 366 0
      Firmware/mmu2_protocol.cpp
  50. 324 0
      Firmware/mmu2_protocol.h
  51. 756 0
      Firmware/mmu2_protocol_logic.cpp
  52. 309 0
      Firmware/mmu2_protocol_logic.h
  53. 295 0
      Firmware/mmu2_reporting.cpp
  54. 50 0
      Firmware/mmu2_reporting.h
  55. 31 0
      Firmware/mmu2_serial.cpp
  56. 20 0
      Firmware/mmu2_serial.h
  57. 81 73
      Firmware/pat9125.cpp
  58. 1 8
      Firmware/pat9125.h
  59. 0 2
      Firmware/planner.cpp
  60. 0 1
      Firmware/planner.h
  61. 26 12
      Firmware/sound.h
  62. 11 47
      Firmware/stepper.cpp
  63. 0 5
      Firmware/stepper.h
  64. 5 0
      Firmware/strlen_cx.h
  65. 57 19
      Firmware/swi2c.c
  66. 3 0
      Firmware/swi2c.h
  67. 1 1
      Firmware/temp_model.h
  68. 3 5
      Firmware/temperature.cpp
  69. 37 1
      Firmware/twi.cpp
  70. 9 1
      Firmware/twi.h
  71. 3 3
      Firmware/uart2.c
  72. 1 1
      Firmware/uart2.h
  73. 626 649
      Firmware/ultralcd.cpp
  74. 22 13
      Firmware/ultralcd.h
  75. 180 201
      Firmware/util.cpp
  76. 2 4
      Firmware/util.h
  77. 8 4
      Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h
  78. 8 4
      Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h
  79. 8 4
      Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h
  80. 8 4
      Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h
  81. 9 4
      Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h
  82. 9 4
      Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h
  83. 0 8
      Firmware/variants/obsolete/1_75mm_MK2-RAMBo10a-E3Dv6full.h
  84. 0 8
      Firmware/variants/obsolete/1_75mm_MK2-RAMBo13a-E3Dv6full.h
  85. 0 146
      Tests/AutoDeplete_test.cpp
  86. 4 3
      lang/fw-build.sh
  87. 14 3
      lang/lang-check.py
  88. 1 0
      lang/lib/charset.py
  89. 951 579
      lang/po/Firmware.pot
  90. 1015 590
      lang/po/Firmware_cs.po
  91. 949 579
      lang/po/Firmware_da.po
  92. 1053 588
      lang/po/Firmware_de.po
  93. 1020 590
      lang/po/Firmware_es.po
  94. 1020 590
      lang/po/Firmware_fr.po
  95. 1018 590
      lang/po/Firmware_hr.po
  96. 1016 588
      lang/po/Firmware_hu.po
  97. 1017 589
      lang/po/Firmware_it.po
  98. 949 579
      lang/po/Firmware_lb.po
  99. 949 579
      lang/po/Firmware_lt.po
  100. 0 0
      lang/po/Firmware_nl.po

+ 0 - 1
CMakeLists.txt

@@ -17,7 +17,6 @@ set(TEST_SOURCES
 	Tests/AutoDeplete_test.cpp
 	Tests/PrusaStatistics_test.cpp
 	Firmware/Timer.cpp
-	Firmware/AutoDeplete.cpp
 )
 add_executable(tests ${TEST_SOURCES})
 target_include_directories(tests PRIVATE Tests)

+ 0 - 79
Firmware/AutoDeplete.cpp

@@ -1,79 +0,0 @@
-//! @file
-//! @author: Marek Bel
-//! @date Jan 3, 2019
-
-#include "AutoDeplete.h"
-#include "assert.h"
-
-//! @brief bit field marking depleted filaments
-//!
-//! binary 1 marks filament as depleted
-//! Zero initialized value means, that no filament is depleted.
-static uint8_t depleted;
-static const uint8_t filamentCount = 5;
-
-//! @return binary 1 for all filaments
-//! @par fCount number of filaments
-static constexpr uint8_t allDepleted(uint8_t fCount)
-{
-    return fCount == 1 ? 1 : ((1 << (fCount - 1)) | allDepleted(fCount - 1));
-}
-
-//! @brief Is filament available for printing?
-//! @par filament Filament number to be checked
-//! @retval true Filament is available for printing.
-//! @retval false Filament is not available for printing.
-static bool loaded(uint8_t filament)
-{
-    if (depleted & (1 << filament)) return false;
-    return true;
-}
-
-//! @brief Mark filament as not available for printing.
-//! @par filament filament to be marked
-void ad_markDepleted(uint8_t filament)
-{
-    assert(filament < filamentCount);
-    if (filament < filamentCount)
-    {
-        depleted |= 1 << filament;
-    }
-}
-
-//! @brief Mark filament as available for printing.
-//! @par filament filament to be marked
-void ad_markLoaded(uint8_t filament)
-{
-    assert(filament < filamentCount);
-    if (filament < filamentCount)
-    {
-        depleted &= ~(1 << filament);
-    }
-}
-
-//! @brief Get alternative filament, which is not depleted
-//! @par filament filament
-//! @return Filament, if it is depleted, returns next available,
-//! if all filaments are depleted, returns filament function parameter.
-uint8_t ad_getAlternative(uint8_t filament)
-{
-    assert(filament < filamentCount);
-    for (uint8_t i = 0; i<filamentCount; ++i)
-    {
-        uint8_t nextFilament = (filament + i) % filamentCount;
-        if (loaded(nextFilament)) return nextFilament;
-    }
-    return filament;
-}
-
-//! @brief Are all filaments depleted?
-//! @retval true All filaments are depleted.
-//! @retval false All filaments are not depleted.
-bool ad_allDepleted()
-{
-    if (allDepleted(filamentCount) == depleted)
-    {
-        return true;
-    }
-    return false;
-}

+ 0 - 17
Firmware/AutoDeplete.h

@@ -1,17 +0,0 @@
-//! @file
-//! @author: Marek Bel
-//! @brief Filament auto deplete engine for multi-material prints with MMUv2 (Now marketed as SpoolJoin)
-//!
-//! Interface for marking MMUv2 filaments as depleted and getting alternative filament for printing.
-
-#ifndef AUTODEPLETE_H
-#define AUTODEPLETE_H
-
-#include <stdint.h>
-
-void ad_markDepleted(uint8_t filament);
-void ad_markLoaded(uint8_t filament);
-uint8_t ad_getAlternative(uint8_t filament);
-bool ad_allDepleted();
-
-#endif /* AUTODEPLETE_H */

+ 56 - 0
Firmware/Configuration_adv.h

@@ -346,6 +346,62 @@ const unsigned int dropsegments=5; //everything with less than this number of st
 // 2nd and 3rd byte (LSB first) contains a 16bit length of a command including its preceding comments.
 #define CMDHDRSIZE 3
 
+/**
+ * Advanced Pause for Filament Change
+ *  - Adds the G-code M600 Filament Change to initiate a filament change.
+ *  - This feature is required for the default FILAMENT_RUNOUT_SCRIPT.
+ *
+ * Requirements:
+ *  - For Filament Change parking enable and configure NOZZLE_PARK_FEATURE.
+ *  - For user interaction enable an LCD display, HOST_PROMPT_SUPPORT, or EMERGENCY_PARSER.
+ *
+ * Enable PARK_HEAD_ON_PAUSE to add the G-code M125 Pause and Park.
+ */
+
+#define PAUSE_PARK_RETRACT_FEEDRATE         60  // (mm/s) Initial retract feedrate.
+#define PAUSE_PARK_RETRACT_LENGTH            2  // (mm) Initial retract.
+                                                // This short retract is done immediately, before parking the nozzle.
+#define FILAMENT_CHANGE_UNLOAD_FEEDRATE     10  // (mm/s) Unload filament feedrate. This can be pretty fast.
+#define FILAMENT_CHANGE_UNLOAD_ACCEL        25  // (mm/s^2) Lower acceleration may allow a faster feedrate.
+#define FILAMENT_CHANGE_UNLOAD_LENGTH      100  // (mm) The length of filament for a complete unload.
+                                                //   For Bowden, the full length of the tube and nozzle.
+                                                //   For direct drive, the full length of the nozzle.
+                                                //   Set to 0 for manual unloading.
+#define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE   6  // (mm/s) Slow move when starting load.
+#define FILAMENT_CHANGE_SLOW_LOAD_LENGTH     0  // (mm) Slow length, to allow time to insert material.
+                                                // 0 to disable start loading and skip to fast load only
+#define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE   6  // (mm/s) Load filament feedrate. This can be pretty fast.
+#define FILAMENT_CHANGE_FAST_LOAD_ACCEL     25  // (mm/s^2) Lower acceleration may allow a faster feedrate.
+#define FILAMENT_CHANGE_FAST_LOAD_LENGTH     0  // (mm) Load length of filament, from extruder gear to nozzle.
+                                                //   For Bowden, the full length of the tube and nozzle.
+                                                //   For direct drive, the full length of the nozzle.
+//#define ADVANCED_PAUSE_CONTINUOUS_PURGE       // Purge continuously up to the purge length until interrupted.
+#define ADVANCED_PAUSE_PURGE_FEEDRATE        3  // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate.
+#define ADVANCED_PAUSE_PURGE_LENGTH         50  // (mm) Length to extrude after loading.
+                                                //   Set to 0 for manual extrusion.
+                                                //   Filament can be extruded repeatedly from the Filament Change menu
+                                                //   until extrusion is consistent, and to purge old filament.
+#define ADVANCED_PAUSE_RESUME_PRIME          0  // (mm) Extra distance to prime nozzle after returning from park.
+//#define ADVANCED_PAUSE_FANS_PAUSE             // Turn off print-cooling fans while the machine is paused.
+
+                                                // Filament Unload does a Retract, Delay, and Purge first:
+#define FILAMENT_UNLOAD_PURGE_RETRACT       13  // (mm) Unload initial retract length.
+#define FILAMENT_UNLOAD_PURGE_DELAY       5000  // (ms) Delay for the filament to cool after retract.
+#define FILAMENT_UNLOAD_PURGE_LENGTH         8  // (mm) An unretract is done, then this length is purged.
+#define FILAMENT_UNLOAD_PURGE_FEEDRATE      25  // (mm/s) feedrate to purge before unload
+
+#define PAUSE_PARK_NOZZLE_TIMEOUT           45  // (seconds) Time limit before the nozzle is turned off for safety.
+#define FILAMENT_CHANGE_ALERT_BEEPS         10  // Number of alert beeps to play when a response is needed.
+#define PAUSE_PARK_NO_STEPPER_TIMEOUT           // Enable for XYZ steppers to stay powered on during filament change.
+//#define FILAMENT_CHANGE_RESUME_ON_INSERT      // Automatically continue / load filament when runout sensor is triggered again.
+//#define PAUSE_REHEAT_FAST_RESUME              // Reduce number of waits by not prompting again post-timeout before continuing.
+
+//#define PARK_HEAD_ON_PAUSE                    // Park the nozzle during pause and filament change.
+//#define HOME_BEFORE_FILAMENT_CHANGE           // If needed, home before parking for filament change
+
+//#define FILAMENT_LOAD_UNLOAD_GCODES           // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu.
+//#define FILAMENT_UNLOAD_ALL_EXTRUDERS         // Allow M702 to unload all extruders above a minimum target temp (as set by M302)
+
 
 // Firmware based and LCD controlled retract
 // M207 and M208 can be used to define parameters for the retraction.

+ 2 - 10
Firmware/Dcodes.cpp

@@ -865,7 +865,7 @@ void dcode_2130()
 }
 #endif //TMC2130
 
-#ifdef PAT9125
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
     /*!
     ### D9125 - PAT9125 filament sensor <a href="https://reprap.org/wiki/G-code#D9:_Read.2FWrite_ADC">D9125: PAT9125 filament sensor</a>
     #### Usage
@@ -878,7 +878,6 @@ void dcode_2130()
     - `R` - Resolution. Not active in code
     - `X` - X values
     - `Y` - Y values
-    - `L` - Activate filament sensor log
     */
 void dcode_9125()
 {
@@ -912,15 +911,8 @@ void dcode_9125()
 		pat9125_y = (int)code_value();
 		LOG("pat9125_y=%d\n", pat9125_y);
 	}
-#ifdef DEBUG_FSENSOR_LOG
-	if (code_seen('L'))
-	{
-		fsensor_log = (int)code_value();
-		LOG("fsensor_log=%d\n", fsensor_log);
-	}
-#endif //DEBUG_FSENSOR_LOG
 }
-#endif //PAT9125
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 #endif //DEBUG_DCODES
 

+ 2 - 2
Firmware/Dcodes.h

@@ -53,9 +53,9 @@ extern void dcode_81(); //D81 - Bed analysis. This command will log data to SD c
 	extern void dcode_2130(); //D2130 - TMC2130
 #endif //TMC2130
 
-#ifdef PAT9125
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 	extern void dcode_9125(); //D9125 - PAT9125
-#endif //PAT9125
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 
 #endif //DCODES_H

+ 525 - 0
Firmware/Filament_sensor.cpp

@@ -0,0 +1,525 @@
+#include <avr/pgmspace.h>
+#include <stdio.h>
+#include <util/atomic.h>
+
+#include "Filament_sensor.h"
+#include "Timer.h"
+#include "cardreader.h"
+#include "eeprom.h"
+#include "menu.h"
+#include "planner.h"
+#include "temperature.h"
+#include "ultralcd.h"
+
+#ifdef FILAMENT_SENSOR
+FSensorBlockRunout::FSensorBlockRunout() {
+    fsensor.setRunoutEnabled(false); //suppress filament runouts while loading filament.
+    fsensor.setAutoLoadEnabled(false); //suppress filament autoloads while loading filament.
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+    fsensor.setJamDetectionEnabled(false); //suppress filament jam detection while loading filament.
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+//    SERIAL_ECHOLNPGM("FSBlockRunout");
+}
+
+FSensorBlockRunout::~FSensorBlockRunout() {
+    fsensor.settings_init(); // restore filament runout state.
+//    SERIAL_ECHOLNPGM("FSUnBlockRunout");
+}
+
+# if FILAMENT_SENSOR_TYPE == FSENSOR_IR
+IR_sensor fsensor;
+# elif FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG
+IR_sensor_analog fsensor;
+# elif FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
+PAT9125_sensor fsensor;
+# endif
+
+#else // FILAMENT_SENSOR
+FSensorBlockRunout::FSensorBlockRunout() { }
+FSensorBlockRunout::~FSensorBlockRunout() { }
+#endif // FILAMENT_SENSOR
+
+void Filament_sensor::setEnabled(bool enabled) {
+    eeprom_update_byte((uint8_t *)EEPROM_FSENSOR, enabled);
+    if (enabled) {
+        fsensor.init();
+    } else {
+        fsensor.deinit();
+    }
+}
+
+void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) {
+    autoLoadEnabled = state;
+    if (updateEEPROM) {
+        eeprom_update_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state);
+    }
+}
+
+void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) {
+    runoutEnabled = state;
+    if (updateEEPROM) {
+        eeprom_update_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED, state);
+    }
+}
+
+void Filament_sensor::setActionOnError(SensorActionOnError state, bool updateEEPROM) {
+    sensorActionOnError = state;
+    if (updateEEPROM) {
+        eeprom_update_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA, (uint8_t)state);
+    }
+}
+
+void Filament_sensor::settings_init_common() {
+    bool enabled = eeprom_read_byte((uint8_t *)EEPROM_FSENSOR);
+    if ((state != State::disabled) != enabled) {
+        state = enabled ? State::initializing : State::disabled;
+    }
+
+    autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED);
+    runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED);
+    sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA);
+    if (sensorActionOnError == SensorActionOnError::_Undef) {
+        sensorActionOnError = SensorActionOnError::_Continue;
+    }
+}
+
+bool Filament_sensor::checkFilamentEvents() {
+    if (state != State::ready)
+        return false;
+    if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms
+        return false;
+    }
+
+    bool newFilamentPresent = fsensor.getFilamentPresent();
+    if (oldFilamentPresent != newFilamentPresent) {
+        oldFilamentPresent = newFilamentPresent;
+        eventBlankingTimer.start();
+        if (newFilamentPresent) { // filament insertion
+//            puts_P(PSTR("filament inserted"));
+            triggerFilamentInserted();
+            postponedLoadEvent = true;
+        } else { // filament removal
+//            puts_P(PSTR("filament removed"));
+            triggerFilamentRemoved();
+        }
+        return true;
+    }
+    return false;
+}
+
+void Filament_sensor::triggerFilamentInserted() {
+    if (autoLoadEnabled
+        && (eFilamentAction == FilamentAction::None)
+        && (! MMU2::mmu2.Enabled() ) // quick and dirty hack to prevent spurious runouts while the MMU is in charge
+        && !(
+            moves_planned() != 0
+            || IS_SD_PRINTING
+            || usb_timer.running()
+            || (lcd_commands_type == LcdCommands::Layer1Cal)
+            || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE)
+            )
+        ) {
+        filAutoLoad();
+    }
+}
+
+void Filament_sensor::triggerFilamentRemoved() {
+//    SERIAL_ECHOLNPGM("triggerFilamentRemoved");
+    if (runoutEnabled
+        && (! MMU2::mmu2.Enabled() ) // quick and dirty hack to prevent spurious runouts just before the toolchange
+        && (eFilamentAction == FilamentAction::None)
+        && !saved_printing
+        && (
+            moves_planned() != 0
+            || IS_SD_PRINTING
+            || usb_timer.running()
+            || (lcd_commands_type == LcdCommands::Layer1Cal)
+            || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE)
+        )
+    ){
+//        SERIAL_ECHOPGM("runoutEnabled="); SERIAL_ECHOLN((int)runoutEnabled);
+//        SERIAL_ECHOPGM("eFilamentAction="); SERIAL_ECHOLN((int)eFilamentAction);
+//        SERIAL_ECHOPGM("saved_printing="); SERIAL_ECHOLN((int)saved_printing);
+        filRunout();
+    }
+}
+
+void Filament_sensor::filAutoLoad() {
+    eFilamentAction = FilamentAction::AutoLoad;
+    if (target_temperature[0] >= EXTRUDE_MINTEMP) {
+        bFilamentPreheatState = true;
+        menu_submenu(mFilamentItemForce);
+    } else {
+        menu_submenu(lcd_generic_preheat_menu);
+        lcd_timeoutToStatus.start();
+    }
+}
+
+void Filament_sensor::filRunout() {
+//    SERIAL_ECHOLNPGM("filRunout");
+    runoutEnabled = false;
+    autoLoadEnabled = false;
+    stop_and_save_print_to_ram(0, 0);
+    restore_print_from_ram_and_continue(0);
+    eeprom_update_byte((uint8_t *)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t *)EEPROM_FERROR_COUNT) + 1);
+    eeprom_update_word((uint16_t *)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t *)EEPROM_FERROR_COUNT_TOT) + 1);
+    enquecommand_front_P((PSTR("M600")));
+}
+
+void Filament_sensor::triggerError() {
+    state = State::error;
+
+    /// some message, idk
+    ; //
+}
+
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+void IR_sensor::init() {
+    if (state == State::error) {
+        fsensor.deinit(); // deinit first if there was an error.
+    }
+//    puts_P(PSTR("fsensor::init()"));
+    SET_INPUT(IR_SENSOR_PIN); // input mode
+    WRITE(IR_SENSOR_PIN, 1);  // pullup
+    settings_init();          // also sets the state to State::initializing
+}
+
+void IR_sensor::deinit() {
+//    puts_P(PSTR("fsensor::deinit()"));
+    SET_INPUT(IR_SENSOR_PIN); // input mode
+    WRITE(IR_SENSOR_PIN, 0);  // no pullup
+    state = State::disabled;
+}
+
+bool IR_sensor::update() {
+    switch (state) {
+    case State::initializing:
+        state = State::ready; // the IR sensor gets ready instantly as it's just a gpio read operation.
+        // initialize the current filament state so that we don't create a switching event right after the sensor is ready.
+        oldFilamentPresent = fsensor.getFilamentPresent();
+        [[fallthrough]];
+    case State::ready: {
+        postponedLoadEvent = false;
+        return checkFilamentEvents();
+    } break;
+    case State::disabled:
+    case State::error:
+    default:
+        return false;
+    }
+    return false;
+}
+
+
+
+#ifdef FSENSOR_PROBING
+bool IR_sensor::probeOtherType() { return pat9125_probe(); }
+#endif
+
+void IR_sensor::settings_init() { Filament_sensor::settings_init_common(); }
+
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+void IR_sensor_analog::init() {
+    IR_sensor::init();
+    IR_sensor::settings_init();
+    sensorRevision = (SensorRevision)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_PCB);
+}
+
+bool IR_sensor_analog::update() {
+    bool event = IR_sensor::update();
+    if (state == State::ready) {
+        if (getVoltReady()) {
+            clearVoltReady();
+            uint16_t volt = getVoltRaw();
+//            printf_P(PSTR("newVoltRaw:%u\n"), volt / OVERSAMPLENR);
+
+            // detect min-max, some long term sliding window for filtration may be added
+            // avoiding floating point operations, thus computing in raw
+            if (volt > maxVolt) {
+                maxVolt = volt;
+            } else if (volt < minVolt) {
+                minVolt = volt;
+            }
+            //! The trouble is, I can hold the filament in the hole in such a way, that it creates the exact voltage
+            //! to be detected as the new fsensor
+            //! We can either fake it by extending the detection window to a looooong time
+            //! or do some other countermeasures
+
+            //! what we want to detect:
+            //! if minvolt gets below ~0.3V, it means there is an old fsensor
+            //! if maxvolt gets above 4.6V, it means we either have an old fsensor or broken cables/fsensor
+            //! So I'm waiting for a situation, when minVolt gets to range <0, 1.5> and maxVolt gets into range <3.0, 5>
+            //! If and only if minVolt is in range <0.3, 1.5> and maxVolt is in range <3.0, 4.6>, I'm considering a situation with the new fsensor
+            if (minVolt >= IRsensor_Ldiode_TRESHOLD && minVolt <= IRsensor_Lmax_TRESHOLD && maxVolt >= IRsensor_Hmin_TRESHOLD &&
+                maxVolt <= IRsensor_Hopen_TRESHOLD) {
+                IR_ANALOG_Check(SensorRevision::_Old, SensorRevision::_Rev04);
+            }
+            //! If and only if minVolt is in range <0.0, 0.3> and maxVolt is in range  <4.6, 5.0V>, I'm considering a situation with the old fsensor
+            //! Note, we are not relying on one voltage here - getting just +5V can mean an old fsensor or a broken new sensor - that's why
+            //! we need to have both voltages detected correctly to allow switching back to the old fsensor.
+            else if (minVolt < IRsensor_Ldiode_TRESHOLD && maxVolt > IRsensor_Hopen_TRESHOLD && maxVolt <= IRsensor_VMax_TRESHOLD) {
+                IR_ANALOG_Check(SensorRevision::_Rev04, SensorRevision::_Old);
+            }
+
+            if (!checkVoltage(volt)) {
+                triggerError();
+            }
+        }
+    }
+
+    ; //
+
+    return event;
+}
+
+void IR_sensor_analog::voltUpdate(uint16_t raw) { // to be called from the ADC ISR when a cycle is finished
+    voltRaw = raw;
+    voltReady = true;
+}
+
+uint16_t IR_sensor_analog::getVoltRaw() {
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { return voltRaw; }
+}
+
+const char *IR_sensor_analog::getIRVersionText() {
+    switch (sensorRevision) {
+    case SensorRevision::_Old:
+        return _T(MSG_IR_03_OR_OLDER);
+    case SensorRevision::_Rev04:
+        return _T(MSG_IR_04_OR_NEWER);
+    default:
+        return _T(MSG_IR_UNKNOWN);
+    }
+}
+
+void IR_sensor_analog::setSensorRevision(SensorRevision rev, bool updateEEPROM) {
+    sensorRevision = rev;
+    if (updateEEPROM) {
+        eeprom_update_byte((uint8_t *)EEPROM_FSENSOR_PCB, (uint8_t)rev);
+    }
+}
+
+bool IR_sensor_analog::checkVoltage(uint16_t raw) {
+    if (IRsensor_Lmax_TRESHOLD <= raw && raw <= IRsensor_Hmin_TRESHOLD) {
+        /// If the voltage is in forbidden range, the fsensor is ok, but the lever is mounted improperly.
+        /// Or the user is so creative so that he can hold a piece of fillament in the hole in such a genius way,
+        /// that the IR fsensor reading is within 1.5 and 3V ... this would have been highly unusual
+        /// and would have been considered more like a sabotage than normal printer operation
+        if (voltageErrorCnt++ > 4) {
+            puts_P(PSTR("fsensor in forbidden range 1.5-3V - check sensor"));
+            return false;
+        }
+    } else {
+        voltageErrorCnt = 0;
+    }
+    if (sensorRevision == SensorRevision::_Rev04) {
+        /// newer IR sensor cannot normally produce 4.6-5V, this is considered a failure/bad mount
+        if (IRsensor_Hopen_TRESHOLD <= raw && raw <= IRsensor_VMax_TRESHOLD) {
+            puts_P(PSTR("fsensor v0.4 in fault range 4.6-5V - unconnected"));
+            return false;
+        }
+        /// newer IR sensor cannot normally produce 0-0.3V, this is considered a failure
+#if 0 // Disabled as it has to be decided if we gonna use this or not.
+            if(IRsensor_Hopen_TRESHOLD <= raw && raw <= IRsensor_VMax_TRESHOLD) {
+                puts_P(PSTR("fsensor v0.4 in fault range 0.0-0.3V - wrong IR sensor"));
+                return false;
+            }
+#endif
+    }
+    /// If IR sensor is "uknown state" and filament is not loaded > 1.5V return false
+#if 0
+#error "I really think this code can't be enabled anymore because we are constantly checking this voltage."
+        if((sensorRevision == SensorRevision::_Undef) && (raw > IRsensor_Lmax_TRESHOLD)) {
+            puts_P(PSTR("Unknown IR sensor version and no filament loaded detected."));
+            return false;
+        }
+#endif
+    // otherwise the IR fsensor is considered working correctly
+    return true;
+}
+
+bool IR_sensor_analog::getVoltReady() const {
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ return voltReady; }
+}
+
+void IR_sensor_analog::clearVoltReady(){
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ voltReady = false; }
+}
+
+void IR_sensor_analog::IR_ANALOG_Check(SensorRevision isVersion, SensorRevision switchTo) {
+    bool bTemp = (!CHECK_ALL_HEATERS);
+    bTemp = bTemp && (menu_menu == lcd_status_screen);
+    bTemp = bTemp && ((sensorRevision == isVersion) || (sensorRevision == SensorRevision::_Undef));
+    bTemp = bTemp && (state == State::ready);
+    if (bTemp) {
+        nFSCheckCount++;
+        if (nFSCheckCount > FS_CHECK_COUNT) {
+            nFSCheckCount = 0; // not necessary
+            setSensorRevision(switchTo, true);
+            printf_IRSensorAnalogBoardChange();
+            switch (switchTo) {
+            case SensorRevision::_Old:
+                lcd_setstatuspgm(_T(MSG_IR_03_OR_OLDER));
+                break;
+            case SensorRevision::_Rev04:
+                lcd_setstatuspgm(_T(MSG_IR_04_OR_NEWER));
+                break;
+            default:
+                break;
+            }
+        }
+    } else {
+        nFSCheckCount = 0;
+    }
+}
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+void PAT9125_sensor::init() {
+    if (state == State::error) {
+        deinit(); // deinit first if there was an error.
+    }
+//    puts_P(PSTR("fsensor::init()"));
+
+    settings_init(); // also sets the state to State::initializing
+
+    calcChunkSteps(cs.axis_steps_per_unit[E_AXIS]); // for jam detection
+
+    if (!pat9125_init()) {
+        deinit();
+        triggerError();
+        ; //
+    }
+#ifdef IR_SENSOR_PIN
+    else if (!READ(IR_SENSOR_PIN)) {
+        ; // MK3 fw on MK3S printer
+    }
+#endif // IR_SENSOR_PIN
+}
+
+void PAT9125_sensor::deinit() {
+//    puts_P(PSTR("fsensor::deinit()"));
+    ; //
+    state = State::disabled;
+    filter = 0;
+}
+
+bool PAT9125_sensor::update() {
+    switch (state) {
+    case State::initializing:
+        if (!updatePAT9125()) {
+            break; // still not stable. Stay in the initialization state.
+        }
+        oldFilamentPresent =
+            getFilamentPresent(); // initialize the current filament state so that we don't create a switching event right after the sensor is ready.
+        oldPos = pat9125_y;
+        state = State::ready;
+        break;
+    case State::ready: {
+        updatePAT9125();
+        postponedLoadEvent = false;
+        bool event = checkFilamentEvents();
+
+        ; //
+
+        return event;
+    } break;
+    case State::disabled:
+    case State::error:
+    default:
+        return false;
+    }
+    return false;
+}
+
+#ifdef FSENSOR_PROBING
+bool PAT9125_sensor::probeOtherType() {
+    SET_INPUT(IR_SENSOR_PIN); // input mode
+    WRITE(IR_SENSOR_PIN, 1);  // pullup
+    _delay_us(100); // wait for the pullup to pull the line high (might be needed, not really sure. The internal pullups are quite weak and there might be a
+                    // long wire attached).
+    bool fsensorDetected = !READ(IR_SENSOR_PIN);
+    WRITE(IR_SENSOR_PIN, 0); // no pullup
+    return fsensorDetected;
+}
+#endif
+
+void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) {
+    jamDetection = state;
+    oldPos = pat9125_y;
+    resetStepCount();
+    jamErrCnt = 0;
+    if (updateEEPROM) {
+        eeprom_update_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION, state);
+    }
+}
+
+void PAT9125_sensor::settings_init() {
+//    puts_P(PSTR("settings_init"));
+    Filament_sensor::settings_init_common();
+    setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION));
+}
+
+int16_t PAT9125_sensor::getStepCount() {
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { return stepCount; }
+}
+
+void PAT9125_sensor::resetStepCount() {
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { stepCount = 0; }
+}
+
+void PAT9125_sensor::filJam() {
+    runoutEnabled = false;
+    autoLoadEnabled = false;
+    jamDetection = false;
+    stop_and_save_print_to_ram(0, 0);
+    restore_print_from_ram_and_continue(0);
+    eeprom_update_byte((uint8_t *)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t *)EEPROM_FERROR_COUNT) + 1);
+    eeprom_update_word((uint16_t *)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t *)EEPROM_FERROR_COUNT_TOT) + 1);
+    enquecommand_front_P((PSTR("M600")));
+}
+
+bool PAT9125_sensor::updatePAT9125() {
+    if (jamDetection) {
+        int16_t _stepCount = getStepCount();
+        if (abs(_stepCount) >= chunkSteps) { // end of chunk. Check distance
+            resetStepCount();
+            if (!pat9125_update()) { // get up to date data. reinit on error.
+                init();              // try to reinit.
+            }
+            bool fsDir = (pat9125_y - oldPos) > 0;
+            bool stDir = _stepCount > 0;
+            if (fsDir != stDir) {
+                jamErrCnt++;
+            } else if (jamErrCnt) {
+                jamErrCnt--;
+            }
+            oldPos = pat9125_y;
+        }
+        if (jamErrCnt > 10) {
+            jamErrCnt = 0;
+            filJam();
+        }
+    }
+
+    if (!pollingTimer.running() || pollingTimer.expired(pollingPeriod)) {
+        pollingTimer.start();
+        if (!pat9125_update()) {
+            init(); // try to reinit.
+        }
+
+        bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50);
+        if (present != filterFilPresent) {
+            filter++;
+        } else if (filter) {
+            filter--;
+        }
+        if (filter >= filterCnt) {
+            filter = 0;
+            filterFilPresent = present;
+        }
+    }
+    return (filter == 0); // return stability
+}
+#endif // #if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)

+ 214 - 0
Firmware/Filament_sensor.h

@@ -0,0 +1,214 @@
+#pragma once
+#include <inttypes.h>
+
+#include "cmdqueue.h"
+#include "pins.h"
+#include "fastio.h"
+#include "adc.h"
+#include "pat9125.h"
+
+#define FSENSOR_IR 1
+#define FSENSOR_IR_ANALOG 2
+#define FSENSOR_PAT9125 3
+
+/// Can be used to block printer's filament sensor handling - to avoid errorneous injecting of M600
+/// while doing a toolchange with the MMU
+/// In case of "no filament sensor" these methods default to an empty implementation
+class FSensorBlockRunout {
+public:
+    FSensorBlockRunout();
+    ~FSensorBlockRunout();
+};
+
+/// Base class Filament sensor
+/// 
+/// Ideally, there could have been a nice class hierarchy of filament sensor types with common functionality
+/// extracted into this base class.
+/// But:
+/// - virtual methods take more space
+/// - we don't need to switch among different filament sensors at runtime
+/// Therefore the class hierarchy carefully avoids using virtual methods and doesn't look too fancy.
+#ifdef FILAMENT_SENSOR
+class Filament_sensor {
+public:
+    enum class State : uint8_t {
+        disabled = 0,
+        initializing,
+        ready,
+        error,
+    };
+    
+    enum class SensorActionOnError : uint8_t {
+        _Continue = 0,
+        _Pause = 1,
+        _Undef = EEPROM_EMPTY_VALUE
+    };
+    
+    static void setEnabled(bool enabled);
+    
+    void setAutoLoadEnabled(bool state, bool updateEEPROM = false);
+    bool getAutoLoadEnabled() const { return autoLoadEnabled; }
+    
+    void setRunoutEnabled(bool state, bool updateEEPROM = false);
+    bool getRunoutEnabled() const { return runoutEnabled; }
+    
+    void setActionOnError(SensorActionOnError state, bool updateEEPROM = false);
+    SensorActionOnError getActionOnError() const { return sensorActionOnError; }
+    
+    bool getFilamentLoadEvent() const { return postponedLoadEvent; }
+    
+    bool isError() const { return state == State::error; }
+    bool isReady() const { return state == State::ready; }
+    bool isEnabled() const { return state != State::disabled; }
+    
+protected:
+    void settings_init_common();
+    
+    bool checkFilamentEvents();
+    
+    void triggerFilamentInserted();
+    
+    void triggerFilamentRemoved();
+    
+    static void filAutoLoad();
+    
+    void filRunout();
+    
+    void triggerError();
+    
+    State state;
+    bool autoLoadEnabled;
+    bool runoutEnabled;
+    bool oldFilamentPresent; //for creating filament presence switching events.
+    bool postponedLoadEvent; //this event lasts exactly one update cycle. It is long enough to be able to do polling for load event.
+    ShortTimer eventBlankingTimer;
+    SensorActionOnError sensorActionOnError;
+};
+
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+class IR_sensor: public Filament_sensor {
+public:
+    void init();
+    void deinit();
+    bool update();
+    bool getFilamentPresent() const { return !READ(IR_SENSOR_PIN); }
+#ifdef FSENSOR_PROBING
+    static bool probeOtherType(); //checks if the wrong fsensor type is detected.
+#endif
+    void settings_init();
+};
+
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+constexpr static uint16_t Voltage2Raw(float V) {
+    return (V * 1023 * OVERSAMPLENR / VOLT_DIV_REF ) + 0.5F;
+}
+constexpr static float Raw2Voltage(uint16_t raw) {
+    return VOLT_DIV_REF * (raw / (1023.F * OVERSAMPLENR));
+}
+
+class IR_sensor_analog: public IR_sensor {
+public:
+    void init();
+    bool update();
+    void voltUpdate(uint16_t raw);
+    
+    uint16_t __attribute__((noinline)) getVoltRaw();
+    
+    enum class SensorRevision : uint8_t {
+        _Old = 0,
+        _Rev04 = 1,
+        _Undef = EEPROM_EMPTY_VALUE
+    };
+    
+    SensorRevision getSensorRevision() const { return sensorRevision; }
+    
+    const char* __attribute__((noinline)) getIRVersionText();
+    
+    void setSensorRevision(SensorRevision rev, bool updateEEPROM = false);
+    
+    constexpr static uint16_t IRsensor_Ldiode_TRESHOLD = Voltage2Raw(0.3F); // ~0.3V, raw value=982
+    constexpr static uint16_t IRsensor_Lmax_TRESHOLD = Voltage2Raw(1.5F); // ~1.5V (0.3*Vcc), raw value=4910
+    constexpr static uint16_t IRsensor_Hmin_TRESHOLD = Voltage2Raw(3.0F); // ~3.0V (0.6*Vcc), raw value=9821
+    constexpr static uint16_t IRsensor_Hopen_TRESHOLD = Voltage2Raw(4.6F); // ~4.6V (N.C. @ Ru~20-50k, Rd'=56k, Ru'=10k), raw value=15059
+    constexpr static uint16_t IRsensor_VMax_TRESHOLD = Voltage2Raw(5.F); // ~5V, raw value=16368
+    
+private:
+    SensorRevision sensorRevision;
+    
+    bool voltReady; // set by the adc ISR, therefore avoid accessing the variable directly but use getVoltReady()
+    bool getVoltReady()const;
+    void clearVoltReady();
+    
+    uint16_t voltRaw; // set by the adc ISR, therefore avoid accessing the variable directly but use getVoltRaw()
+    bool checkVoltage(uint16_t raw);
+    
+    uint16_t minVolt = Voltage2Raw(6.F);
+    uint16_t maxVolt = 0;
+    uint16_t nFSCheckCount;
+    uint8_t voltageErrorCnt;
+
+    static constexpr uint16_t FS_CHECK_COUNT = 4;
+    /// Switching mechanism of the fsensor type.
+    /// Called from 2 spots which have a very similar behavior
+    /// 1: SensorRevision::_Old -> SensorRevision::_Rev04 and print _i("FS v0.4 or newer")
+    /// 2: SensorRevision::_Rev04 -> sensorRevision=SensorRevision::_Old and print _i("FS v0.3 or older")
+    void IR_ANALOG_Check(SensorRevision isVersion, SensorRevision switchTo);
+};
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+class PAT9125_sensor: public Filament_sensor {
+public:
+    void init();
+    void deinit();
+    bool update();
+    bool getFilamentPresent() const { return filterFilPresent; }
+#ifdef FSENSOR_PROBING
+    bool probeOtherType(); //checks if the wrong fsensor type is detected.
+#endif
+    
+    void setJamDetectionEnabled(bool state, bool updateEEPROM = false);
+    bool getJamDetectionEnabled() const { return jamDetection; }
+    
+    void stStep(bool rev) { //from stepper isr
+        stepCount += rev ? -1 : 1;
+    }
+    
+    void settings_init();
+private:
+    static constexpr uint16_t pollingPeriod = 10; //[ms]
+    static constexpr uint8_t filterCnt = 5; //how many checks need to be done in order to determine the filament presence precisely.
+    ShortTimer pollingTimer;
+    uint8_t filter;
+    uint8_t filterFilPresent;
+    
+    bool jamDetection;
+    int16_t oldPos;
+    int16_t stepCount;
+    int16_t chunkSteps;
+    uint8_t jamErrCnt;
+    
+    constexpr void calcChunkSteps(float u) {
+        chunkSteps = (int16_t)(1.25 * u); //[mm]
+    }
+    
+    int16_t getStepCount();
+    
+    void resetStepCount();
+    
+    void filJam();
+    
+    bool updatePAT9125();
+};
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+
+#if FILAMENT_SENSOR_TYPE == FSENSOR_IR
+extern IR_sensor fsensor;
+#elif FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG
+extern IR_sensor_analog fsensor;
+#elif FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
+extern PAT9125_sensor fsensor;
+#endif
+
+#endif //FILAMENT_SENSOR

+ 8 - 5
Firmware/Marlin.h

@@ -21,6 +21,7 @@
 #include "Configuration.h"
 #include "pins.h"
 #include "Timer.h"
+#include "mmu2.h"
 extern uint8_t mbl_z_probe_nr;
 
 #ifndef AT90USB
@@ -280,7 +281,6 @@ extern float max_pos[3];
 extern bool axis_known_position[3];
 extern int fanSpeed;
 extern uint8_t newFanSpeed;
-extern int8_t lcd_change_fil_state;
 extern float default_retraction;
 
 void get_coordinates();
@@ -315,8 +315,9 @@ extern bool fan_state[2];
 extern int fan_edge_counter[2];
 extern int fan_speed[2];
 
-// Handling multiple extruders pins
-extern uint8_t active_extruder;
+// Active extruder becomes a #define to make the whole firmware compilable.
+// We may even remove the references to it wherever possible in the future
+#define active_extruder 0
 
 //Long pause
 extern unsigned long pause_time;
@@ -413,6 +414,7 @@ extern void print_physical_coordinates();
 extern void print_mesh_bed_leveling_table();
 
 extern void stop_and_save_print_to_ram(float z_move, float e_move);
+void restore_extruder_temperature_from_ram();
 extern void restore_print_from_ram_and_continue(float e_move);
 extern void cancel_saved_printing();
 
@@ -461,7 +463,7 @@ void gcode_M114();
 #if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
 void gcode_M123();
 #endif //FANCHECK and TACH_0 and TACH_1
-void gcode_M701();
+void gcode_M701(float fastLoadLength, uint8_t mmuSlotIndex);
 
 #define UVLO !(PINE & (1<<4))
 
@@ -472,7 +474,8 @@ void M600_wait_for_user(float HotendTempBckp);
 void M600_check_state(float nozzle_temp);
 void load_filament_final_feed();
 void marlin_wait_for_click();
-void raise_z_above(float target, bool plan=true);
+float raise_z(float delta);
+void raise_z_above(float target);
 
 extern "C" void softReset();
 void stack_error();

+ 582 - 652
Firmware/Marlin_main.cpp

@@ -86,8 +86,9 @@
 #include <avr/wdt.h>
 #include <avr/pgmspace.h>
 
+#include "Tcodes.h"
 #include "Dcodes.h"
-#include "AutoDeplete.h"
+#include "SpoolJoin.h"
 
 #ifndef LA_NOCOMPAT
 #include "la10compat.h"
@@ -95,12 +96,7 @@
 
 #include "spi.h"
 
-#ifdef FILAMENT_SENSOR
-#include "fsensor.h"
-#ifdef IR_SENSOR
-#include "pat9125.h" // for pat9125_probe
-#endif
-#endif //FILAMENT_SENSOR
+#include "Filament_sensor.h"
 
 #ifdef TMC2130
 #include "tmc2130.h"
@@ -130,7 +126,7 @@
 #include <SPI.h>
 #endif
 
-#include "mmu.h"
+#include "mmu2.h"
 
 #define VERSION_STRING  "1.0.2"
 
@@ -193,8 +189,6 @@ int extruder_multiply[EXTRUDERS] = {100
 
 bool homing_flag = false;
 
-int8_t lcd_change_fil_state = 0;
-
 unsigned long pause_time = 0;
 unsigned long start_pause_print = _millis();
 unsigned long t_fan_rising_edge = _millis();
@@ -248,7 +242,6 @@ float extruder_offset[NUM_EXTRUDER_OFFSETS][EXTRUDERS] = {
 };
 #endif
 
-uint8_t active_extruder = 0;
 int fanSpeed=0;
 uint8_t newFanSpeed = 0;
 
@@ -299,9 +292,6 @@ float saved_start_position[NUM_AXIS] = {SAVED_START_POSITION_UNSET, 0, 0, 0};
 
 uint16_t saved_segment_idx = 0;
 
-// save/restore printing in case that mmu was not responding 
-bool mmu_print_saved = false;
-
 // storing estimated time to end of print counted by slicer
 uint8_t print_percent_done_normal = PRINT_PERCENT_DONE_INIT;
 uint8_t print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
@@ -369,9 +359,8 @@ uint8_t saved_printing_type = PRINTING_TYPE_SD;
 static float saved_pos[4] = { X_COORD_INVALID, 0, 0, 0 };
 static uint16_t saved_feedrate2 = 0; //!< Default feedrate (truncated from float)
 static int saved_feedmultiply2 = 0;
-static uint8_t saved_active_extruder = 0;
 float saved_extruder_temperature = 0.0; //!< Active extruder temperature
-float saved_bed_temperature = 0.0; //!< Bed temperature
+float saved_bed_temperature = 0.0;
 static bool saved_extruder_relative_mode = false;
 int saved_fan_speed = 0; //!< Print fan speed
 //! @}
@@ -569,7 +558,7 @@ bool __attribute__((noinline)) printer_active() {
         || (custom_message_type == CustomMsg::TempCal)
         || saved_printing
         || (lcd_commands_type == LcdCommands::Layer1Cal)
-        || mmu_print_saved
+        || MMU2::mmu2.MMU_PRINT_SAVED()
         || homing_flag
         || mesh_bed_leveling_flag;
 }
@@ -654,13 +643,12 @@ void crashdet_detected(uint8_t mask)
         lcd_set_cursor(0, 1);
         lcd_puts_P(_T(MSG_RESUME_PRINT));
         lcd_putc('?');
-        bool yesno = lcd_show_yes_no_and_wait(false);
-		lcd_update_enable(true);
-		if (yesno)
+        uint8_t yesno = lcd_show_yes_no_and_wait(false);
+		if (yesno == LCD_LEFT_BUTTON_CHOICE)
 		{
 			enquecommand_P(PSTR("CRASH_RECOVER"));
 		}
-		else
+		else // LCD_MIDDLE_BUTTON_CHOICE
 		{
 			enquecommand_P(PSTR("CRASH_CANCEL"));
 		}
@@ -695,9 +683,6 @@ void failstats_reset_print()
 	eeprom_update_byte((uint8_t *)EEPROM_POWER_COUNT, 0);
 	eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);
 	eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-    fsensor_softfail = 0;
-#endif
 }
 
 void softReset()
@@ -764,8 +749,12 @@ static void factory_reset(char level)
 		farm_disable();
 
 #ifdef FILAMENT_SENSOR
-		fsensor_enable();
-		fsensor_autoload_set(true);
+		fsensor.setEnabled(true);
+		fsensor.setAutoLoadEnabled(true, true);
+		fsensor.setRunoutEnabled(true, true);
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+		fsensor.setJamDetectionEnabled(true, true);
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 #endif //FILAMENT_SENSOR
 		break;
 
@@ -864,24 +853,14 @@ void show_fw_version_warnings() {
 	lcd_update_enable(true);
 }
 
+#if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
 //! @brief try to check if firmware is on right type of printer
-static void check_if_fw_is_on_right_printer(){
-#ifdef FILAMENT_SENSOR
-  if((PRINTER_TYPE == PRINTER_MK3) || (PRINTER_TYPE == PRINTER_MK3S)){
-    #ifdef IR_SENSOR
-      if (pat9125_probe()){
-        lcd_show_fullscreen_message_and_wait_P(_i("MK3S firmware detected on MK3 printer"));}////MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-    #endif //IR_SENSOR
-
-    #ifdef PAT9125
-      //will return 1 only if IR can detect filament in bondtech extruder so this may fail even when we have IR sensor
-      const uint8_t ir_detected = !READ(IR_SENSOR_PIN);
-      if (ir_detected){
-        lcd_show_fullscreen_message_and_wait_P(_i("MK3 firmware detected on MK3S printer"));}////MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-    #endif //PAT9125
-  }
-#endif //FILAMENT_SENSOR
+static void check_if_fw_is_on_right_printer() {
+    if (fsensor.probeOtherType()) {
+        lcd_show_fullscreen_message_and_wait_P(_i(PRINTER_NAME " firmware detected on " PRINTER_NAME_ALTERNATE " printer"));////c=20 r=4
+    }
 }
+#endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
 
 uint8_t check_printer_version()
 {
@@ -1061,7 +1040,6 @@ void setup()
 {
 	timer2_init(); // enables functional millis
 
-	mmu_init();
 
 	ultralcd_init();
 
@@ -1134,6 +1112,11 @@ void setup()
 	SERIAL_ECHO_START;
 	puts_P(PSTR(" " FW_VERSION_FULL));
 
+	if (eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED)) {
+		MMU2::mmu2.Start();
+	}
+	SpoolJoin::spooljoin.initSpoolJoinStatus();
+
 	//SERIAL_ECHOPAIR("Active sheet before:", static_cast<unsigned long int>(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))));
 
 #ifdef DEBUG_SEC_LANG
@@ -1365,7 +1348,7 @@ void setup()
         xflash_err_msg();
 
 #ifdef FILAMENT_SENSOR
-	fsensor_init();
+    fsensor.init();
 #endif //FILAMENT_SENSOR
 
 
@@ -1497,15 +1480,13 @@ void setup()
 	setup_fan_interrupt();
 #endif //DEBUG_DISABLE_FANCHECK
 
-#ifdef PAT9125
-	fsensor_setup_interrupt();
-#endif //PAT9125
-
 #ifndef DEBUG_DISABLE_STARTMSGS
   KEEPALIVE_STATE(PAUSED_FOR_USER);
 
   if (!farm_mode) {
+#if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
     check_if_fw_is_on_right_printer();
+#endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
     show_fw_version_warnings();    
   }
 
@@ -1601,7 +1582,7 @@ void setup()
 #ifdef UVLO_SUPPORT
   if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != 0) { //previous print was terminated by UVLO
 /*
-	  if (lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false))	recover_print();
+	  if (!lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false))	recover_print();
 	  else {
 		  eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0);
 		  lcd_update_enable(true);
@@ -1623,8 +1604,9 @@ void setup()
           #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
         puts_P(_N("Normal recovery!")); 
           #endif 
-          if ( lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false) ) recover_print(0); 
-          else { 
+          if ( lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false) == LCD_LEFT_BUTTON_CHOICE) {
+              recover_print(0); 
+          } else { 
               eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0); 
               lcd_update_enable(true); 
               lcd_update(2); 
@@ -1639,7 +1621,6 @@ void setup()
 #endif //UVLO_SUPPORT
 
   fCheckModeInit();
-  fSetMmuMode(mmu_enabled);
   KEEPALIVE_STATE(NOT_BUSY);
 #ifdef WATCHDOG
   wdt_enable(WDTO_4S);
@@ -1810,7 +1791,7 @@ void loop()
       // The first character in the block is the block type.      
       char *ptr = cmdbuffer + bufindr;
       if (*ptr == CMDBUFFER_CURRENT_TYPE_SDCARD) {
-        // To support power panic, move the lenght of the command on the SD card to a planner buffer.
+        // To support power panic, move the length of the command on the SD card to a planner buffer.
         union {
           struct {
               char lo;
@@ -1872,7 +1853,7 @@ void loop()
 		}
 	}
 #endif //TMC2130
-	mmu_loop();
+	MMU2::mmu2.mmu_loop();
 }
 
 #define DEFINE_PGM_READ_ANY(type, reader)       \
@@ -2107,20 +2088,15 @@ bool check_commands() {
 	
 }
 
-
-// raise_z_above: slowly raise Z to the requested height
-//
-// contrarily to a simple move, this function will carefully plan a move
-// when the current Z position is unknown. In such cases, stallguard is
-// enabled and will prevent prolonged pushing against the Z tops
-void raise_z_above(float target, bool plan)
+/// @brief Safely move Z-axis by distance delta (mm)
+/// @param delta travel distance in mm
+/// @returns The actual travel distance in mm. Endstop may limit the requested move.
+float raise_z(float delta)
 {
-    if (current_position[Z_AXIS] >= target)
-        return;
+    float travel_z = current_position[Z_AXIS];
 
-    // Z needs raising
-    current_position[Z_AXIS] = target;
-    clamp_to_software_endstops(current_position);
+    // Prepare to move Z axis
+    current_position[Z_AXIS] += delta;
 
 #if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT)
     bool z_min_endstop = (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING);
@@ -2131,31 +2107,54 @@ void raise_z_above(float target, bool plan)
     if (axis_known_position[Z_AXIS] || z_min_endstop)
     {
         // current position is known or very low, it's safe to raise Z
-        if(plan) plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
-        return;
-    }
+        clamp_to_software_endstops(current_position);
+        plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
+        st_synchronize();
 
-    // ensure Z is powered in normal mode to overcome initial load
-    enable_z();
-    st_synchronize();
+        // Get the final travel distance
+        travel_z = current_position[Z_AXIS] - travel_z;
+    } else {
+        // ensure Z is powered in normal mode to overcome initial load
+        enable_z();
+        st_synchronize();
 
-    // rely on crashguard to limit damage
-    bool z_endstop_enabled = enable_z_endstop(true);
+        // rely on crashguard to limit damage
+        bool z_endstop_enabled = enable_z_endstop(true);
 #ifdef TMC2130
-    tmc2130_home_enter(Z_AXIS_MASK);
+        tmc2130_home_enter(Z_AXIS_MASK);
 #endif //TMC2130
-    plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60);
-    st_synchronize();
+        plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60);
+        st_synchronize();
+
+        // Get the final travel distance
+        travel_z = st_get_position_mm(Z_AXIS) - travel_z;
 #ifdef TMC2130
-    if (endstop_z_hit_on_purpose())
-    {
-        // not necessarily exact, but will avoid further vertical moves
-        current_position[Z_AXIS] = max_pos[Z_AXIS];
-        plan_set_position_curposXYZE();
-    }
-    tmc2130_home_exit();
+        if (endstop_z_hit_on_purpose())
+        {
+            // not necessarily exact, but will avoid further vertical moves
+            current_position[Z_AXIS] = max_pos[Z_AXIS];
+            plan_set_position_curposXYZE();
+        }
+        tmc2130_home_exit();
 #endif //TMC2130
-    enable_z_endstop(z_endstop_enabled);
+        enable_z_endstop(z_endstop_enabled);
+    }
+
+    return travel_z;
+}
+
+// raise_z_above: slowly raise Z to the requested height
+//
+// contrarily to a simple move, this function will carefully plan a move
+// when the current Z position is unknown. In such cases, stallguard is
+// enabled and will prevent prolonged pushing against the Z tops
+void raise_z_above(float target)
+{
+    if (current_position[Z_AXIS] >= target)
+        return;
+
+    // Use absolute value in case the current position is unknown
+    raise_z(fabs(current_position[Z_AXIS] - target));
 }
 
 
@@ -2178,7 +2177,6 @@ bool calibrate_z_auto()
 	//	current_position[axis] = 0;
 	//	plan_set_position_curposXYZE();
 	tmc2130_home_exit();
-	enable_endstops(false);
 	current_position[Z_AXIS] = 0;
 	plan_set_position_curposXYZE();
 	set_destination_to_current();
@@ -2555,7 +2553,6 @@ static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, lon
 	//if we are homing all axes, first move z higher to protect heatbed/steel sheet
 	if (home_all_axes) {
         raise_z_above(MESH_HOME_Z_SEARCH);
-		st_synchronize();
 	}
 #ifdef ENABLE_AUTO_BED_LEVELING
       plan_bed_level_matrix.set_to_identity();  //Reset the plane ("erase" all leveling data)
@@ -2660,11 +2657,9 @@ static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, lon
           if(home_z) {
             #if defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
               raise_z_above(Z_RAISE_BEFORE_HOMING);
-              st_synchronize();
             #endif // defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
             #ifdef MESH_BED_LEVELING  // If Mesh bed leveling, move X&Y to safe position for home
               raise_z_above(MESH_HOME_Z_SEARCH);
-              st_synchronize();
               if (!axis_known_position[X_AXIS]) homeaxis(X_AXIS);
               if (!axis_known_position[Y_AXIS]) homeaxis(Y_AXIS);
               // 1st mesh bed leveling measurement point, corrected.
@@ -3064,9 +3059,7 @@ static void gcode_G80()
 #endif // TMC2130
             // ~ Z-homing (can not be used "G28", because X & Y-homing would have been done before (Z-homing))
             bState=enable_z_endstop(false);
-            current_position[Z_AXIS] -= 1;
-            plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40);
-            st_synchronize();
+            raise_z(-1);
             enable_z_endstop(true);
 #ifdef TMC2130
             tmc2130_home_enter(Z_AXIS_MASK);
@@ -3267,7 +3260,6 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level)
 	int l_feedmultiply = setup_for_endstop_move();
 	lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME));
   raise_z_above(MESH_HOME_Z_SEARCH);
-  st_synchronize();
 	home_xy();
 
 	enable_endstops(false);
@@ -3306,19 +3298,19 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level)
 		{
 			KEEPALIVE_STATE(PAUSED_FOR_USER);
 			#ifdef STEEL_SHEET
-			bool result = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false, false);
-			if(result) lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_STEEL_SHEET));
+			uint8_t result = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false);
+			if(result == LCD_LEFT_BUTTON_CHOICE) {
+				lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_STEEL_SHEET));
+			}
 			#endif //STEEL_SHEET
-		    lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER));
+			lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER));
 			KEEPALIVE_STATE(IN_HANDLER);
 			lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
 			lcd_puts_at_P(0,3,_n("1/4"));
 		}
 			
 		bool endstops_enabled  = enable_endstops(false);
-        current_position[Z_AXIS] -= 1; //move 1mm down with disabled endstop
-        plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40);
-        st_synchronize();
+    raise_z(-1);
 
 		// Move the print head close to the bed.
 		current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
@@ -3461,218 +3453,254 @@ void gcode_M123()
 }
 #endif //FANCHECK and TACH_0 or TACH_1
 
-//! extracted code to compute z_shift for M600 in case of filament change operation 
-//! requested from fsensors.
-//! The function ensures, that the printhead lifts to at least 25mm above the heat bed
-//! unlike the previous implementation, which was adding 25mm even when the head was
-//! printing at e.g. 24mm height.
-//! A safety margin of FILAMENTCHANGE_ZADD is added in all cases to avoid touching
-//! the printout.
-//! This function is templated to enable fast change of computation data type.
-//! @return new z_shift value
-template<typename T>
-static T gcode_M600_filament_change_z_shift()
-{
-#ifdef FILAMENTCHANGE_ZADD
-	static_assert(Z_MAX_POS < (255 - FILAMENTCHANGE_ZADD), "Z-range too high, change the T type from uint8_t to uint16_t");
-	// avoid floating point arithmetics when not necessary - results in shorter code
-	T z_shift = T(FILAMENTCHANGE_ZADD); // always move above printout
-	T ztmp = T( current_position[Z_AXIS] );
-	if((ztmp + z_shift) < T(MIN_Z_FOR_SWAP)){
-		z_shift = T(MIN_Z_FOR_SWAP) - ztmp; // make sure to be at least 25mm above the heat bed
-	}
-	return z_shift;
-#else
-	return T(0);
-#endif
-}	
+static void mmu_M600_wait_and_beep() {
+    // Beep and wait for user to remove old filament and prepare new filament for load
+    KEEPALIVE_STATE(PAUSED_FOR_USER);
 
-static void gcode_M600(bool automatic, float x_position, float y_position, float z_shift, float e_shift, float /*e_shift_late*/)
-{
+    int counterBeep = 0;
+    lcd_display_message_fullscreen_P(_i("Remove old filament and press the knob to start loading new filament.")); ////MSG_REMOVE_OLD_FILAMENT c=20 r=5
+    bool bFirst = true;
+
+    while (!lcd_clicked()) {
+        manage_heater();
+        manage_inactivity(true);
+
+#if BEEPER > 0
+        if (counterBeep == 500) {
+            counterBeep = 0;
+        }
+        SET_OUTPUT(BEEPER);
+        if (counterBeep == 0) {
+            if ((eSoundMode == e_SOUND_MODE_BLIND) || (eSoundMode == e_SOUND_MODE_LOUD) || ((eSoundMode == e_SOUND_MODE_ONCE) && bFirst)) {
+                bFirst = false;
+                WRITE(BEEPER, HIGH);
+            }
+        }
+        if (counterBeep == 20) {
+            WRITE(BEEPER, LOW);
+        }
+
+        counterBeep++;
+#endif // BEEPER > 0
+
+        delay_keep_alive(4);
+    }
+    WRITE(BEEPER, LOW);
+}
+
+/**
+ * @brief Handling of unload when using MMU with M600
+ * A fullscreen message showing "Unloading Filament x"
+ * should be shown on the LCD and LCD updates should be
+ * are disabled in the meantime.
+ */ 
+static void mmu_M600_unload_filament() {
+    if (MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN) return;
+
+    lcd_update_enable(false);
+    lcd_clear();
+    lcd_puts_at_P(0, 1, _T(MSG_UNLOADING_FILAMENT));
+    lcd_print(' ');
+    lcd_print(MMU2::mmu2.get_current_tool() + 1);
+
+    // unload just current filament for multimaterial printers (used also in M702)
+    MMU2::mmu2.unload();
+    lcd_update_enable(true);
+}
+
+/// @brief load filament for mmu v2
+/// @par nozzle_temp nozzle temperature to load filament
+static void mmu_M600_load_filament(bool automatic, float nozzle_temp) {
+    uint8_t slot;
+    if (automatic) {
+        slot = SpoolJoin::spooljoin.nextSlot();
+    } else {
+        // Only ask for the slot if automatic/SpoolJoin is off
+        slot = choose_menu_P(_T(MSG_SELECT_EXTRUDER), _T(MSG_EXTRUDER));
+    }
+
+    setTargetHotend(nozzle_temp, active_extruder);
+
+    MMU2::mmu2.load_filament_to_nozzle(slot);
+
+    load_filament_final_feed(); // @@TODO verify
     st_synchronize();
-    float lastpos[4];
+}
 
-    prusa_statistics(22);
+static void gcode_M600(bool automatic, float x_position, float y_position, float z_shift, float e_shift, float /*e_shift_late*/) {
+    st_synchronize();
+    float lastpos[4];
 
+        prusa_statistics(22);
+    
     //First backup current position and settings
     int feedmultiplyBckp = feedmultiply;
     float HotendTempBckp = degTargetHotend(active_extruder);
     int fanSpeedBckp = fanSpeed;
 
-    lastpos[X_AXIS] = current_position[X_AXIS];
-    lastpos[Y_AXIS] = current_position[Y_AXIS];
-    lastpos[Z_AXIS] = current_position[Z_AXIS];
-    lastpos[E_AXIS] = current_position[E_AXIS];
+    memcpy(lastpos, current_position, sizeof(lastpos));
 
-    //Retract E
+    // Retract E
     current_position[E_AXIS] += e_shift;
     plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED);
     st_synchronize();
 
-    //Lift Z
-    current_position[Z_AXIS] += z_shift;
-    clamp_to_software_endstops(current_position);
-    plan_buffer_line_curposXYZE(FILAMENTCHANGE_ZFEED);
-    st_synchronize();
+    // Raise the Z axis
+    raise_z(z_shift);
 
-    //Move XY to side
+    // Move XY to side
     current_position[X_AXIS] = x_position;
     current_position[Y_AXIS] = y_position;
     plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
     st_synchronize();
 
-    //Beep, manage nozzle heater and wait for user to start unload filament
-    if(!mmu_enabled) M600_wait_for_user(HotendTempBckp);
-
-    lcd_change_fil_state = 0;
+    // Beep, manage nozzle heater and wait for user to start unload filament
+    if (!MMU2::mmu2.Enabled())
+        M600_wait_for_user(HotendTempBckp);
 
     // Unload filament
-    if (mmu_enabled) extr_unload();	//unload just current filament for multimaterial printers (used also in M702)
-    else unload_filament(true); //unload filament for single material (used also in M702)
-    //finish moves
-    st_synchronize();
-
-    if (!mmu_enabled)
+    if (MMU2::mmu2.Enabled())
+        mmu_M600_unload_filament();
+    else
+        unload_filament(FILAMENTCHANGE_FINALRETRACT, true); // unload filament for single material (used also in M702)
+    st_synchronize();          // finish moves
     {
-        KEEPALIVE_STATE(PAUSED_FOR_USER);
-        lcd_change_fil_state = lcd_show_fullscreen_message_yes_no_and_wait_P(
-                _i("Was filament unload successful?"), ////MSG_UNLOAD_SUCCESSFUL c=20 r=2
-                false, true);
-        if (lcd_change_fil_state == 0)
+        FSensorBlockRunout fsBlockRunout;
+        
+        if (!MMU2::mmu2.Enabled())
         {
-			lcd_clear();
-			lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT));
-			current_position[X_AXIS] -= 100;
-			plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
-			st_synchronize();
-			lcd_show_fullscreen_message_and_wait_P(_i("Please open idler and remove filament manually."));////MSG_CHECK_IDLER c=20 r=5
-        }
-    }
-
-    if (mmu_enabled)
-    {
-        if (!automatic) {
-            if (saved_printing) mmu_eject_filament(mmu_extruder, false); //if M600 was invoked by filament senzor (FINDA) eject filament so user can easily remove it
-            mmu_M600_wait_and_beep();
-            if (saved_printing) {
-
+            KEEPALIVE_STATE(PAUSED_FOR_USER);
+            uint8_t choice =
+                lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Was filament unload successful?"), false, LCD_LEFT_BUTTON_CHOICE); ////MSG_UNLOAD_SUCCESSFUL c=20 r=2
+            if (choice == LCD_MIDDLE_BUTTON_CHOICE) {
                 lcd_clear();
                 lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT));
-
-                mmu_command(MmuCmd::R0);
-                manage_response(false, false);
+                current_position[X_AXIS] -= 100;
+                plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
+                st_synchronize();
+                lcd_show_fullscreen_message_and_wait_P(_i("Please open idler and remove filament manually.")); ////MSG_CHECK_IDLER c=20 r=5
             }
+            M600_load_filament();
+        }
+        else // MMU is enabled
+        {
+            if (!automatic) {
+                if (saved_printing){
+                    // if M600 was invoked by filament senzor (FINDA) eject filament so user can easily remove it
+                    MMU2::mmu2.eject_filament(MMU2::mmu2.get_current_tool(), false);
+                }
+                mmu_M600_wait_and_beep();
+                if (saved_printing) {
+                    lcd_clear();
+                    lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT));
+//@@TODO                mmu_command(MmuCmd::R0);
+//                manage_response(false, false);
+                }
+            }
+            mmu_M600_load_filament(automatic, HotendTempBckp);
+        }
+        if (!automatic)
+            M600_check_state(HotendTempBckp);
+    
+        lcd_update_enable(true);
+    
+        // Not let's go back to print
+        fanSpeed = fanSpeedBckp;
+    
+        // Feed a little of filament to stabilize pressure
+        if (!automatic) {
+            current_position[E_AXIS] += FILAMENTCHANGE_RECFEED;
+            plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED);
         }
-        mmu_M600_load_filament(automatic, HotendTempBckp);
-    }
-    else
-        M600_load_filament();
-
-    if (!automatic) M600_check_state(HotendTempBckp);
 
-		lcd_update_enable(true);
+        // Move XY back
+        plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED, active_extruder);
+        st_synchronize();
 
-    //Not let's go back to print
-    fanSpeed = fanSpeedBckp;
+        // Move Z back
+        plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED, active_extruder);
+        st_synchronize();
 
-    //Feed a little of filament to stabilize pressure
-    if (!automatic)
-    {
-        current_position[E_AXIS] += FILAMENTCHANGE_RECFEED;
-        plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED);
+        // Set E position to original
+        plan_set_e_position(lastpos[E_AXIS]);
+    
+        memcpy(current_position, lastpos, sizeof(lastpos));
+        set_destination_to_current();
+    
+        // Recover feed rate
+        feedmultiply = feedmultiplyBckp;
+        char cmd[9];
+        sprintf_P(cmd, PSTR("M220 S%i"), feedmultiplyBckp);
+        enquecommand(cmd);
+        
     }
-
-    //Move XY back
-    plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS],
-            FILAMENTCHANGE_XYFEED, active_extruder);
-    st_synchronize();
-    //Move Z back
-    plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS],
-            FILAMENTCHANGE_ZFEED, active_extruder);
-    st_synchronize();
-
-    //Set E position to original
-    plan_set_e_position(lastpos[E_AXIS]);
-
-    memcpy(current_position, lastpos, sizeof(lastpos));
-    set_destination_to_current();
-
-    //Recover feed rate
-    feedmultiply = feedmultiplyBckp;
-    char cmd[9];
-    sprintf_P(cmd, PSTR("M220 S%i"), feedmultiplyBckp);
-    enquecommand(cmd);
-
-#ifdef IR_SENSOR
-	//this will set fsensor_watch_autoload to correct value and prevent possible M701 gcode enqueuing when M600 is finished
-	fsensor_check_autoload();
-#endif //IR_SENSOR
-
+    
     lcd_setstatuspgm(MSG_WELCOME);
     custom_message_type = CustomMsg::Status;
 }
 
-void gcode_M701()
-{
-	printf_P(PSTR("gcode_M701 begin\n"));
-
+void gcode_M701(float fastLoadLength, uint8_t mmuSlotIndex){
+    FSensorBlockRunout fsBlockRunout;
+    
     prusa_statistics(22);
 
-	if (mmu_enabled) 
-	{
-		extr_adj(tmp_extruder);//loads current extruder
-		mmu_extruder = tmp_extruder;
-	}
-	else
-	{
-		enable_z();
-		custom_message_type = CustomMsg::FilamentLoading;
-
-#ifdef FSENSOR_QUALITY
-		fsensor_oq_meassure_start(40);
-#endif //FSENSOR_QUALITY
-
-        const int feed_mm_before_raising = 30;
-        static_assert(feed_mm_before_raising <= FILAMENTCHANGE_FIRSTFEED);
+    if (MMU2::mmu2.Enabled() && mmuSlotIndex < MMU_FILAMENT_COUNT) {
+        MMU2::mmu2.load_filament_to_nozzle(mmuSlotIndex);
+    } else {
+        custom_message_type = CustomMsg::FilamentLoading;
+        lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
 
-		lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
-		current_position[E_AXIS] += FILAMENTCHANGE_FIRSTFEED - feed_mm_before_raising;
-		plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); //fast sequence
-		st_synchronize();
+        current_position[E_AXIS] += fastLoadLength;
+        plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); //fast sequence
 
-        raise_z_above(MIN_Z_FOR_LOAD, false);
-		current_position[E_AXIS] += feed_mm_before_raising;
-		plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); //fast sequence
-		
-		load_filament_final_feed(); //slow sequence
-		st_synchronize();
+        load_filament_final_feed(); // slow sequence
+        st_synchronize();
 
-    Sound_MakeCustom(50,500,false);
+        Sound_MakeCustom(50, 500, false);
 
-		if (!farm_mode && loading_flag) {
-			lcd_load_filament_color_check();
-		}
-		lcd_update_enable(true);
-		lcd_update(2);
-		lcd_setstatuspgm(MSG_WELCOME);
-		disable_z();
-		loading_flag = false;
-		custom_message_type = CustomMsg::Status;
+        if (!farm_mode && loading_flag) {
+            lcd_load_filament_color_check();
+        }
+        lcd_update_enable(true);
+        lcd_update(2);
+        lcd_setstatuspgm(MSG_WELCOME);
+        loading_flag = false;
+        custom_message_type = CustomMsg::Status;
+    }
 
-#ifdef FSENSOR_QUALITY
-        fsensor_oq_meassure_stop();
+    eFilamentAction = FilamentAction::None;
+}
 
-        if (!fsensor_oq_result())
-        {
-            bool disable = lcd_show_fullscreen_message_yes_no_and_wait_P(_n("Fil. sensor response is poor, disable it?"), false, true);
-            lcd_update_enable(true);
-            lcd_update(2);
-            if (disable)
-                fsensor_disable();
+// Common gcode shared by the gcodes. This saves some flash memory
+static void gcodes_M704_M705_M706(uint16_t gcode)
+{
+    uint8_t mmuSlotIndex = 0xffU;
+    if (MMU2::mmu2.Enabled() && code_seen('P'))
+    {
+        mmuSlotIndex = code_value_uint8();
+        if (mmuSlotIndex < MMU_FILAMENT_COUNT) {
+            switch (gcode)
+            {
+            case 704:
+                MMU2::mmu2.load_filament(mmuSlotIndex);
+                break;
+            case 705:
+                MMU2::mmu2.eject_filament(mmuSlotIndex, false);
+                break;
+            case 706:
+#ifdef MMU_HAS_CUTTER
+                if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0){
+                    MMU2::mmu2.cut_filament(mmuSlotIndex);
+                }
+#endif // MMU_HAS_CUTTER
+                break;
+            default:
+                break;
+            }
         }
-#endif //FSENSOR_QUALITY
-	}
+    }
 }
+
 /**
  * @brief Get serial number from 32U2 processor
  *
@@ -4260,7 +4288,7 @@ void process_commands()
         }
 		else if (code_seen_P(PSTR("MMURES"))) // PRUSA MMURES
 		{
-			mmu_reset();
+			MMU2::mmu2.Reset(MMU2::MMU2::Software);
 		}
 		else if (code_seen_P(PSTR("RESET"))) { // PRUSA RESET
 #ifdef WATCHDOG
@@ -4880,9 +4908,9 @@ eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,0xFFFF);
             break;
         }
         lcd_show_fullscreen_message_and_wait_P(_i("Stable ambient temperature 21-26C is needed a rigid stand is required."));////MSG_TEMP_CAL_WARNING c=20 r=4
-        bool result = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false, false);
+        uint8_t result = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false);
 
-        if (result)
+        if (result == LCD_LEFT_BUTTON_CHOICE)
         {
             current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
             plan_buffer_line_curposXYZE(3000 / 60);
@@ -5430,24 +5458,32 @@ eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,0xFFFF);
 	### M24 - Start SD print <a href="https://reprap.org/wiki/G-code#M24:_Start.2Fresume_SD_print">M24: Start/resume SD print</a>
     */
     case 24:
-	  if (isPrintPaused)
-          lcd_resume_print();
-      else
+    if (isPrintPaused)
+      lcd_resume_print();
+    else
+    {
+      if (!card.get_sdpos())
       {
-          if (!card.get_sdpos())
-          {
               // A new print has started from scratch, reset stats
               failstats_reset_print();
               sdpos_atomic = 0;
 #ifndef LA_NOCOMPAT
-              la10c_reset();
+        la10c_reset();
 #endif
-          }
+      }
 
-          card.startFileprint();
-          starttime=_millis();
+      card.startFileprint();
+      starttime=_millis();
+      if (MMU2::mmu2.Enabled())
+      {
+        if (MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent())
+        { // Filament only half way into the PTFE. Unload the filament.
+          MMU2::mmu2.unload();
+          // Tx and Tc gcodes take care of loading the filament to the nozzle.
+        }
       }
-	  break;
+    }
+    break;
 
     /*!
 	### M26 - Set SD index <a href="https://reprap.org/wiki/G-code#M26:_Set_SD_position">M26: Set SD position</a>
@@ -6505,9 +6541,9 @@ Sigma_Exit:
               axis_steps_per_sqr_second[i] *= factor;
             }
             cs.axis_steps_per_unit[i] = value;
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-            fsensor_set_axis_steps_per_unit(value);
-#endif
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+            fsensor.init();
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
           }
           else {
             cs.axis_steps_per_unit[i] = code_value();
@@ -7611,14 +7647,13 @@ Sigma_Exit:
 	{
 		// currently three different materials are needed (default, flex and PVA)
 		// add storing this information for different load/unload profiles etc. in the future
-		// firmware does not wait for "ok" from mmu
-		if (mmu_enabled)
+		if (MMU2::mmu2.Enabled())
 		{
 			uint8_t extruder = 255;
 			uint8_t filament = FILAMENT_UNDEFINED;
 			if(code_seen('E')) extruder = code_value_uint8();
 			if(code_seen('F')) filament = code_value_uint8();
-			mmu_set_filament_type(extruder, filament);
+			MMU2::mmu2.set_filament_type(extruder, filament);
 		}
 	}
 	break;
@@ -7785,7 +7820,7 @@ Sigma_Exit:
       
     - `X`    - X position, default 211
     - `Y`    - Y position, default 0
-    - `Z`    - relative lift Z, default 2.
+    - `Z`    - relative lift Z, default MIN_Z_FOR_SWAP.
     - `E`    - initial retract, default -2
     - `L`    - later retract distance for removal, default -80
     - `AUTO` - Automatically (only with MMU)
@@ -7796,7 +7831,7 @@ Sigma_Exit:
 
 		float x_position = current_position[X_AXIS];
 		float y_position = current_position[Y_AXIS];
-		float z_shift = 0; // is it necessary to be a float?
+		float z_shift = MIN_Z_FOR_SWAP;
 		float e_shift_init = 0;
 		float e_shift_late = 0;
 		bool automatic = false;
@@ -7825,16 +7860,10 @@ Sigma_Exit:
 		  #endif	
 		}
 
-        //Lift Z
-        if(code_seen('Z'))
-        {
-          z_shift = code_value();
-        }
-        else
-        {
-			z_shift = gcode_M600_filament_change_z_shift<uint8_t>();
-        }
-		//Move XY to side
+        // Z lift. For safety only allow positive values
+        if (code_seen('Z')) z_shift = fabs(code_value());
+
+        //Move XY to side
         if(code_seen('X'))
         {
           x_position = code_value();
@@ -7856,7 +7885,7 @@ Sigma_Exit:
           #endif
         }
 
-		if (mmu_enabled && code_seen_P(PSTR("AUTO")))
+		if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO")))
 			automatic = true;
 
 		gcode_M600(automatic, x_position, y_position, z_shift, e_shift_init, e_shift_late);
@@ -8103,6 +8132,8 @@ Sigma_Exit:
                          {
                          uint16_t nPrinterModel;
                          nPrinterModel=(uint16_t)code_value_long();
+                         // based on current state of MMU (active/stopped/connecting) perform a runtime update of the printer type
+                         fSetMmuMode(MMU2::mmu2.Enabled());
                          printer_model_check(nPrinterModel);
                          }
                     else if(code_seen('Q'))
@@ -8110,7 +8141,10 @@ Sigma_Exit:
                     break;
                case ClPrintChecking::_Smodel:     // ~ .3
                     if(code_seen('P'))
-                         printer_smodel_check(strchr_pointer);
+                    {
+                        fSetMmuMode(MMU2::mmu2.Enabled());
+                        printer_smodel_check(strchr_pointer);
+                    }
                     else if(code_seen('Q'))
                          SERIAL_PROTOCOLLNRPGM(sPrinterName);
                     break;
@@ -8441,10 +8475,10 @@ Sigma_Exit:
 						cs.axis_steps_per_unit[i] /= fac;
 						position[i] /= fac;
 					}
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-                    if (i == E_AXIS)
-                        fsensor_set_axis_steps_per_unit(cs.axis_steps_per_unit[i]);
-#endif
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+					if (i == E_AXIS)
+						fsensor.init();
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 				}
 			}
 		}
@@ -8495,45 +8529,224 @@ Sigma_Exit:
     break;
 
     /*!
-    ### M701 - Load filament <a href="https://reprap.org/wiki/G-code#M701:_Load_filament">M701: Load filament</a>
+    ### M701 - Load filament to extruder <a href="https://reprap.org/wiki/G-code#M701:_Load_filament">M701: Load filament</a>
+    Load filament into the active extruder.
     #### Usage
 
-        M701 [ E | T ]
+        M701 [ P | T | L | Z ]
 
     #### Parameters
-    - `E` - ID of filament to load, ranges from 0 to 4
-    - `T` - Alias of `E`. Used for compatibility with Marlin
+    - `P` - n index of MMU slot (zero based, so 0-4 like T0 and T4)
+    - `T` - Alias of `P`. Used for compatibility with Marlin
+    - `L` - Extrude distance for insertion (positive value)(manual reload)
+    - `Z` - Move the Z axis by this distance. Default value MIN_Z_FOR_LOAD
     */
-	case 701:
-	{
-		if (mmu_enabled && (code_seen('E') || code_seen('T')))
-			tmp_extruder = code_value_uint8();
-		gcode_M701();
-	}
-	break;
+    case 701:
+    {
+        uint8_t mmuSlotIndex = 0xffU;
+        float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU
+        float z_target = MIN_Z_FOR_LOAD;
+        if( MMU2::mmu2.Enabled() )
+        {
+            if( code_seen('P') || code_seen('T') ) {
+                mmuSlotIndex = code_value_uint8();
+            }
+        }
+
+        if (code_seen('L')) fastLoadLength = code_value();
+
+        // Z lift. For safety only allow positive values
+        if (code_seen('Z')) z_target = fabs(code_value());
+
+        // Raise the Z axis
+        float delta = raise_z(z_target);
+
+        // Load filament
+        gcode_M701(fastLoadLength, mmuSlotIndex);
+
+        // Restore Z axis
+        raise_z(-delta);
+    }
+    break;
 
     /*!
     ### M702 - Unload filament <a href="https://reprap.org/wiki/G-code#M702:_Unload_filament">G32: Undock Z Probe sled</a>
     #### Usage
     
-        M702 [ C ]
+        M702 [ U | Z ]
     
     #### Parameters
-    - `C` - Unload just current filament
-    - without any parameters unload all filaments
+    - `U` - Retract distance for removal (manual reload). Default value is 0.
+    - `Z` - Move the Z axis by this distance. Default value MIN_Z_FOR_UNLOAD.
     */
-	case 702:
-	{
-		if (code_seen('C')) {
-			if(mmu_enabled) extr_unload(); //! if "C" unload current filament; if mmu is not present no action is performed
-		}
-		else {
-			if(mmu_enabled) extr_unload(); //! unload current filament
-			else unload_filament();
-		}
-	}
-	break;
+    case 702:
+    {
+        float z_target = MIN_Z_FOR_UNLOAD;
+        float unloadLength = FILAMENTCHANGE_FINALRETRACT;
+        if (code_seen('U')) unloadLength = code_value();
+
+        // For safety only allow positive values
+        if (code_seen('Z')) z_target = fabs(code_value());
+
+        // Raise the Z axis
+        float delta = raise_z(z_target);
+
+        // Unload filament
+        if (MMU2::mmu2.Enabled())  MMU2::mmu2.unload();
+        else unload_filament(unloadLength);
+
+        // Restore Z axis
+        raise_z(-delta);
+    }
+    break;
+
+    /*!
+    ### M704 - Load to MMU <a href="https://reprap.org/wiki/G-code#M704:_Load_to_MMU">M704: Load to MMU</a>
+    #### Usage
+
+        M704 [ P ]
+
+    #### Parameters
+    - `P` - n index of slot (zero based, so 0-4 like T0 and T4)
+    */
+    case 704:
+    {
+        gcodes_M704_M705_M706(704);
+    }
+    break;
+
+    /*!
+    ### M705 - Eject filament <a href="https://reprap.org/wiki/G-code#M705:_Eject_filament">M705: Eject filament</a>
+    #### Usage
+
+        M705 [ P ]
 
+    #### Parameters
+    - `P` - n index of slot (zero based, so 0-4 like T0 and T4)
+    */
+    case 705:
+    {
+        gcodes_M704_M705_M706(705);
+    }
+    break;
+
+
+    /*!
+    ### M706 - Cut filament <a href="https://reprap.org/wiki/G-code#M706:_Cut_filament">M706: Cut filament</a>
+    #### Usage
+
+        M706 [ P ]
+
+    #### Parameters
+    - `P` - n index of slot (zero based, so 0-4 like T0 and T4)
+    */
+    case 706:
+    {
+        gcodes_M704_M705_M706(706);
+    }
+    break;
+
+    /*!
+    ### M707 - Read from MMU register <a href="https://reprap.org/wiki/G-code#M707:_Read_from_MMU_register">M707: Read from MMU register</a>
+    #### Usage
+
+        M707 [ A ]
+
+    #### Parameters
+    - `A` - Address of register in hexidecimal.
+
+    #### Example
+
+    M707 A0x1b - Read a 8bit integer from register 0x1b and prints the result onto the serial line.
+
+    Does nothing if the A parameter is not present or if MMU is not enabled.
+
+    */
+    case 707: {
+        if ( MMU2::mmu2.Enabled() ) {
+            if( code_seen('A') ) {
+                MMU2::mmu2.ReadRegister(uint8_t(strtol(strchr_pointer+1, NULL, 16)));
+            }
+        }
+    } break;
+
+    /*!
+    ### M708 - Write to MMU register <a href="https://reprap.org/wiki/G-code#M708:_Write_to_MMU_register">M707: Write to MMU register</a>
+    #### Usage
+
+        M708 [ A | X ]
+
+    #### Parameters
+    - `A` - Address of register in hexidecimal.
+    - `X` - Data to write (16-bit integer). Default value 0.
+
+    #### Example
+    M708 A0x1b X05 - Write to register 0x1b the value 05.
+
+    Does nothing if A parameter is missing or if MMU is not enabled.
+    */
+    case 708: {
+        if ( MMU2::mmu2.Enabled() ){
+            uint8_t addr = 0;
+            if( code_seen('A') ) {
+                addr = uint8_t(strtol(strchr_pointer+1, NULL, 16));
+            }
+            uint16_t data = 0;
+            if( code_seen('X') ) {
+                data = code_value_short();
+            }
+            if(addr){
+                MMU2::mmu2.WriteRegister(addr, data);
+            }
+        }
+    } break;
+
+    /*!
+    ### M709 - MMU reset <a href="https://reprap.org/wiki/G-code#M709:_MMU_reset">M709: MMU reset</a>
+    The MK3S cannot not power off the MMU, for that reason the functionality is not supported.
+    #### Usage
+
+        M709 [ X ]
+
+    #### Parameters
+    - `X` - Reset MMU (0:soft reset | 1:hardware reset)
+
+    #### Example
+
+    M709 X0 - issue an X0 command via communication into the MMU (soft reset)
+
+    M709 X1 - toggle the MMU's reset pin (hardware reset)
+
+    */
+    case 709:
+    {
+        if (MMU2::mmu2.Enabled() && code_seen('X'))
+        {
+            switch (code_value_uint8())
+            {
+            case 0:
+                MMU2::mmu2.Reset(MMU2::MMU2::Software);
+                break;
+            case 1:
+                MMU2::mmu2.Reset(MMU2::MMU2::ResetPin);
+                break;
+            default:
+                break;
+            }
+        }
+    }
+    break;
+
+    /*!
+    ### M999 - Restart after being stopped <a href="https://reprap.org/wiki/G-code#M999:_Restart_after_being_stopped_by_error">M999: Restart after being stopped by error</a>
+    @todo Usually doesn't work. Should be fixed or removed. Most of the time, if `Stopped` it set, the print fails and is unrecoverable.
+    */
+    case 999:
+      Stopped = false;
+      lcd_reset_alert_level();
+//@@TODO      gcode_LastN = Stopped_gcode_LastN;
+      FlushSerialRequestResend();
+    break;
 	/*!
 	#### End of M-Commands
     */
@@ -8555,139 +8768,8 @@ Sigma_Exit:
   @n Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load.
   @n Tc Load to nozzle after filament was prepared by Tc and extruder nozzle is already heated.
   */
-  else if(code_seen('T'))
-  {
-      static const char duplicate_Tcode_ignored[] PROGMEM = "Duplicate T-code ignored.";
-      
-      int index;
-      bool load_to_nozzle = false;
-      for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++);
-
-      *(strchr_pointer + index) = tolower(*(strchr_pointer + index));
-
-      if ((*(strchr_pointer + index) < '0' || *(strchr_pointer + index) > '4') && *(strchr_pointer + index) != '?' && *(strchr_pointer + index) != 'x' && *(strchr_pointer + index) != 'c') {
-          SERIAL_ECHOLNPGM("Invalid T code.");
-      }
-	  else if (*(strchr_pointer + index) == 'x'){ //load to bondtech gears; if mmu is not present do nothing
-		if (mmu_enabled)
-		{
-			tmp_extruder = choose_menu_P(_T(MSG_SELECT_FILAMENT), _T(MSG_FILAMENT));
-			if ((tmp_extruder == mmu_extruder) && mmu_fil_loaded) //dont execute the same T-code twice in a row
-			{
-				puts_P(duplicate_Tcode_ignored);
-			}
-			else
-			{
-				st_synchronize();
-				mmu_command(MmuCmd::T0 + tmp_extruder);
-				manage_response(true, true, MMU_TCODE_MOVE);
-			}
-		}
-	  }
-	  else if (*(strchr_pointer + index) == 'c') { //load to from bondtech gears to nozzle (nozzle should be preheated)
-	  	if (mmu_enabled) 
-		{
-			st_synchronize();
-			mmu_continue_loading(usb_timer.running()  || (lcd_commands_type == LcdCommands::Layer1Cal));
-			mmu_extruder = tmp_extruder; //filament change is finished
-			mmu_load_to_nozzle();
-		}
-	  }
-      else {
-          if (*(strchr_pointer + index) == '?')
-          {
-              if(mmu_enabled)
-              {
-                  tmp_extruder = choose_menu_P(_T(MSG_SELECT_FILAMENT), _T(MSG_FILAMENT));
-                  load_to_nozzle = true;
-              } else
-              {
-                  tmp_extruder = choose_menu_P(_T(MSG_SELECT_EXTRUDER), _T(MSG_EXTRUDER));
-              }
-          }
-          else {
-              tmp_extruder = code_value();
-              if (mmu_enabled && lcd_autoDepleteEnabled())
-              {
-                  tmp_extruder = ad_getAlternative(tmp_extruder);
-              }
-          }
-          st_synchronize();
-
-          if (mmu_enabled)
-          {
-              if ((tmp_extruder == mmu_extruder) && mmu_fil_loaded) //dont execute the same T-code twice in a row
-              {
-                  puts_P(duplicate_Tcode_ignored);
-              }
-			  else
-			  {
-#if defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
-			      if (EEPROM_MMU_CUTTER_ENABLED_always == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
-                  {
-                      mmu_command(MmuCmd::K0 + tmp_extruder);
-                      manage_response(true, true, MMU_UNLOAD_MOVE);
-                  }
-#endif //defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
-				  mmu_command(MmuCmd::T0 + tmp_extruder);
-				  manage_response(true, true, MMU_TCODE_MOVE);
-		          mmu_continue_loading(usb_timer.running()  || (lcd_commands_type == LcdCommands::Layer1Cal));
-
-				  mmu_extruder = tmp_extruder; //filament change is finished
-
-				  if (load_to_nozzle)// for single material usage with mmu
-				  {
-					  mmu_load_to_nozzle();
-				  }
-			  }
-          }
-          else
-          {
-              if (tmp_extruder >= EXTRUDERS) {
-                  SERIAL_ECHO_START;
-                  SERIAL_ECHO('T');
-                  SERIAL_PROTOCOLLN((int)tmp_extruder);
-                  SERIAL_ECHOLNRPGM(_n("Invalid extruder"));////MSG_INVALID_EXTRUDER
-              }
-              else {
-#if EXTRUDERS > 1
-                  bool make_move = false;
-#endif
-                  if (code_seen('F')) {
-#if EXTRUDERS > 1
-                      make_move = true;
-#endif
-                      next_feedrate = code_value();
-                      if (next_feedrate > 0.0) {
-                          feedrate = next_feedrate;
-                      }
-                  }
-#if EXTRUDERS > 1
-                  if (tmp_extruder != active_extruder) {
-                      // Save current position to return to after applying extruder offset
-                      set_destination_to_current();
-                      // Offset extruder (only by XY)
-                      int i;
-                      for (i = 0; i < 2; i++) {
-                          current_position[i] = current_position[i] -
-                                  extruder_offset[i][active_extruder] +
-                                  extruder_offset[i][tmp_extruder];
-                      }
-                      // Set the new active extruder and position
-                      active_extruder = tmp_extruder;
-                      plan_set_position_curposXYZE();
-                      // Move to the old position if 'F' was in the parameters
-                      if (make_move) {
-                          prepare_move();
-                      }
-                  }
-#endif
-                  SERIAL_ECHO_START;
-                  SERIAL_ECHORPGM(_n("Active Extruder: "));////MSG_ACTIVE_EXTRUDER
-                  SERIAL_PROTOCOLLN((int)active_extruder);
-              }
-          }
-      }
+  else if(code_seen('T')){
+        TCodes(strchr_pointer, code_value());
   } // end if(code_seen('T')) (end of T codes)
   /*!
   #### End of T-Codes
@@ -9075,7 +9157,7 @@ Sigma_Exit:
 		dcode_2130(); break;
 #endif //TMC2130
 
-#if (defined (FILAMENT_SENSOR) && defined(PAT9125))
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
     /*!
     ### D9125 - PAT9125 filament sensor <a href="https://reprap.org/wiki/G-code#D9:_Read.2FWrite_ADC">D9125: PAT9125 filament sensor</a>
@@ -9093,7 +9175,7 @@ Sigma_Exit:
     */
 	case 9125:
 		dcode_9125(); break;
-#endif //FILAMENT_SENSOR
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 #endif //DEBUG_DCODES
 
@@ -9397,133 +9479,13 @@ static void handleSafetyTimer()
 }
 #endif //SAFETYTIMER
 
-#ifdef IR_SENSOR_ANALOG
-#define FS_CHECK_COUNT 16
-/// Switching mechanism of the fsensor type.
-/// Called from 2 spots which have a very similar behavior
-/// 1: ClFsensorPCB::_Old -> ClFsensorPCB::_Rev04 and print _i("FS v0.4 or newer")
-/// 2: ClFsensorPCB::_Rev04 -> oFsensorPCB=ClFsensorPCB::_Old and print _i("FS v0.3 or older")
-void manage_inactivity_IR_ANALOG_Check(uint16_t &nFSCheckCount, ClFsensorPCB isVersion, ClFsensorPCB switchTo, const char *statusLineTxt_P) {
-    bool bTemp = (!CHECK_ALL_HEATERS);
-    bTemp = bTemp && (menu_menu == lcd_status_screen);
-    bTemp = bTemp && ((oFsensorPCB == isVersion) || (oFsensorPCB == ClFsensorPCB::_Undef));
-    bTemp = bTemp && fsensor_enabled;
-    if (bTemp) {
-        nFSCheckCount++;
-        if (nFSCheckCount > FS_CHECK_COUNT) {
-            nFSCheckCount = 0; // not necessary
-            oFsensorPCB = switchTo;
-            eeprom_update_byte((uint8_t *)EEPROM_FSENSOR_PCB, (uint8_t)oFsensorPCB);
-            printf_IRSensorAnalogBoardChange();
-            lcd_setstatuspgm(statusLineTxt_P);
-        }
-    } else {
-        nFSCheckCount = 0;
-    }
-}
-#endif
-
 void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h
 {
 #ifdef FILAMENT_SENSOR
-bool bInhibitFlag = false;
-#ifdef IR_SENSOR_ANALOG
-static uint16_t nFSCheckCount=0;
-#endif // IR_SENSOR_ANALOG
-
-	if (mmu_enabled == false)
-	{
-//-//		if (mcode_in_progress != 600) //M600 not in progress
-		if (!printer_active()) bInhibitFlag=(menu_menu==lcd_menu_show_sensors_state); //Block Filament sensor actions if PRINTER is not active and Support::SensorInfo menu active
-#ifdef IR_SENSOR_ANALOG
-		bInhibitFlag=bInhibitFlag||bMenuFSDetect; // Block Filament sensor actions if Settings::HWsetup::FSdetect menu active
-#endif // IR_SENSOR_ANALOG
-		if ((mcode_in_progress != 600) && (eFilamentAction != FilamentAction::AutoLoad) && (!bInhibitFlag) && (menu_menu != lcd_move_e)) //M600 not in progress, preHeat @ autoLoad menu not active
-		{
-			if (!moves_planned() && !IS_SD_PRINTING && !usb_timer.running() && (lcd_commands_type != LcdCommands::Layer1Cal) && ! eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
-			{
-#ifdef IR_SENSOR_ANALOG
-				static uint16_t minVolt = Voltage2Raw(6.F), maxVolt = 0;
-				// detect min-max, some long term sliding window for filtration may be added
-				// avoiding floating point operations, thus computing in raw
-				if( current_voltage_raw_IR > maxVolt )maxVolt = current_voltage_raw_IR;
-				if( current_voltage_raw_IR < minVolt )minVolt = current_voltage_raw_IR;
-				
-#if 0 // Start: IR Sensor debug info
-				{ // debug print
-					static uint16_t lastVolt = ~0U;
-					if( current_voltage_raw_IR != lastVolt ){
-						printf_P(PSTR("fs volt=%4.2fV (min=%4.2f max=%4.2f)\n"), Raw2Voltage(current_voltage_raw_IR), Raw2Voltage(minVolt), Raw2Voltage(maxVolt) );
-						lastVolt = current_voltage_raw_IR;
-					}
-				}
-#endif // End: IR Sensor debug info
-				//! The trouble is, I can hold the filament in the hole in such a way, that it creates the exact voltage
-				//! to be detected as the new fsensor
-				//! We can either fake it by extending the detection window to a looooong time
-				//! or do some other countermeasures
-				
-				//! what we want to detect:
-				//! if minvolt gets below ~0.3V, it means there is an old fsensor
-				//! if maxvolt gets above 4.6V, it means we either have an old fsensor or broken cables/fsensor
-				//! So I'm waiting for a situation, when minVolt gets to range <0, 1.5> and maxVolt gets into range <3.0, 5>
-				//! If and only if minVolt is in range <0.3, 1.5> and maxVolt is in range <3.0, 4.6>, I'm considering a situation with the new fsensor
-				if( minVolt >= IRsensor_Ldiode_TRESHOLD && minVolt <= IRsensor_Lmax_TRESHOLD 
-				 && maxVolt >= IRsensor_Hmin_TRESHOLD && maxVolt <= IRsensor_Hopen_TRESHOLD
-				){
-					manage_inactivity_IR_ANALOG_Check(nFSCheckCount, ClFsensorPCB::_Old, ClFsensorPCB::_Rev04, _i("FS v0.4 or newer") ); ////MSG_FS_V_04_OR_NEWER c=18
-				} 
-				//! If and only if minVolt is in range <0.0, 0.3> and maxVolt is in range  <4.6, 5.0V>, I'm considering a situation with the old fsensor
-				//! Note, we are not relying on one voltage here - getting just +5V can mean an old fsensor or a broken new sensor - that's why
-				//! we need to have both voltages detected correctly to allow switching back to the old fsensor.
-				else if( minVolt < IRsensor_Ldiode_TRESHOLD 
-				 && maxVolt > IRsensor_Hopen_TRESHOLD && maxVolt <= IRsensor_VMax_TRESHOLD
-				){
-					manage_inactivity_IR_ANALOG_Check(nFSCheckCount, ClFsensorPCB::_Rev04, oFsensorPCB=ClFsensorPCB::_Old, _i("FS v0.3 or older")); ////MSG_FS_V_03_OR_OLDER c=18
-				}
-#endif // IR_SENSOR_ANALOG
-				if (fsensor_check_autoload())
-				{
-#ifdef PAT9125
-					fsensor_autoload_check_stop();
-#endif //PAT9125
-//-//					if ((int)degHotend0() > extrude_min_temp)
-if(0)
-					{
-						Sound_MakeCustom(50,1000,false);
-						loading_flag = true;
-						enquecommand_front_P((PSTR("M701")));
-					}
-					else
-					{
-/*
-						lcd_update_enable(false);
-						show_preheat_nozzle_warning();
-						lcd_update_enable(true);
-*/
-						eFilamentAction=FilamentAction::AutoLoad;
-						if(target_temperature[0] >= extrude_min_temp){
-							bFilamentPreheatState=true;
-//							mFilamentItem(target_temperature[0],target_temperature_bed);
-							menu_submenu(mFilamentItemForce);
-						} else {
-							menu_submenu(lcd_generic_preheat_menu);
-							lcd_timeoutToStatus.start();
-						}
-					}
-				}
-			}
-			else
-			{
-#ifdef PAT9125
-				fsensor_autoload_check_stop();
-#endif //PAT9125
-                if (fsensor_enabled && !saved_printing)
-                    fsensor_update();
-			}
-		}
-	}
-#endif //FILAMENT_SENSOR
+    if (fsensor.update()) {
+        lcd_draw_update = 1; //cause lcd update so that fsensor event polling can be done from the lcd draw routine.
+    }
+#endif
 
 #ifdef SAFETYTIMER
 	handleSafetyTimer();
@@ -9608,7 +9570,7 @@ if(0)
     }
   #endif
   check_axes_activity();
-  mmu_loop();
+  MMU2::mmu2.mmu_loop();
 
   // handle longpress
   if(lcd_longpress_trigger)
@@ -9864,23 +9826,9 @@ bool setTargetedHotend(int code, uint8_t &extruder)
       extruder = code_value_uint8();
     if(extruder >= EXTRUDERS) {
       SERIAL_ECHO_START;
-      switch(code){
-        case 104:
-          SERIAL_ECHORPGM(_n("M104 Invalid extruder "));////MSG_M104_INVALID_EXTRUDER
-          break;
-        case 105:
-          SERIAL_ECHORPGM(_n("M105 Invalid extruder "));////MSG_M105_INVALID_EXTRUDER
-          break;
-        case 109:
-          SERIAL_ECHORPGM(_n("M109 Invalid extruder "));////MSG_M109_INVALID_EXTRUDER
-          break;
-        case 218:
-          SERIAL_ECHORPGM(_n("M218 Invalid extruder "));////MSG_M218_INVALID_EXTRUDER
-          break;
-        case 221:
-          SERIAL_ECHORPGM(_n("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER
-          break;
-      }
+      serialprintPGM(PSTR("M"));
+      SERIAL_ECHO(code);
+      SERIAL_ECHOPGM(" Invalid extruder ");
       SERIAL_PROTOCOLLN((int)extruder);
       return true;
     }
@@ -10588,7 +10536,7 @@ void long_pause() //long pause print
     setAllTargetHotends(0);
 
     // Lift z
-    raise_z_above(current_position[Z_AXIS] + Z_PAUSE_LIFT, true);
+    raise_z(Z_PAUSE_LIFT);
 
     // Move XY to side
     if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
@@ -11318,7 +11266,6 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
     if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID;
 
     saved_feedmultiply2 = feedmultiply; //save feedmultiply
-	saved_active_extruder = active_extruder; //save active_extruder
 	saved_extruder_temperature = degTargetHotend(active_extruder);
 	saved_bed_temperature = degTargetBed();
 	saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
@@ -11366,6 +11313,16 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
   }
 }
 
+void restore_extruder_temperature_from_ram() {
+    if (degTargetHotend(active_extruder) != saved_extruder_temperature)
+    {
+        setTargetHotendSafe(saved_extruder_temperature, active_extruder);
+        heating_status = HeatingStatus::EXTRUDER_HEATING;
+        wait_for_heater(_millis(), active_extruder);
+        heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE;
+    }
+}
+
 //! @brief Restore print from ram
 //!
 //! Restore print saved by stop_and_save_print_to_ram(). Is blocking, restores
@@ -11388,17 +11345,8 @@ void restore_print_from_ram_and_continue(float e_move)
     // restore bed temperature (bed can be disabled during a thermal warning)
     if (degBed() != saved_bed_temperature)
         setTargetBed(saved_bed_temperature);
-
-	// restore active_extruder
-	active_extruder = saved_active_extruder;
 	fanSpeed = saved_fan_speed;
-	if (degTargetHotend(saved_active_extruder) != saved_extruder_temperature)
-	{
-		setTargetHotendSafe(saved_extruder_temperature, saved_active_extruder);
-		heating_status = HeatingStatus::EXTRUDER_HEATING;
-		wait_for_heater(_millis(), saved_active_extruder);
-		heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE;
-	}
+	restore_extruder_temperature_from_ram();
 	axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK;
 	float e = saved_pos[E_AXIS] - e_move;
 	plan_set_e_position(e);
@@ -11528,21 +11476,28 @@ void load_filament_final_feed()
 //! @par nozzle_temp nozzle temperature to load filament
 void M600_check_state(float nozzle_temp)
 {
-    lcd_change_fil_state = 0;
-    while (lcd_change_fil_state != 1)
+    uint8_t lcd_change_filament_state = 0;
+    while (lcd_change_filament_state != 1)
     {
-        lcd_change_fil_state = 0;
         KEEPALIVE_STATE(PAUSED_FOR_USER);
-        lcd_alright();
+        lcd_change_filament_state = lcd_alright();
         KEEPALIVE_STATE(IN_HANDLER);
-        switch(lcd_change_fil_state)
+        switch(lcd_change_filament_state)
         {
         // Filament failed to load so load it again
         case 2:
-            if (mmu_enabled)
-                mmu_M600_load_filament(false, nozzle_temp); //nonautomatic load; change to "wrong filament loaded" option?
-            else
+            if (MMU2::mmu2.Enabled()){
+                // Unload filament
+                mmu_M600_unload_filament();
+
+                // Ask to remove any old filament and load new
+                mmu_M600_wait_and_beep();
+
+                // After user clicks knob, MMU will load the filament
+                mmu_M600_load_filament(false, nozzle_temp);
+            } else {
                 M600_load_filament_movements();
+            }
             break;
 
         // Filament loaded properly but color is not clear
@@ -11660,46 +11615,23 @@ void M600_load_filament() {
 	//load_filament_time = _millis();
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
 
-#ifdef PAT9125
-	fsensor_autoload_check_start();
-#endif //PAT9125
 	while(!lcd_clicked())
 	{
 		manage_heater();
 		manage_inactivity(true);
 #ifdef FILAMENT_SENSOR
-		if (fsensor_check_autoload())
-		{
-      Sound_MakeCustom(50,1000,false);
+		if (fsensor.getFilamentLoadEvent()) {
+			Sound_MakeCustom(50,1000,false);
 			break;
 		}
 #endif //FILAMENT_SENSOR
 	}
-#ifdef PAT9125
-	fsensor_autoload_check_stop();
-#endif //PAT9125
 	KEEPALIVE_STATE(IN_HANDLER);
 
-#ifdef FSENSOR_QUALITY
-	fsensor_oq_meassure_start(70);
-#endif //FSENSOR_QUALITY
-
 	M600_load_filament_movements();
 
-      Sound_MakeCustom(50,1000,false);
-
-#ifdef FSENSOR_QUALITY
-	fsensor_oq_meassure_stop();
+	Sound_MakeCustom(50,1000,false);
 
-	if (!fsensor_oq_result())
-	{
-		bool disable = lcd_show_fullscreen_message_yes_no_and_wait_P(_n("Fil. sensor response is poor, disable it?"), false, true);
-		lcd_update_enable(true);
-		lcd_update(2);
-		if (disable)
-			fsensor_disable();
-	}
-#endif //FSENSOR_QUALITY
 	lcd_update_enable(false);
 }
 
@@ -11721,8 +11653,6 @@ void marlin_wait_for_click()
     KEEPALIVE_STATE(busy_state_backup);
 }
 
-#define FIL_LOAD_LENGTH 60
-
 #ifdef PSU_Delta
 bool bEnableForce_z;
 

+ 2 - 2
Firmware/Prusa_farm.cpp

@@ -7,7 +7,7 @@
 #include "conv2str.h"
 #include "util.h"
 #include "ultralcd.h"
-#include "fsensor.h" //to be converted to Filament_sensor.h...
+#include "Filament_sensor.h"
 
 #ifdef PRUSA_FARM
 uint8_t farm_mode = 0;
@@ -405,7 +405,7 @@ void farm_mode_init() {
 #ifdef FILAMENT_SENSOR
         //to be converted to Filament_sensor.h...
         //disabled filament autoload (PFW360)
-        fsensor_autoload_set(false);
+        fsensor.setAutoLoadEnabled(false);
 #endif //FILAMENT_SENSOR
         // ~ FanCheck -> on
         eeprom_update_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED, true);

+ 2 - 0
Firmware/Prusa_farm.h

@@ -10,6 +10,8 @@
 #define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring
 #define NC_BUTTON_LONG_PRESS 15 //time in s
 
+//#define FARM_CONNECT_MESSAGE
+
 #ifdef PRUSA_FARM
 extern uint8_t farm_mode;
 #else

+ 82 - 0
Firmware/SpoolJoin.cpp

@@ -0,0 +1,82 @@
+#include "SpoolJoin.h"
+#include "Marlin.h"
+#include "eeprom.h"
+#include "messages.h"
+#include "language.h"
+
+namespace SpoolJoin {
+
+SpoolJoin spooljoin;
+
+SpoolJoin::SpoolJoin()
+    : status(EEPROM::Unknown)
+    , currentMMUSlot(0)
+{
+}
+
+void SpoolJoin::updateSpoolJoinStatus(EEPROM newStatus)
+{
+    status = newStatus;
+    eeprom_write_byte((uint8_t*)EEPROM_SPOOL_JOIN, (uint8_t)status);
+}
+
+void SpoolJoin::initSpoolJoinStatus()
+{
+    EEPROM currentStatus = (EEPROM)eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN);
+    if( currentStatus == EEPROM::Empty)
+    {
+        // By default SpoolJoin is disabled
+        updateSpoolJoinStatus(EEPROM::Disabled);
+    } else {
+        updateSpoolJoinStatus(currentStatus);
+    }
+
+    // Useful information to see during bootup
+    SERIAL_ECHOPGM("SpoolJoin is ");
+    if (isSpoolJoinEnabled())
+    {
+        SERIAL_ECHOLNRPGM(_O(MSG_ON));
+    } else {
+        SERIAL_ECHOLNRPGM(_O(MSG_OFF));
+    }
+}
+
+void SpoolJoin::toggleSpoolJoin()
+{
+    if (eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Disabled)
+    {
+        eeprom_write_byte((uint8_t*)EEPROM_SPOOL_JOIN, (uint8_t)EEPROM::Enabled);
+    } else {
+        eeprom_write_byte((uint8_t*)EEPROM_SPOOL_JOIN, (uint8_t)EEPROM::Disabled);
+    }
+}
+
+bool SpoolJoin::isSpoolJoinEnabled()
+{
+    if(eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Enabled) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+void SpoolJoin::setSlot(uint8_t slot)
+{
+    currentMMUSlot = slot;
+}
+
+uint8_t SpoolJoin::nextSlot()
+{
+    SERIAL_ECHOPGM("SpoolJoin: ");
+    SERIAL_ECHO((int)currentMMUSlot);
+
+    if (currentMMUSlot >= 4) currentMMUSlot = 0;
+    else currentMMUSlot++;
+
+    SERIAL_ECHOPGM(" -> ");
+    SERIAL_ECHOLN((int)currentMMUSlot);
+
+    return currentMMUSlot;
+}
+
+}

+ 60 - 0
Firmware/SpoolJoin.h

@@ -0,0 +1,60 @@
+/// @file
+#pragma once
+#include <stdint.h>
+#include "eeprom.h"
+
+// See documentation here: https://help.prusa3d.com/article/spooljoin-mmu2s_134252
+
+namespace SpoolJoin {
+
+class SpoolJoin {
+public:
+    SpoolJoin();
+
+    enum class EEPROM : uint8_t {
+        Unknown, ///< SpoolJoin is unknown while printer is booting up
+        Enabled, ///< SpoolJoin is enabled in EEPROM
+        Disabled, ///< SpoolJoin is disabled in EEPROM
+        Empty = 0xFF ///< EEPROM has not been set before and all bits are 1 (0xFF) - either a new printer or user erased the memory
+    };
+
+    /// @brief Called when EEPROM is ready to be read
+    void initSpoolJoinStatus();
+
+    /// @brief Enable SpoolJoin
+    inline void enableSpoolJoin() { updateSpoolJoinStatus(EEPROM::Enabled); };
+
+    /// @brief Disable SpoolJoin
+    inline void disableSpoolJoin() { updateSpoolJoinStatus(EEPROM::Disabled); };
+
+    /// @brief Toggle SpoolJoin
+    static void toggleSpoolJoin();
+
+    /// @brief Check if SpoolJoin is enabled
+    /// @returns true if enabled, false if disabled
+    bool isSpoolJoinEnabled();
+
+    /// @brief Update the saved MMU slot number so SpoolJoin can determine the next slot to use
+    /// @param slot number of the slot to set
+    void setSlot(uint8_t slot);
+
+    /// @brief Fetch the next slot number should count from 0 to 4.
+    /// When filament slot 4 is depleted, the next slot should be 0.
+    /// @returns the next slot, ranges from 0 to 4
+    uint8_t nextSlot();
+
+private:
+    /// @brief Update EEPROM
+    /// @param newStatus Status to write into EEPROM
+    void updateSpoolJoinStatus(EEPROM newStatus);
+
+    /// @brief SpoolJoin status
+    enum EEPROM status;
+
+    /// @brief Currently used slot, ranges from 0 to 4
+    uint8_t currentMMUSlot;
+};
+
+extern SpoolJoin spooljoin;
+
+} // namespace SpoolJoin

+ 105 - 0
Firmware/Tcodes.cpp

@@ -0,0 +1,105 @@
+#include "Tcodes.h"
+#include "SpoolJoin.h"
+#include "Marlin.h"
+#include "language.h"
+#include "messages.h"
+#include "mmu2.h"
+#include "stepper.h"
+#include "ultralcd.h"
+#include <avr/pgmspace.h>
+#include <ctype.h>
+#include <stdint.h>
+#include <stdio.h>
+
+static const char duplicate_Tcode_ignored[] PROGMEM = "Duplicate T-code ignored.";
+
+inline bool IsInvalidTCode(char *const s, uint8_t i) { 
+    return ((s[i] < '0' || s[i] > '4') && s[i] != '?' && s[i] != 'x' && s[i] != 'c'); 
+}
+
+inline void TCodeInvalid() { 
+    SERIAL_ECHOLNPGM("Invalid T code."); 
+}
+
+struct SChooseFromMenu {
+    uint8_t slot:7;
+    uint8_t loadToNozzle:1;
+    inline constexpr SChooseFromMenu(uint8_t slot, bool loadToNozzle):slot(slot), loadToNozzle(loadToNozzle){}
+    inline constexpr SChooseFromMenu():slot(0), loadToNozzle(false) { }
+};
+
+SChooseFromMenu TCodeChooseFromMenu() {
+    if (MMU2::mmu2.Enabled()) {
+        return SChooseFromMenu( choose_menu_P(_T(MSG_SELECT_FILAMENT), _T(MSG_FILAMENT)), true );
+    } else {
+        return SChooseFromMenu( choose_menu_P(_T(MSG_SELECT_EXTRUDER), _T(MSG_EXTRUDER)), false );
+    }
+}
+
+void TCodes(char *const strchr_pointer, uint8_t codeValue) {
+    uint8_t index = 1;
+    for ( /*nothing*/ ; strchr_pointer[index] == ' ' || strchr_pointer[index] == '\t'; index++)
+        ;
+
+    strchr_pointer[index] = tolower(strchr_pointer[index]);
+
+    if (IsInvalidTCode(strchr_pointer, index)){
+        TCodeInvalid();
+    } else if (strchr_pointer[index] == 'x'){
+        // load to extruder gears; if mmu is not present do nothing
+        if (MMU2::mmu2.Enabled()) {
+            MMU2::mmu2.tool_change(strchr_pointer[index], choose_menu_P(_T(MSG_SELECT_EXTRUDER), _T(MSG_EXTRUDER)));
+        }
+    } else if (strchr_pointer[index] == 'c'){
+        // load from extruder gears to nozzle (nozzle should be preheated)
+        if (MMU2::mmu2.Enabled()) {
+            MMU2::mmu2.tool_change(strchr_pointer[index], MMU2::mmu2.get_current_tool());
+        }
+    } else {
+        SChooseFromMenu selectedSlot;
+        if (strchr_pointer[index] == '?') {
+            selectedSlot = TCodeChooseFromMenu();
+        /*} else if (MMU2::mmu2.Enabled() && SpoolJoin::spooljoin.isSpoolJoinEnabled()) {
+            // TODO: What if the next slot has no filament?
+            selectedSlot.slot = SpoolJoin::spooljoin.nextSlot();*/
+        } else {
+            selectedSlot.slot = codeValue;
+        }
+        st_synchronize();
+
+        if (MMU2::mmu2.Enabled()) {
+            if (selectedSlot.slot == MMU2::mmu2.get_current_tool()){ 
+                // don't execute the same T-code twice in a row
+                puts_P(duplicate_Tcode_ignored);
+            } else {
+#if defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
+                if (EEPROM_MMU_CUTTER_ENABLED_always == eeprom_read_byte((uint8_t *)EEPROM_MMU_CUTTER_ENABLED)) {
+                    MMU2::mmu2.cut_filament(selectedSlot.slot);
+                }
+#endif // defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
+                if (selectedSlot.loadToNozzle){ // for single material usage with mmu
+                    MMU2::mmu2.load_filament_to_nozzle(selectedSlot.slot);
+                } else {
+                    MMU2::mmu2.tool_change(selectedSlot.slot);
+                }
+            }
+        } else {
+            if (selectedSlot.slot >= EXTRUDERS) {
+                SERIAL_ECHO_START;
+                SERIAL_ECHO('T');
+                SERIAL_ECHOLN(selectedSlot.slot + '0');
+                SERIAL_ECHOLNRPGM(_n("Invalid extruder")); ////MSG_INVALID_EXTRUDER
+            } else {
+// @@TODO               if (code_seen('F')) {
+//                    next_feedrate = code_value();
+//                    if (next_feedrate > 0.0) {
+//                        feedrate = next_feedrate;
+//                    }
+//                }
+                SERIAL_ECHO_START;
+                SERIAL_ECHORPGM(_n("Active Extruder: ")); ////MSG_ACTIVE_EXTRUDER
+                SERIAL_ECHOLN(active_extruder + '0'); // this is not changed in our FW at all, can be optimized away
+            }
+        }
+    }
+}

+ 5 - 0
Firmware/Tcodes.h

@@ -0,0 +1,5 @@
+/// @file
+#pragma once
+#include <stdint.h>
+
+void TCodes(char * const strchr_pointer, uint8_t codeValue);

+ 2 - 0
Firmware/adc.h

@@ -15,6 +15,8 @@ http://resnet.uoregon.edu/~gurney_j/jmpc/bitwise.html
 # error "ADC_CHAN_MSK oes not match ADC_CHAN_CNT"
 #endif
 
+#define VOLT_DIV_REF 5 //[V]
+
 extern volatile uint8_t adc_channel;
 extern volatile uint16_t adc_values[ADC_CHAN_CNT];
 

+ 29 - 60
Firmware/cmdqueue.cpp

@@ -1,3 +1,4 @@
+#include <util/atomic.h>
 #include "cmdqueue.h"
 #include "cardreader.h"
 #include "ultralcd.h"
@@ -152,7 +153,7 @@ static bool cmdqueue_could_enqueue_front(size_t len_asked)
 // len_asked does not contain the zero terminator size.
 // This function may update bufindw, therefore for the power panic to work, this function must be called
 // with the interrupts disabled!
-static bool cmdqueue_could_enqueue_back(size_t len_asked, bool atomic_update = false)
+static bool __attribute__((noinline)) cmdqueue_could_enqueue_back(size_t len_asked)
 {
     // MAX_CMD_SIZE has to accommodate the zero terminator.
     if (len_asked >= MAX_CMD_SIZE)
@@ -162,61 +163,29 @@ static bool cmdqueue_could_enqueue_back(size_t len_asked, bool atomic_update = f
         // Full buffer.
         return false;
 
-    if (serial_count > 0) {
-        // If there is some data stored starting at bufindw, len_asked is certainly smaller than
-        // the allocated data buffer. Try to reserve a new buffer and to move the already received
-        // serial data.
-        // How much memory to reserve for the commands pushed to the front?
-        // End of the queue, when pushing to the end.
-        size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
-        if (bufindw < bufindr)
-            // Simple case. There is a contiguous space between the write buffer and the read buffer.
-            return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
-        // Otherwise the free space is split between the start and end.
-        if (// Could one fit to the end, including the reserve?
-            endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
-            // Could one fit to the end, and the reserve to the start?
-            (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
-            return true;
-        // Could one fit both to the start?
-        if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) {
-            // Mark the rest of the buffer as used.
-            memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw);
-            // and point to the start.
-            // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
-            if (atomic_update)
-                cli();
-            bufindw = 0;
-            if (atomic_update)
-                sei();
-            return true;
-        }
-    } else {
-        // How much memory to reserve for the commands pushed to the front?
-        // End of the queue, when pushing to the end.
-        size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
-        if (bufindw < bufindr)
-            // Simple case. There is a contiguous space between the write buffer and the read buffer.
-            return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
-        // Otherwise the free space is split between the start and end.
-        if (// Could one fit to the end, including the reserve?
-            endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
-            // Could one fit to the end, and the reserve to the start?
-            (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
-            return true;
-        // Could one fit both to the start?
-        if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) {
-            // Mark the rest of the buffer as used.
-            memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw);
-            // and point to the start.
-            // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
-            if (atomic_update)
-                cli();
-            bufindw = 0;
-            if (atomic_update)
-                sei();
-            return true;
-        }
+    // If there is some data stored starting at bufindw, len_asked is certainly smaller than
+    // the allocated data buffer. Try to reserve a new buffer and to move the already received
+    // serial data.
+    // How much memory to reserve for the commands pushed to the front?
+    // End of the queue, when pushing to the end.
+    size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
+    if (bufindw < bufindr)
+        // Simple case. There is a contiguous space between the write buffer and the read buffer.
+        return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
+    // Otherwise the free space is split between the start and end.
+    if (// Could one fit to the end, including the reserve?
+        endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
+        // Could one fit to the end, and the reserve to the start?
+        (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
+        return true;
+    // Could one fit both to the start?
+    if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) {
+        // Mark the rest of the buffer as used.
+        memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw);
+        // and point to the start.
+        // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
+        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { bufindw = 0; }
+        return true;
     }
     return false;
 }
@@ -368,7 +337,7 @@ void repeatcommand_front()
 void get_command()
 {
     // Test and reserve space for the new command string.
-    if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1, true))
+    if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1))
       return;
 
 	if (MYSERIAL.available() == RX_BUFFER_SIZE - 1) { //compare number of chars buffered in rx buffer with rx buffer size
@@ -515,7 +484,7 @@ void get_command()
       serial_count = 0; //clear buffer
       // Don't call cmdqueue_could_enqueue_back if there are no characters waiting
       // in the queue, as this function will reserve the memory.
-      if (MYSERIAL.available() == 0 || ! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1, true))
+      if (MYSERIAL.available() == 0 || ! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1))
           return;
     } // end of "end of line" processing
     else {
@@ -571,7 +540,7 @@ void get_command()
         // This is either an empty line, or a line with just a comment.
         // Continue to the following line, and continue accumulating the number of bytes
         // read from the sdcard into sd_count, 
-        // so that the lenght of the already read empty lines and comments will be added
+        // so that the length of the already read empty lines and comments will be added
         // to the following non-empty line. 
         return; // prevent cycling indefinitely - let manage_heaters do their job
       }
@@ -613,7 +582,7 @@ void get_command()
       if(card.eof()) break;
 
       // The following line will reserve buffer space if available.
-      if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1, true))
+      if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1))
           return;
     }
     else

+ 7 - 2
Firmware/config.h

@@ -43,7 +43,12 @@
 //#define PAT9125_I2C_ADDR  0x73  //ID=NC
 #define PAT9125_XRES      0
 #define PAT9125_YRES      240                   // maximum resolution (5*X cpi)
-#define PAT9124_YRES_MM   (5*PAT9125_YRES/25.4) // counts per mm
+#define PAT9125_YRES_MM   (5*PAT9125_YRES/25.4) // counts per mm
+#define PAT9125_INVERT_X  0 //1 means flipped
+#define PAT9125_INVERT_Y  1 //1 means flipped
+#define PAT9125_SWAP_XY   0 //X is Y and Y is X
+#define PAT9125_12B_RES   1 //8bit or 12bit signed motion data
+#define PAT9125_NEW_INIT  1 //set to 1 to use the magic sequence provided by pixart.
 
 //SM4 configuration
 #define SM4_DEFDELAY      500       //default step delay [us]
@@ -59,7 +64,7 @@
 //#define LANG_MODE              0 // primary language only
 #define LANG_MODE              1 // sec. language support
 
-#define LANG_SIZE_RESERVED     0x3000 // reserved space for secondary language (12288 bytes).
+#define LANG_SIZE_RESERVED     0x3500 // reserved space for secondary language (13568 bytes).
                                       // 0x3D00 Maximum 15616 bytes as it depends on xflash_layout.h
                                       // 16 Languages max. per group including stock 
 

+ 2 - 0
Firmware/eeprom.cpp

@@ -105,6 +105,8 @@ if (eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION) == 0xff) eeprom_u
         eeprom_update_dword((uint32_t *)EEPROM_TOTALTIME, 0);
         eeprom_update_dword((uint32_t *)EEPROM_FILAMENTUSED, 0);
     }
+//Set Cutter OFF if 0xff
+    if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_CUTTER_ENABLED, 0);
 }
 
 //! @brief Get default sheet name for index

+ 11 - 7
Firmware/eeprom.h

@@ -216,10 +216,10 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
 | ^					| ^			| ^										| 01h 1			| ^						| Sound mode: __once__								| ^				| ^
 | ^					| ^			| ^										| 02h 1			| ^						| Sound mode: __silent__							| ^				| ^
 | ^					| ^			| ^										| 03h 1			| ^						| Sound mode: __assist__							| ^				| ^
-| 0x0ED6 3798		| bool		| EEPROM_AUTO_DEPLETE					| 01h 1			| ffh 255				| MMU2/s autodeplete: __on__						| ???			| D3 Ax0ed6 C1
+| 0x0ED6 3798		| bool		| EEPROM_SPOOL_JOIN					| 01h 1			| ffh 255				| MMU2/s autodeplete: __on__						| ???			| D3 Ax0ed6 C1
 | ^					| ^			| ^										| 00h 0			| ^						| MMU2/s autodeplete: __off__						| ^				| ^
-| 0x0ED5 3797		| bool		| EEPROM_FSENS_OQ_MEASS_ENABLED			| ???			| ffh 255				| PAT1925 ???										| ???			| D3 Ax0ed5 C1
-| ^					| ^			| ^										| ???			| ^						| PAT1925 ???										| ^				| ^
+| 0x0ED5 3797		| bool		| EEPROM_FSENS_RUNOUT_ENABLED			| 01h 1			| ffh 255		__P__	| Filament runout: __enabled__						| LCD menu		| D3 Ax0ed5 C1
+| ^					| ^			| ^										| 00h 0			| ^						| Filament runout: __disabled__						| LCD menu		| ^
 | 0x0ED3 3795		| uint16	| EEPROM_MMU_FAIL_TOT					| ???			| ff ffh 65535	__S/P__	| MMU2/s total failures								| ???			| D3 Ax0ed3 C2
 | 0x0ED2 3794		| uint8		| EEPROM_MMU_FAIL						| ???			| ffh 255		__S/P__	| MMU2/s fails during print							| ???			| D3 Ax0ed2 C1
 | 0x0ED0 3792		| uint16	| EEPROM_MMU_LOAD_FAIL_TOT				| ???			| ff ffh 65535	__S/P__	| MMU2/s total load failures						| ???			| D3 Ax0ed0 C2
@@ -333,6 +333,8 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
 | ^					| ^			| ^										| 03h 3			| ^						| bad_isr											| ^				| ^
 | ^					| ^			| ^										| 04h 4			| ^						| bad_pullup_temp_isr								| ^				| ^
 | ^					| ^			| ^										| 05h 5			| ^						| bad_pullup_step_isr								| ^				| ^
+| 0x0D02 3320		| uint8_t	| EEPROM_FSENSOR_JAM_DETECTION			| 01h 1			| ff/01					| fsensor pat9125 jam detection feature				| LCD menu		| D3 Ax0d02 C1
+| 0x0D01 3319		| uint8_t	| EEPROM_MMU_ENABLED        			| 01h 1			| ff/01					| MMU enabled                       				| LCD menu		| D3 Ax0d01 C1
 
 | Address begin		| Bit/Type 	| Name 									| Valid values	| Default/FactoryReset	| Description 										| Gcode/Function| Debug code
 | :--:				| :--: 		| :--: 									| :--:			| :--:					| :--:												| :--:			| :--:
@@ -492,11 +494,11 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
 
 // Sound Mode
 #define EEPROM_SOUND_MODE (EEPROM_UVLO_TARGET_HOTEND-1) // uint8
-#define EEPROM_AUTO_DEPLETE (EEPROM_SOUND_MODE-1) //bool
+#define EEPROM_SPOOL_JOIN (EEPROM_SOUND_MODE-1) //bool
 
-#define EEPROM_FSENS_OQ_MEASS_ENABLED (EEPROM_AUTO_DEPLETE - 1) //bool
+#define EEPROM_FSENS_RUNOUT_ENABLED (EEPROM_SPOOL_JOIN - 1) //bool
 
-#define EEPROM_MMU_FAIL_TOT (EEPROM_FSENS_OQ_MEASS_ENABLED - 2) //uint16_t
+#define EEPROM_MMU_FAIL_TOT (EEPROM_FSENS_RUNOUT_ENABLED - 2) //uint16_t
 #define EEPROM_MMU_FAIL (EEPROM_MMU_FAIL_TOT - 1) //uint8_t
 
 #define EEPROM_MMU_LOAD_FAIL_TOT (EEPROM_MMU_FAIL - 2) //uint16_t
@@ -556,8 +558,10 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
 #define EEPROM_TEMP_MODEL_W (EEPROM_TEMP_MODEL_Ta_corr-4) // float
 #define EEPROM_TEMP_MODEL_E (EEPROM_TEMP_MODEL_W-4) // float
 
+#define EEPROM_FSENSOR_JAM_DETECTION (EEPROM_TEMP_MODEL_E-1) // uint8_t
+#define EEPROM_MMU_ENABLED (EEPROM_FSENSOR_JAM_DETECTION-1) // uint8_t
 //This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
-#define EEPROM_LAST_ITEM EEPROM_TEMP_MODEL_E
+#define EEPROM_LAST_ITEM EEPROM_MMU_ENABLED
 // !!!!!
 // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
 // !!!!!

+ 3 - 3
Firmware/first_lay_cal.cpp

@@ -8,7 +8,7 @@
 #include "language.h"
 #include "Marlin.h"
 #include "cmdqueue.h"
-#include "mmu.h"
+#include "mmu2.h"
 #include <avr/pgmspace.h>
 
 //! @brief Wait for preheat
@@ -34,7 +34,7 @@ void lay1cal_wait_preheat()
 //! @param filament filament to use (applies for MMU only)
 void lay1cal_load_filament(char *cmd_buffer, uint8_t filament)
 {
-    if (mmu_enabled)
+    if (MMU2::mmu2.Enabled())
     {
         enquecommand_P(PSTR("M83"));
         enquecommand_P(PSTR("G1 Y-3.0 F1000.0"));
@@ -73,7 +73,7 @@ void lay1cal_intro_line()
         cmd_intro_mmu_12,
     };
 
-    if (mmu_enabled)
+    if (MMU2::mmu2.Enabled())
     {
         for (uint8_t i = 0; i < (sizeof(intro_mmu_cmd)/sizeof(intro_mmu_cmd[0])); ++i)
         {

+ 0 - 734
Firmware/fsensor.cpp

@@ -1,734 +0,0 @@
-//! @file
-
-#include "Marlin.h"
-
-#include "fsensor.h"
-#include <avr/pgmspace.h>
-#include "pat9125.h"
-#include "stepper.h"
-#include "cmdqueue.h"
-#include "ultralcd.h"
-#include "mmu.h"
-#include "cardreader.h"
-
-#include "adc.h"
-#include "temperature.h"
-#include "config.h"
-
-//! @name Basic parameters
-//! @{
-#define FSENSOR_CHUNK_LEN      1.25 //!< filament sensor chunk length (mm)
-#define FSENSOR_ERR_MAX           4 //!< filament sensor maximum error/chunk count for runout detection
-
-#define FSENSOR_SOFTERR_CMAX      3 //!< number of contiguous soft failures before a triggering a runout
-#define FSENSOR_SOFTERR_DELTA 30000 //!< maximum interval (ms) to consider soft failures contiguous
-//! @}
-
-//! @name Optical quality measurement parameters
-//! @{
-#define FSENSOR_OQ_MAX_ES      2    //!< maximum sum of error blocks during filament recheck
-#define FSENSOR_OQ_MIN_YD      2    //!< minimum yd sum during filament check (counts per inch)
-#define FSENSOR_OQ_MIN_BR      80   //!< minimum brightness value
-#define FSENSOR_OQ_MAX_SH      10   //!< maximum shutter value
-//! @}
-
-const char ERRMSG_PAT9125_NOT_RESP[] PROGMEM = "PAT9125 not responding (%d)!\n";
-
-// PJ7 can not be used (does not have PinChangeInterrupt possibility)
-#define FSENSOR_INT_PIN          75 //!< filament sensor interrupt pin PJ4
-#define FSENSOR_INT_PIN_MASK   0x10 //!< filament sensor interrupt pin mask (bit4)
-#define FSENSOR_INT_PIN_PIN_REG PINJ              // PIN register @ PJ4
-#define FSENSOR_INT_PIN_VECT PCINT1_vect          // PinChange ISR @ PJ4
-#define FSENSOR_INT_PIN_PCMSK_REG PCMSK1          // PinChangeMaskRegister @ PJ4
-#define FSENSOR_INT_PIN_PCMSK_BIT PCINT13         // PinChange Interrupt / PinChange Enable Mask @ PJ4
-#define FSENSOR_INT_PIN_PCICR_BIT PCIE1           // PinChange Interrupt Enable / Flag @ PJ4
-
-//! enabled = initialized and sampled every chunk event
-bool fsensor_enabled = true;
-//! runout watching is done in fsensor_update (called from main loop)
-bool fsensor_watch_runout = true;
-//! not responding - is set if any communication error occurred during initialization or readout
-bool fsensor_not_responding = false;
-
-#ifdef PAT9125
-uint8_t fsensor_int_pin_old = 0;
-//! optical checking "chunk lenght" (already in steps)
-int16_t fsensor_chunk_len = 0;
-//! enable/disable quality meassurement
-bool fsensor_oq_meassure_enabled = false;
-//! number of errors, updated in ISR
-uint8_t fsensor_err_cnt = 0;
-//! variable for accumulating step count (updated callbacks from stepper and ISR)
-int16_t fsensor_st_cnt = 0;
-//! count of total sensor "soft" failures (filament status checks)
-uint8_t fsensor_softfail = 0;
-//! timestamp of last soft failure
-unsigned long fsensor_softfail_last = 0;
-//! count of soft failures within the configured time
-uint8_t fsensor_softfail_ccnt = 0;
-#endif
-
-#ifdef DEBUG_FSENSOR_LOG
-//! log flag: 0=log disabled, 1=log enabled
-uint8_t fsensor_log = 1;
-#endif //DEBUG_FSENSOR_LOG
-
-
-//! @name filament autoload variables
-//! @{
-
-//! autoload feature enabled
-bool fsensor_autoload_enabled = true;
-//! autoload watching enable/disable flag
-bool fsensor_watch_autoload = false;
-
-#ifdef PAT9125
-//
-uint16_t fsensor_autoload_y;
-//
-uint8_t fsensor_autoload_c;
-//
-uint32_t fsensor_autoload_last_millis;
-//
-uint8_t fsensor_autoload_sum;
-//! @}
-#endif
-
-
-//! @name filament optical quality measurement variables
-//! @{
-
-//! Measurement enable/disable flag
-bool fsensor_oq_meassure = false;
-//! skip-chunk counter, for accurate measurement is necessary to skip first chunk...
-uint8_t  fsensor_oq_skipchunk;
-//! number of samples from start of measurement
-uint8_t fsensor_oq_samples;
-//! sum of steps in positive direction movements
-uint16_t fsensor_oq_st_sum;
-//! sum of deltas in positive direction movements
-uint16_t fsensor_oq_yd_sum;
-//! sum of errors during measurement
-uint16_t fsensor_oq_er_sum;
-//! max error counter value during measurement
-uint8_t  fsensor_oq_er_max;
-//! minimum delta value
-int16_t fsensor_oq_yd_min;
-//! maximum delta value
-int16_t fsensor_oq_yd_max;
-//! sum of shutter value
-uint16_t fsensor_oq_sh_sum;
-//! @}
-
-#ifdef IR_SENSOR_ANALOG
-ClFsensorPCB oFsensorPCB;
-ClFsensorActionNA oFsensorActionNA;
-bool bIRsensorStateFlag=false;
-ShortTimer tIRsensorCheckTimer;
-#endif //IR_SENSOR_ANALOG
-
-void fsensor_stop_and_save_print(void)
-{
-    puts_P(PSTR("fsensor_stop_and_save_print"));
-    stop_and_save_print_to_ram(0, 0);
-    fsensor_watch_runout = false;
-}
-
-#ifdef PAT9125
-// Reset all internal counters to zero, including stepper callbacks
-void fsensor_reset_err_cnt()
-{
-    fsensor_err_cnt = 0;
-    pat9125_y = 0;
-    st_reset_fsensor();
-}
-
-void fsensor_set_axis_steps_per_unit(float u)
-{
-    fsensor_chunk_len = (int16_t)(FSENSOR_CHUNK_LEN * u);
-}
-#endif
-
-
-void fsensor_restore_print_and_continue(void)
-{
-    puts_P(PSTR("fsensor_restore_print_and_continue"));
-    fsensor_watch_runout = true;
-#ifdef PAT9125
-    fsensor_reset_err_cnt();
-#endif
-    restore_print_from_ram_and_continue(0);
-}
-
-// fsensor_checkpoint_print cuts the current print job at the current position,
-// allowing new instructions to be inserted in the middle
-void fsensor_checkpoint_print(void)
-{
-    puts_P(PSTR("fsensor_checkpoint_print"));
-    stop_and_save_print_to_ram(0, 0);
-    restore_print_from_ram_and_continue(0);
-}
-
-#ifdef IR_SENSOR_ANALOG
-const char* FsensorIRVersionText()
-{
-	switch(oFsensorPCB)
-	{
-		case ClFsensorPCB::_Old:
-			return _T(MSG_IR_03_OR_OLDER);
-		case ClFsensorPCB::_Rev04:
-			return _T(MSG_IR_04_OR_NEWER);
-		default:
-			return _T(MSG_IR_UNKNOWN);
-	}
-}
-#endif //IR_SENSOR_ANALOG
-
-void fsensor_init(void)
-{
-#ifdef PAT9125
-	uint8_t pat9125 = pat9125_init();
-	printf_P(PSTR("PAT9125_init:%u\n"), pat9125);
-#endif //PAT9125
-	uint8_t fsensor_enabled = eeprom_read_byte((uint8_t*)EEPROM_FSENSOR);
-	fsensor_autoload_enabled=eeprom_read_byte((uint8_t*)EEPROM_FSENS_AUTOLOAD_ENABLED);
-	fsensor_not_responding = false;
-#ifdef PAT9125
-	uint8_t oq_meassure_enabled = eeprom_read_byte((uint8_t*)EEPROM_FSENS_OQ_MEASS_ENABLED);
-	fsensor_oq_meassure_enabled = (oq_meassure_enabled == 1)?true:false;
-	fsensor_set_axis_steps_per_unit(cs.axis_steps_per_unit[E_AXIS]);
-	
-	if (!pat9125){
-		fsensor_enabled = 0; //disable sensor
-		fsensor_not_responding = true;
-	}
-#endif //PAT9125
-#ifdef IR_SENSOR_ANALOG
-	bIRsensorStateFlag=false;
-	oFsensorPCB = (ClFsensorPCB)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_PCB);
-	oFsensorActionNA = (ClFsensorActionNA)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA);
-
-	// If the fsensor is not responding even at the start of the printer,
-	// set this flag accordingly to show N/A in Settings->Filament sensor.
-	// This is even valid for both fsensor board revisions (0.3 or older and 0.4).
-	// Must be done after reading what type of fsensor board we have
-	fsensor_not_responding = ! fsensor_IR_check();
-#endif //IR_SENSOR_ANALOG
-	if (fsensor_enabled){
-		fsensor_enable(false);                  // (in this case) EEPROM update is not necessary
-	} else {
-		fsensor_disable(false);                 // (in this case) EEPROM update is not necessary
-	}
-	printf_P(PSTR("FSensor %S"), (fsensor_enabled?PSTR("ENABLED"):PSTR("DISABLED")));
-#ifdef IR_SENSOR_ANALOG
-	printf_P(PSTR(" (sensor board revision:%S)\n"), FsensorIRVersionText());
-#else //IR_SENSOR_ANALOG
-	MYSERIAL.println();
-#endif //IR_SENSOR_ANALOG
-	if (check_for_ir_sensor()){
-		ir_sensor_detected = true;
-	}
-}
-
-bool fsensor_enable(bool bUpdateEEPROM)
-{
-#ifdef PAT9125
-    (void)bUpdateEEPROM; // silence unused warning in this variant
-
-	if (mmu_enabled == false) { //filament sensor is pat9125, enable only if it is working
-		uint8_t pat9125 = pat9125_init();
-		printf_P(PSTR("PAT9125_init:%u\n"), pat9125);
-		if (pat9125)
-			fsensor_not_responding = false;
-		else
-			fsensor_not_responding = true;
-		fsensor_enabled = pat9125 ? true : false;
-		fsensor_watch_runout = true;
-		fsensor_oq_meassure = false;
-        fsensor_reset_err_cnt();
-		eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, fsensor_enabled ? 0x01 : 0x00);
-		FSensorStateMenu = fsensor_enabled ? 1 : 0;
-	}
-	else //filament sensor is FINDA, always enable 
-	{
-		fsensor_enabled = true;
-		eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x01);
-		FSensorStateMenu = 1;
-	}
-#else // PAT9125
-#ifdef IR_SENSOR_ANALOG
-     if(!fsensor_IR_check())
-          {
-          bUpdateEEPROM=true;
-          fsensor_enabled=false;
-          fsensor_not_responding=true;
-          FSensorStateMenu=0;
-          }
-     else {
-#endif //IR_SENSOR_ANALOG
-     fsensor_enabled=true;
-     fsensor_not_responding=false;
-     FSensorStateMenu=1;
-#ifdef IR_SENSOR_ANALOG
-          }
-#endif //IR_SENSOR_ANALOG
-     if(bUpdateEEPROM)
-          eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, FSensorStateMenu);
-#endif //PAT9125
-	return fsensor_enabled;
-}
-
-void fsensor_disable(bool bUpdateEEPROM)
-{ 
-	fsensor_enabled = false;
-	FSensorStateMenu = 0;
-     if(bUpdateEEPROM)
-          eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x00); 
-}
-
-void fsensor_autoload_set(bool State)
-{
-#ifdef PAT9125
-	if (!State) fsensor_autoload_check_stop();
-#endif //PAT9125
-	fsensor_autoload_enabled = State;
-	eeprom_update_byte((unsigned char *)EEPROM_FSENS_AUTOLOAD_ENABLED, fsensor_autoload_enabled);
-}
-
-void pciSetup(byte pin)
-{
-// !!! "digitalPinTo?????bit()" does not provide the correct results for some MCU pins
-	*digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin
-	PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
-	PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group 
-}
-
-#ifdef PAT9125
-void fsensor_autoload_check_start(void)
-{
-//	puts_P(_N("fsensor_autoload_check_start\n"));
-	if (!fsensor_enabled) return;
-	if (!fsensor_autoload_enabled) return;
-	if (fsensor_watch_autoload) return;
-	if (!pat9125_update()) //update sensor
-	{
-		fsensor_disable();
-		fsensor_not_responding = true;
-		fsensor_watch_autoload = false;
-		printf_P(ERRMSG_PAT9125_NOT_RESP, 3);
-		return;
-	}
-	puts_P(_N("fsensor_autoload_check_start - autoload ENABLED"));
-	fsensor_autoload_y = pat9125_y; //save current y value
-	fsensor_autoload_c = 0; //reset number of changes counter
-	fsensor_autoload_sum = 0;
-	fsensor_autoload_last_millis = _millis();
-	fsensor_watch_runout = false;
-	fsensor_watch_autoload = true;
-}
-
-
-void fsensor_autoload_check_stop(void)
-{
-//	puts_P(_N("fsensor_autoload_check_stop\n"));
-	if (!fsensor_enabled) return;
-//	puts_P(_N("fsensor_autoload_check_stop 1\n"));
-	if (!fsensor_autoload_enabled) return;
-//	puts_P(_N("fsensor_autoload_check_stop 2\n"));
-	if (!fsensor_watch_autoload) return;
-	puts_P(_N("fsensor_autoload_check_stop - autoload DISABLED"));
-	fsensor_autoload_sum = 0;
-	fsensor_watch_autoload = false;
-	fsensor_watch_runout = true;
-    fsensor_reset_err_cnt();
-}
-#endif //PAT9125
-
-bool fsensor_check_autoload(void)
-{
-	if (!fsensor_enabled) return false;
-	if (!fsensor_autoload_enabled) return false;
-	if (ir_sensor_detected) {
-		if (READ(IR_SENSOR_PIN)) {
-			fsensor_watch_autoload = true;
-		}
-		else if (fsensor_watch_autoload == true) {
-			fsensor_watch_autoload = false;
-			return true;
-		}
-	}
-#ifdef PAT9125
-	if (!fsensor_watch_autoload)
-	{
-		fsensor_autoload_check_start();
-		return false;
-	}
-#if 0
-	uint8_t fsensor_autoload_c_old = fsensor_autoload_c;
-#endif
-	if ((_millis() - fsensor_autoload_last_millis) < 25) return false;
-	fsensor_autoload_last_millis = _millis();
-	if (!pat9125_update_y()) //update sensor
-	{
-		fsensor_disable();
-		fsensor_not_responding = true;
-		printf_P(ERRMSG_PAT9125_NOT_RESP, 2);
-		return false;
-	}
-	int16_t dy = pat9125_y - fsensor_autoload_y;
-	if (dy) //? dy value is nonzero
-	{
-		if (dy > 0) //? delta-y value is positive (inserting)
-		{
-			fsensor_autoload_sum += dy;
-			fsensor_autoload_c += 3; //increment change counter by 3
-		}
-		else if (fsensor_autoload_c > 1)
-			fsensor_autoload_c -= 2; //decrement change counter by 2 
-		fsensor_autoload_y = pat9125_y; //save current value
-	}
-	else if (fsensor_autoload_c > 0)
-		fsensor_autoload_c--;
-	if (fsensor_autoload_c == 0) fsensor_autoload_sum = 0;
-#if 0
-  	puts_P(_N("fsensor_check_autoload\n"));
-  	if (fsensor_autoload_c != fsensor_autoload_c_old)
-  		printf_P(PSTR("fsensor_check_autoload dy=%d c=%d sum=%d\n"), dy, fsensor_autoload_c, fsensor_autoload_sum);
-#endif
-//	if ((fsensor_autoload_c >= 15) && (fsensor_autoload_sum > 30))
-	if ((fsensor_autoload_c >= 12) && (fsensor_autoload_sum > 20))
-	{
-//		puts_P(_N("fsensor_check_autoload = true !!!\n"));
-		return true;
-	}
-#endif //PAT9125
-	return false;
-}
-
-#ifdef PAT9125
-void fsensor_oq_meassure_set(bool State)
-{
-	fsensor_oq_meassure_enabled = State;
-	eeprom_update_byte((unsigned char *)EEPROM_FSENS_OQ_MEASS_ENABLED, fsensor_oq_meassure_enabled);
-}
-
-void fsensor_oq_meassure_start(uint8_t skip)
-{
-	if (!fsensor_enabled) return;
-	if (!fsensor_oq_meassure_enabled) return;
-	puts_P(PSTR("fsensor_oq_meassure_start"));
-	fsensor_oq_skipchunk = skip;
-	fsensor_oq_samples = 0;
-	fsensor_oq_st_sum = 0;
-	fsensor_oq_yd_sum = 0;
-	fsensor_oq_er_sum = 0;
-	fsensor_oq_er_max = 0;
-	fsensor_oq_yd_min = INT16_MAX;
-	fsensor_oq_yd_max = 0;
-	fsensor_oq_sh_sum = 0;
-	pat9125_update();
-	pat9125_y = 0;
-	fsensor_oq_meassure = true;
-}
-
-void fsensor_oq_meassure_stop(void)
-{
-	if (!fsensor_enabled) return;
-	if (!fsensor_oq_meassure_enabled) return;
-	printf_P(PSTR("fsensor_oq_meassure_stop, %u samples\n"), fsensor_oq_samples);
-	printf_P(_N(" st_sum=%u yd_sum=%u er_sum=%u er_max=%u\n"), fsensor_oq_st_sum, fsensor_oq_yd_sum, fsensor_oq_er_sum, fsensor_oq_er_max);
-	printf_P(_N(" yd_min=%u yd_max=%u yd_avg=%u sh_avg=%u\n"), fsensor_oq_yd_min, fsensor_oq_yd_max, (uint16_t)((uint32_t)fsensor_oq_yd_sum * fsensor_chunk_len / fsensor_oq_st_sum), (uint16_t)(fsensor_oq_sh_sum / fsensor_oq_samples));
-	fsensor_oq_meassure = false;
-}
-
-#ifdef FSENSOR_QUALITY
-const char _OK[] PROGMEM = "OK";
-const char _NG[] PROGMEM = "NG!";
-
-bool fsensor_oq_result(void)
-{
-	if (!fsensor_enabled) return true;
-	if (!fsensor_oq_meassure_enabled) return true;
-	puts_P(_N("fsensor_oq_result"));
-	bool res_er_sum = (fsensor_oq_er_sum <= FSENSOR_OQ_MAX_ES);
-	printf_P(_N(" er_sum = %u %S\n"), fsensor_oq_er_sum, (res_er_sum?_OK:_NG));
-	bool res_er_max = (fsensor_oq_er_max <= FSENSOR_OQ_MAX_EM);
-	printf_P(_N(" er_max = %u %S\n"), fsensor_oq_er_max, (res_er_max?_OK:_NG));
-	uint8_t yd_avg = ((uint32_t)fsensor_oq_yd_sum * fsensor_chunk_len / fsensor_oq_st_sum);
-	bool res_yd_avg = (yd_avg >= FSENSOR_OQ_MIN_YD) && (yd_avg <= FSENSOR_OQ_MAX_YD);
-	printf_P(_N(" yd_avg = %u %S\n"), yd_avg, (res_yd_avg?_OK:_NG));
-	bool res_yd_max = (fsensor_oq_yd_max <= (yd_avg * FSENSOR_OQ_MAX_PD));
-	printf_P(_N(" yd_max = %u %S\n"), fsensor_oq_yd_max, (res_yd_max?_OK:_NG));
-	bool res_yd_min = (fsensor_oq_yd_min >= (yd_avg / FSENSOR_OQ_MAX_ND));
-	printf_P(_N(" yd_min = %u %S\n"), fsensor_oq_yd_min, (res_yd_min?_OK:_NG));
-
-	uint16_t yd_dev = (fsensor_oq_yd_max - yd_avg) + (yd_avg - fsensor_oq_yd_min);
-	printf_P(_N(" yd_dev = %u\n"), yd_dev);
-
-	uint16_t yd_qua = 10 * yd_avg / (yd_dev + 1);
-	printf_P(_N(" yd_qua = %u %S\n"), yd_qua, ((yd_qua >= 8)?_OK:_NG));
-
-	uint8_t sh_avg = (fsensor_oq_sh_sum / fsensor_oq_samples);
-	bool res_sh_avg = (sh_avg <= FSENSOR_OQ_MAX_SH);
-	if (yd_qua >= 8) res_sh_avg = true;
-
-	printf_P(_N(" sh_avg = %u %S\n"), sh_avg, (res_sh_avg?_OK:_NG));
-	bool res = res_er_sum && res_er_max && res_yd_avg && res_yd_max && res_yd_min && res_sh_avg;
-	printf_P(_N("fsensor_oq_result %S\n"), (res?_OK:_NG));
-	return res;
-}
-#endif //FSENSOR_QUALITY
-
-FORCE_INLINE static void fsensor_isr(int st_cnt)
-{
-	uint8_t old_err_cnt = fsensor_err_cnt;
-	uint8_t pat9125_res = fsensor_oq_meassure?pat9125_update():pat9125_update_y();
-	if (!pat9125_res)
-	{
-		fsensor_disable();
-		fsensor_not_responding = true;
-		printf_P(ERRMSG_PAT9125_NOT_RESP, 1);
-	}
-
-	if (st_cnt != 0)
-	{
-        // movement was planned, check for sensor movement
-        int8_t st_dir = st_cnt >= 0;
-        int8_t pat9125_dir = pat9125_y >= 0;
-
-        if (pat9125_y == 0)
-        {
-            if (st_dir)
-            {
-                // no movement detected: we might be within a blind sensor range,
-                // update the frame and shutter parameters we didn't earlier
-                if (!fsensor_oq_meassure)
-                    pat9125_update_bs();
-
-                // increment the error count only if underexposed: filament likely missing
-                if ((pat9125_b < FSENSOR_OQ_MIN_BR) && (pat9125_s > FSENSOR_OQ_MAX_SH))
-                {
-                    // check for a dark frame (<30% avg brightness) with long exposure
-                    ++fsensor_err_cnt;
-                }
-                else
-                {
-                    // good frame, filament likely present
-                    if(fsensor_err_cnt) --fsensor_err_cnt;
-                }
-            }
-        }
-        else if (pat9125_dir != st_dir)
-        {
-            // detected direction opposite of motor movement
-            if (st_dir) ++fsensor_err_cnt;
-        }
-        else if (pat9125_dir == st_dir)
-        {
-            // direction agreeing with planned movement
-            if (fsensor_err_cnt) --fsensor_err_cnt;
-        }
-
-        if (st_dir && fsensor_oq_meassure)
-        {
-            // extruding with quality assessment
-            if (fsensor_oq_skipchunk)
-            {
-                fsensor_oq_skipchunk--;
-                fsensor_err_cnt = 0;
-            }
-            else
-            {
-                if (st_cnt == fsensor_chunk_len)
-                {
-                    if (pat9125_y > 0) if (fsensor_oq_yd_min > pat9125_y) fsensor_oq_yd_min = (fsensor_oq_yd_min + pat9125_y) / 2;
-                    if (pat9125_y >= 0) if (fsensor_oq_yd_max < pat9125_y) fsensor_oq_yd_max = (fsensor_oq_yd_max + pat9125_y) / 2;
-                }
-                fsensor_oq_samples++;
-                fsensor_oq_st_sum += st_cnt;
-                if (pat9125_y > 0) fsensor_oq_yd_sum += pat9125_y;
-                if (fsensor_err_cnt > old_err_cnt)
-                    fsensor_oq_er_sum += (fsensor_err_cnt - old_err_cnt);
-                if (fsensor_oq_er_max < fsensor_err_cnt)
-                    fsensor_oq_er_max = fsensor_err_cnt;
-                fsensor_oq_sh_sum += pat9125_s;
-            }
-        }
-	}
-
-#ifdef DEBUG_FSENSOR_LOG
-	if (fsensor_log)
-	{
-		printf_P(_N("FSENSOR cnt=%d dy=%d err=%u %S\n"), st_cnt, pat9125_y, fsensor_err_cnt, (fsensor_err_cnt > old_err_cnt)?_N("NG!"):_N("OK"));
-		if (fsensor_oq_meassure) printf_P(_N("FSENSOR st_sum=%u yd_sum=%u er_sum=%u er_max=%u yd_max=%u\n"), fsensor_oq_st_sum, fsensor_oq_yd_sum, fsensor_oq_er_sum, fsensor_oq_er_max, fsensor_oq_yd_max);
-	}
-#endif //DEBUG_FSENSOR_LOG
-
-	pat9125_y = 0;
-}
-
-ISR(FSENSOR_INT_PIN_VECT)
-{
-    if (mmu_enabled || ir_sensor_detected) return;
-    if (!((fsensor_int_pin_old ^ FSENSOR_INT_PIN_PIN_REG) & FSENSOR_INT_PIN_MASK)) return;
-    fsensor_int_pin_old = FSENSOR_INT_PIN_PIN_REG;
-
-    // prevent isr re-entry
-    static bool _lock = false;
-    if (!_lock)
-    {
-        // fetch fsensor_st_cnt atomically
-        int st_cnt = fsensor_st_cnt;
-        fsensor_st_cnt = 0;
-
-        _lock = true;
-        sei();
-        fsensor_isr(st_cnt);
-        cli();
-        _lock = false;
-    }
-}
-
-void fsensor_setup_interrupt(void)
-{
-	WRITE(FSENSOR_INT_PIN, 0);
-	SET_OUTPUT(FSENSOR_INT_PIN);
-	fsensor_int_pin_old = 0;
-
-	//pciSetup(FSENSOR_INT_PIN);
-// !!! "pciSetup()" does not provide the correct results for some MCU pins
-// so interrupt registers settings:
-     FSENSOR_INT_PIN_PCMSK_REG |= bit(FSENSOR_INT_PIN_PCMSK_BIT); // enable corresponding PinChangeInterrupt (individual pin)
-     PCIFR |= bit(FSENSOR_INT_PIN_PCICR_BIT);     // clear previous occasional interrupt (set of pins)
-     PCICR |= bit(FSENSOR_INT_PIN_PCICR_BIT);     // enable corresponding PinChangeInterrupt (set of pins)
-}
-
-void fsensor_st_block_chunk(int cnt)
-{
-	if (!fsensor_enabled) return;
-	fsensor_st_cnt += cnt;
-
-	// !!! bit toggling (PINxn <- 1) (for PinChangeInterrupt) does not work for some MCU pins
-	WRITE(FSENSOR_INT_PIN, !READ(FSENSOR_INT_PIN));
-}
-#endif //PAT9125
-
-
-//! Common code for enqueing M600 and supplemental codes into the command queue.
-//! Used both for the IR sensor and the PAT9125
-void fsensor_enque_M600(){
-	puts_P(PSTR("fsensor_update - M600"));
-	eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1);
-	eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1);
-	enquecommand_front_P((PSTR("M600")));
-}
-
-//! @brief filament sensor update (perform M600 on filament runout)
-//!
-//! Works only if filament sensor is enabled.
-//! When the filament sensor error count is larger then FSENSOR_ERR_MAX, pauses print, tries to move filament back and forth.
-//! If there is still no plausible signal from filament sensor plans M600 (Filament change).
-void fsensor_update(void)
-{
-#ifdef PAT9125
-    if (fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX))
-        {
-            fsensor_stop_and_save_print();
-            KEEPALIVE_STATE(IN_HANDLER);
-
-            bool autoload_enabled_tmp = fsensor_autoload_enabled;
-            fsensor_autoload_enabled = false;
-            bool oq_meassure_enabled_tmp = fsensor_oq_meassure_enabled;
-            fsensor_oq_meassure_enabled = true;
-
-            // move the nozzle away while checking the filament
-            current_position[Z_AXIS] += 0.8;
-            if(current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS;
-            plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
-            st_synchronize();
-
-            // check the filament in isolation
-            fsensor_reset_err_cnt();
-            fsensor_oq_meassure_start(0);
-            float e_tmp = current_position[E_AXIS];
-            current_position[E_AXIS] -= 3;
-            plan_buffer_line_curposXYZE(250/60);
-            current_position[E_AXIS] = e_tmp;
-            plan_buffer_line_curposXYZE(200/60);
-            st_synchronize();
-            fsensor_oq_meassure_stop();
-
-            bool err = false;
-            err |= (fsensor_err_cnt > 0);                   // final error count is non-zero
-            err |= (fsensor_oq_er_sum > FSENSOR_OQ_MAX_ES); // total error count is above limit
-            err |= (fsensor_oq_yd_sum < FSENSOR_OQ_MIN_YD); // total measured distance is below limit
-
-            fsensor_restore_print_and_continue();
-            fsensor_autoload_enabled = autoload_enabled_tmp;
-            fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp;
-            unsigned long now = _millis();
-            if (!err && (now - fsensor_softfail_last) > FSENSOR_SOFTERR_DELTA)
-                fsensor_softfail_ccnt = 0;
-            if (!err && fsensor_softfail_ccnt <= FSENSOR_SOFTERR_CMAX)
-            {
-                puts_P(PSTR("fsensor_err_cnt = 0"));
-                ++fsensor_softfail;
-                ++fsensor_softfail_ccnt;
-                fsensor_softfail_last = now;
-            }
-            else
-            {
-                fsensor_softfail_ccnt = 0;
-                fsensor_softfail_last = 0;
-                fsensor_enque_M600();
-            }
-        }
-#else //PAT9125
-        if (CHECK_FSENSOR && ir_sensor_detected)
-        {
-            if (READ(IR_SENSOR_PIN))
-            {                                  // IR_SENSOR_PIN ~ H
-                fsensor_checkpoint_print();
-                fsensor_enque_M600();
-            }
-        }
-#endif //PAT9125
-}
-
-#ifdef IR_SENSOR_ANALOG
-/// This is called only upon start of the printer or when switching the fsensor ON in the menu
-/// We cannot do temporal window checks here (aka the voltage has been in some range for a period of time)
-bool fsensor_IR_check(){
-    if( IRsensor_Lmax_TRESHOLD <= current_voltage_raw_IR && current_voltage_raw_IR <= IRsensor_Hmin_TRESHOLD ){
-        /// If the voltage is in forbidden range, the fsensor is ok, but the lever is mounted improperly.
-        /// Or the user is so creative so that he can hold a piece of fillament in the hole in such a genius way,
-        /// that the IR fsensor reading is within 1.5 and 3V ... this would have been highly unusual
-        /// and would have been considered more like a sabotage than normal printer operation
-        puts_P(PSTR("fsensor in forbidden range 1.5-3V - check sensor"));
-        return false; 
-    }
-    if( oFsensorPCB == ClFsensorPCB::_Rev04 ){
-        /// newer IR sensor cannot normally produce 4.6-5V, this is considered a failure/bad mount
-        if( IRsensor_Hopen_TRESHOLD <= current_voltage_raw_IR && current_voltage_raw_IR <= IRsensor_VMax_TRESHOLD ){
-            puts_P(PSTR("fsensor v0.4 in fault range 4.6-5V - unconnected"));
-            return false;
-        }
-        /// newer IR sensor cannot normally produce 0-0.3V, this is considered a failure 
-#if 0	//Disabled as it has to be decided if we gonna use this or not.
-        if( IRsensor_Hopen_TRESHOLD <= current_voltage_raw_IR && current_voltage_raw_IR <= IRsensor_VMax_TRESHOLD ){
-            puts_P(PSTR("fsensor v0.4 in fault range 0.0-0.3V - wrong IR sensor"));
-            return false;
-        }
-#endif
-    }
-    /// If IR sensor is "uknown state" and filament is not loaded > 1.5V return false
-#if 0
-    if( (oFsensorPCB == ClFsensorPCB::_Undef) && ( current_voltage_raw_IR > IRsensor_Lmax_TRESHOLD ) ){
-        puts_P(PSTR("Unknown IR sensor version and no filament loaded detected."));
-        return false;
-    }
-#endif
-    // otherwise the IR fsensor is considered working correctly
-    return true;
-}
-#endif //IR_SENSOR_ANALOG

+ 0 - 124
Firmware/fsensor.h

@@ -1,124 +0,0 @@
-//! @file
-#ifndef FSENSOR_H
-#define FSENSOR_H
-
-#include <inttypes.h>
-#include "config.h"
-
-
-// enable/disable flag
-extern bool fsensor_enabled;
-// not responding flag
-extern bool fsensor_not_responding;
-#ifdef PAT9125
-// optical checking "chunk lenght" (already in steps)
-extern int16_t fsensor_chunk_len;
-// count of soft failures
-extern uint8_t fsensor_softfail;
-#endif
-
-//! @name save restore printing
-//! @{
-extern void fsensor_stop_and_save_print(void);
-//! restore print - restore position and heatup to original temperature
-extern void fsensor_restore_print_and_continue(void);
-//! split the current gcode stream to insert new instructions
-extern void fsensor_checkpoint_print(void);
-//! @}
-
-//! initialize
-extern void fsensor_init(void);
-
-#ifdef PAT9125
-//! update axis resolution
-extern void fsensor_set_axis_steps_per_unit(float u);
-#endif
-
-//! @name enable/disable
-//! @{
-extern bool fsensor_enable(bool bUpdateEEPROM=true);
-extern void fsensor_disable(bool bUpdateEEPROM=true);
-//! @}
-
-//autoload feature enabled
-extern bool fsensor_autoload_enabled;
-extern void fsensor_autoload_set(bool State);
-
-extern void fsensor_update(void);
-#ifdef PAT9125
-//! setup pin-change interrupt
-extern void fsensor_setup_interrupt(void);
-
-//! @name autoload support
-//! @{
-
-extern void fsensor_autoload_check_start(void);
-extern void fsensor_autoload_check_stop(void);
-#endif //PAT9125
-extern bool fsensor_check_autoload(void);
-//! @}
-
-#ifdef PAT9125
-//! @name optical quality measurement support
-//! @{
-extern bool fsensor_oq_meassure_enabled;
-extern void fsensor_oq_meassure_set(bool State);
-extern void fsensor_oq_meassure_start(uint8_t skip);
-extern void fsensor_oq_meassure_stop(void);
-extern bool fsensor_oq_result(void);
-//! @}
-
-//! @name callbacks from stepper
-//! @{
-extern void fsensor_st_block_chunk(int cnt);
-
-// debugging
-extern uint8_t fsensor_log;
-
-// There's really nothing to do in block_begin: the stepper ISR likely has
-// called us already at the end of the last block, making this integration
-// redundant. LA1.5 might not always do that during a coasting move, so attempt
-// to drain fsensor_st_cnt anyway at the beginning of the new block.
-#define fsensor_st_block_begin(rev) fsensor_st_block_chunk(0)
-//! @}
-#endif //PAT9125
-
-#define VOLT_DIV_REF 5
-
-#ifdef IR_SENSOR_ANALOG
-#define IR_SENSOR_STEADY 10                       // [ms]
-
-enum class ClFsensorPCB:uint_least8_t
-{
-    _Old=0,
-    _Rev04=1,
-    _Undef=EEPROM_EMPTY_VALUE
-};
-
-enum class ClFsensorActionNA:uint_least8_t
-{
-    _Continue=0,
-    _Pause=1,
-    _Undef=EEPROM_EMPTY_VALUE
-};
-
-extern ClFsensorPCB oFsensorPCB;
-extern ClFsensorActionNA oFsensorActionNA;
-extern const char* FsensorIRVersionText();
-
-extern bool fsensor_IR_check();
-constexpr uint16_t Voltage2Raw(float V){
-	return ( V * 1023 * OVERSAMPLENR / VOLT_DIV_REF ) + 0.5F;
-}
-constexpr float Raw2Voltage(uint16_t raw){
-	return VOLT_DIV_REF*(raw / (1023.F * OVERSAMPLENR) );
-}
-constexpr uint16_t IRsensor_Ldiode_TRESHOLD = Voltage2Raw(0.3F); // ~0.3V, raw value=982
-constexpr uint16_t IRsensor_Lmax_TRESHOLD = Voltage2Raw(1.5F); // ~1.5V (0.3*Vcc), raw value=4910
-constexpr uint16_t IRsensor_Hmin_TRESHOLD = Voltage2Raw(3.0F); // ~3.0V (0.6*Vcc), raw value=9821
-constexpr uint16_t IRsensor_Hopen_TRESHOLD = Voltage2Raw(4.6F); // ~4.6V (N.C. @ Ru~20-50k, Rd'=56k, Ru'=10k), raw value=15059
-constexpr uint16_t IRsensor_VMax_TRESHOLD = Voltage2Raw(5.F); // ~5V, raw value=16368
-
-#endif //IR_SENSOR_ANALOG
-
-#endif //FSENSOR_H

+ 2 - 2
Firmware/lcd.h

@@ -190,14 +190,14 @@ private:
 //Custom characters defined in the first 8 characters of the LCD
 #define LCD_STR_BEDTEMP      "\x00"
 #define LCD_STR_DEGREE       "\x01"
-#define LCD_STR_ARROW_2_DOWN "\x01"
 #define LCD_STR_THERMOMETER  "\x02"
-#define LCD_STR_CONFIRM      "\x02"
 #define LCD_STR_UPLEVEL      "\x03"
 #define LCD_STR_REFRESH      "\x04"
 #define LCD_STR_FOLDER       "\x05"
 #define LCD_STR_FEEDRATE     "\x06"
+#define LCD_STR_ARROW_2_DOWN "\x06"
 #define LCD_STR_CLOCK        "\x07"
+#define LCD_STR_CONFIRM      "\x07"
 #define LCD_STR_ARROW_RIGHT  "\x7E" //from the default character set
 #define LCD_STR_SOLID_BLOCK  "\xFF"  //from the default character set
 

+ 2 - 6
Firmware/mesh_bed_calibration.cpp

@@ -995,8 +995,7 @@ bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, int
 		//printf_P(PSTR("Zs: %f, Z: %f, delta Z: %f"), z_bckp, current_position[Z_AXIS], (z_bckp - current_position[Z_AXIS]));
 		if (fabs(current_position[Z_AXIS] - z_bckp) < 0.025) {
 			//printf_P(PSTR("PINDA triggered immediately, move Z higher and repeat measurement\n")); 
-			current_position[Z_AXIS] += 0.5;
-			go_to_current(homing_feedrate[Z_AXIS]/60);
+			raise_z(0.5);
 			current_position[Z_AXIS] = minimum_z;
             go_to_current(homing_feedrate[Z_AXIS]/(4*60));
             // we have to let the planner know where we are right now as it is not where we said to go.
@@ -2792,10 +2791,7 @@ canceled:
 bool sample_z() {
 	bool sampled = true;
 	//make space
-	current_position[Z_AXIS] += 150;
-	go_to_current(homing_feedrate[Z_AXIS] / 60);
-	//plan_buffer_line_curposXYZE(feedrate, active_extruder););
-
+	raise_z(150);
 	lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET));
 
 	// Sample Z heights for the mesh bed leveling.

+ 9 - 4
Firmware/messages.cpp

@@ -41,7 +41,9 @@ const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[] PROGMEM_I1 = ISTR("Searching bed
 const char MSG_FINISHING_MOVEMENTS[] PROGMEM_I1 = ISTR("Finishing movements"); ////MSG_FINISHING_MOVEMENTS c=20
 const char MSG_FOLLOW_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."); ////MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 const char MSG_FOLLOW_Z_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("There is still a need to make Z calibration. Please follow the manual, chapter First steps, section Calibration flow."); ////MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
+const char MSG_FSENSOR_RUNOUT[] PROGMEM_I1 = ISTR("F. runout"); ////MSG_FSENSOR_RUNOUT c=13
 const char MSG_FSENSOR_AUTOLOAD[] PROGMEM_I1 = ISTR("F. autoload"); ////MSG_FSENSOR_AUTOLOAD c=13
+const char MSG_FSENSOR_JAM_DETECTION[] PROGMEM_I1 = ISTR("F. jam detect"); ////MSG_FSENSOR_JAM_DETECTION c=13
 const char MSG_FSENSOR[] PROGMEM_I1 = ISTR("Fil. sensor"); ////MSG_FSENSOR c=12
 const char MSG_HEATING[] PROGMEM_I1 = ISTR("Heating"); ////MSG_HEATING c=20
 const char MSG_HEATING_COMPLETE[] PROGMEM_I1 = ISTR("Heating done."); ////MSG_HEATING_COMPLETE c=20
@@ -52,7 +54,9 @@ const char MSG_SELECT_FILAMENT[] PROGMEM_I1 = ISTR("Select filament:"); ////MSG_
 const char MSG_LAST_PRINT[] PROGMEM_I1 = ISTR("Last print"); ////MSG_LAST_PRINT c=18
 const char MSG_LAST_PRINT_FAILURES[] PROGMEM_I1 = ISTR("Last print failures"); ////MSG_LAST_PRINT_FAILURES c=20
 const char MSG_LOAD_FILAMENT[] PROGMEM_I1 = ISTR("Load filament"); ////MSG_LOAD_FILAMENT c=17
+const char MSG_LOAD_TO_EXTRUDER[] PROGMEM_I1 = ISTR("Load to extruder"); ////MSG_LOAD_TO_EXTRUDER c=18
 const char MSG_LOADING_FILAMENT[] PROGMEM_I1 = ISTR("Loading filament"); ////MSG_LOADING_FILAMENT c=20
+const char MSG_TESTING_FILAMENT[] PROGMEM_I1 = ISTR("Testing filament"); ////MSG_TESTING_FILAMENT c=20
 const char MSG_EJECT_FILAMENT[] PROGMEM_I1 = ISTR("Eject filament"); ////MSG_EJECT_FILAMENT c=17
 const char MSG_CUT_FILAMENT[] PROGMEM_I1 = ISTR("Cut filament"); ////MSG_CUT_FILAMENT c=17
 const char MSG_MAIN[] PROGMEM_I1 = ISTR("Main"); ////MSG_MAIN c=18
@@ -108,7 +112,7 @@ const char MSG_STOP_PRINT[] PROGMEM_I1 = ISTR("Stop print"); ////MSG_STOP_PRINT
 const char MSG_STOPPED[] PROGMEM_I1 = ISTR("STOPPED."); ////MSG_STOPPED c=20
 const char MSG_PINDA_CALIBRATION[] PROGMEM_I1 = ISTR("PINDA cal."); ////MSG_PINDA_CALIBRATION c=13
 const char MSG_PINDA_CALIBRATION_DONE[] PROGMEM_I1 = ISTR("PINDA calibration is finished and active. It can be disabled in menu Settings->PINDA cal."); ////MSG_PINDA_CALIBRATION_DONE c=20 r=8
-const char MSG_UNLOAD_FILAMENT[] PROGMEM_I1 = ISTR("Unload filament"); ////MSG_UNLOAD_FILAMENT c=18
+const char MSG_UNLOAD_FILAMENT[] PROGMEM_I1 = ISTR("Unload filament"); ////MSG_UNLOAD_FILAMENT c=16
 const char MSG_UNLOADING_FILAMENT[] PROGMEM_I1 = ISTR("Unloading filament"); ////MSG_UNLOADING_FILAMENT c=20
 const char MSG_INFO_SCREEN[] PROGMEM_I1 = ISTR("Info screen"); ////MSG_INFO_SCREEN c=18
 const char MSG_WIZARD_CALIBRATION_FAILED[] PROGMEM_I1 = ISTR("Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."); ////MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
@@ -116,7 +120,7 @@ const char MSG_WIZARD_DONE[] PROGMEM_I1 = ISTR("All is done. Happy printing!");
 const char MSG_WIZARD_HEATING[] PROGMEM_I1 = ISTR("Preheating nozzle. Please wait."); ////MSG_WIZARD_HEATING c=20 r=3
 const char MSG_WIZARD_QUIT[] PROGMEM_I1 = ISTR("You can always resume the Wizard from Calibration -> Wizard."); ////MSG_WIZARD_QUIT c=20 r=8
 const char MSG_WIZARD_WELCOME[] PROGMEM_I1 = ISTR("Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"); ////MSG_WIZARD_WELCOME c=20 r=7
-const char MSG_WIZARD_WELCOME_SHIPPING[] PROGMEM_I1 = ISTR("Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."); ////MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+const char MSG_WIZARD_WELCOME_SHIPPING[] PROGMEM_I1 = ISTR("Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."); ////MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
 const char MSG_YES[] PROGMEM_I1 = ISTR("Yes"); ////MSG_YES c=4
 const char MSG_V2_CALIBRATION[] PROGMEM_I1 = ISTR("First layer cal."); ////MSG_V2_CALIBRATION c=18
 const char MSG_OFF[] PROGMEM_I1 = ISTR("Off"); ////MSG_OFF c=3
@@ -155,7 +159,7 @@ const char MSG_TIMEOUT[] PROGMEM_I1 = ISTR("Timeout"); ////MSG_TIMEOUT c=12
 const char MSG_BRIGHT[] PROGMEM_I1 = ISTR("Bright"); ////MSG_BRIGHT c=6
 const char MSG_DIM[] PROGMEM_I1 = ISTR("Dim"); ////MSG_DIM c=6
 const char MSG_AUTO[] PROGMEM_I1 = ISTR("Auto"); ////MSG_AUTO c=6
-#ifdef IR_SENSOR_ANALOG
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 // Beware - the space at the beginning is necessary since it is reused in LCD menu items which are to be with a space
 const char MSG_IR_04_OR_NEWER[] PROGMEM_I1 = ISTR(" 0.4 or newer");////MSG_IR_04_OR_NEWER c=18
 const char MSG_IR_03_OR_OLDER[] PROGMEM_I1 = ISTR(" 0.3 or older");////MSG_IR_03_OR_OLDER c=18
@@ -165,9 +169,10 @@ extern const char MSG_PAUSED_THERMAL_ERROR[] PROGMEM_I1 = ISTR("PAUSED THERMAL E
 #ifdef TEMP_MODEL
 extern const char MSG_THERMAL_ANOMALY[] PROGMEM_I1 = ISTR("THERMAL ANOMALY");////MSG_THERMAL_ANOMALY c=20
 #endif
+extern const char MSG_LOAD_ALL[] PROGMEM_I1 = ISTR("Load All"); ////MSG_LOAD_ALL c=18
 
 //not internationalized messages
-const char MSG_AUTO_DEPLETE[] PROGMEM_N1 = "SpoolJoin"; ////MSG_AUTO_DEPLETE c=13
+const char MSG_SPOOL_JOIN[] PROGMEM_N1 = "SpoolJoin"; ////MSG_SPOOL_JOIN c=13
 const char MSG_FIRMWARE[] PROGMEM_N1 = "Firmware"; ////MSG_FIRMWARE c=8
 const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY[] PROGMEM_N1 = "FlashAir"; ////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY c=8
 const char MSG_PINDA[] PROGMEM_N1 = "PINDA"; ////MSG_PINDA c=5

+ 7 - 2
Firmware/messages.h

@@ -47,7 +47,9 @@ extern const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[];
 extern const char MSG_FINISHING_MOVEMENTS[];
 extern const char MSG_FOLLOW_CALIBRATION_FLOW[];
 extern const char MSG_FOLLOW_Z_CALIBRATION_FLOW[];
+extern const char MSG_FSENSOR_RUNOUT[];
 extern const char MSG_FSENSOR_AUTOLOAD[];
+extern const char MSG_FSENSOR_JAM_DETECTION[];
 extern const char MSG_FSENSOR[];
 extern const char MSG_HEATING[];
 extern const char MSG_HEATING_COMPLETE[];
@@ -58,7 +60,9 @@ extern const char MSG_SELECT_FILAMENT[];
 extern const char MSG_LAST_PRINT[];
 extern const char MSG_LAST_PRINT_FAILURES[];
 extern const char MSG_LOAD_FILAMENT[];
+extern const char MSG_LOAD_TO_EXTRUDER[];
 extern const char MSG_LOADING_FILAMENT[];
+extern const char MSG_TESTING_FILAMENT[];
 extern const char MSG_M117_V2_CALIBRATION[];
 extern const char MSG_MAIN[];
 extern const char MSG_BACK[];
@@ -130,7 +134,7 @@ extern const char MSG_WELCOME[];
 extern const char MSG_OFF[];
 extern const char MSG_ON[];
 extern const char MSG_NA[];
-extern const char MSG_AUTO_DEPLETE[];
+extern const char MSG_SPOOL_JOIN[];
 extern const char MSG_CUTTER[];
 extern const char MSG_NONE[];
 extern const char MSG_WARN[];
@@ -166,7 +170,7 @@ extern const char MSG_TIMEOUT[];
 extern const char MSG_BRIGHT[];
 extern const char MSG_DIM[];
 extern const char MSG_AUTO[];
-#ifdef IR_SENSOR_ANALOG
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 extern const char MSG_IR_04_OR_NEWER[];
 extern const char MSG_IR_03_OR_OLDER[];
 extern const char MSG_IR_UNKNOWN[];
@@ -175,6 +179,7 @@ extern const char MSG_PAUSED_THERMAL_ERROR[];
 #ifdef TEMP_MODEL
 extern const char MSG_THERMAL_ANOMALY[];
 #endif
+extern const char MSG_LOAD_ALL[];
 
 //not internationalized messages
 extern const char MSG_BROWNOUT_RESET[];

+ 0 - 1267
Firmware/mmu.cpp

@@ -1,1267 +0,0 @@
-//! @file
-
-#include "mmu.h"
-#include "planner.h"
-#include "language.h"
-#include "lcd.h"
-#include "uart2.h"
-#include "temperature.h"
-#include "Configuration_prusa.h"
-#include "fsensor.h"
-#include "cardreader.h"
-#include "cmdqueue.h"
-#include "stepper.h"
-#include "ultralcd.h"
-#include "menu.h"
-#include "sound.h"
-#include "printers.h"
-#include <avr/pgmspace.h>
-#include "AutoDeplete.h"
-#include "fastio.h"
-#include "pins.h"
-//-//
-#include "util.h"
-
-#ifdef TMC2130
-#include "tmc2130.h"
-#endif //TMC2130
-
-#define MMU_TODELAY 100
-#define MMU_TIMEOUT 10
-#define MMU_CMD_TIMEOUT 45000ul //45s timeout for mmu commands (except P0)
-#define MMU_P0_TIMEOUT 3000ul //timeout for P0 command: 3seconds
-#define MMU_MAX_RESEND_ATTEMPTS 2
-
-
-namespace
-{
-    enum class S : uint_least8_t
-    {
-        WaitStealthMode,
-        GetFindaInit,
-        GetBuildNr,
-        GetVersion,
-        Init,
-        Disabled,
-        Idle,
-        GetFinda,
-        WaitCmd, //!< wait for command response
-        Pause,
-        GetDrvError, //!< get power failures count
-		SwitchMode //switch mmu between stealth and normal mode 
-    };
-}
-
-bool mmu_enabled = false;
-bool mmu_ready = false;
-bool mmu_fil_loaded = false; //if true: blocks execution of duplicit T-codes
-
-static S mmu_state = S::Disabled;
-
-MmuCmd mmu_cmd = MmuCmd::None;
-
-//idler ir sensor
-static uint8_t mmu_idl_sens = 0;
-bool ir_sensor_detected = false; 
-static bool mmu_loading_flag = false; //when set to true, we assume that mmu2 unload was finished and loading phase is now performed; printer can send 'A' to mmu2 to abort loading process
-
-uint8_t mmu_extruder = MMU_FILAMENT_UNKNOWN;
-
-//! This variable probably has no meaning and is planed to be removed
-uint8_t tmp_extruder = MMU_FILAMENT_UNKNOWN;
-
-int8_t mmu_finda = -1;
-
-int16_t mmu_version = -1;
-
-int16_t mmu_buildnr = -1;
-
-LongTimer mmu_last_request;
-LongTimer mmu_last_response;
-LongTimer mmu_last_finda_response;
-
-MmuCmd mmu_last_cmd = MmuCmd::None;
-uint16_t mmu_power_failures = 0;
-
-
-#ifdef MMU_DEBUG
-static const auto DEBUG_PUTCHAR = putchar;
-static const auto DEBUG_PUTS_P = puts_P;
-static const auto DEBUG_PRINTF_P = printf_P;
-#else //MMU_DEBUG
-#define DEBUG_PUTCHAR(c)
-#define DEBUG_PUTS_P(str)
-#define DEBUG_PRINTF_P( __fmt, ... )
-#endif //MMU_DEBUG
-
-#if defined(MMU_FINDA_DEBUG) && defined(MMU_DEBUG)
-static const auto FDEBUG_PUTS_P = puts_P;
-static const auto FDEBUG_PRINTF_P = printf_P;
-#else
-#define FDEBUG_PUTS_P(str)
-#define FDEBUG_PRINTF_P( __fmt, ... )
-#endif //defined(MMU_FINDA_DEBUG) && defined(MMU_DEBUG)
-
-
-//clear rx buffer
-void mmu_clr_rx_buf(void)
-{
-	while (fgetc(uart2io) >= 0);
-}
-
-//send command - puts
-int mmu_puts_P(const char* str)
-{
-	mmu_clr_rx_buf();                          //clear rx buffer
-    int r = fputs_P(str, uart2io);             //send command
-	mmu_last_request.start();
-	return r;
-}
-
-//send command - printf
-int mmu_printf_P(const char* format, ...)
-{
-	va_list args;
-	va_start(args, format);
-	mmu_clr_rx_buf();                          //clear rx buffer
-	int r = vfprintf_P(uart2io, format, args); //send command
-	va_end(args);
-	mmu_last_request.start();
-	return r;
-}
-
-//check 'ok' response
-int8_t mmu_rx_ok(void)
-{
-	int8_t res = uart2_rx_str_P(PSTR("ok\n"));
-	if (res == 1) mmu_last_response.start();
-	return res;
-}
-
-//check 'start' response
-int8_t mmu_rx_start(void)
-{
-	int8_t res = uart2_rx_str_P(PSTR("start\n"));
-	if (res == 1) mmu_last_response.start();
-	return res;
-}
-
-//initialize mmu2 unit - first part - should be done at begining of startup process
-void mmu_init(void)
-{
-#ifdef MMU_HWRESET
-	WRITE(MMU_RST_PIN, 1);
-	SET_OUTPUT(MMU_RST_PIN);                   //setup reset pin
-#endif //MMU_HWRESET
-	uart2_init();                              //init uart2
-	_delay_ms(10);                             //wait 10ms for sure
-	mmu_reset();                               //reset mmu (HW or SW), do not wait for response
-	mmu_state = S::Init;
-	SET_INPUT(IR_SENSOR_PIN); //input mode
-	WRITE(IR_SENSOR_PIN, 1); //pullup
-}
-
-//if IR_SENSOR defined, always returns true
-//otherwise check for ir sensor and returns true if idler IR sensor was detected, otherwise returns false
-bool check_for_ir_sensor() 
-{
-#ifdef IR_SENSOR
-	return true;
-#else //IR_SENSOR
-
-	bool detected = false;
-	//if IR_SENSOR_PIN input is low and pat9125sensor is not present we detected idler sensor
-	if ((READ(IR_SENSOR_PIN) == 0) 
-#ifdef PAT9125
-		&& fsensor_not_responding
-#endif //PAT9125
-	) 
-	{		
-		detected = true;
-		//printf_P(PSTR("Idler IR sensor detected\n"));
-	}
-	else
-	{
-		//printf_P(PSTR("Idler IR sensor not detected\n"));
-	}
-	return detected;
-#endif //IR_SENSOR
-}
-
-static bool activate_stealth_mode()
-{
-#ifdef MMU_FORCE_STEALTH_MODE
-	return true;
-#else
-	return (eeprom_read_byte((uint8_t*)EEPROM_MMU_STEALTH) == 1);
-#endif
-}
-
-//mmu main loop - state machine processing
-void mmu_loop(void)
-{
-	static uint8_t mmu_attempt_nr = 0;
-//	printf_P(PSTR("MMU loop, state=%d\n"), mmu_state);
-	switch (mmu_state)
-	{
-	case S::Disabled:
-		return;
-	case S::Init:
-		if (mmu_rx_start() > 0)
-		{
-		    DEBUG_PUTS_P(PSTR("MMU => 'start'"));
-		    DEBUG_PUTS_P(PSTR("MMU <= 'S1'"));
-		    mmu_puts_P(PSTR("S1\n")); //send 'read version' request
-			mmu_state = S::GetVersion;
-		}
-		else if (_millis() > 30000) //30sec after reset disable mmu
-		{
-			puts_P(PSTR("MMU not responding - DISABLED"));
-			mmu_state = S::Disabled;
-		}
-		return;
-	case S::GetVersion:
-		if (mmu_rx_ok() > 0)
-		{
-			fscanf_P(uart2io, PSTR("%u"), &mmu_version); //scan version from buffer
-			DEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_version);
-			DEBUG_PUTS_P(PSTR("MMU <= 'S2'"));
-			mmu_puts_P(PSTR("S2\n")); //send 'read buildnr' request
-			mmu_state = S::GetBuildNr;
-		}
-		return;
-	case S::GetBuildNr:
-		if (mmu_rx_ok() > 0)
-		{
-			fscanf_P(uart2io, PSTR("%u"), &mmu_buildnr); //scan buildnr from buffer
-			DEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_buildnr);
-			bool version_valid = mmu_check_version();
-			if (!version_valid) mmu_show_warning();
-			else puts_P(PSTR("MMU version valid"));
-			
-			if (!activate_stealth_mode())
-			{
-				FDEBUG_PUTS_P(PSTR("MMU <= 'P0'"));
-				mmu_puts_P(PSTR("P0\n")); //send 'read finda' request
-				mmu_state = S::GetFindaInit;
-			}
-			else
-			{
-				DEBUG_PUTS_P(PSTR("MMU <= 'M1'"));
-				mmu_puts_P(PSTR("M1\n")); //set mmu mode to stealth
-				mmu_state = S::WaitStealthMode;
-			}
-
-		}
-		return;
-	case S::WaitStealthMode:
-		if (mmu_rx_ok() > 0)
-		{
-			FDEBUG_PUTS_P(PSTR("MMU <= 'P0'"));
-		    mmu_puts_P(PSTR("P0\n")); //send 'read finda' request
-			mmu_state = S::GetFindaInit;
-		}
-		return;
-	case S::GetFindaInit:
-		if (mmu_rx_ok() > 0)
-		{
-			fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer. MUST BE %hhu!!!
-			mmu_last_finda_response.start();
-			FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda);
-			puts_P(PSTR("MMU - ENABLED"));
-			mmu_enabled = true;
-            //-//
-            // ... PrinterType/Name
-            fSetMmuMode(true);
-			mmu_state = S::Idle;
-		}
-		return;
-	case S::Idle:
-		if (mmu_cmd != MmuCmd::None) //command request ?
-		{
-			if ((mmu_cmd >= MmuCmd::T0) && (mmu_cmd <= MmuCmd::T4))
-			{
-				const uint8_t filament = mmu_cmd - MmuCmd::T0;
-				DEBUG_PRINTF_P(PSTR("MMU <= 'T%d'\n"), filament);
-				mmu_printf_P(PSTR("T%d\n"), filament);
-				mmu_state = S::WaitCmd; // wait for response
-				mmu_fil_loaded = true;
-				mmu_idl_sens = 1;
-			}
-			else if ((mmu_cmd >= MmuCmd::L0) && (mmu_cmd <= MmuCmd::L4))
-			{
-			    const uint8_t filament = mmu_cmd - MmuCmd::L0;
-			    DEBUG_PRINTF_P(PSTR("MMU <= 'L%d'\n"), filament);
-			    mmu_printf_P(PSTR("L%d\n"), filament);
-			    mmu_state = S::WaitCmd; // wait for response
-			}
-			else if (mmu_cmd == MmuCmd::C0)
-			{
-			    DEBUG_PRINTF_P(PSTR("MMU <= 'C0'\n"));
-				mmu_puts_P(PSTR("C0\n")); //send 'continue loading'
-				mmu_state = S::WaitCmd;
-				mmu_idl_sens = 1;
-			}
-			else if (mmu_cmd == MmuCmd::U0)
-			{
-			    DEBUG_PRINTF_P(PSTR("MMU <= 'U0'\n"));
-				mmu_puts_P(PSTR("U0\n")); //send 'unload current filament'
-				mmu_fil_loaded = false;
-				mmu_state = S::WaitCmd;
-			}
-			else if ((mmu_cmd >= MmuCmd::E0) && (mmu_cmd <= MmuCmd::E4))
-			{
-			    const uint8_t filament = mmu_cmd - MmuCmd::E0;
-				DEBUG_PRINTF_P(PSTR("MMU <= 'E%d'\n"), filament);
-				mmu_printf_P(PSTR("E%d\n"), filament); //send eject filament
-				mmu_fil_loaded = false;
-				mmu_state = S::WaitCmd;
-			}
-			else if ((mmu_cmd >= MmuCmd::K0) && (mmu_cmd <= MmuCmd::K4))
-            {
-                const uint8_t filament = mmu_cmd - MmuCmd::K0;
-                DEBUG_PRINTF_P(PSTR("MMU <= 'K%d'\n"), filament);
-                mmu_printf_P(PSTR("K%d\n"), filament); //send eject filament
-                mmu_fil_loaded = false;
-                mmu_state = S::WaitCmd;
-            }
-			else if (mmu_cmd == MmuCmd::R0)
-			{
-			    DEBUG_PRINTF_P(PSTR("MMU <= 'R0'\n"));
-				mmu_puts_P(PSTR("R0\n")); //send recover after eject
-				mmu_state = S::WaitCmd;
-			}
-			else if (mmu_cmd == MmuCmd::S3)
-			{
-			    DEBUG_PRINTF_P(PSTR("MMU <= 'S3'\n"));
-				mmu_puts_P(PSTR("S3\n")); //send power failures request
-				mmu_state = S::GetDrvError;
-			}
-			else if (mmu_cmd == MmuCmd::W0)
-			{
-			    DEBUG_PRINTF_P(PSTR("MMU <= 'W0'\n"));
-			    mmu_puts_P(PSTR("W0\n"));
-			    mmu_state = S::Pause;
-			}
-			mmu_last_cmd = mmu_cmd;
-			mmu_cmd = MmuCmd::None;
-		}
-		else if ((eeprom_read_byte((uint8_t*)EEPROM_MMU_STEALTH) != SilentModeMenu_MMU) && mmu_ready) {
-				DEBUG_PRINTF_P(PSTR("MMU <= 'M%d'\n"), SilentModeMenu_MMU);
-				mmu_printf_P(PSTR("M%d\n"), SilentModeMenu_MMU);
-				mmu_state = S::SwitchMode;
-		}
-		else if (mmu_last_response.expired(300)) //request every 300ms
-		{
-#ifndef IR_SENSOR
-			if(check_for_ir_sensor()) ir_sensor_detected = true;
-#endif //IR_SENSOR not defined
-			FDEBUG_PUTS_P(PSTR("MMU <= 'P0'"));
-		    mmu_puts_P(PSTR("P0\n")); //send 'read finda' request
-			mmu_state = S::GetFinda;
-		}
-		return;
-	case S::GetFinda: //response to command P0
-        if (mmu_idl_sens)
-        {
-            if (READ(IR_SENSOR_PIN) == 0 && mmu_loading_flag)
-            {
-#ifdef MMU_DEBUG
-                printf_P(PSTR("MMU <= 'A'\n"));
-#endif //MMU_DEBUG  
-                mmu_puts_P(PSTR("A\n")); //send 'abort' request
-                mmu_idl_sens = 0;
-                //printf_P(PSTR("MMU IDLER_SENSOR = 0 - ABORT\n"));
-            }
-            //else
-                //printf_P(PSTR("MMU IDLER_SENSOR = 1 - WAIT\n"));
-        }
-		if (mmu_rx_ok() > 0)
-		{
-			fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer. MUST BE %hhu!!!
-			mmu_last_finda_response.start();
-			FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda);
-			//printf_P(PSTR("Eact: %d\n"), int(e_active()));
-			if (!mmu_finda && CHECK_FSENSOR && fsensor_enabled) {
-				fsensor_checkpoint_print();
-				if (mmu_extruder != MMU_FILAMENT_UNKNOWN) // Can't deplete unknown extruder.
-                    ad_markDepleted(mmu_extruder);
-				if (lcd_autoDepleteEnabled() && !ad_allDepleted() && mmu_extruder != MMU_FILAMENT_UNKNOWN) // Can't auto if F=?
-				{
-				    enquecommand_front_P(PSTR("M600 AUTO")); //save print and run M600 command
-				}
-				else
-				{
-				    enquecommand_front_P(PSTR("M600")); //save print and run M600 command
-				}
-			}
-			mmu_state = S::Idle;
-			if (mmu_cmd == MmuCmd::None)
-				mmu_ready = true;
-		}
-		else if (mmu_last_request.expired(MMU_P0_TIMEOUT))
-		{ //resend request after timeout (30s)
-			mmu_state = S::Idle;
-		}
-		return;
-	case S::WaitCmd: //response to mmu commands
-        if (mmu_idl_sens)
-        {
-            if (READ(IR_SENSOR_PIN) == 0 && mmu_loading_flag)
-            {
-                DEBUG_PRINTF_P(PSTR("MMU <= 'A'\n"));
-                mmu_puts_P(PSTR("A\n")); //send 'abort' request
-                mmu_idl_sens = 0;
-                //printf_P(PSTR("MMU IDLER_SENSOR = 0 - ABORT\n"));
-            }
-            //else
-                //printf_P(PSTR("MMU IDLER_SENSOR = 1 - WAIT\n"));
-        }
-		if (mmu_rx_ok() > 0)
-		{
-		    DEBUG_PRINTF_P(PSTR("MMU => 'ok'\n"));
-			mmu_attempt_nr = 0;
-			mmu_last_cmd = MmuCmd::None;
-			mmu_ready = true;
-			mmu_state = S::Idle;
-		}
-		else if (mmu_last_request.expired(MMU_CMD_TIMEOUT))
-		{ //resend request after timeout (5 min)
-			if (mmu_last_cmd != MmuCmd::None)
-			{
-				if (mmu_attempt_nr++ < MMU_MAX_RESEND_ATTEMPTS &&
-				    mmu_last_cmd >= MmuCmd::T0 && mmu_last_cmd <= MmuCmd::T4)
-				{
-				    DEBUG_PRINTF_P(PSTR("MMU retry attempt nr. %d\n"), mmu_attempt_nr - 1);
-					mmu_cmd = mmu_last_cmd;
-				}
-				else {
-					mmu_cmd = MmuCmd::None;
-					mmu_last_cmd = MmuCmd::None; //check
-					mmu_attempt_nr = 0;
-				}
-			}
-			mmu_state = S::Idle;
-		}
-		return;
-	case S::Pause:
-        if (mmu_rx_ok() > 0)
-        {
-            DEBUG_PRINTF_P(PSTR("MMU => 'ok', resume print\n"));
-            mmu_attempt_nr = 0;
-            mmu_last_cmd = MmuCmd::None;
-            mmu_ready = true;
-            mmu_state = S::Idle;
-            lcd_resume_print();
-        }
-        if (mmu_cmd != MmuCmd::None)
-        {
-            mmu_state = S::Idle;
-        }
-	    return;
-	case S::GetDrvError:
-		if (mmu_rx_ok() > 0)
-		{
-			fscanf_P(uart2io, PSTR("%d"), &mmu_power_failures); //scan power failures
-			DEBUG_PRINTF_P(PSTR("MMU => 'ok'\n"));
-			mmu_last_cmd = MmuCmd::None;
-			mmu_ready = true;
-			mmu_state = S::Idle;
-		}
-		else if (mmu_last_request.expired(MMU_CMD_TIMEOUT))
-		{ //timeout 45 s
-			mmu_state = S::Idle;
-		}
-		return;
-	case S::SwitchMode:
-		if (mmu_rx_ok() > 0)
-		{
-			DEBUG_PRINTF_P(PSTR("MMU => 'ok'\n"));
-			eeprom_update_byte((uint8_t*)EEPROM_MMU_STEALTH, SilentModeMenu_MMU);
-			mmu_state = S::Idle;
-		}
-		else if (mmu_last_request.expired(MMU_CMD_TIMEOUT))
-		{ //timeout 45 s
-			mmu_state = S::Idle;
-		}
-		return;		
-	}
-}
-
-void mmu_reset(void)
-{
-#ifdef MMU_HWRESET                             //HW - pulse reset pin
-	WRITE(MMU_RST_PIN, 0);
-	_delay_us(100);
-	WRITE(MMU_RST_PIN, 1);
-#else                                          //SW - send X0 command
-    mmu_puts_P(PSTR("X0\n"));
-#endif
-}
-
-int8_t mmu_set_filament_type(uint8_t extruder, uint8_t filament)
-{
-	printf_P(PSTR("MMU <= 'F%d %d'\n"), extruder, filament);
-	mmu_printf_P(PSTR("F%d %d\n"), extruder, filament);
-	unsigned char timeout = MMU_TIMEOUT;       //10x100ms
-	while ((mmu_rx_ok() <= 0) && (--timeout))
-		delay_keep_alive(MMU_TODELAY);
-	return timeout?1:0;
-}
-
-//! @brief Enqueue MMUv2 command
-//!
-//! Call manage_response() after enqueuing to process command.
-//! If T command is enqueued, it disables current for extruder motor if TMC2130 driver present.
-//! If T or L command is enqueued, it marks filament loaded in AutoDeplete module.
-void mmu_command(MmuCmd cmd)
-{
-	if ((cmd >= MmuCmd::T0) && (cmd <= MmuCmd::T4))
-	{
-		//disable extruder motor
-#ifdef TMC2130
-		tmc2130_set_pwr(E_AXIS, 0);
-#endif //TMC2130
-		//printf_P(PSTR("E-axis disabled\n"));
-		ad_markLoaded(cmd - MmuCmd::T0);
-	}
-    if ((cmd >= MmuCmd::L0) && (cmd <= MmuCmd::L4))
-    {
-        ad_markLoaded(cmd - MmuCmd::L0);
-    }
-
-	mmu_cmd = cmd;
-	mmu_ready = false;
-}
-
-//! @brief Rotate extruder idler to catch filament
-//! @par synchronize
-//!  * true blocking call
-//!  * false non-blocking call
-void mmu_load_step(bool synchronize)
-{
-		current_position[E_AXIS] = current_position[E_AXIS] + MMU_LOAD_FEEDRATE * 0.1;
-		plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
-		if (synchronize) st_synchronize();
-}
-
-//! @brief Is nozzle hot enough to move extruder wheels and do we have idler sensor?
-//!
-//! Do load steps only if temperature is higher then min. temp for safe extrusion and
-//! idler sensor present.
-//! Otherwise "cold extrusion prevented" would be send to serial line periodically
-//! and watchdog reset will be triggered by lack of keep_alive processing.
-//!
-//! @retval true temperature is high enough to move extruder
-//! @retval false temperature is not high enough to move extruder, turned
-//!         off E-stepper to prevent over-heating and allow filament pull-out if necessary
-bool can_extrude()
-{
-    if ((degHotend(active_extruder) < EXTRUDE_MINTEMP) || !ir_sensor_detected)
-    {
-        disable_e0();
-        delay_keep_alive(100);
-        return false;
-    }
-    return true;
-}
-
-static void get_response_print_info(uint8_t move) {
-	printf_P(PSTR("mmu_get_response - begin move: "), move);
-	switch (move) {
-		case MMU_LOAD_MOVE: puts_P(PSTR("load")); break;
-		case MMU_UNLOAD_MOVE: puts_P(PSTR("unload")); break;
-		case MMU_TCODE_MOVE: puts_P(PSTR("T-code")); break;
-		case MMU_NO_MOVE: puts_P(PSTR("no move")); break;
-		default: puts_P(PSTR("error: unknown move")); break;
-	}
-}
-
-bool mmu_get_response(uint8_t move)
-{
-
-	get_response_print_info(move);
-	KEEPALIVE_STATE(IN_PROCESS);
-	while (mmu_cmd != MmuCmd::None)
-	{
-		delay_keep_alive(100);
-	}
-
-	while (!mmu_ready)
-	{
-		if ((mmu_state != S::WaitCmd) && (mmu_last_cmd == MmuCmd::None))
-			break;
-
-		switch (move) {
-			case MMU_LOAD_MOVE:
-			    mmu_loading_flag = true;
-				if (can_extrude()) mmu_load_step();
-				//don't rely on "ok" signal from mmu unit; if filament detected by idler sensor during loading stop loading movements to prevent infinite loading
-				if (READ(IR_SENSOR_PIN) == 0) move = MMU_NO_MOVE;
-				break;
-			case MMU_UNLOAD_MOVE:
-				if (READ(IR_SENSOR_PIN) == 0) //filament is still detected by idler sensor, printer helps with unlading 
-				{
-				    if (can_extrude())
-				    {
-                        puts_P(PSTR("Unload 1"));
-                        current_position[E_AXIS] = current_position[E_AXIS] - MMU_LOAD_FEEDRATE * MMU_LOAD_TIME_MS*0.001;
-                        plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
-                        st_synchronize();
-				    }
-				}
-				else //filament was unloaded from idler, no additional movements needed 
-				{ 
-					puts_P(PSTR("Unloading finished 1"));
-					disable_e0(); //turn off E-stepper to prevent overheating and alow filament pull-out if necessary
-					move = MMU_NO_MOVE;
-				}
-				break;
-			case MMU_TCODE_MOVE: //first do unload and then continue with infinite loading movements
-				if (READ(IR_SENSOR_PIN) == 0) //filament detected by idler sensor, we must unload first 
-				{
-                    if (can_extrude())
-                    {
-                        puts_P(PSTR("Unload 2"));
-                        current_position[E_AXIS] = current_position[E_AXIS] - MMU_LOAD_FEEDRATE * MMU_LOAD_TIME_MS*0.001;
-                        plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
-                        st_synchronize();
-                    }
-				}
-				else //delay to allow mmu unit to pull out filament from bondtech gears and then start with infinite loading 
-				{ 
-					puts_P(PSTR("Unloading finished 2"));
-					disable_e0(); //turn off E-stepper to prevent overheating and alow filament pull-out if necessary
-					delay_keep_alive(MMU_LOAD_TIME_MS);
-					move = MMU_LOAD_MOVE;
-					get_response_print_info(move);
-				}
-				break;
-			case MMU_NO_MOVE:
-			default: 
-				delay_keep_alive(100);
-				break;
-		}
-	}
-	printf_P(PSTR("mmu_get_response() returning: %d\n"), mmu_ready);
-	bool ret = mmu_ready;
-	mmu_ready = false;
-//	printf_P(PSTR("mmu_get_response - end %d\n"), ret?1:0);
-	return ret;
-}
-
-//! @brief Wait for active extruder to reach temperature set
-//!
-//! This function is blocking and showing lcd_wait_for_heater() screen
-//! which is constantly updated with nozzle temperature.
-void mmu_wait_for_heater_blocking()
-{
-    while ((degTargetHotend(active_extruder) - degHotend(active_extruder)) > 5)
-    {
-        delay_keep_alive(1000);
-        lcd_wait_for_heater();
-    }
-}
-
-void manage_response(bool move_axes, bool turn_off_nozzle, uint8_t move)
-{
-	bool response = false;
-	mmu_print_saved = false;
-	bool lcd_update_was_enabled = false;
-	float hotend_temp_bckp = degTargetHotend(active_extruder);
-	float z_position_bckp = current_position[Z_AXIS];
-	float x_position_bckp = current_position[X_AXIS];
-	float y_position_bckp = current_position[Y_AXIS];	
-	uint8_t screen = 0; //used for showing multiscreen messages
-	mmu_loading_flag = false;
-	while(!response)
-	{
-		  response = mmu_get_response(move); //wait for "ok" from mmu
-		  if (!response) { //no "ok" was received in reserved time frame, user will fix the issue on mmu unit
-			  if (!mmu_print_saved) { //first occurence, we are saving current position, park print head in certain position and disable nozzle heater
-				  
-				  uint8_t mmu_fail = eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL);
-				  uint16_t mmu_fail_tot = eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT);
-				  if(mmu_fail < 255) eeprom_update_byte((uint8_t*)EEPROM_MMU_FAIL, mmu_fail + 1);
-				  if(mmu_fail_tot < 65535) eeprom_update_word((uint16_t*)EEPROM_MMU_FAIL_TOT, mmu_fail_tot + 1);
-
-				  if (lcd_update_enabled) {
-					  lcd_update_was_enabled = true;
-					  lcd_update_enable(false);
-				  }
-				  st_synchronize();
-				  mmu_print_saved = true;
-				  puts_P(PSTR("MMU not responding"));
-				  KEEPALIVE_STATE(PAUSED_FOR_USER);
-				  hotend_temp_bckp = degTargetHotend(active_extruder);
-				  if (move_axes) {
-					  z_position_bckp = current_position[Z_AXIS];
-					  x_position_bckp = current_position[X_AXIS];
-					  y_position_bckp = current_position[Y_AXIS];
-				  
-					  //lift z
-					  current_position[Z_AXIS] += Z_PAUSE_LIFT;
-					  if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS;
-					  plan_buffer_line_curposXYZE(15);
-					  st_synchronize();
-					  					  
-					  //Move XY to side
-					  current_position[X_AXIS] = X_PAUSE_POS;
-					  current_position[Y_AXIS] = Y_PAUSE_POS;
-					  plan_buffer_line_curposXYZE(50);
-					  st_synchronize();
-				  }
-				  if (turn_off_nozzle) {
-					  //set nozzle target temperature to 0
-					  setAllTargetHotends(0);
-				  }
-				  disable_e0(); //turn off E-stepper to prevent overheating and alow filament pull-out if necessary
-			  }
-
-			  //first three lines are used for printing multiscreen message; last line contains measured and target nozzle temperature
-			  if (screen == 0) { //screen 0
-				  lcd_display_message_fullscreen_P(_i("MMU needs user attention."));////MSG_MMU_USER_ATTENTION c=20 r=3
-				  screen++;
-			  }
-			  else {  //screen 1
-				  if((degTargetHotend(active_extruder) == 0) && turn_off_nozzle) lcd_display_message_fullscreen_P(_i("Press the knob to resume nozzle temperature."));////MSG_RESUME_NOZZLE_TEMP c=20 r=4
-				  else lcd_display_message_fullscreen_P(_i("Fix the issue and then press button on MMU unit."));////MSG_MMU_FIX_ISSUE c=20 r=4
-				  screen=0;
-			  }
-
-			  //5 seconds delay
-			  for (uint8_t i = 0; i < 5; i++) {
-				  if (lcd_clicked()) {
-					  setTargetHotend(hotend_temp_bckp, active_extruder);
-					 /// mmu_cmd = mmu_last_cmd;
-					  break;
-				  }		  
-
-				  //Print the hotend temperature (9 chars total) and fill rest of the line with space
-				  lcd_set_cursor(0, 4); //line 4
-				  int chars = lcd_printf_P(_N("%c%3d/%d%c"), LCD_STR_THERMOMETER[0],(int)(degHotend(active_extruder) + 0.5), (int)(degTargetHotend(active_extruder) + 0.5), LCD_STR_DEGREE[0]);
-				  lcd_space(9 - chars);
-				  delay_keep_alive(1000);
-			  }
-		  }
-		  else if (mmu_print_saved) {
-			  puts_P(PSTR("MMU starts responding"));
-			  KEEPALIVE_STATE(IN_HANDLER);
-			  mmu_loading_flag = false;
-			  if (turn_off_nozzle) 
-			  {
-				lcd_clear();
-				setTargetHotend(hotend_temp_bckp, active_extruder);
-				if (((degTargetHotend(active_extruder) - degHotend(active_extruder)) > 5)) {
-					lcd_display_message_fullscreen_P(_i("MMU OK. Resuming temperature...")); ////MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-					delay_keep_alive(3000);
-				}
-				mmu_wait_for_heater_blocking();
-			  }			  
-			  if (move_axes) {
-				  lcd_clear();
-				  lcd_display_message_fullscreen_P(_i("MMU OK. Resuming position...")); ////MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-				  current_position[X_AXIS] = x_position_bckp;
-				  current_position[Y_AXIS] = y_position_bckp;
-				  plan_buffer_line_curposXYZE(50);
-				  st_synchronize();
-				  current_position[Z_AXIS] = z_position_bckp;
-				  plan_buffer_line_curposXYZE(15);
-				  st_synchronize();
-			  }
-			  else {
-				  lcd_clear();
-				  lcd_display_message_fullscreen_P(_i("MMU OK. Resuming...")); ////MSG_MMU_OK_RESUMING c=20 r=4
-				  delay_keep_alive(1000); //delay just for showing MMU OK message for a while in case that there are no xyz movements
-			  }
-		  }
-	}
-	if (lcd_update_was_enabled) lcd_update_enable(true);
-#ifdef TMC2130
-			//enable extruder motor (disabled in mmu_command, start of T-code processing)
-			tmc2130_set_pwr(E_AXIS, 1);
-			//printf_P(PSTR("E-axis enabled\n"));
-#endif //TMC2130
-}
-
-//! @brief load filament to nozzle of multimaterial printer
-//!
-//! This function is used only only after T? (user select filament) and M600 (change filament).
-//! It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading
-//! filament to nozzle.
-//!
-void mmu_load_to_nozzle()
-{
-	st_synchronize();
-	
-	const bool saved_e_relative_mode = axis_relative_modes & E_AXIS_MASK;
-	if (!saved_e_relative_mode) axis_relative_modes |= E_AXIS_MASK;
-	if (ir_sensor_detected)
-	{
-		current_position[E_AXIS] += 3.0f;
-	}
-	else
-	{
-		current_position[E_AXIS] += 7.2f;
-	}
-    float feedrate = 562;
-	plan_buffer_line_curposXYZE(feedrate / 60);
-    st_synchronize();
-	current_position[E_AXIS] += 14.4f;
-	feedrate = 871;
-	plan_buffer_line_curposXYZE(feedrate / 60);
-    st_synchronize();
-	current_position[E_AXIS] += 36.0f;
-	feedrate = 1393;
-	plan_buffer_line_curposXYZE(feedrate / 60);
-    st_synchronize();
-	current_position[E_AXIS] += 14.4f;
-	feedrate = 871;
-	plan_buffer_line_curposXYZE(feedrate / 60);
-    st_synchronize();
-	if (!saved_e_relative_mode) axis_relative_modes &= ~E_AXIS_MASK;
-}
-
-void mmu_M600_wait_and_beep() {
-		//Beep and wait for user to remove old filament and prepare new filament for load
-
-		KEEPALIVE_STATE(PAUSED_FOR_USER);
-
-		int counterBeep = 0;
-		lcd_display_message_fullscreen_P(_i("Remove old filament and press the knob to start loading new filament.")); ////MSG_REMOVE_OLD_FILAMENT c=20 r=5
-		bool bFirst=true;
-
-		while (!lcd_clicked()){
-			manage_heater();
-			manage_inactivity(true);
-
-			#if BEEPER > 0
-			if (counterBeep == 500) {
-				counterBeep = 0;
-			}
-			SET_OUTPUT(BEEPER);
-			if (counterBeep == 0) {
-				if((eSoundMode==e_SOUND_MODE_BLIND)|| (eSoundMode==e_SOUND_MODE_LOUD)||((eSoundMode==e_SOUND_MODE_ONCE)&&bFirst))
-				{
-					bFirst=false;
-					WRITE(BEEPER, HIGH);
-				}
-			}
-			if (counterBeep == 20) {
-				WRITE(BEEPER, LOW);
-			}
-				
-			counterBeep++;
-			#endif //BEEPER > 0
-
-			delay_keep_alive(4);
-		}
-		WRITE(BEEPER, LOW);
-}
-
-//! @brief load filament for mmu v2
-//! @par nozzle_temp nozzle temperature to load filament
-void mmu_M600_load_filament(bool automatic, float nozzle_temp)
-{ 
-    tmp_extruder = mmu_extruder;
-    if (automatic) {
-        tmp_extruder = ad_getAlternative(tmp_extruder);
-    }
-    lcd_update_enable(false);
-    lcd_clear();
-    lcd_puts_at_P(0, 1, _T(MSG_LOADING_FILAMENT));
-    lcd_print(' ');
-    lcd_print(tmp_extruder + 1);
-
-    //printf_P(PSTR("T code: %d \n"), tmp_extruder);
-    //mmu_printf_P(PSTR("T%d\n"), tmp_extruder);
-    setTargetHotend(nozzle_temp,active_extruder);
-    mmu_wait_for_heater_blocking();
-
-    mmu_command(MmuCmd::T0 + tmp_extruder);
-
-    manage_response(false, true, MMU_LOAD_MOVE);
-    mmu_continue_loading(usb_timer.running() || (lcd_commands_type == LcdCommands::Layer1Cal));
-    mmu_extruder = tmp_extruder; //filament change is finished
-
-    mmu_load_to_nozzle();
-    load_filament_final_feed();
-    st_synchronize();
-}
-
-void extr_adj(uint8_t extruder) //loading filament into the MMU unit
-{
-    MmuCmd cmd = MmuCmd::L0 + extruder;
-    if (extruder > (MmuCmd::L4 - MmuCmd::L0))
-    {
-        printf_P(PSTR("Filament out of range %d \n"),extruder);
-        return;
-    }
-    mmu_command(cmd);
-	
-	//show which filament is currently loaded
-	
-	lcd_update_enable(false);
-	lcd_clear();
-	lcd_puts_at_P(0, 1, _T(MSG_LOADING_FILAMENT));
-	//if(strlen(_T(MSG_LOADING_FILAMENT))>18) lcd.setCursor(0, 1);
-	//else lcd.print(" ");
-	lcd_print(' ');
-	lcd_print(extruder + 1);
-
-	// get response
-	manage_response(false, false);
-
-	lcd_update_enable(true);
-	
-	
-	//lcd_return_to_status();
-}
-
-struct E_step
-{
-    float extrude;   //!< extrude distance in mm
-    float feed_rate; //!< feed rate in mm/s
-};
-static const E_step ramming_sequence[] PROGMEM =
-{
-    {1.0,   1000.0/60},
-    {1.0,   1500.0/60},
-    {2.0,   2000.0/60},
-    {1.5,   3000.0/60},
-    {2.5,   4000.0/60},
-    {-15.0, 5000.0/60},
-    {-14.0, 1200.0/60},
-    {-6.0,  600.0/60},
-    {10.0,  700.0/60},
-    {-10.0, 400.0/60},
-    {-50.0, 2000.0/60},
-};
-
-//! @brief Unload sequence to optimize shape of the tip of the unloaded filament
-void mmu_filament_ramming()
-{
-    for(uint8_t i = 0; i < (sizeof(ramming_sequence)/sizeof(E_step));++i)
-    {
-        current_position[E_AXIS] += pgm_read_float(&(ramming_sequence[i].extrude));
-        plan_buffer_line_curposXYZE(pgm_read_float(&(ramming_sequence[i].feed_rate)));
-        st_synchronize();
-    }
-}
-
-
-//! @brief show which filament is currently unloaded
-void extr_unload_view()
-{
-    lcd_clear();
-    lcd_puts_at_P(0, 1, _T(MSG_UNLOADING_FILAMENT));
-    lcd_print(' ');
-    if (mmu_extruder == MMU_FILAMENT_UNKNOWN) lcd_print(' ');
-    else lcd_print(mmu_extruder + 1);
-}
-
-void extr_unload()
-{ //unload just current filament for multimaterial printers
-	if (degHotend0() > EXTRUDE_MINTEMP)
-	{
-		st_synchronize();
-
-        menu_submenu(extr_unload_view);
-
-		mmu_filament_ramming();
-
-		mmu_command(MmuCmd::U0);
-		// get response
-		manage_response(false, true, MMU_UNLOAD_MOVE);
-
-        menu_back();
-	}
-	else
-	{
-		show_preheat_nozzle_warning();
-	}
-}
-
-void load_all()
-{
-	enquecommand_P(PSTR("M701 E0"));
-	enquecommand_P(PSTR("M701 E1"));
-	enquecommand_P(PSTR("M701 E2"));
-	enquecommand_P(PSTR("M701 E3"));
-	enquecommand_P(PSTR("M701 E4"));
-}
-
-bool mmu_check_version()
-{
-	return (mmu_buildnr >= MMU_REQUIRED_FW_BUILDNR);
-}
-
-void mmu_show_warning()
-{
-	printf_P(PSTR("MMU2 firmware version invalid. Required version: build number %d or higher."), MMU_REQUIRED_FW_BUILDNR);
-	kill(_i("Please update firmware in your MMU2. Waiting for reset.")); ////MSG_UPDATE_MMU2_FW c=20 r=4
-}
-
-void lcd_mmu_load_to_nozzle(uint8_t filament_nr)
-{
-    menu_back();
-    bFilamentAction = false;                            // NOT in "mmu_load_to_nozzle_menu()"
-    if (degHotend0() > EXTRUDE_MINTEMP)
-    {
-        tmp_extruder = filament_nr;
-        lcd_update_enable(false);
-        lcd_clear();
-        lcd_puts_at_P(0, 1, _T(MSG_LOADING_FILAMENT));
-        lcd_print(' ');
-        lcd_print(tmp_extruder + 1);
-        mmu_command(MmuCmd::T0 + tmp_extruder);
-        manage_response(true, true, MMU_TCODE_MOVE);
-        mmu_continue_loading(false);
-        mmu_extruder = tmp_extruder; //filament change is finished
-        raise_z_above(MIN_Z_FOR_LOAD, false);
-        mmu_load_to_nozzle();
-        load_filament_final_feed();
-        st_synchronize();
-        custom_message_type = CustomMsg::FilamentLoading;
-        lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
-        lcd_return_to_status();
-        lcd_update_enable(true);
-        lcd_load_filament_color_check();
-        lcd_setstatuspgm(MSG_WELCOME);
-        custom_message_type = CustomMsg::Status;
-    }
-    else
-    {
-        show_preheat_nozzle_warning();
-    }
-}
-
-#ifdef MMU_HAS_CUTTER
-void mmu_cut_filament(uint8_t filament_nr)
-{
-    menu_back();
-    bFilamentAction=false;                            // NOT in "mmu_load_to_nozzle_menu()"
-    if (degHotend0() > EXTRUDE_MINTEMP)
-    {
-        LcdUpdateDisabler disableLcdUpdate;
-        lcd_clear();
-        lcd_puts_at_P(0, 1, _i("Cutting filament")); ////MSG_MMU_CUTTING_FIL c=18
-        lcd_print(' ');
-        lcd_print(filament_nr + 1);
-        mmu_filament_ramming();
-        mmu_command(MmuCmd::K0 + filament_nr);
-        manage_response(false, false, MMU_UNLOAD_MOVE);
-    }
-    else
-    {
-        show_preheat_nozzle_warning();
-    }
-}
-#endif //MMU_HAS_CUTTER
-
-void mmu_eject_filament(uint8_t filament, bool recover)
-{
-//-//
-bFilamentAction=false;                            // NOT in "mmu_fil_eject_menu()"
-	if (filament < 5) 
-	{
-
-		if (degHotend0() > EXTRUDE_MINTEMP)
-		{
-			st_synchronize();
-
-			{
-			    LcdUpdateDisabler disableLcdUpdate;
-                lcd_clear();
-                lcd_puts_at_P(0, 1, _i("Ejecting filament")); ////MSG_EJECTING_FILAMENT c=20
-                mmu_filament_ramming();
-                mmu_command(MmuCmd::E0 + filament);
-                manage_response(false, false, MMU_UNLOAD_MOVE);
-                if (recover)
-                {
-                    lcd_show_fullscreen_message_and_wait_P(_i("Please remove filament and then press the knob.")); ////MSG_EJECT_REMOVE c=20 r=4
-                    mmu_command(MmuCmd::R0);
-                    manage_response(false, false);
-                }
-
-            }
-		}
-		else
-		{
-			show_preheat_nozzle_warning();
-		}
-	}
-	else
-	{
-		puts_P(PSTR("Filament nr out of range!"));
-	}
-}
-
-//! @brief Fits filament tip into heatbreak?
-//!
-//! If PTFE tube is jammed, this causes filament to be unloaded and no longer
-//! being detected by the pulley IR sensor.
-//! @retval true Fits
-//! @retval false Doesn't fit
-static bool can_load()
-{
-    current_position[E_AXIS] += 60;
-    plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
-    current_position[E_AXIS] -= 52;
-    plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
-    st_synchronize();
-
-    uint_least8_t filament_detected_count = 0;
-    const float e_increment = 0.2;
-    const uint_least8_t steps = 6.0 / e_increment;
-    DEBUG_PUTS_P(PSTR("MMU can_load:"));
-    for(uint_least8_t i = 0; i < steps; ++i)
-    {
-        current_position[E_AXIS] -= e_increment;
-        plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
-        st_synchronize();
-        if(0 == READ(IR_SENSOR_PIN))
-        {
-            ++filament_detected_count;
-            DEBUG_PUTCHAR('O');
-        }
-        else
-        {
-            DEBUG_PUTCHAR('o');
-        }
-    }
-    if (filament_detected_count > steps - 4)
-    {
-        DEBUG_PUTS_P(PSTR(" succeeded."));
-        return true;
-    }
-    else
-    {
-        DEBUG_PUTS_P(PSTR(" failed."));
-        return false;
-    }
-}
-
-//! @brief load more
-//!
-//! Try to feed more filament from MMU if it is not detected by filament sensor.
-//! @retval true Success, filament detected by IR sensor
-//! @retval false Failed, filament not detected by IR sensor after maximum number of attempts
-static bool load_more()
-{
-    for (uint8_t i = 0; i < MMU_IDLER_SENSOR_ATTEMPTS_NR; i++)
-    {
-        if (READ(IR_SENSOR_PIN) == 0) return true;
-        DEBUG_PRINTF_P(PSTR("Additional load attempt nr. %d\n"), i);
-        mmu_command(MmuCmd::C0);
-        manage_response(true, true, MMU_LOAD_MOVE);
-    }
-    return false;
-}
-
-static void increment_load_fail()
-{
-    uint8_t mmu_load_fail = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
-    uint16_t mmu_load_fail_tot = eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT);
-    if(mmu_load_fail < 255) eeprom_update_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, mmu_load_fail + 1);
-    if(mmu_load_fail_tot < 65535) eeprom_update_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, mmu_load_fail_tot + 1);
-}
-
-//! @brief continue loading filament
-//! @par blocking
-//!  * true blocking - do not return until successful load
-//!  * false non-blocking - pause print and return on load failure
-//!
-//! @startuml
-//! [*] --> [*] : !ir_sensor_detected /\n send MmuCmd::C0
-//! [*] --> LoadMore
-//! LoadMore --> [*] : filament \ndetected
-//! LoadMore --> Retry : !filament detected /\n increment load fail
-//! Retry --> [*] : filament \ndetected
-//! Retry --> Unload : !filament \ndetected
-//! Unload --> [*] : non-blocking
-//! Unload --> Retry : button \nclicked
-//!
-//! Retry : Cut filament if enabled
-//! Retry : repeat last T-code
-//! Unload : unload filament
-//! Unload : pause print
-//! Unload : show error message
-//!
-//! @enduml
-void mmu_continue_loading(bool blocking)
-{
-	if (!ir_sensor_detected)
-	{
-	    mmu_command(MmuCmd::C0);
-	    return;
-	}
-
-    bool success = load_more();
-    if (success) success = can_load();
-
-    enum class Ls : uint_least8_t
-    {
-        Enter,
-        Retry,
-        Unload,
-    };
-    Ls state = Ls::Enter;
-
-    const uint_least8_t max_retry = 3;
-    uint_least8_t retry = 0;
-
-    while (!success)
-    {
-        switch (state)
-        {
-        case Ls::Enter:
-            increment_load_fail();
-            // FALLTHRU
-        case Ls::Retry:
-            ++retry; // overflow not handled, as it is not dangerous.
-            if (retry >= max_retry)
-            {
-                state = Ls::Unload;
-#ifdef MMU_HAS_CUTTER
-                if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
-                {
-                    mmu_command(MmuCmd::K0 + tmp_extruder);
-                    manage_response(true, true, MMU_UNLOAD_MOVE);
-                }
-#endif //MMU_HAS_CUTTER
-            }
-            mmu_command(MmuCmd::T0 + tmp_extruder);
-            manage_response(true, true, MMU_TCODE_MOVE);
-            success = load_more();
-            if (success) success = can_load();
-
-            break;
-        case Ls::Unload:
-            stop_and_save_print_to_ram(0, 0);
-            long_pause();
-
-            mmu_command(MmuCmd::U0);
-            manage_response(false, true, MMU_UNLOAD_MOVE);
-
-            setAllTargetHotends(0);
-            lcd_setstatuspgm(_i("MMU load failed"));////MSG_MMU_LOAD_FAILED c=20
-
-            if (blocking)
-            {
-                marlin_wait_for_click();
-                st_synchronize();
-                restore_print_from_ram_and_continue(0);
-                state = Ls::Retry;
-            }
-            else
-            {
-                mmu_fil_loaded = false; //so we can retry same T-code again
-                isPrintPaused = true;
-                mmu_command(MmuCmd::W0);
-                return;
-            }
-            break;
-        }
-    }
-}

+ 0 - 120
Firmware/mmu.h

@@ -1,120 +0,0 @@
-//! @file
-
-#ifndef MMU_H
-#define MMU_H
-
-#include <inttypes.h>
-#include "Timer.h"
-
-
-extern bool mmu_enabled;
-extern bool mmu_fil_loaded;
-
-extern uint8_t mmu_extruder;
-
-extern uint8_t tmp_extruder;
-
-extern int8_t mmu_finda;
-extern LongTimer mmu_last_finda_response;
-extern bool ir_sensor_detected;
-
-extern int16_t mmu_version;
-extern int16_t mmu_buildnr;
-
-extern uint16_t mmu_power_failures;
-
-#define MMU_FILAMENT_UNKNOWN 255
-
-#define MMU_NO_MOVE 0
-#define MMU_UNLOAD_MOVE 1
-#define MMU_LOAD_MOVE 2
-#define MMU_TCODE_MOVE 3
-
-#define MMU_LOAD_FEEDRATE 19.02f //mm/s
-#define MMU_LOAD_TIME_MS 2000 //should be fine tuned to load time for shortest allowed PTFE tubing and maximum loading speed
-
-enum class MmuCmd : uint_least8_t
-{
-    None,
-    T0,
-    T1,
-    T2,
-    T3,
-    T4,
-    L0,
-    L1,
-    L2,
-    L3,
-    L4,
-    C0,
-    U0,
-    E0,
-    E1,
-    E2,
-    E3,
-    E4,
-    K0,
-    K1,
-    K2,
-    K3,
-    K4,
-    R0,
-    S3,
-    W0, //!< Wait and signal load error
-};
-
-inline MmuCmd operator+ (MmuCmd cmd, uint8_t filament)
-{
-    return static_cast<MmuCmd>(static_cast<uint8_t>(cmd) + filament );
-}
-
-inline uint8_t operator- (MmuCmd cmda, MmuCmd cmdb)
-{
-    return (static_cast<uint8_t>(cmda) - static_cast<uint8_t>(cmdb));
-}
-
-extern int mmu_puts_P(const char* str);
-
-extern int mmu_printf_P(const char* format, ...);
-
-extern int8_t mmu_rx_ok(void);
-
-extern bool check_for_ir_sensor();
-
-extern void mmu_init(void);
-
-extern void mmu_loop(void);
-
-
-extern void mmu_reset(void);
-
-extern int8_t mmu_set_filament_type(uint8_t extruder, uint8_t filament);
-
-extern void mmu_command(MmuCmd cmd);
-
-extern bool mmu_get_response(uint8_t move = 0);
-
-extern void manage_response(bool move_axes, bool turn_off_nozzle, uint8_t move = MMU_NO_MOVE);
-
-extern void mmu_load_to_nozzle();
-
-extern void mmu_M600_load_filament(bool automatic, float nozzle_temp);
-extern void mmu_M600_wait_and_beep();
-
-extern void extr_adj(uint8_t extruder);
-extern void extr_unload();
-extern void load_all();
-
-extern bool mmu_check_version();
-extern void mmu_show_warning();
-extern void lcd_mmu_load_to_nozzle(uint8_t filament_nr);
-extern void mmu_eject_filament(uint8_t filament, bool recover);
-#ifdef MMU_HAS_CUTTER
-extern void mmu_cut_filament(uint8_t filament_nr);
-#endif //MMU_HAS_CUTTER
-extern void mmu_continue_loading(bool blocking);
-extern void mmu_filament_ramming();
-extern void mmu_wait_for_heater_blocking();
-extern void mmu_load_step(bool synchronize = true);
-
-#endif //MMU_H

+ 926 - 0
Firmware/mmu2.cpp

@@ -0,0 +1,926 @@
+#include "mmu2.h"
+#include "mmu2_error_converter.h"
+#include "mmu2_fsensor.h"
+#include "mmu2_log.h"
+#include "mmu2_power.h"
+#include "mmu2_progress_converter.h"
+#include "mmu2_reporting.h"
+
+#include "Marlin.h"
+#include "language.h"
+#include "messages.h"
+#include "sound.h"
+#include "stepper.h"
+#include "strlen_cx.h"
+#include "temperature.h"
+#include "ultralcd.h"
+#include "cardreader.h" // for IS_SD_PRINTING
+#include "SpoolJoin.h"
+
+// As of FW 3.12 we only support building the FW with only one extruder, all the multi-extruder infrastructure will be removed.
+// Saves at least 800B of code size
+static_assert(EXTRUDERS==1);
+
+// Settings for filament load / unload from the LCD menu.
+// This is for Prusa MK3-style extruders. Customize for your hardware.
+#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0
+
+#define NOZZLE_PARK_XY_FEEDRATE 50
+#define NOZZLE_PARK_Z_FEEDRATE 15
+
+// Nominal distance from the extruder gear to the nozzle tip is 87mm
+// However, some slipping may occur and we need separate distances for
+// LoadToNozzle and ToolChange.
+// - +5mm seemed good for LoadToNozzle,
+// - but too much (made blobs) for a ToolChange
+static constexpr float MMU2_LOAD_TO_NOZZLE_LENGTH = 87.0F + 5.0F;
+
+// As discussed with our PrusaSlicer profile specialist
+// - ToolChange shall not try to push filament into the very tip of the nozzle
+// to have some space for additional G-code to tune the extruded filament length
+// in the profile
+static constexpr float MMU2_TOOL_CHANGE_LOAD_LENGTH = 30.0F;
+
+static constexpr float MMU2_LOAD_TO_NOZZLE_FEED_RATE = 20.0F; // mm/s
+static constexpr float MMU2_UNLOAD_TO_FINDA_FEED_RATE = 120.0F; // mm/s
+
+// The first the MMU does is initialise its axis. Meanwhile the E-motor will unload 20mm of filament in approx. 1 second.
+static constexpr float MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH = 20.0f; // mm
+static constexpr float MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE = 20.0f; // mm/s
+
+static constexpr uint8_t MMU2_NO_TOOL = 99;
+static constexpr uint32_t MMU_BAUD = 115200;
+
+struct E_Step {
+    float extrude;       ///< extrude distance in mm
+    float feedRate; ///< feed rate in mm/s
+};
+
+static constexpr E_Step ramming_sequence[] PROGMEM = {
+    { 0.2816F,  1339.0F / 60.F},
+    { 0.3051F,  1451.0F / 60.F},
+    { 0.3453F,  1642.0F / 60.F},
+    { 0.3990F,  1897.0F / 60.F},
+    { 0.4761F,  2264.0F / 60.F},
+    { 0.5767F,  2742.0F / 60.F},
+    { 0.5691F,  3220.0F / 60.F},
+    { 0.1081F,  3220.0F / 60.F},
+    { 0.7644F,  3635.0F / 60.F},
+    { 0.8248F,  3921.0F / 60.F},
+    { 0.8483F,  4033.0F / 60.F},
+    { -15.0F,   6000.0F / 60.F},
+    { -24.5F,   1200.0F / 60.F},
+    { -7.0F,    600.0F / 60.F},
+    { -3.5F,    360.0F / 60.F},
+    { 20.0F,    454.0F / 60.F},
+    { -20.0F,   303.0F / 60.F},
+    { -35.0F,   2000.0F / 60.F},
+};
+
+static constexpr E_Step load_to_nozzle_sequence[] PROGMEM = { 
+    { 10.0F,  810.0F / 60.F}, // feed rate = 13.5mm/s - Load fast until filament reach end of nozzle
+    { 25.0F,  198.0F / 60.F}, // feed rate = 3.3mm/s  - Load slower once filament is out of the nozzle
+};
+
+namespace MMU2 {
+
+void execute_extruder_sequence(const E_Step *sequence, int steps);
+
+template<typename F>
+void waitForHotendTargetTemp(uint16_t delay, F f){
+    while (((degTargetHotend(active_extruder) - degHotend(active_extruder)) > 5)) {
+        f();
+        delay_keep_alive(delay);
+    }
+}
+
+void WaitForHotendTargetTempBeep(){
+    waitForHotendTargetTemp(3000, []{ Sound_MakeSound(e_SOUND_TYPE_StandardPrompt); } );
+}
+
+MMU2 mmu2;
+
+MMU2::MMU2()
+    : is_mmu_error_monitor_active(false)
+    , logic(&mmu2Serial)
+    , extruder(MMU2_NO_TOOL)
+    , tool_change_extruder(MMU2_NO_TOOL)
+    , resume_position()
+    , resume_hotend_temp(0)
+    , logicStepLastStatus(StepStatus::Finished)
+    , state(xState::Stopped)
+    , mmu_print_saved(SavedState::None)
+    , loadFilamentStarted(false)
+    , unloadFilamentStarted(false)
+    , loadingToNozzle(false)
+    , inAutoRetry(false)
+    , retryAttempts(MAX_RETRIES)
+{
+}
+
+void MMU2::Start() {
+#ifdef MMU_HWRESET
+    WRITE(MMU_RST_PIN, 1);
+    SET_OUTPUT(MMU_RST_PIN); // setup reset pin
+#endif //MMU_HWRESET
+
+    mmu2Serial.begin(MMU_BAUD);
+
+    PowerOn(); // I repurposed this to serve as our EEPROM disable toggle.
+    Reset(ResetForm::ResetPin);
+
+    mmu2Serial.flush(); // make sure the UART buffer is clear before starting communication
+
+    extruder = MMU2_NO_TOOL;
+    state = xState::Connecting;
+
+    // start the communication
+    logic.Start();
+
+    ResetRetryAttempts();
+}
+
+void MMU2::Stop() {
+    StopKeepPowered();
+    PowerOff(); // This also disables the MMU in the EEPROM.
+}
+
+void MMU2::StopKeepPowered(){
+    state = xState::Stopped;
+    logic.Stop();
+    mmu2Serial.close();
+}
+
+void MMU2::Reset(ResetForm level){
+    switch (level) {
+    case Software: ResetX0(); break;
+    case ResetPin: TriggerResetPin(); break;
+    case CutThePower: PowerCycle(); break;
+    default: break;
+    }
+}
+
+void MMU2::ResetX0() {
+    logic.ResetMMU(); // Send soft reset
+}
+
+void MMU2::TriggerResetPin(){
+    reset();
+}
+
+void MMU2::PowerCycle(){
+    // cut the power to the MMU and after a while restore it
+    // Sadly, MK3/S/+ cannot do this 
+    // NOTE: the below will toggle the EEPROM var. Should we
+    // assert this function is never called in the MK3 FW? Do we even care?
+    PowerOff();
+    delay_keep_alive(1000);
+    PowerOn();
+}
+
+void MMU2::PowerOff(){
+    power_off();
+}
+
+void MMU2::PowerOn(){
+    power_on();
+}
+
+bool MMU2::ReadRegister(uint8_t address){
+    if( ! WaitForMMUReady())
+        return false;
+    logic.ReadRegister(address); // we may signal the accepted/rejected status of the response as return value of this function
+    manage_response(false, false);
+    return true;
+}
+
+bool MMU2::WriteRegister(uint8_t address, uint16_t data){
+    if( ! WaitForMMUReady())
+        return false;
+    logic.WriteRegister(address, data); // we may signal the accepted/rejected status of the response as return value of this function
+    manage_response(false, false);
+    return true;
+}
+
+void MMU2::mmu_loop() {
+    // We only leave this method if the current command was successfully completed - that's the Marlin's way of blocking operation
+    // Atomic compare_exchange would have been the most appropriate solution here, but this gets called only in Marlin's task,
+    // so thread safety should be kept
+    static bool avoidRecursion = false;
+    if (avoidRecursion)
+        return;
+    avoidRecursion = true;
+
+    logicStepLastStatus = LogicStep(); // it looks like the mmu_loop doesn't need to be a blocking call
+
+    if (is_mmu_error_monitor_active){
+        // Call this every iteration to keep the knob rotation responsive
+        // This includes when mmu_loop is called within manage_response
+        ReportErrorHook((uint16_t)lastErrorCode, mmu2.MMUCurrentErrorCode() == ErrorCode::OK ? ErrorSourcePrinter : ErrorSourceMMU);
+    }
+
+    avoidRecursion = false;
+}
+
+void MMU2::CheckFINDARunout()
+{
+    // Check for FINDA filament runout
+    if (!FindaDetectsFilament() && CHECK_FSENSOR) {
+        SERIAL_ECHOLNPGM("FINDA filament runout!");
+        stop_and_save_print_to_ram(0, 0);
+        restore_print_from_ram_and_continue(0);
+        if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN) // Can't auto if F=?
+        {
+            enquecommand_front_P(PSTR("M600 AUTO")); //save print and run M600 command
+        }
+        else
+        {
+            enquecommand_front_P(PSTR("M600")); //save print and run M600 command
+        }
+    }
+}
+
+struct ReportingRAII {
+    CommandInProgress cip;
+    inline ReportingRAII(CommandInProgress cip):cip(cip){
+        BeginReport(cip, (uint16_t)ProgressCode::EngagingIdler);
+    }
+    inline ~ReportingRAII(){
+        EndReport(cip, (uint16_t)ProgressCode::OK);
+    }
+};
+
+bool MMU2::WaitForMMUReady(){
+    switch(State()){
+    case xState::Stopped:
+        return false;
+    case xState::Connecting:
+        // shall we wait until the MMU reconnects?
+        // fire-up a fsm_dlg and show "MMU not responding"?
+    default:
+        return true;
+    }
+}
+
+bool MMU2::RetryIfPossible(uint16_t ec){
+    if( retryAttempts ){
+        SERIAL_ECHOPGM("retryAttempts=");SERIAL_ECHOLN((uint16_t)retryAttempts);
+        SetButtonResponse(ButtonOperations::Retry);
+        // check, that Retry is actually allowed on that operation
+        if( ButtonAvailable(ec) != NoButton ){
+            inAutoRetry = true;
+            SERIAL_ECHOLNPGM("RetryButtonPressed");
+            // We don't decrement until the button is acknowledged by the MMU.
+            //--retryAttempts; // "used" one retry attempt
+            return true;
+        }
+    }
+    inAutoRetry = false;
+    return false;
+}
+
+void MMU2::ResetRetryAttempts(){
+    SERIAL_ECHOLNPGM("ResetRetryAttempts");
+    retryAttempts = MAX_RETRIES;
+}
+
+void MMU2::DecrementRetryAttempts(){
+    if (inAutoRetry && retryAttempts)
+    {
+        SERIAL_ECHOLNPGM("DecrementRetryAttempts");
+        retryAttempts--;
+    }
+}
+
+bool MMU2::tool_change(uint8_t index) {
+    if( ! WaitForMMUReady())
+        return false;
+
+    if (index != extruder) {
+        if (!IS_SD_PRINTING && !usb_timer.running())
+        {
+            // If Tcodes are used manually through the serial
+            // we need to unload manually as well
+            unload();
+        }
+
+        ReportingRAII rep(CommandInProgress::ToolChange);
+        FSensorBlockRunout blockRunout;
+
+        st_synchronize();
+
+        tool_change_extruder = index;
+        logic.ToolChange(index); // let the MMU pull the filament out and push a new one in
+        manage_response(true, true);
+        
+        // reset current position to whatever the planner thinks it is
+        plan_set_e_position(current_position[E_AXIS]);
+
+        extruder = index; //filament change is finished
+        SpoolJoin::spooljoin.setSlot(index);
+
+        // @@TODO really report onto the serial? May be for the Octoprint? Not important now
+        //        SERIAL_ECHO_START();
+        //        SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, int(extruder));
+    }
+    return true;
+}
+
+/// Handle special T?/Tx/Tc commands
+///
+///- T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically
+///- Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load.
+///- Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
+bool MMU2::tool_change(char code, uint8_t slot) {
+    if( ! WaitForMMUReady())
+        return false;
+
+    FSensorBlockRunout blockRunout;
+
+    switch (code) {
+    case '?': {
+        waitForHotendTargetTemp(100, []{});
+        load_filament_to_nozzle(slot);
+    } break;
+
+    case 'x': {
+        set_extrude_min_temp(0); // Allow cold extrusion since Tx only loads to the gears not nozzle
+        st_synchronize();
+        tool_change_extruder = slot;
+        logic.ToolChange(slot);
+        manage_response(false, false);
+        extruder = slot;
+        SpoolJoin::spooljoin.setSlot(slot);
+        set_extrude_min_temp(EXTRUDE_MINTEMP);
+    } break;
+
+    case 'c': {
+        waitForHotendTargetTemp(100, []{});
+        execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof (load_to_nozzle_sequence[0]));
+    } break;
+    }
+
+    return true;
+}
+
+void MMU2::get_statistics() {
+    logic.Statistics();
+}
+
+uint8_t MMU2::get_current_tool() const {
+    return extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : extruder;
+}
+
+uint8_t MMU2::get_tool_change_tool() const {
+    return tool_change_extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : tool_change_extruder;
+}
+
+bool MMU2::set_filament_type(uint8_t index, uint8_t type) {
+    if( ! WaitForMMUReady())
+        return false;
+    
+    // @@TODO - this is not supported in the new MMU yet
+    // cmd_arg = filamentType;
+    // command(MMU_CMD_F0 + index);
+
+    manage_response(false, false); // true, true); -- Comment: how is it possible for a filament type set to fail?
+    
+    return true;
+}
+
+bool MMU2::unload() {
+    if( ! WaitForMMUReady())
+        return false;
+
+    WaitForHotendTargetTempBeep();
+
+    {
+        FSensorBlockRunout blockRunout;
+        ReportingRAII rep(CommandInProgress::UnloadFilament);
+        filament_ramming();
+
+        logic.UnloadFilament();
+        manage_response(false, true);
+        Sound_MakeSound(e_SOUND_TYPE_StandardConfirm);
+
+        // no active tool
+        extruder = MMU2_NO_TOOL;
+        tool_change_extruder = MMU2_NO_TOOL;
+    }
+    return true;
+}
+
+bool MMU2::cut_filament(uint8_t index){
+    if( ! WaitForMMUReady())
+        return false;
+
+    ReportingRAII rep(CommandInProgress::CutFilament);
+    logic.CutFilament(index);
+    manage_response(false, true);
+    
+    return true;
+}
+
+void FullScreenMsg(const char *pgmS, uint8_t slot){
+    lcd_update_enable(false);
+    lcd_clear();
+    lcd_puts_at_P(0, 1, pgmS);
+    lcd_print(' ');
+    lcd_print(slot + 1);
+}
+
+bool MMU2::load_to_extruder(uint8_t index){
+    FullScreenMsg(_T(MSG_TESTING_FILAMENT), index);
+    tool_change(index);
+    st_synchronize();
+    unload();
+    lcd_update_enable(true);
+    return true;
+}
+
+bool MMU2::load_filament(uint8_t index) {
+    if( ! WaitForMMUReady())
+        return false;
+
+    FullScreenMsg(_T(MSG_LOADING_FILAMENT), index);
+
+    ReportingRAII rep(CommandInProgress::LoadFilament);
+    logic.LoadFilament(index);
+    manage_response(false, false);
+    Sound_MakeSound(e_SOUND_TYPE_StandardConfirm);
+
+    lcd_update_enable(true);
+
+    return true;
+}
+
+struct LoadingToNozzleRAII {
+    MMU2 &mmu2;
+    explicit inline LoadingToNozzleRAII(MMU2 &mmu2):mmu2(mmu2){
+        mmu2.loadingToNozzle = true;
+    }
+    inline ~LoadingToNozzleRAII(){
+        mmu2.loadingToNozzle = false;
+    }
+};
+
+bool MMU2::load_filament_to_nozzle(uint8_t index) {
+    if( ! WaitForMMUReady())
+        return false;
+
+    LoadingToNozzleRAII ln(*this);
+
+    WaitForHotendTargetTempBeep();
+
+    FullScreenMsg(_T(MSG_LOADING_FILAMENT), index);
+    {
+        // used for MMU-menu operation "Load to Nozzle"
+        ReportingRAII rep(CommandInProgress::ToolChange);
+        FSensorBlockRunout blockRunout;
+
+        if( extruder != MMU2_NO_TOOL ){ // we already have some filament loaded - free it + shape its tip properly
+            filament_ramming();
+        }
+
+        tool_change_extruder = index;
+        logic.ToolChange(index);
+        manage_response(true, true);
+
+        // The MMU's idler is disengaged at this point
+        // That means the MK3/S now has fully control
+
+        // reset current position to whatever the planner thinks it is
+        st_synchronize();
+        plan_set_e_position(current_position[E_AXIS]);
+
+        // Finish loading to the nozzle with finely tuned steps.
+        execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof (load_to_nozzle_sequence[0]));
+
+        extruder = index;
+        SpoolJoin::spooljoin.setSlot(index);
+
+        Sound_MakeSound(e_SOUND_TYPE_StandardConfirm);
+    }
+    lcd_update_enable(true);
+    return true;
+}
+
+bool MMU2::eject_filament(uint8_t index, bool recover) {
+    if( ! WaitForMMUReady())
+        return false;
+
+    ReportingRAII rep(CommandInProgress::EjectFilament);
+    current_position[E_AXIS] -= MMU2_FILAMENTCHANGE_EJECT_FEED;
+    plan_buffer_line_curposXYZE(2500.F / 60.F);
+    st_synchronize();
+    logic.EjectFilament(index);
+    manage_response(false, false);
+
+    if (recover) {
+        //        LCD_MESSAGEPGM(MSG_MMU2_EJECT_RECOVER);
+        Sound_MakeSound(e_SOUND_TYPE_StandardPrompt);
+//@@TODO        wait_for_user = true;
+        
+        //#if ENABLED(HOST_PROMPT_SUPPORT)
+        //        host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), PSTR("Continue"));
+        //#endif
+        //#if ENABLED(EXTENSIBLE_UI)
+        //        ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover"));
+        //#endif
+        
+//@@TODO        while (wait_for_user) idle(true);
+        
+        Sound_MakeSound(e_SOUND_TYPE_StandardConfirm);
+        // logic.Command(); //@@TODO command(MMU_CMD_R0);
+        manage_response(false, false);
+    }
+
+    // no active tool
+    extruder = MMU2_NO_TOOL;
+    tool_change_extruder = MMU2_NO_TOOL;
+    Sound_MakeSound(e_SOUND_TYPE_StandardConfirm);
+//    disable_E0();
+
+    return true;
+}
+
+void MMU2::Button(uint8_t index){
+    LogEchoEvent_P(PSTR("Button"));
+    logic.Button(index);
+}
+
+void MMU2::Home(uint8_t mode){
+    logic.Home(mode);
+}
+
+void MMU2::SaveAndPark(bool move_axes, bool turn_off_nozzle) {
+    if (mmu_print_saved == SavedState::None) { // First occurrence. Save current position, park print head, disable nozzle heater.
+        LogEchoEvent_P(PSTR("Saving and parking"));
+        st_synchronize();
+      
+        resume_hotend_temp = degTargetHotend(active_extruder);
+
+        if (move_axes){
+            mmu_print_saved |= SavedState::ParkExtruder;
+            // save current pos
+            for(uint8_t i = 0; i < 3; ++i){
+                resume_position.xyz[i] = current_position[i];
+            }
+
+            // lift Z
+            raise_z(MMU_ERR_Z_PAUSE_LIFT);
+
+            // move XY aside
+            current_position[X_AXIS] = MMU_ERR_X_PAUSE_POS;
+            current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS;
+            plan_buffer_line_curposXYZE(NOZZLE_PARK_XY_FEEDRATE);
+            st_synchronize();
+        }
+
+        if (turn_off_nozzle){
+            mmu_print_saved |= SavedState::CooldownPending;
+            LogEchoEvent_P(PSTR("Heater cooldown pending"));
+            // This just sets the flag that we should timeout and shut off the nozzle in 30 minutes...
+            //setAllTargetHotends(0);
+        }
+    }
+    // keep the motors powered forever (until some other strategy is chosen)
+    // @@TODO do we need that in 8bit?
+    // gcode.reset_stepper_timeout();
+}
+
+void MMU2::ResumeHotendTemp() {
+    if ((mmu_print_saved & SavedState::CooldownPending))
+    {
+        // Clear the "pending" flag if we haven't cooled yet.
+        mmu_print_saved &= ~(SavedState::CooldownPending);
+        LogEchoEvent_P(PSTR("Cooldown flag cleared"));
+    }
+    if ((mmu_print_saved & SavedState::Cooldown) && resume_hotend_temp) {
+        LogEchoEvent_P(PSTR("Resuming Temp"));
+        MMU2_ECHO_MSGRPGM(PSTR("Restoring hotend temperature "));
+        SERIAL_ECHOLN(resume_hotend_temp);
+        mmu_print_saved &= ~(SavedState::Cooldown);
+        setTargetHotend(resume_hotend_temp, active_extruder);
+        lcd_display_message_fullscreen_P(_i("MMU Retry: Restoring temperature...")); ////MSG_MMU_RESTORE_TEMP c=20 r=4
+        //@todo better report the event and let the GUI do its work somewhere else
+        ReportErrorHookSensorLineRender();
+        waitForHotendTargetTemp(1000, []{
+            ReportErrorHookDynamicRender();
+            manage_inactivity(true);
+        });
+        lcd_update_enable(true); // temporary hack to stop this locking the printer...
+        LogEchoEvent_P(PSTR("Hotend temperature reached"));
+        lcd_clear();
+    }
+}
+
+void MMU2::ResumeUnpark(){
+    if (mmu_print_saved & SavedState::ParkExtruder) {
+        LogEchoEvent_P(PSTR("Resuming XYZ"));
+
+        current_position[X_AXIS] = resume_position.xyz[X_AXIS];
+        current_position[Y_AXIS] = resume_position.xyz[Y_AXIS];
+        plan_buffer_line_curposXYZE(NOZZLE_PARK_XY_FEEDRATE);
+        st_synchronize();
+        
+        current_position[Z_AXIS] = resume_position.xyz[Z_AXIS];
+        plan_buffer_line_curposXYZE(NOZZLE_PARK_Z_FEEDRATE);
+        st_synchronize();
+        mmu_print_saved &= ~(SavedState::ParkExtruder);
+    }
+}
+
+void MMU2::CheckUserInput(){
+    auto btn = ButtonPressed((uint16_t)lastErrorCode);
+
+    // Was a button pressed on the MMU itself instead of the LCD?
+    if (btn == Buttons::NoButton && lastButton != Buttons::NoButton){
+        btn = lastButton;
+        lastButton = Buttons::NoButton; // Clear it. 
+    }
+
+    switch (btn) {
+    case Left:
+    case Middle:
+    case Right:
+        SERIAL_ECHOPGM("CheckUserInput-btnLMR ");
+        SERIAL_ECHOLN(btn);
+        ResumeHotendTemp(); // Recover the hotend temp before we attempt to do anything else...
+        Button(btn);
+        break;
+    case RestartMMU:
+        Reset(ResetPin); // we cannot do power cycle on the MK3
+        // ... but mmu2_power.cpp knows this and triggers a soft-reset instead.
+        break;
+    case DisableMMU:
+        Stop(); // Poweroff handles updating the EEPROM shutoff.
+        break;
+    case StopPrint:
+        // @@TODO not sure if we shall handle this high level operation at this spot
+        break;
+    default:
+        break;
+    }
+}
+
+/// Originally, this was used to wait for response and deal with timeout if necessary.
+/// The new protocol implementation enables much nicer and intense reporting, so this method will boil down
+/// just to verify the result of an issued command (which was basically the original idea)
+///
+/// It is closely related to mmu_loop() (which corresponds to our ProtocolLogic::Step()), which does NOT perform any blocking wait for a command to finish.
+/// But - in case of an error, the command is not yet finished, but we must react accordingly - move the printhead elsewhere, stop heating, eat a cat or so.
+/// That's what's being done here...
+void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) {
+    mmu_print_saved = SavedState::None;
+
+    KEEPALIVE_STATE(IN_PROCESS);
+
+    LongTimer nozzleTimeout;
+
+    for (;;) {
+        // in our new implementation, we know the exact state of the MMU at any moment, we do not have to wait for a timeout
+        // So in this case we shall decide if the operation is:
+        // - still running -> wait normally in idle()
+        // - failed -> then do the safety moves on the printer like before
+        // - finished ok -> proceed with reading other commands
+        manage_heater();
+        manage_inactivity(true); // calls LogicStep() and remembers its return status
+        lcd_update(0);
+
+        if (mmu_print_saved & SavedState::CooldownPending){
+            if (!nozzleTimeout.running()){
+                nozzleTimeout.start();
+                LogEchoEvent_P(PSTR("Cooling Timeout started"));
+            } else if (nozzleTimeout.expired(DEFAULT_SAFETYTIMER_TIME_MINS*60*1000ul)){ // mins->msec. TODO: do we use the global or have our own independent timeout
+                mmu_print_saved &= ~(SavedState::CooldownPending);
+                mmu_print_saved |= SavedState::Cooldown;
+                setAllTargetHotends(0);
+                LogEchoEvent_P(PSTR("Heater cooldown"));
+            }
+        } else if (nozzleTimeout.running()) {
+            nozzleTimeout.stop();
+            LogEchoEvent_P(PSTR("Cooling timer stopped"));
+        }
+
+        switch (logicStepLastStatus) {
+        case Finished: 
+            // command/operation completed, let Marlin continue its work
+            // the E may have some more moves to finish - wait for them
+            ResumeUnpark(); // We can now travel back to the tower or wherever we were when we saved.
+            ResetRetryAttempts(); // Reset the retry counter.
+            st_synchronize(); 
+            return;
+        case VersionMismatch: // this basically means the MMU will be disabled until reconnected
+            CheckUserInput();
+            return;
+        case CommandError:
+            // Don't proceed to the park/save if we are doing an autoretry.
+            if (inAutoRetry){
+                continue;
+            }
+            [[fallthrough]];
+        case CommunicationTimeout:
+        case ProtocolError:
+            SaveAndPark(move_axes, turn_off_nozzle); // and wait for the user to resolve the problem
+            CheckUserInput();
+            break;
+        case CommunicationRecovered: // @@TODO communication recovered and may be an error recovered as well
+            // may be the logic layer can detect the change of state a respond with one "Recovered" to be handled here
+            ResumeHotendTemp();
+            ResumeUnpark();
+            break;
+        case Processing: // wait for the MMU to respond
+        default:
+            break;
+        }
+    }
+}
+
+StepStatus MMU2::LogicStep() {
+    CheckUserInput(); // Process any buttons before proceeding with another MMU Query
+    StepStatus ss = logic.Step();
+    switch (ss) {
+    case Finished:
+        // At this point it is safe to trigger a runout and not interrupt the MMU protocol
+        CheckFINDARunout();
+        break;
+    case Processing:
+        OnMMUProgressMsg(logic.Progress());
+        break;
+    case CommandError:
+        ReportError(logic.Error(), ErrorSourceMMU);
+        break;
+    case CommunicationTimeout:
+        state = xState::Connecting;
+        ReportError(ErrorCode::MMU_NOT_RESPONDING, ErrorSourcePrinter);
+        break;
+    case ProtocolError:
+        state = xState::Connecting;
+        ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter);
+        break;
+    case VersionMismatch:
+        StopKeepPowered();
+        ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter);
+        break;
+    case ButtonPushed:
+        lastButton = logic.Button();
+        LogEchoEvent_P(PSTR("MMU Button pushed"));
+        CheckUserInput(); // Process the button immediately
+        break;
+    default:
+        break;
+    }
+    
+    if( logic.Running() ){
+        state = xState::Active;
+    }
+    return ss;
+}
+
+void MMU2::filament_ramming() {
+    execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step));
+}
+
+void MMU2::execute_extruder_sequence(const E_Step *sequence, uint8_t steps) {
+    st_synchronize();
+    const E_Step *step = sequence;
+    for (uint8_t i = 0; i < steps; i++) {
+        current_position[E_AXIS] += pgm_read_float(&(step->extrude));
+        plan_buffer_line_curposXYZE(pgm_read_float(&(step->feedRate)));
+        st_synchronize();
+        step++;
+    }
+}
+
+void MMU2::ReportError(ErrorCode ec, uint8_t res) {
+    // Due to a potential lossy error reporting layers linked to this hook
+    // we'd better report everything to make sure especially the error states
+    // do not get lost. 
+    // - The good news here is the fact, that the MMU reports the errors repeatedly until resolved.
+    // - The bad news is, that MMU not responding may repeatedly occur on printers not having the MMU at all.
+    // 
+    // Not sure how to properly handle this situation, options:
+    // - skip reporting "MMU not responding" (at least for now)
+    // - report only changes of states (we can miss an error message)
+    // - may be some combination of MMUAvailable + UseMMU flags and decide based on their state
+    // Right now the filtering of MMU_NOT_RESPONDING is done in ReportErrorHook() as it is not a problem if mmu2.cpp
+
+    // Depending on the Progress code, we may want to do some action when an error occurs
+    switch (logic.Progress()){
+    case ProgressCode::UnloadingToFinda:
+        unloadFilamentStarted = false;
+        break;
+    case ProgressCode::FeedingToFSensor:
+        // FSENSOR error during load. Make sure E-motor stops moving.
+        loadFilamentStarted = false;
+        break;
+    default:
+        break;
+    }
+
+    ReportErrorHook((uint16_t)ec, res);
+
+    if( ec != lastErrorCode ){ // deduplicate: only report changes in error codes into the log
+        lastErrorCode = ec;
+        LogErrorEvent_P( _O(PrusaErrorTitle(PrusaErrorCodeIndex((uint16_t)ec))) );
+    }
+
+    static_assert(mmu2Magic[0] == 'M' 
+        && mmu2Magic[1] == 'M' 
+        && mmu2Magic[2] == 'U' 
+        && mmu2Magic[3] == '2' 
+        && mmu2Magic[4] == ':' 
+        && strlen_constexpr(mmu2Magic) == 5, 
+        "MMU2 logging prefix mismatch, must be updated at various spots"
+    );
+}
+
+void MMU2::ReportProgress(ProgressCode pc) {
+    ReportProgressHook((CommandInProgress)logic.CommandInProgress(), (uint16_t)pc);
+    LogEchoEvent_P( _O(ProgressCodeToText((uint16_t)pc)) );
+}
+
+void MMU2::OnMMUProgressMsg(ProgressCode pc){
+    if (pc != lastProgressCode) {
+        OnMMUProgressMsgChanged(pc);
+    } else {
+        OnMMUProgressMsgSame(pc);
+    }
+}
+
+void MMU2::OnMMUProgressMsgChanged(ProgressCode pc){
+    ReportProgress(pc);
+    lastProgressCode = pc;
+    switch (pc) {
+    case ProgressCode::UnloadingToFinda:
+        if ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::UnloadFilament
+        || ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::ToolChange))
+        {
+            // If MK3S sent U0 command, ramming sequence takes care of releasing the filament.
+            // If Toolchange is done while printing, PrusaSlicer takes care of releasing the filament
+            // If printing is not in progress, ToolChange will issue a U0 command.
+            break;
+        } else {
+            // We're likely recovering from an MMU error
+            st_synchronize();
+            unloadFilamentStarted = true;
+            current_position[E_AXIS] -= MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH;
+            plan_buffer_line_curposXYZE(MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE);
+        }
+        break;
+    case ProgressCode::FeedingToFSensor:
+        // prepare for the movement of the E-motor
+        st_synchronize();
+        loadFilamentStarted = true;
+        break;
+    default:
+        // do nothing yet
+        break;
+    }
+}
+
+void MMU2::OnMMUProgressMsgSame(ProgressCode pc){
+    switch (pc) {
+    case ProgressCode::UnloadingToFinda:
+        if (unloadFilamentStarted && !blocks_queued()) { // Only plan a move if there is no move ongoing
+            if (fsensor.getFilamentPresent()) {
+                current_position[E_AXIS] -= MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH;
+                plan_buffer_line_curposXYZE(MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE);
+            } else {
+                unloadFilamentStarted = false;
+            }
+        }
+        break;
+    case ProgressCode::FeedingToFSensor:
+        if (loadFilamentStarted) {
+            switch (WhereIsFilament()) {
+            case FilamentState::AT_FSENSOR:
+                // fsensor triggered, finish FeedingToExtruder state
+                loadFilamentStarted = false;
+                // After the MMU knows the FSENSOR is triggered it will:
+                // 1. Push the filament by additional 30mm (see fsensorToNozzle)
+                // 2. Disengage the idler and push another 5mm.
+                current_position[E_AXIS] += 30.0f + 2.0f;
+                plan_buffer_line_curposXYZE(MMU2_LOAD_TO_NOZZLE_FEED_RATE);
+                break;
+            case FilamentState::NOT_PRESENT:
+                // fsensor not triggered, continue moving extruder
+                if (!blocks_queued()) { // Only plan a move if there is no move ongoing
+                    current_position[E_AXIS] += 2.0f;
+                    plan_buffer_line_curposXYZE(MMU2_LOAD_TO_NOZZLE_FEED_RATE);
+                }
+                break;
+            default:
+                // Abort here?
+                break;
+            }
+        }
+        break;
+    default:
+        // do nothing yet
+        break;
+    }
+}
+
+} // namespace MMU2

+ 291 - 0
Firmware/mmu2.h

@@ -0,0 +1,291 @@
+/// @file
+#pragma once
+#include "mmu2_protocol_logic.h"
+
+struct E_Step;
+
+namespace MMU2 {
+
+static constexpr uint8_t MAX_RETRIES = 3U;
+
+/// @@TODO hmmm, 12 bytes... may be we can reduce that
+struct xyz_pos_t {
+    float xyz[3];
+    xyz_pos_t()=default;
+};
+
+// general MMU setup for MK3
+enum : uint8_t {
+    FILAMENT_UNKNOWN = 0xffU
+};
+
+struct Version {
+    uint8_t major, minor, build;
+};
+
+/// Top-level interface between Logic and Marlin.
+/// Intentionally named MMU2 to be (almost) a drop-in replacement for the previous implementation.
+/// Most of the public methods share the original naming convention as well.
+class MMU2 {
+public:
+    MMU2();
+    
+    /// Powers ON the MMU, then initializes the UART and protocol logic
+    void Start();
+    
+    /// Stops the protocol logic, closes the UART, powers OFF the MMU
+    void Stop();
+    
+    /// States of a printer with the MMU:
+    /// - Active
+    /// - Connecting
+    /// - Stopped
+    /// 
+    /// When the printer's FW starts, the MMU2 mode is either Stopped or NotResponding (based on user's preference).
+    /// When the MMU successfully establishes communication, the state changes to Active.
+    enum class xState : uint_fast8_t {
+        Active, ///< MMU has been detected, connected, communicates and is ready to be worked with.
+        Connecting, ///< MMU is connected but it doesn't communicate (yet). The user wants the MMU, but it is not ready to be worked with.
+        Stopped ///< The user doesn't want the printer to work with the MMU. The MMU itself is not powered and does not work at all.
+    };
+    
+    inline xState State() const { return state; }
+    
+    // @@TODO temporary wrappers to make old gcc survive the code
+    inline bool Enabled()const { return State() == xState::Active; }
+
+    /// Different levels of resetting the MMU
+    enum ResetForm : uint8_t {
+        Software = 0, ///< sends a X0 command into the MMU, the MMU will watchdog-reset itself
+        ResetPin = 1, ///< trigger the reset pin of the MMU
+        CutThePower = 2 ///< power off and power on (that includes +5V and +24V power lines)
+    };
+
+    /// Saved print state on error.
+    enum SavedState: uint8_t {
+        None = 0, // No state saved. 
+        ParkExtruder = 1, // The extruder was parked. 
+        Cooldown = 2, // The extruder was allowed to cool.
+        CooldownPending = 4,
+    };
+
+    /// Source of operation error
+    enum ReportErrorSource: uint8_t {
+        ErrorSourcePrinter = 0,
+        ErrorSourceMMU = 1,
+    };
+
+    /// Perform a reset of the MMU
+    /// @param level physical form of the reset
+    void Reset(ResetForm level);
+    
+    /// Power off the MMU (cut the power)
+    void PowerOff();
+    
+    /// Power on the MMU
+    void PowerOn();
+
+    /// Read from a MMU register (See gcode M707)
+    /// @param address Address of register in hexidecimal
+    /// @returns true upon success
+    bool ReadRegister(uint8_t address);
+
+    /// Write from a MMU register (See gcode M708)
+    /// @param address Address of register in hexidecimal
+    /// @param data Data to write to register
+    /// @returns true upon success
+    bool WriteRegister(uint8_t address, uint16_t data);
+
+
+    /// The main loop of MMU processing.
+    /// Doesn't loop (block) inside, performs just one step of logic state machines.
+    /// Also, internally it prevents recursive entries.
+    void mmu_loop();
+
+    /// The main MMU command - select a different slot
+    /// @param index of the slot to be selected
+    /// @returns false if the operation cannot be performed (Stopped)
+    bool tool_change(uint8_t index);
+    
+    /// Handling of special Tx, Tc, T? commands
+    bool tool_change(char code, uint8_t slot);
+
+    /// Unload of filament in collaboration with the MMU.
+    /// That includes rotating the printer's extruder in order to release filament.
+    /// @returns false if the operation cannot be performed (Stopped or cold extruder)
+    bool unload();
+
+    /// Load (insert) filament just into the MMU (not into printer's nozzle)
+    /// @returns false if the operation cannot be performed (Stopped)
+    bool load_filament(uint8_t index);
+    
+    /// Load (push) filament from the MMU into the printer's nozzle
+    /// @returns false if the operation cannot be performed (Stopped or cold extruder)
+    bool load_filament_to_nozzle(uint8_t index);
+
+    /// Move MMU's selector aside and push the selected filament forward.
+    /// Usable for improving filament's tip or pulling the remaining piece of filament out completely.
+    bool eject_filament(uint8_t index, bool recover);
+
+    /// Issue a Cut command into the MMU
+    /// Requires unloaded filament from the printer (obviously)
+    /// @returns false if the operation cannot be performed (Stopped)
+    bool cut_filament(uint8_t index);
+
+    /// Issue a planned request for statistics data from MMU
+    void get_statistics();
+
+    /// Issue a Try-Load command
+    /// It behaves very similarly like a ToolChange, but it doesn't load the filament
+    /// all the way down to the nozzle. The sole purpose of this operation
+    /// is to check, that the filament will be ready for printing.
+    bool load_to_extruder(uint8_t index);
+
+    /// @returns the active filament slot index (0-4) or 0xff in case of no active tool
+    uint8_t get_current_tool() const;
+
+    /// @returns The filament slot index (0 to 4) that will be loaded next, 0xff in case of no active tool change 
+    uint8_t get_tool_change_tool() const;
+
+    bool set_filament_type(uint8_t index, uint8_t type);
+
+    /// Issue a "button" click into the MMU - to be used from Error screens of the MMU
+    /// to select one of the 3 possible options to resolve the issue
+    void Button(uint8_t index);
+    
+    /// Issue an explicit "homing" command into the MMU
+    void Home(uint8_t mode);
+
+    /// @returns current state of FINDA (true=filament present, false=filament not present)
+    inline bool FindaDetectsFilament()const { return logic.FindaPressed(); }
+
+    inline uint16_t TotalFailStatistics()const { return logic.FailStatistics(); }
+
+    /// @returns Current error code
+    inline ErrorCode MMUCurrentErrorCode() const { return logic.Error(); }
+
+    /// @returns the version of the connected MMU FW.
+    /// In the future we'll return the trully detected FW version
+    Version GetMMUFWVersion()const {
+        if( State() == xState::Active ){
+            return { logic.MmuFwVersionMajor(), logic.MmuFwVersionMinor(), logic.MmuFwVersionRevision() };
+        } else {
+            return { 0, 0, 0}; 
+        }
+    }
+
+    // Helper variable to monitor knob in MMU error screen in blocking functions e.g. manage_response
+    bool is_mmu_error_monitor_active;
+
+    /// Method to read-only mmu_print_saved
+    bool MMU_PRINT_SAVED() const { return mmu_print_saved != SavedState::None; }
+
+    /// Automagically "press" a Retry button if we have any retry attempts left
+    bool RetryIfPossible(uint16_t ec);
+
+    /// Decrement the retry attempts, if in a retry. 
+    // Called by the MMU protocol when a sent button is acknowledged.
+    void DecrementRetryAttempts();
+
+private:
+    /// Reset the retryAttempts back to the default value
+    void ResetRetryAttempts();
+    /// Perform software self-reset of the MMU (sends an X0 command)
+    void ResetX0();
+    
+    /// Trigger reset pin of the MMU
+    void TriggerResetPin();
+    
+    /// Perform power cycle of the MMU (cold boot)
+    /// Please note this is a blocking operation (sleeps for some time inside while doing the power cycle)
+    void PowerCycle();
+    
+    /// Stop the communication, but keep the MMU powered on (for scenarios with incorrect FW version)
+    void StopKeepPowered();
+
+    /// Along with the mmu_loop method, this loops until a response from the MMU is received and acts upon.
+    /// In case of an error, it parks the print head and turns off nozzle heating
+    void manage_response(const bool move_axes, const bool turn_off_nozzle);
+    
+    /// Performs one step of the protocol logic state machine 
+    /// and reports progress and errors if needed to attached ExtUIs.
+    /// Updates the global state of MMU (Active/Connecting/Stopped) at runtime, see @ref State
+    StepStatus LogicStep();
+    
+    void filament_ramming();
+    void execute_extruder_sequence(const E_Step *sequence, uint8_t steps);
+
+    /// Reports an error into attached ExtUIs
+    /// @param ec error code, see ErrorCode
+    /// @param res reporter error source, is either Printer (0) or MMU (1)
+    void ReportError(ErrorCode ec, uint8_t res);
+
+    /// Reports progress of operations into attached ExtUIs
+    /// @param pc progress code, see ProgressCode
+    void ReportProgress(ProgressCode pc);
+    
+    /// Responds to a change of MMU's progress
+    /// - plans additional steps, e.g. starts the E-motor after fsensor trigger
+    void OnMMUProgressMsg(ProgressCode pc);
+    /// Progress code changed - act accordingly
+    void OnMMUProgressMsgChanged(ProgressCode pc);
+    /// Repeated calls when progress code remains the same
+    void OnMMUProgressMsgSame(ProgressCode pc);
+    
+    /// Save print and park the print head
+    void SaveAndPark(bool move_axes, bool turn_off_nozzle);
+
+    /// Resume hotend temperature, if it was cooled. Safe to call if we aren't saved.
+    void ResumeHotendTemp();
+
+    /// Resume position, if the extruder was parked. Safe to all if state was not saved.
+    void ResumeUnpark();
+
+    /// Check for any button/user input coming from the printer's UI
+    void CheckUserInput();
+
+    /// @brief Check whether to trigger a FINDA runout. If triggered this function will call M600 AUTO
+    /// if SpoolJoin is enabled, otherwise M600 is called without AUTO which will prompt the user
+    /// for the next filament slot to use
+    void CheckFINDARunout();
+
+    /// Entry check of all external commands.
+    /// It can wait until the MMU becomes ready.
+    /// Optionally, it can also emit/display an error screen and the user can decide what to do next.
+    /// @returns false if the MMU is not ready to perform the command (for whatever reason)
+    bool WaitForMMUReady();
+
+    ProtocolLogic logic; ///< implementation of the protocol logic layer
+    uint8_t extruder; ///< currently active slot in the MMU ... somewhat... not sure where to get it from yet
+    uint8_t tool_change_extruder; ///< only used for UI purposes
+
+    xyz_pos_t resume_position;
+    int16_t resume_hotend_temp;
+    
+    ProgressCode lastProgressCode = ProgressCode::OK;
+    ErrorCode lastErrorCode = ErrorCode::MMU_NOT_RESPONDING;
+    Buttons lastButton = Buttons::NoButton;
+
+    StepStatus logicStepLastStatus;
+    
+    enum xState state;
+
+    uint8_t mmu_print_saved;
+    bool loadFilamentStarted;
+    bool unloadFilamentStarted;
+    
+    friend struct LoadingToNozzleRAII;
+    /// true in case we are doing the LoadToNozzle operation - that means the filament shall be loaded all the way down to the nozzle
+    /// unlike the mid-print ToolChange commands, which only load the first ~30mm and then the G-code takes over.
+    bool loadingToNozzle;
+    
+    uint8_t retryAttempts;
+
+    bool inAutoRetry;
+};
+
+/// following Marlin's way of doing stuff - one and only instance of MMU implementation in the code base
+/// + avoiding buggy singletons on the AVR platform
+extern MMU2 mmu2;
+
+} // namespace MMU2

+ 37 - 0
Firmware/mmu2/buttons.h

@@ -0,0 +1,37 @@
+#pragma once
+#include <stdint.h>
+
+// Helper macros to parse the operations from Btns()
+#define BUTTON_OP_RIGHT(X) ( ( X & 0xF0 ) >> 4 )
+#define BUTTON_OP_MIDDLE(X) ( X & 0x0F )
+
+namespace MMU2 {
+
+/// Will be mapped onto dialog button responses in the FW
+/// Those responses have their unique+translated texts as well
+enum class ButtonOperations : uint8_t {
+    NoOperation = 0,
+    Retry       = 1,
+    Continue    = 2,
+    RestartMMU  = 3,
+    Unload      = 4,
+    StopPrint   = 5,
+    DisableMMU  = 6,
+};
+
+/// Button codes + extended actions performed on the printer's side
+enum Buttons : uint8_t {
+    Right = 0,
+    Middle,
+    Left,
+    
+    // performed on the printer's side
+    RestartMMU,
+    StopPrint,
+    DisableMMU,
+    
+    NoButton = 0xff // shall be kept last
+};
+
+
+} // namespace MMU2

+ 109 - 0
Firmware/mmu2/error_codes.h

@@ -0,0 +1,109 @@
+/// @file error_codes.h
+#pragma once
+#include <stdint.h>
+
+/// A complete set of error codes which may be a result of a high-level command/operation.
+/// This header file shall be included in the printer's firmware as well as a reference,
+/// therefore the error codes have been extracted to one place.
+///
+/// Please note the errors are intentionally coded as "negative" values (highest bit set),
+/// becase they are a complement to reporting the state of the high-level state machines -
+/// positive values are considered as normal progress, negative values are errors.
+///
+/// Please note, that multiple TMC errors can occur at once, thus they are defined as a bitmask of the higher byte.
+/// Also, as there are 3 TMC drivers on the board, each error is added a bit for the corresponding TMC -
+/// TMC_PULLEY_BIT, TMC_SELECTOR_BIT, TMC_IDLER_BIT,
+/// The resulting error is a bitwise OR over 3 TMC drivers and their status, which should cover most of the situations correctly.
+enum class ErrorCode : uint_fast16_t {
+    RUNNING = 0x0000, ///< the operation is still running - keep this value as ZERO as it is used for initialization of error codes as well
+    OK = 0x0001, ///< the operation finished OK
+
+    // TMC bit masks
+    TMC_PULLEY_BIT = 0x0040, ///< +64 TMC Pulley bit
+    TMC_SELECTOR_BIT = 0x0080, ///< +128 TMC Pulley bit
+    TMC_IDLER_BIT = 0x0100, ///< +256 TMC Pulley bit
+
+    /// Unload Filament related error codes
+    FINDA_DIDNT_SWITCH_ON = 0x8001, ///< E32769 FINDA didn't switch on while loading filament - either there is something blocking the metal ball or a cable is broken/disconnected
+    FINDA_DIDNT_SWITCH_OFF = 0x8002, ///< E32770 FINDA didn't switch off while unloading filament
+
+    FSENSOR_DIDNT_SWITCH_ON = 0x8003, ///< E32771 Filament sensor didn't switch on while performing LoadFilament
+    FSENSOR_DIDNT_SWITCH_OFF = 0x8004, ///< E32772 Filament sensor didn't switch off while performing UnloadFilament
+
+    FILAMENT_ALREADY_LOADED = 0x8005, ///< E32773 cannot perform operation LoadFilament or move the selector as the filament is already loaded
+
+    INVALID_TOOL = 0x8006, ///< E32774 tool/slot index out of range (typically issuing T5 into an MMU with just 5 slots - valid range 0-4)
+
+    HOMING_FAILED = 0x8007, ///< generic homing failed error - always reported with the corresponding axis bit set (Idler or Selector) as follows:
+    HOMING_SELECTOR_FAILED = HOMING_FAILED | TMC_SELECTOR_BIT, ///< E32903 the Selector was unable to home properly - that means something is blocking its movement
+    HOMING_IDLER_FAILED = HOMING_FAILED | TMC_IDLER_BIT, ///< E33031 the Idler was unable to home properly - that means something is blocking its movement
+    STALLED_PULLEY = HOMING_FAILED | TMC_PULLEY_BIT, ///< E32839 for the Pulley "homing" means just stallguard detected during Pulley's operation (Pulley doesn't home)
+
+    FINDA_VS_EEPROM_DISREPANCY = 0x8008, ///< E32776 FINDA is pressed but we have no such record in EEPROM - this can only happen at the start of the MMU and can be resolved by issuing an Unload command
+
+    FSENSOR_TOO_EARLY = 0x8009, ///< E32777 FSensor triggered while doing FastFeedToExtruder - that means either:
+    ///< - the PTFE is too short
+    ///< - a piece of filament was left inside - pushed in front of the loaded filament causing the fsensor trigger too early
+    ///< - fsensor is faulty producing bogus triggers
+
+    MOVE_FAILED = 0x800a, ///< generic move failed error - always reported with the corresponding axis bit set (Idler or Selector) as follows:
+    MOVE_SELECTOR_FAILED = MOVE_FAILED | TMC_SELECTOR_BIT, ///< E32905 the Selector was unable to move to desired position properly - that means something is blocking its movement, e.g. a piece of filament got out of pulley body
+    MOVE_IDLER_FAILED = MOVE_FAILED | TMC_IDLER_BIT, ///< E33033 the Idler was unable to move - unused at the time of creation, but added for completeness
+    MOVE_PULLEY_FAILED = MOVE_FAILED | TMC_PULLEY_BIT, ///< E32841 the Pulley was unable to move - unused at the time of creation, but added for completeness
+
+    QUEUE_FULL = 0x802b, ///< E32811 internal logic error - attempt to move with a full queue
+
+    VERSION_MISMATCH = 0x802c, ///< E32812 internal error of the printer - incompatible version of the MMU FW
+    PROTOCOL_ERROR = 0x802d, ///< E32813 internal error of the printer - communication with the MMU got garbled - protocol decoder couldn't decode the incoming messages
+    MMU_NOT_RESPONDING = 0x802e, ///< E32814 internal error of the printer - communication with the MMU is not working
+    INTERNAL = 0x802f, ///< E32815 internal runtime error (software)
+
+    /// TMC driver init error - TMC dead or bad communication
+    /// - E33344 Pulley TMC driver
+    /// - E33404 Selector TMC driver
+    /// - E33536 Idler TMC driver
+    /// - E33728 All 3 TMC driver
+    TMC_IOIN_MISMATCH = 0x8200,
+
+    /// TMC driver reset - recoverable, we just need to rehome the axis
+    /// Idler: can be rehomed any time
+    /// Selector: if there is a filament, remove it and rehome, if there is no filament, just rehome
+    /// Pulley: do nothing - for the loading sequence - just restart and move slowly, for the unload sequence just restart
+    /// - E33856 Pulley TMC driver
+    /// - E33920 Selector TMC driver
+    /// - E34048 Idler TMC driver
+    /// - E34240 All 3 TMC driver
+    TMC_RESET = 0x8400,
+
+    /// not enough current for the TMC, NOT RECOVERABLE
+    /// - E34880 Pulley TMC driver
+    /// - E34944 Selector TMC driver
+    /// - E35072 Idler TMC driver
+    /// - E35264 All 3 TMC driver
+    TMC_UNDERVOLTAGE_ON_CHARGE_PUMP = 0x8800,
+
+    /// TMC driver serious error - short to ground on coil A or coil B - dangerous to recover
+    /// - E36928 Pulley TMC driver
+    /// - E36992 Selector TMC driver
+    /// - E37120 Idler TMC driver
+    /// - E37312 All 3 TMC driver
+    TMC_SHORT_TO_GROUND = 0x9000,
+
+    /// TMC driver over temperature warning - can be recovered by restarting the driver.
+    /// If this error happens, we should probably go into the error state as soon as the current command is finished.
+    /// The driver technically still works at this point.
+    /// - E41024 Pulley TMC driver
+    /// - E41088 Selector TMC driver
+    /// - E41216 Idler TMC driver
+    /// - E41408 All 3 TMC driver
+    TMC_OVER_TEMPERATURE_WARN = 0xA000,
+
+    /// TMC driver over temperature error - we really shouldn't ever reach this error.
+    /// It can still be recovered if the driver cools down below 120C.
+    /// The driver needs to be disabled and enabled again for operation to resume after this error is cleared.
+    /// - E49216 Pulley TMC driver
+    /// - E49280 Selector TMC driver
+    /// - E49408 Idler TMC driver
+    /// - E49600 All 3 TMC driver
+    TMC_OVER_TEMPERATURE_ERROR = 0xC000
+};

+ 353 - 0
Firmware/mmu2/errors_list.h

@@ -0,0 +1,353 @@
+// Extracted from Prusa-Error-Codes repo
+// Subject to automation and optimization
+// BEWARE - this file shall be included only into mmu2_error_converter.cpp, not anywhere else!
+#pragma once
+#include "inttypes.h"
+#include "../language.h"
+#include <avr/pgmspace.h>
+#include "buttons.h"
+
+namespace MMU2 {
+
+static constexpr uint8_t ERR_MMU_CODE = 4;
+
+typedef enum : uint16_t {
+    ERR_UNDEF = 0,
+
+    ERR_MECHANICAL = 100,
+    ERR_MECHANICAL_FINDA_DIDNT_TRIGGER = 101,
+    ERR_MECHANICAL_FINDA_DIDNT_GO_OFF = 102,
+    ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER = 103,
+    ERR_MECHANICAL_FSENSOR_DIDNT_GO_OFF = 104,
+
+    ERR_MECHANICAL_PULLEY_CANNOT_MOVE = 105,
+    ERR_MECHANICAL_FSENSOR_TOO_EARLY = 106,
+    ERR_MECHANICAL_SELECTOR_CANNOT_HOME = 115,
+    ERR_MECHANICAL_SELECTOR_CANNOT_MOVE = 116,
+    ERR_MECHANICAL_IDLER_CANNOT_HOME = 125,
+    ERR_MECHANICAL_IDLER_CANNOT_MOVE = 126,
+
+    ERR_TEMPERATURE = 200,
+    ERR_TEMPERATURE_PULLEY_WARNING_TMC_TOO_HOT = 201,
+    ERR_TEMPERATURE_SELECTOR_WARNING_TMC_TOO_HOT = 211,
+    ERR_TEMPERATURE_IDLER_WARNING_TMC_TOO_HOT = 221,
+
+    ERR_TEMPERATURE_PULLEY_TMC_OVERHEAT_ERROR = 202,
+    ERR_TEMPERATURE_SELECTOR_TMC_OVERHEAT_ERROR = 212,
+    ERR_TEMPERATURE_IDLER_TMC_OVERHEAT_ERROR = 222,
+
+
+    ERR_ELECTRICAL = 300,
+    ERR_ELECTRICAL_PULLEY_TMC_DRIVER_ERROR = 301,
+    ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_ERROR = 311,
+    ERR_ELECTRICAL_IDLER_TMC_DRIVER_ERROR = 321,
+
+    ERR_ELECTRICAL_PULLEY_TMC_DRIVER_RESET = 302,
+    ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_RESET = 312,
+    ERR_ELECTRICAL_IDLER_TMC_DRIVER_RESET = 322,
+
+    ERR_ELECTRICAL_PULLEY_TMC_UNDERVOLTAGE_ERROR = 303,
+    ERR_ELECTRICAL_SELECTOR_TMC_UNDERVOLTAGE_ERROR = 313,
+    ERR_ELECTRICAL_IDLER_TMC_UNDERVOLTAGE_ERROR = 323,
+
+    ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED = 304,
+    ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED = 314,
+    ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED = 324,
+
+
+    ERR_CONNECT = 400,
+    ERR_CONNECT_MMU_NOT_RESPONDING = 401,
+    ERR_CONNECT_COMMUNICATION_ERROR = 402,
+
+
+    ERR_SYSTEM = 500,
+    ERR_SYSTEM_FILAMENT_ALREADY_LOADED = 501,
+    ERR_SYSTEM_INVALID_TOOL = 502,
+    ERR_SYSTEM_QUEUE_FULL = 503,
+    ERR_SYSTEM_FW_UPDATE_NEEDED = 504,
+    ERR_SYSTEM_FW_RUNTIME_ERROR = 505,
+    ERR_SYSTEM_UNLOAD_MANUALLY = 506,
+
+    ERR_OTHER = 900
+} err_num_t;
+
+// Avr gcc has serious trouble understanding static data structures in PROGMEM
+// and inadvertedly falls back to copying the whole structure into RAM (which is obviously unwanted).
+// But since this file ought to be generated in the future from yaml prescription,
+// it really makes no difference if there are "nice" data structures or plain arrays.
+static const constexpr uint16_t errorCodes[] PROGMEM = {
+    ERR_MECHANICAL_FINDA_DIDNT_TRIGGER,
+    ERR_MECHANICAL_FINDA_DIDNT_GO_OFF,
+    ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER,
+    ERR_MECHANICAL_FSENSOR_DIDNT_GO_OFF,
+    ERR_MECHANICAL_PULLEY_CANNOT_MOVE,
+    ERR_MECHANICAL_FSENSOR_TOO_EARLY,
+    ERR_MECHANICAL_SELECTOR_CANNOT_HOME,
+    ERR_MECHANICAL_SELECTOR_CANNOT_MOVE,
+    ERR_MECHANICAL_IDLER_CANNOT_HOME,
+    ERR_MECHANICAL_IDLER_CANNOT_MOVE,
+    ERR_TEMPERATURE_PULLEY_WARNING_TMC_TOO_HOT,
+    ERR_TEMPERATURE_SELECTOR_WARNING_TMC_TOO_HOT,
+    ERR_TEMPERATURE_IDLER_WARNING_TMC_TOO_HOT,
+    ERR_TEMPERATURE_PULLEY_TMC_OVERHEAT_ERROR,
+    ERR_TEMPERATURE_SELECTOR_TMC_OVERHEAT_ERROR,
+    ERR_TEMPERATURE_IDLER_TMC_OVERHEAT_ERROR,
+    ERR_ELECTRICAL_PULLEY_TMC_DRIVER_ERROR,
+    ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_ERROR,
+    ERR_ELECTRICAL_IDLER_TMC_DRIVER_ERROR,
+    ERR_ELECTRICAL_PULLEY_TMC_DRIVER_RESET,
+    ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_RESET,
+    ERR_ELECTRICAL_IDLER_TMC_DRIVER_RESET,
+    ERR_ELECTRICAL_PULLEY_TMC_UNDERVOLTAGE_ERROR,
+    ERR_ELECTRICAL_SELECTOR_TMC_UNDERVOLTAGE_ERROR,
+    ERR_ELECTRICAL_IDLER_TMC_UNDERVOLTAGE_ERROR,
+    ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED,
+    ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED,
+    ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED,
+    ERR_CONNECT_MMU_NOT_RESPONDING,
+    ERR_CONNECT_COMMUNICATION_ERROR,
+    ERR_SYSTEM_FILAMENT_ALREADY_LOADED, 
+    ERR_SYSTEM_INVALID_TOOL, 
+    ERR_SYSTEM_QUEUE_FULL, 
+    ERR_SYSTEM_FW_UPDATE_NEEDED, 
+    ERR_SYSTEM_FW_RUNTIME_ERROR,
+    ERR_SYSTEM_UNLOAD_MANUALLY
+};
+
+// @@TODO some of the strings are duplicates, can be merged into one     01234567890123456789
+static const char MSG_TITLE_FINDA_DIDNT_TRIGGER[] PROGMEM_I1     = ISTR("FINDA DIDNT TRIGGER"); ////MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+static const char MSG_TITLE_FINDA_DIDNT_GO_OFF[] PROGMEM_I1      = ISTR("FINDA: FILAM. STUCK"); ////MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+static const char MSG_TITLE_FSENSOR_DIDNT_TRIGGER[] PROGMEM_I1   = ISTR("FSENSOR DIDNT TRIGG."); ////MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+static const char MSG_TITLE_FSENSOR_DIDNT_GO_OFF[] PROGMEM_I1    = ISTR("FSENSOR: FIL. STUCK"); ////MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+static const char MSG_TITLE_PULLEY_CANNOT_MOVE[] PROGMEM_I1      = ISTR("PULLEY CANNOT MOVE"); ////MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+static const char MSG_TITLE_FSENSOR_TOO_EARLY[] PROGMEM_I1       = ISTR("FSENSOR TOO EARLY"); ////MSG_TITLE_FSENSOR_TOO_EARLY c=20
+static const char MSG_TITLE_SELECTOR_CANNOT_MOVE[] PROGMEM_I1    = ISTR("SELECTOR CANNOT MOVE"); ////MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+static const char MSG_TITLE_SELECTOR_CANNOT_HOME[] PROGMEM_I1    = ISTR("SELECTOR CANNOT HOME"); ////MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+static const char MSG_TITLE_IDLER_CANNOT_MOVE[] PROGMEM_I1       = ISTR("IDLER CANNOT MOVE"); ////MSG_TITLE_IDLER_CANNOT_MOVE c=20
+static const char MSG_TITLE_IDLER_CANNOT_HOME[] PROGMEM_I1       = ISTR("IDLER CANNOT HOME"); ////MSG_TITLE_IDLER_CANNOT_HOME c=20
+static const char MSG_TITLE_TMC_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("WARNING TMC TOO HOT"); ////MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+//static const char MSG_TITLE_TMC_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("WARNING TMC TOO HOT"); ////MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+//static const char MSG_TITLE_TMC_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("WARNING TMC TOO HOT");
+static const char MSG_TITLE_TMC_OVERHEAT_ERROR[] PROGMEM_I1      = ISTR("TMC OVERHEAT ERROR"); ////MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+//static const char MSG_TITLE_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC OVERHEAT ERROR");
+//static const char MSG_TITLE_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC OVERHEAT ERROR");
+static const char MSG_TITLE_TMC_DRIVER_ERROR[] PROGMEM_I1        = ISTR("TMC DRIVER ERROR"); ////MSG_TITLE_TMC_DRIVER_ERROR c=20
+//static const char MSG_TITLE_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC DRIVER ERROR");
+//static const char MSG_TITLE_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC DRIVER ERROR");
+static const char MSG_TITLE_TMC_DRIVER_RESET[] PROGMEM_I1        = ISTR("TMC DRIVER RESET"); ////MSG_TITLE_TMC_DRIVER_RESET c=20
+//static const char MSG_TITLE_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC DRIVER RESET");
+//static const char MSG_TITLE_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC DRIVER RESET");
+static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1  = ISTR("TMC UNDERVOLTAGE ERR"); ////MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+//static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("TMC UNDERVOLTAGE ERR");
+//static const char MSG_TITLE_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("TMC UNDERVOLTAGE ERR");
+static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1      = ISTR("TMC DRIVER SHORTED"); ////MSG_TITLE_TMC_DRIVER_SHORTED c=20
+//static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
+//static const char MSG_TITLE_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("TMC DRIVER SHORTED");
+static const char MSG_TITLE_MMU_NOT_RESPONDING[] PROGMEM_I1      = ISTR("MMU NOT RESPONDING"); ////MSG_TITLE_MMU_NOT_RESPONDING c=20
+static const char MSG_TITLE_COMMUNICATION_ERROR[] PROGMEM_I1     = ISTR("COMMUNICATION ERROR"); ////MSG_TITLE_COMMUNICATION_ERROR c=20
+static const char MSG_TITLE_FIL_ALREADY_LOADED[] PROGMEM_I1      = ISTR("FILAMENT ALREADY LOA"); ////MSG_TITLE_FIL_ALREADY_LOADED c=20
+static const char MSG_TITLE_INVALID_TOOL[] PROGMEM_I1            = ISTR("INVALID TOOL"); ////MSG_TITLE_INVALID_TOOL c=20
+static const char MSG_TITLE_QUEUE_FULL[] PROGMEM_I1              = ISTR("QUEUE FULL"); ////MSG_TITLE_QUEUE_FULL c=20
+static const char MSG_TITLE_FW_UPDATE_NEEDED[] PROGMEM_I1        = ISTR("MMU FW UPDATE NEEDED"); ////MSG_TITLE_FW_UPDATE_NEEDED c=20
+static const char MSG_TITLE_FW_RUNTIME_ERROR[] PROGMEM_I1        = ISTR("FW RUNTIME ERROR"); ////MSG_TITLE_FW_RUNTIME_ERROR c=20
+static const char MSG_TITLE_UNLOAD_MANUALLY[] PROGMEM_I1         = ISTR("UNLOAD MANUALLY"); ////MSG_TITLE_UNLOAD_MANUALLY c=20
+
+static const char * const errorTitles [] PROGMEM = {
+    _R(MSG_TITLE_FINDA_DIDNT_TRIGGER),
+    _R(MSG_TITLE_FINDA_DIDNT_GO_OFF),
+    _R(MSG_TITLE_FSENSOR_DIDNT_TRIGGER),
+    _R(MSG_TITLE_FSENSOR_DIDNT_GO_OFF),
+    _R(MSG_TITLE_PULLEY_CANNOT_MOVE),
+    _R(MSG_TITLE_FSENSOR_TOO_EARLY),
+    _R(MSG_TITLE_SELECTOR_CANNOT_HOME),
+    _R(MSG_TITLE_SELECTOR_CANNOT_MOVE),
+    _R(MSG_TITLE_IDLER_CANNOT_HOME),
+    _R(MSG_TITLE_IDLER_CANNOT_MOVE),
+    _R(MSG_TITLE_TMC_WARNING_TMC_TOO_HOT),
+    _R(MSG_TITLE_TMC_WARNING_TMC_TOO_HOT),
+    _R(MSG_TITLE_TMC_WARNING_TMC_TOO_HOT),
+    _R(MSG_TITLE_TMC_OVERHEAT_ERROR),
+    _R(MSG_TITLE_TMC_OVERHEAT_ERROR),
+    _R(MSG_TITLE_TMC_OVERHEAT_ERROR),
+    _R(MSG_TITLE_TMC_DRIVER_ERROR),
+    _R(MSG_TITLE_TMC_DRIVER_ERROR),
+    _R(MSG_TITLE_TMC_DRIVER_ERROR),
+    _R(MSG_TITLE_TMC_DRIVER_RESET),
+    _R(MSG_TITLE_TMC_DRIVER_RESET),
+    _R(MSG_TITLE_TMC_DRIVER_RESET),
+    _R(MSG_TITLE_TMC_UNDERVOLTAGE_ERROR),
+    _R(MSG_TITLE_TMC_UNDERVOLTAGE_ERROR),
+    _R(MSG_TITLE_TMC_UNDERVOLTAGE_ERROR),
+    _R(MSG_TITLE_TMC_DRIVER_SHORTED),
+    _R(MSG_TITLE_TMC_DRIVER_SHORTED),
+    _R(MSG_TITLE_TMC_DRIVER_SHORTED),
+    _R(MSG_TITLE_MMU_NOT_RESPONDING),
+    _R(MSG_TITLE_COMMUNICATION_ERROR),
+    _R(MSG_TITLE_FIL_ALREADY_LOADED),
+    _R(MSG_TITLE_INVALID_TOOL),
+    _R(MSG_TITLE_QUEUE_FULL),
+    _R(MSG_TITLE_FW_UPDATE_NEEDED),
+    _R(MSG_TITLE_FW_RUNTIME_ERROR),
+    _R(MSG_TITLE_UNLOAD_MANUALLY)
+};
+
+// @@TODO looking at the texts, they can be composed of several parts and/or parametrized (could save a lot of space ;) )
+// Moreover, some of them have been disabled in favour of saving some more code size.
+static const char MSG_DESC_FINDA_DIDNT_TRIGGER[] PROGMEM_I1 = ISTR("FINDA didn't trigger while loading the filament. Ensure the filament can move and FINDA works."); ////MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+static const char MSG_DESC_FINDA_DIDNT_GO_OFF[] PROGMEM_I1 = ISTR("FINDA didn't switch off while unloading filament. Try unloading manually. Ensure filament can move and FINDA works."); ////MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+static const char MSG_DESC_FSENSOR_DIDNT_TRIGGER[] PROGMEM_I1 = ISTR("Filament sensor didn't trigger while loading the filament. Ensure the filament reached the fsensor and the sensor works."); ////MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+static const char MSG_DESC_FSENSOR_DIDNT_GO_OFF[] PROGMEM_I1 = ISTR("Filament sensor didn't switch off while unloading filament. Ensure filament can move and the sensor works."); ////MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+static const char MSG_DESC_PULLEY_STALLED[] PROGMEM_I1 = ISTR("Pulley motor stalled. Ensure the pulley can move and check the wiring."); ////MSG_DESC_PULLEY_STALLED c=20 r=8
+static const char MSG_DESC_FSENSOR_TOO_EARLY[] PROGMEM_I1 = ISTR("Filament sensor triggered too early while loading to extruder. Check there isn't anything stuck in PTFE tube. Check that sensor reads properly."); ////MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+static const char MSG_DESC_SELECTOR_CANNOT_HOME[] PROGMEM_I1 = ISTR("The Selector cannot home properly. Check for anything blocking its movement."); ////MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+static const char MSG_DESC_CANNOT_MOVE[] PROGMEM_I1 = ISTR("Can't move Selector or Idler."); /////MSG_DESC_CANNOT_MOVE c=20 r=4
+//static const char MSG_DESC_SELECTOR_CANNOT_MOVE[] PROGMEM_I1 = ISTR("The Selector cannot move. Check for anything blocking its movement. Check the wiring is correct.");
+static const char MSG_DESC_IDLER_CANNOT_HOME[] PROGMEM_I1 = ISTR("The Idler cannot home properly. Check for anything blocking its movement."); ////MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+//static const char MSG_DESC_IDLER_CANNOT_MOVE[] PROGMEM_I1 = ISTR("The Idler cannot move properly. Check for anything blocking its movement. Check the wiring is correct.");
+static const char MSG_DESC_TMC[] PROGMEM_I1 = ISTR("More details online."); ////MSG_DESC_TMC c=20 r=8
+//static const char MSG_DESC_PULLEY_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor is almost overheating. Make sure there is sufficient airflow near the MMU board.");
+//static const char MSG_DESC_SELECTOR_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor is almost overheating. Make sure there is sufficient airflow near the MMU board.");
+//static const char MSG_DESC_IDLER_WARNING_TMC_TOO_HOT[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor is almost overheating. Make sure there is sufficient airflow near the MMU board.");
+//static const char MSG_DESC_PULLEY_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor is overheated. Cool down the MMU board and reset MMU.");
+//static const char MSG_DESC_SELECTOR_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor is overheated. Cool down the MMU board and reset MMU.");
+//static const char MSG_DESC_IDLER_TMC_OVERHEAT_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor is overheated. Cool down the MMU board and reset MMU.");
+//static const char MSG_DESC_PULLEY_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor is not responding. Try resetting the MMU. If the issue persists contact support.");
+//static const char MSG_DESC_SELECTOR_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor is not responding. Try resetting the MMU. If the issue persists contact support.");
+//static const char MSG_DESC_IDLER_TMC_DRIVER_ERROR[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor is not responding. Try resetting the MMU. If the issue persists contact support.");
+//static const char MSG_DESC_PULLEY_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC driver for the Pulley motor was restarted. There is probably an issue with the electronics. Check the wiring and connectors.");
+//static const char MSG_DESC_SELECTOR_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC driver for the Selector motor was restarted. There is probably an issue with the electronics. Check the wiring and connectors.");
+//static const char MSG_DESC_IDLER_TMC_DRIVER_RESET[] PROGMEM_I1 = ISTR("TMC driver for the Idler motor was restarted. There is probably an issue with the electronics. Check the wiring and connectors.");
+//static const char MSG_DESC_PULLEY_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("Not enough current for the Pulley TMC driver. There is probably an issue with the electronics. Check the wiring and connectors.");
+//static const char MSG_DESC_SELECTOR_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("Not enough current for the Selector TMC driver. There is probably an issue with the electronics. Check the wiring and connectors.");
+//static const char MSG_DESC_IDLER_TMC_UNDERVOLTAGE_ERROR[] PROGMEM_I1 = ISTR("Not enough current for the Idler TMC driver. There is probably an issue with the electronics. Check the wiring and connectors.");
+//static const char MSG_DESC_PULLEY_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("Short circuit on the Pulley TMC driver. Check the wiring and connectors. If the issue persists contact support.");
+//static const char MSG_DESC_SELECTOR_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("Short circuit on the Selector TMC driver. Check the wiring and connectors. If the issue persists contact support.");
+//static const char MSG_DESC_IDLER_TMC_DRIVER_SHORTED[] PROGMEM_I1 = ISTR("Short circuit on the Idler TMC driver. Check the wiring and connectors. If the issue persists contact support.");
+static const char MSG_DESC_MMU_NOT_RESPONDING[] PROGMEM_I1 = ISTR("MMU unit not responding. Check the wiring and connectors. If the issue persists, contact support."); ////MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+static const char MSG_DESC_COMMUNICATION_ERROR[] PROGMEM_I1 = ISTR("MMU unit not responding correctly. Check the wiring and connectors. If the issue persists, contact support."); ////MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+static const char MSG_DESC_FILAMENT_ALREADY_LOADED[] PROGMEM_I1 = ISTR("Cannot perform the action, filament is already loaded. Unload it first."); ////MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+static const char MSG_DESC_INVALID_TOOL[] PROGMEM_I1 = ISTR("Requested filament tool is not available on this hardware. Check the G-code for tool index out of range (T0-T4)."); ////MSG_DESC_INVALID_TOOL c=20 r=8
+static const char MSG_DESC_QUEUE_FULL[] PROGMEM_I1 = ISTR("MMU Firmware internal error, please reset the MMU."); ////MSG_DESC_QUEUE_FULL c=20 r=8
+static const char MSG_DESC_FW_UPDATE_NEEDED[] PROGMEM_I1 = ISTR("The MMU unit reports its FW version incompatible with the printer's firmware. Make sure the MMU firmware is up to date."); ////MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+static const char MSG_DESC_FW_RUNTIME_ERROR[] PROGMEM_I1 = ISTR("Internal runtime error. Try resetting the MMU unit or updating the firmware. If the issue persists, contact support."); ////MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+static const char MSG_DESC_UNLOAD_MANUALLY[] PROGMEM_I1 = ISTR("Unexpected FINDA reading. Ensure no filament is under FINDA and the selector is free. Check FINDA connection."); ////MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+
+static const char * const errorDescs[] PROGMEM = {
+    _R(MSG_DESC_FINDA_DIDNT_TRIGGER),
+    _R(MSG_DESC_FINDA_DIDNT_GO_OFF),
+    _R(MSG_DESC_FSENSOR_DIDNT_TRIGGER),
+    _R(MSG_DESC_FSENSOR_DIDNT_GO_OFF),
+    _R(MSG_DESC_PULLEY_STALLED),
+    _R(MSG_DESC_FSENSOR_TOO_EARLY),
+    _R(MSG_DESC_SELECTOR_CANNOT_HOME),
+    _R(MSG_DESC_CANNOT_MOVE),
+    _R(MSG_DESC_IDLER_CANNOT_HOME),
+    _R(MSG_DESC_CANNOT_MOVE),
+    _R(MSG_DESC_TMC), // descPULLEY_WARNING_TMC_TOO_HOT
+    _R(MSG_DESC_TMC), // descSELECTOR_WARNING_TMC_TOO_HOT
+    _R(MSG_DESC_TMC), // descIDLER_WARNING_TMC_TOO_HOT
+    _R(MSG_DESC_TMC), // descPULLEY_TMC_OVERHEAT_ERROR
+    _R(MSG_DESC_TMC), // descSELECTOR_TMC_OVERHEAT_ERROR
+    _R(MSG_DESC_TMC), // descIDLER_TMC_OVERHEAT_ERROR
+    _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_ERROR
+    _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_ERROR
+    _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_ERROR
+    _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_RESET
+    _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_RESET
+    _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_RESET
+    _R(MSG_DESC_TMC), // descPULLEY_TMC_UNDERVOLTAGE_ERROR
+    _R(MSG_DESC_TMC), // descSELECTOR_TMC_UNDERVOLTAGE_ERROR
+    _R(MSG_DESC_TMC), // descIDLER_TMC_UNDERVOLTAGE_ERROR
+    _R(MSG_DESC_TMC), // descPULLEY_TMC_DRIVER_SHORTED
+    _R(MSG_DESC_TMC), // descSELECTOR_TMC_DRIVER_SHORTED
+    _R(MSG_DESC_TMC), // descIDLER_TMC_DRIVER_SHORTED
+    _R(MSG_DESC_MMU_NOT_RESPONDING),
+    _R(MSG_DESC_COMMUNICATION_ERROR),
+    _R(MSG_DESC_FILAMENT_ALREADY_LOADED),
+    _R(MSG_DESC_INVALID_TOOL),
+    _R(MSG_DESC_QUEUE_FULL),
+    _R(MSG_DESC_FW_UPDATE_NEEDED),
+    _R(MSG_DESC_FW_RUNTIME_ERROR),
+    _R(MSG_DESC_UNLOAD_MANUALLY)
+};
+
+// we have max 3 buttons/operations to select from
+// one of them is "More" to show the explanation text normally hidden in the next screens.
+// 01234567890123456789
+// >bttxt >bttxt>MoreW
+// Therefore at least some of the buttons, which can occur on the screen together, need to be 5-chars long max @@TODO.
+// Beware - we only have space for 2 buttons on the LCD while the MMU has 3 buttons
+// -> the left button on the MMU is not used/rendered on the LCD (it is also almost unused on the MMU side)
+static const char MSG_BTN_RETRY[] PROGMEM_I1 = ISTR("Retry"); ////MSG_BTN_RETRY c=5
+static const char MSG_BTN_CONTINUE[] PROGMEM_I1 = ISTR("Done"); ////MSG_BTN_CONTINUE c=5
+static const char MSG_BTN_RESTART_MMU[] PROGMEM_I1 = ISTR("Reset MMU"); ////MSG_BTN_RESTART_MMU c=9
+static const char MSG_BTN_UNLOAD[] PROGMEM_I1 = ISTR("Unload"); ////MSG_BTN_UNLOAD c=6
+static const char MSG_BTN_STOP[] PROGMEM_I1 = ISTR("Stop"); ////MSG_BTN_STOP c=5
+static const char MSG_BTN_DISABLE_MMU[] PROGMEM_I1 = ISTR("Disable"); ////MSG_BTN_DISABLE_MMU c=9
+static const char MSG_BTN_MORE[] PROGMEM_I1 = ISTR("More\x06"); ////MSG_BTN_MORE c=5
+
+// Used to parse the buttons from Btns().
+static const char * const btnOperation[] PROGMEM = {
+    _R(MSG_BTN_RETRY),
+    _R(MSG_BTN_CONTINUE),
+    _R(MSG_BTN_RESTART_MMU),
+    _R(MSG_BTN_UNLOAD),
+    _R(MSG_BTN_STOP),
+    _R(MSG_BTN_DISABLE_MMU),
+};
+
+// We have 8 different operations/buttons at this time, so we need at least 4 bits to encode each.
+// Since one of the buttons is always "More", we can skip that one.
+// Therefore we need just 1 byte to describe the necessary buttons for each screen.
+uint8_t constexpr Btns(ButtonOperations bMiddle, ButtonOperations bRight){
+    return ((uint8_t)bRight) << 4 | ((uint8_t)bMiddle);
+}
+
+static const uint8_t errorButtons[] PROGMEM = {
+    Btns(ButtonOperations::Retry, ButtonOperations::Continue),//FINDA_DIDNT_TRIGGER
+    Btns(ButtonOperations::Retry, ButtonOperations::Continue),//FINDA_DIDNT_GO_OFF
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//FSENSOR_DIDNT_TRIGGER
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//FSENSOR_DIDNT_GO_OFF
+
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//PULLEY_STALLED
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//FSENSOR_TOO_EARLY
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//SELECTOR_CANNOT_HOME
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//SELECTOR_CANNOT_MOVE
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//IDLER_CANNOT_HOME
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//IDLER_CANNOT_MOVE
+
+    Btns(ButtonOperations::Continue, ButtonOperations::RestartMMU),//PULLEY_WARNING_TMC_TOO_HOT
+    Btns(ButtonOperations::Continue, ButtonOperations::RestartMMU),//SELECTOR_WARNING_TMC_TOO_HOT
+    Btns(ButtonOperations::Continue, ButtonOperations::RestartMMU),//IDLER_WARNING_TMC_TOO_HOT
+
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_OVERHEAT_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_OVERHEAT_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_OVERHEAT_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_RESET
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_RESET
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_RESET
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_UNDERVOLTAGE_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_UNDERVOLTAGE_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_UNDERVOLTAGE_ERROR
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//PULLEY_TMC_DRIVER_SHORTED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//SELECTOR_TMC_DRIVER_SHORTED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//IDLER_TMC_DRIVER_SHORTED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//MMU_NOT_RESPONDING
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//COMMUNICATION_ERROR
+
+    Btns(ButtonOperations::Unload, ButtonOperations::Continue),//FILAMENT_ALREADY_LOADED
+    Btns(ButtonOperations::StopPrint, ButtonOperations::RestartMMU),//INVALID_TOOL
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//QUEUE_FULL
+    Btns(ButtonOperations::DisableMMU, ButtonOperations::NoOperation),//FW_UPDATE_NEEDED
+    Btns(ButtonOperations::RestartMMU, ButtonOperations::NoOperation),//FW_RUNTIME_ERROR
+    Btns(ButtonOperations::Retry, ButtonOperations::NoOperation),//UNLOAD_MANUALLY
+};
+
+static_assert( sizeof(errorCodes) / sizeof(errorCodes[0]) == sizeof(errorDescs) / sizeof (errorDescs[0]));
+static_assert( sizeof(errorCodes) / sizeof(errorCodes[0]) == sizeof(errorTitles) / sizeof (errorTitles[0]));
+static_assert( sizeof(errorCodes) / sizeof(errorCodes[0]) == sizeof(errorButtons) / sizeof (errorButtons[0]));
+
+} // namespace MMU2

+ 45 - 0
Firmware/mmu2/progress_codes.h

@@ -0,0 +1,45 @@
+/// @file progress_codes.h
+#pragma once
+#include <stdint.h>
+
+/// A complete set of progress codes which may be reported while running a high-level command/operation
+/// This header file shall be included in the printer's firmware as well as a reference,
+/// therefore the progress codes have been extracted to one place
+enum class ProgressCode : uint_fast8_t {
+    OK = 0, ///< finished ok
+
+    EngagingIdler, // P1
+    DisengagingIdler, // P2
+    UnloadingToFinda, // P3
+    UnloadingToPulley, //P4
+    FeedingToFinda, // P5
+    FeedingToExtruder, // P6
+    FeedingToNozzle, // P7
+    AvoidingGrind, // P8
+    FinishingMoves, // P9
+
+    ERRDisengagingIdler, // P10
+    ERREngagingIdler, // P11
+    ERRWaitingForUser, // P12
+    ERRInternal, // P13
+    ERRHelpingFilament, // P14
+    ERRTMCFailed, // P15
+
+    UnloadingFilament, // P16
+    LoadingFilament, // P17
+    SelectingFilamentSlot, // P18
+    PreparingBlade, // P19
+    PushingFilament, // P20
+    PerformingCut, // P21
+    ReturningSelector, // P22
+    ParkingSelector, // P23
+    EjectingFilament, // P24
+    RetractingFromFinda, // P25
+
+    Homing, // P26
+    MovingSelector, // P27
+
+    FeedingToFSensor, // P28
+
+    Empty = 0xff // dummy empty state
+};

+ 22 - 0
Firmware/mmu2_crc.cpp

@@ -0,0 +1,22 @@
+/// @file
+#include "mmu2_crc.h"
+
+#ifdef __AVR__
+#include <util/crc16.h>
+#endif
+
+namespace modules {
+namespace crc {
+
+#ifdef __AVR__
+uint8_t CRC8::CCITT_update(uint8_t crc, uint8_t b) {
+    return _crc8_ccitt_update(crc, b);
+}
+#else
+uint8_t CRC8::CCITT_update(uint8_t crc, uint8_t b) {
+    return CCITT_updateCX(crc, b);
+}
+#endif
+
+} // namespace crc
+} // namespace modules

+ 43 - 0
Firmware/mmu2_crc.h

@@ -0,0 +1,43 @@
+/// @file
+#pragma once
+#include <stdint.h>
+
+namespace modules {
+
+/// Contains all the necessary functions for computation of CRC
+namespace crc {
+
+class CRC8 {
+public:
+    /// Compute/update CRC8 CCIIT from 8bits.
+    /// Details: https://www.nongnu.org/avr-libc/user-manual/group__util__crc.html
+    static uint8_t CCITT_update(uint8_t crc, uint8_t b);
+
+    static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) {
+        uint8_t data = crc ^ b;
+        for (uint8_t i = 0; i < 8; i++) {
+            if ((data & 0x80U) != 0) {
+                data <<= 1U;
+                data ^= 0x07U;
+            } else {
+                data <<= 1U;
+            }
+        }
+        return data;
+    }
+
+    /// Compute/update CRC8 CCIIT from 16bits (convenience wrapper)
+    static constexpr uint8_t CCITT_updateW(uint8_t crc, uint16_t w) {
+        union U {
+            uint8_t b[2];
+            uint16_t w;
+            explicit constexpr inline U(uint16_t w)
+                : w(w) {}
+        } u(w);
+        return CCITT_updateCX(CCITT_updateCX(crc, u.b[0]), u.b[1]);
+    }
+};
+
+} // namespace crc
+
+} // namespace modules

+ 294 - 0
Firmware/mmu2_error_converter.cpp

@@ -0,0 +1,294 @@
+#include "mmu2_error_converter.h"
+#include "mmu2/error_codes.h"
+#include "mmu2/errors_list.h"
+#include "language.h"
+#include <stdio.h>
+
+namespace MMU2 {
+
+static ButtonOperations buttonSelectedOperation = ButtonOperations::NoOperation;
+
+// we don't have a constexpr find_if in C++17/STL yet
+template <class InputIt, class UnaryPredicate>
+constexpr InputIt find_if_cx(InputIt first, InputIt last, UnaryPredicate p) {
+    for (; first != last; ++first) {
+        if (p(*first)) {
+            return first;
+        }
+    }
+    return last;
+}
+
+// Making a constexpr FindError should instruct the compiler to optimize the ConvertMMUErrorCode
+// in such a way that no searching will ever be done at runtime.
+// A call to FindError then compiles to a single instruction even on the AVR.
+static constexpr uint8_t FindErrorIndex(uint16_t pec) {
+    constexpr uint16_t errorCodesSize = sizeof(errorCodes) / sizeof(errorCodes[0]);
+    constexpr const auto *errorCodesEnd = errorCodes + errorCodesSize;
+    const auto *i = find_if_cx(errorCodes, errorCodesEnd, [pec](uint16_t ed){ return ed == pec; });
+    return (i != errorCodesEnd) ? (i-errorCodes) : (errorCodesSize - 1);
+}
+
+// check that the searching algoritm works
+static_assert( FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_TRIGGER) == 0);
+static_assert( FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_GO_OFF) == 1);
+static_assert( FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2);
+static_assert( FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_GO_OFF) == 3);
+
+uint8_t PrusaErrorCodeIndex(uint16_t ec) {
+    switch (ec) {
+    case (uint16_t)ErrorCode::FINDA_DIDNT_SWITCH_ON:
+        return FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_TRIGGER);
+    case (uint16_t)ErrorCode::FINDA_DIDNT_SWITCH_OFF:
+        return FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_GO_OFF);
+    case (uint16_t)ErrorCode::FSENSOR_DIDNT_SWITCH_ON:
+        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER);
+    case (uint16_t)ErrorCode::FSENSOR_DIDNT_SWITCH_OFF:
+        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_GO_OFF);
+    case (uint16_t)ErrorCode::FSENSOR_TOO_EARLY:
+        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_TOO_EARLY);
+        
+    case (uint16_t)ErrorCode::STALLED_PULLEY:
+    case (uint16_t)ErrorCode::MOVE_PULLEY_FAILED:
+        return FindErrorIndex(ERR_MECHANICAL_PULLEY_CANNOT_MOVE);
+        
+    case (uint16_t)ErrorCode::HOMING_SELECTOR_FAILED:
+        return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_HOME);
+    case (uint16_t)ErrorCode::MOVE_SELECTOR_FAILED:
+        return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_MOVE);
+        
+    case (uint16_t)ErrorCode::HOMING_IDLER_FAILED:
+        return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_HOME);
+    case (uint16_t)ErrorCode::MOVE_IDLER_FAILED:
+        return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_MOVE);
+        
+    case (uint16_t)ErrorCode::MMU_NOT_RESPONDING:
+        return FindErrorIndex(ERR_CONNECT_MMU_NOT_RESPONDING);
+    case (uint16_t)ErrorCode::PROTOCOL_ERROR:
+        return FindErrorIndex(ERR_CONNECT_COMMUNICATION_ERROR);
+    case (uint16_t)ErrorCode::FILAMENT_ALREADY_LOADED:
+        return FindErrorIndex(ERR_SYSTEM_FILAMENT_ALREADY_LOADED);
+    case (uint16_t)ErrorCode::INVALID_TOOL:
+        return FindErrorIndex(ERR_SYSTEM_INVALID_TOOL);
+    case (uint16_t)ErrorCode::QUEUE_FULL:
+        return FindErrorIndex(ERR_SYSTEM_QUEUE_FULL);
+    case (uint16_t)ErrorCode::VERSION_MISMATCH:
+        return FindErrorIndex(ERR_SYSTEM_FW_UPDATE_NEEDED);
+    case (uint16_t)ErrorCode::INTERNAL:
+        return FindErrorIndex(ERR_SYSTEM_FW_RUNTIME_ERROR);
+    case (uint16_t)ErrorCode::FINDA_VS_EEPROM_DISREPANCY:
+        return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY);
+    }
+
+    // TMC-related errors - multiple of these can occur at once
+    // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough)
+    // By carefully ordering the checks here we can prioritize the errors being reported to the user.
+    if (ec & (uint16_t)ErrorCode::TMC_PULLEY_BIT) {
+        if (ec & (uint16_t)ErrorCode::TMC_IOIN_MISMATCH)
+            return FindErrorIndex(ERR_ELECTRICAL_PULLEY_TMC_DRIVER_ERROR);
+        if (ec & (uint16_t)ErrorCode::TMC_RESET)
+            return FindErrorIndex(ERR_ELECTRICAL_PULLEY_TMC_DRIVER_RESET);
+        if (ec & (uint16_t)ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)
+            return FindErrorIndex(ERR_ELECTRICAL_PULLEY_TMC_UNDERVOLTAGE_ERROR);
+        if (ec & (uint16_t)ErrorCode::TMC_SHORT_TO_GROUND)
+            return FindErrorIndex(ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED);
+        if (ec & (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_WARN)
+            return FindErrorIndex(ERR_TEMPERATURE_PULLEY_WARNING_TMC_TOO_HOT);
+        if (ec & (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_ERROR)
+            return FindErrorIndex(ERR_TEMPERATURE_PULLEY_TMC_OVERHEAT_ERROR);
+    } else if (ec & (uint16_t)ErrorCode::TMC_SELECTOR_BIT) {
+        if (ec & (uint16_t)ErrorCode::TMC_IOIN_MISMATCH)
+            return FindErrorIndex(ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_ERROR);
+        if (ec & (uint16_t)ErrorCode::TMC_RESET)
+            return FindErrorIndex(ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_RESET);
+        if (ec & (uint16_t)ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)
+            return FindErrorIndex(ERR_ELECTRICAL_SELECTOR_TMC_UNDERVOLTAGE_ERROR);
+        if (ec & (uint16_t)ErrorCode::TMC_SHORT_TO_GROUND)
+            return FindErrorIndex(ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED);
+        if (ec & (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_WARN)
+            return FindErrorIndex(ERR_TEMPERATURE_SELECTOR_WARNING_TMC_TOO_HOT);
+        if (ec & (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_ERROR)
+            return FindErrorIndex(ERR_TEMPERATURE_SELECTOR_TMC_OVERHEAT_ERROR);
+    } else if (ec & (uint16_t)ErrorCode::TMC_IDLER_BIT) {
+        if (ec & (uint16_t)ErrorCode::TMC_IOIN_MISMATCH)
+            return FindErrorIndex(ERR_ELECTRICAL_IDLER_TMC_DRIVER_ERROR);
+        if (ec & (uint16_t)ErrorCode::TMC_RESET)
+            return FindErrorIndex(ERR_ELECTRICAL_IDLER_TMC_DRIVER_RESET);
+        if (ec & (uint16_t)ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)
+            return FindErrorIndex(ERR_ELECTRICAL_IDLER_TMC_UNDERVOLTAGE_ERROR);
+        if (ec & (uint16_t)ErrorCode::TMC_SHORT_TO_GROUND)
+            return FindErrorIndex(ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED);
+        if (ec & (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_WARN)
+            return FindErrorIndex(ERR_TEMPERATURE_IDLER_WARNING_TMC_TOO_HOT);
+        if (ec & (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_ERROR)
+            return FindErrorIndex(ERR_TEMPERATURE_IDLER_TMC_OVERHEAT_ERROR);
+    }
+
+    // if nothing got caught, return a generic runtime error
+    return FindErrorIndex(ERR_SYSTEM_FW_RUNTIME_ERROR);
+}
+
+uint16_t PrusaErrorCode(uint8_t i){
+    return pgm_read_word(errorCodes + i);
+}
+
+const char * const PrusaErrorTitle(uint8_t i){
+    return (const char * const)pgm_read_ptr(errorTitles + i);
+}
+
+const char * const PrusaErrorDesc(uint8_t i){
+    return (const char * const)pgm_read_ptr(errorDescs + i);
+}
+
+uint8_t PrusaErrorButtons(uint8_t i){
+    return pgm_read_byte(errorButtons + i);
+}
+
+const char * const PrusaErrorButtonTitle(uint8_t bi){
+    // -1 represents the hidden NoOperation button which is not drawn in any way
+    return (const char * const)pgm_read_ptr(btnOperation + bi - 1);
+}
+
+const char * const PrusaErrorButtonMore(){
+    return _R(MSG_BTN_MORE);
+}
+
+struct ResetOnExit {
+    ResetOnExit() = default;
+    ~ResetOnExit(){
+        buttonSelectedOperation = ButtonOperations::NoOperation;
+    }
+};
+
+Buttons ButtonPressed(uint16_t ec) {
+    if (buttonSelectedOperation == ButtonOperations::NoOperation) {
+        return NoButton; // no button
+    }
+    
+    ResetOnExit ros; // clear buttonSelectedOperation on exit from this call
+    return ButtonAvailable(ec);
+}
+
+Buttons ButtonAvailable(uint16_t ec) {
+    uint8_t ei = PrusaErrorCodeIndex(ec);
+    
+    // The list of responses which occur in mmu error dialogs
+    // Return button index or perform some action on the MK3 by itself (like restart MMU)
+    // Based on Prusa-Error-Codes errors_list.h
+    // So far hardcoded, but shall be generated in the future
+    switch ( PrusaErrorCode(ei) ) {
+    case ERR_MECHANICAL_FINDA_DIDNT_TRIGGER:
+    case ERR_MECHANICAL_FINDA_DIDNT_GO_OFF:
+        switch (buttonSelectedOperation) {
+        case ButtonOperations::Retry: // "Repeat action"
+            return Middle;
+        case ButtonOperations::Continue: // "Continue"
+            return Right;
+        default:
+            break;
+        }
+        break;
+    case ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER:
+    case ERR_MECHANICAL_FSENSOR_DIDNT_GO_OFF:
+    case ERR_MECHANICAL_FSENSOR_TOO_EARLY:
+    case ERR_MECHANICAL_SELECTOR_CANNOT_HOME:
+    case ERR_MECHANICAL_SELECTOR_CANNOT_MOVE:
+    case ERR_MECHANICAL_IDLER_CANNOT_HOME:
+    case ERR_MECHANICAL_IDLER_CANNOT_MOVE:
+    case ERR_MECHANICAL_PULLEY_CANNOT_MOVE:
+    case ERR_SYSTEM_UNLOAD_MANUALLY:
+        switch (buttonSelectedOperation) {
+        // may be allow move selector right and left in the future
+        case ButtonOperations::Retry: // "Repeat action"
+            return Middle;
+        default:
+            break;
+        }
+        break;
+        
+    case ERR_TEMPERATURE_PULLEY_WARNING_TMC_TOO_HOT:
+    case ERR_TEMPERATURE_SELECTOR_WARNING_TMC_TOO_HOT:
+    case ERR_TEMPERATURE_IDLER_WARNING_TMC_TOO_HOT:
+        switch (buttonSelectedOperation) {
+        case ButtonOperations::Continue: // "Continue"
+            return Left;
+        case ButtonOperations::RestartMMU: // "Restart MMU"
+            return RestartMMU;
+        default:
+            break;
+        }
+        break;
+        
+    case ERR_TEMPERATURE_PULLEY_TMC_OVERHEAT_ERROR:
+    case ERR_TEMPERATURE_SELECTOR_TMC_OVERHEAT_ERROR:
+    case ERR_TEMPERATURE_IDLER_TMC_OVERHEAT_ERROR:
+        
+    case ERR_ELECTRICAL_PULLEY_TMC_DRIVER_ERROR:
+    case ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_ERROR:
+    case ERR_ELECTRICAL_IDLER_TMC_DRIVER_ERROR:
+        
+    case ERR_ELECTRICAL_PULLEY_TMC_DRIVER_RESET:
+    case ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_RESET:
+    case ERR_ELECTRICAL_IDLER_TMC_DRIVER_RESET:
+        
+    case ERR_ELECTRICAL_PULLEY_TMC_UNDERVOLTAGE_ERROR:
+    case ERR_ELECTRICAL_SELECTOR_TMC_UNDERVOLTAGE_ERROR:
+    case ERR_ELECTRICAL_IDLER_TMC_UNDERVOLTAGE_ERROR:
+        
+    case ERR_ELECTRICAL_PULLEY_TMC_DRIVER_SHORTED:
+    case ERR_ELECTRICAL_SELECTOR_TMC_DRIVER_SHORTED:
+    case ERR_ELECTRICAL_IDLER_TMC_DRIVER_SHORTED:
+        
+    case ERR_CONNECT_MMU_NOT_RESPONDING:
+    case ERR_CONNECT_COMMUNICATION_ERROR:
+        
+    case ERR_SYSTEM_QUEUE_FULL:
+    case ERR_SYSTEM_FW_RUNTIME_ERROR:
+        switch (buttonSelectedOperation) {
+        case ButtonOperations::RestartMMU: // "Restart MMU"
+            return RestartMMU;
+        default:
+            break;
+        }
+        break;
+    case ERR_SYSTEM_FW_UPDATE_NEEDED:
+        switch (buttonSelectedOperation) {
+        case ButtonOperations::DisableMMU: // "Disable"
+            return DisableMMU;
+        default:
+            break;
+        }
+        break;
+    case ERR_SYSTEM_FILAMENT_ALREADY_LOADED:
+        switch (buttonSelectedOperation) {
+        case ButtonOperations::Unload: // "Unload"
+            return Left;
+        case ButtonOperations::Continue: // "Proceed/Continue"
+            return Right;
+        default:
+            break;
+        }
+        break;
+        
+    case ERR_SYSTEM_INVALID_TOOL:
+        switch (buttonSelectedOperation) {
+        case ButtonOperations::StopPrint: // "Stop print"
+            return StopPrint;
+        case ButtonOperations::RestartMMU: // "Restart MMU"
+            return RestartMMU;
+        default:
+            break;
+        }
+        break;
+    default:
+        break;
+    }
+    
+    return NoButton;
+}
+
+void SetButtonResponse(ButtonOperations rsp){
+    buttonSelectedOperation = rsp;
+}
+
+} // namespace MMU2

+ 48 - 0
Firmware/mmu2_error_converter.h

@@ -0,0 +1,48 @@
+#pragma once
+#include <stdint.h>
+#include <stddef.h>
+#include "mmu2/buttons.h"
+
+namespace MMU2 {
+
+/// Translates MMU2::ErrorCode into an index of Prusa-Error-Codes
+/// Basically this is the way to obtain an index into all other functions in this API
+uint8_t PrusaErrorCodeIndex(uint16_t ec);
+
+/// @returns pointer to a PROGMEM string representing the Title of the Prusa-Error-Codes error
+/// @param i index of the error - obtained by calling ErrorCodeIndex
+const char * const PrusaErrorTitle(uint8_t i);
+
+/// @returns pointer to a PROGMEM string representing the multi-page Description of the Prusa-Error-Codes error
+/// @param i index of the error - obtained by calling ErrorCodeIndex
+const char * const PrusaErrorDesc(uint8_t i);
+
+/// @returns the actual numerical value of the Prusa-Error-Codes error
+/// @param i index of the error - obtained by calling ErrorCodeIndex
+uint16_t PrusaErrorCode(uint8_t i);
+
+/// @returns Btns pair of buttons for a particular Prusa-Error-Codes error
+/// @param i index of the error - obtained by calling ErrorCodeIndex
+uint8_t PrusaErrorButtons(uint8_t i);
+
+/// @returns pointer to a PROGMEM string representing the Title of a button
+/// @param i index of the error - obtained by calling PrusaErrorButtons + extracting low or high nibble from the Btns pair
+const char * const PrusaErrorButtonTitle(uint8_t bi);
+
+/// @returns pointer to a PROGMEM string representing the "More" button
+const char * const PrusaErrorButtonMore();
+
+/// Sets the selected button for later pick-up by the MMU state machine.
+/// Used to save the GUI selection/decoupling
+void SetButtonResponse(ButtonOperations rsp);
+
+/// @returns button index/code based on currently processed error/screen
+/// Clears the "pressed" button upon exit
+Buttons ButtonPressed(uint16_t ec);
+
+/// @returns button index/code based on currently processed error/screen
+/// Used as a subfunction of ButtonPressed.
+/// Does not clear the "pressed" button upon exit
+Buttons ButtonAvailable(uint16_t ec);
+
+} // namespace MMU2

+ 10 - 0
Firmware/mmu2_fsensor.cpp

@@ -0,0 +1,10 @@
+#include "mmu2_fsensor.h"
+#include "Filament_sensor.h"
+
+namespace MMU2 {
+
+FilamentState WhereIsFilament(){
+    return fsensor.getFilamentPresent() ? FilamentState::AT_FSENSOR : FilamentState::NOT_PRESENT;
+}
+
+} // namespace MMU2

+ 17 - 0
Firmware/mmu2_fsensor.h

@@ -0,0 +1,17 @@
+#pragma once
+#include <stdint.h>
+#include "Filament_sensor.h"
+
+namespace MMU2 {
+
+/// Possible states of filament from the perspective of presence in various parts of the printer
+/// Beware, the numeric codes are important and sent into the MMU
+enum class FilamentState : uint_fast8_t {
+    NOT_PRESENT = 0, ///< filament sensor doesn't see the filament
+    AT_FSENSOR = 1, ///< filament detected by the filament sensor, but the nozzle has not detected the filament yet
+    IN_NOZZLE = 2 ///< filament detected by the filament sensor and also loaded in the nozzle
+};
+
+FilamentState WhereIsFilament();
+
+} // namespace MMU2

+ 17 - 0
Firmware/mmu2_log.cpp

@@ -0,0 +1,17 @@
+#include "mmu2_log.h"
+
+namespace MMU2 {
+
+void LogErrorEvent_P(const char *msg){
+    SERIAL_ERROR_START;
+    SERIAL_MMU2();
+    SERIAL_ECHOLNRPGM(msg);
+}
+
+void LogEchoEvent_P(const char *msg){
+    SERIAL_ECHO_START;
+    SERIAL_MMU2();
+    SERIAL_ECHOLNRPGM(msg);
+}
+
+} // namespace MMU2

+ 39 - 0
Firmware/mmu2_log.h

@@ -0,0 +1,39 @@
+#pragma once
+
+#ifndef UNITTEST
+#include "Marlin.h"
+
+// Beware - before changing this prefix, think twice
+// you'd need to change appmain.cpp app_marlin_serial_output_write_hook
+// and MMU2::ReportError + MMU2::ReportProgress
+static constexpr char mmu2Magic[] PROGMEM = "MMU2:";
+
+namespace MMU2 {
+
+/// Report the msg into the general logging subsystem (through Marlin's SERIAL_ECHO stuff)
+/// @param msg pointer to a string in PROGMEM
+void LogErrorEvent_P(const char *msg);
+
+/// Report the msg into the general logging subsystem (through Marlin's SERIAL_ECHO stuff)
+/// @param msg pointer to a string in PROGMEM
+void LogEchoEvent_P(const char *msg);
+
+} // namespace
+
+#define SERIAL_MMU2() { serialprintPGM(mmu2Magic); }
+
+#define MMU2_ECHO_MSG(S) do{ SERIAL_ECHO_START; SERIAL_MMU2(); SERIAL_ECHO(S); }while(0)
+#define MMU2_ERROR_MSG(S) do{ SERIAL_ERROR_START; SERIAL_MMU2(); SERIAL_ECHO(S); }while(0)
+#define MMU2_ECHO_MSGRPGM(S) do{ SERIAL_ECHO_START; SERIAL_MMU2(); SERIAL_ECHORPGM(S); }while(0)
+#define MMU2_ERROR_MSGRPGM(S) do{ SERIAL_ERROR_START; SERIAL_MMU2(); SERIAL_ECHORPGM(S); }while(0)
+
+#else // #ifndef UNITTEST
+
+#define MMU2_ECHO_MSG(S) /* */
+#define MMU2_ERROR_MSG(S) /* */
+#define SERIAL_ECHO(S) /* */
+#define SERIAL_ECHOLN(S) /* */
+#define MMU2_ECHO_MSGRPGM(S) /* */
+#define MMU2_ERROR_MSGRPGM(S) /* */
+
+#endif // #ifndef UNITTEST

+ 34 - 0
Firmware/mmu2_power.cpp

@@ -0,0 +1,34 @@
+#include "mmu2_power.h"
+#include "Configuration_prusa.h"
+#include "pins.h"
+#include "fastio.h"
+#include <util/delay.h>
+#include "mmu2.h"
+#include "eeprom.h"
+
+namespace MMU2 {
+
+// sadly, on MK3 we cannot do actual power cycle on HW...
+// so we just block the MMU via EEPROM var instead.
+void power_on()
+{
+    eeprom_update_byte((uint8_t *)EEPROM_MMU_ENABLED, true);
+}
+
+void power_off()
+{
+    eeprom_update_byte((uint8_t *)EEPROM_MMU_ENABLED, false);
+}
+
+void reset() {
+#ifdef MMU_HWRESET // HW - pulse reset pin
+    WRITE(MMU_RST_PIN, 0);
+    _delay_us(100);
+    WRITE(MMU_RST_PIN, 1);
+#else
+    mmu2.Reset(MMU2::Software); // @@TODO needs to be redesigned, this power implementation shall not know anything about the MMU itself
+#endif
+    // otherwise HW reset is not available
+}
+
+} // namespace MMU2

+ 11 - 0
Firmware/mmu2_power.h

@@ -0,0 +1,11 @@
+#pragma once
+
+namespace MMU2 {
+
+void power_on();
+
+void power_off();
+
+void reset();
+
+} // namespace MMU2

+ 72 - 0
Firmware/mmu2_progress_converter.cpp

@@ -0,0 +1,72 @@
+#include "mmu2_progress_converter.h"
+#include "language.h"
+#include "mmu2/progress_codes.h"
+#include <avr/pgmspace.h>
+
+namespace MMU2 {
+                                                                   //01234567890123456789
+static const char MSG_PROGRESS_OK[] PROGMEM_I1               = ISTR("OK"); ////MSG_PROGRESS_OK c=4
+static const char MSG_PROGRESS_ENGAGE_IDLER[] PROGMEM_I1     = ISTR("Engaging idler"); ////MSG_PROGRESS_ENGAGE_IDLER c=20
+static const char MSG_PROGRESS_DISENGAGE_IDLER[] PROGMEM_I1  = ISTR("Disengaging idler"); ////MSG_PROGRESS_DISENGAGE_IDLER c=20
+static const char MSG_PROGRESS_UNLOAD_FINDA[] PROGMEM_I1     = ISTR("Unloading to FINDA"); ////MSG_PROGRESS_UNLOAD_FINDA c=20
+static const char MSG_PROGRESS_UNLOAD_PULLEY[] PROGMEM_I1    = ISTR("Unloading to pulley"); ////MSG_PROGRESS_UNLOAD_PULLEY c=20
+static const char MSG_PROGRESS_FEED_FINDA[] PROGMEM_I1       = ISTR("Feeding to FINDA"); ////MSG_PROGRESS_FEED_FINDA c=20
+static const char MSG_PROGRESS_FEED_EXTRUDER[] PROGMEM_I1    = ISTR("Feeding to extruder"); ////MSG_PROGRESS_FEED_EXTRUDER c=20
+static const char MSG_PROGRESS_FEED_NOZZLE[] PROGMEM_I1      = ISTR("Feeding to nozzle"); ////MSG_PROGRESS_FEED_NOZZLE c=20
+static const char MSG_PROGRESS_AVOID_GRIND[] PROGMEM_I1      = ISTR("Avoiding grind"); ////MSG_PROGRESS_AVOID_GRIND c=20
+static const char MSG_PROGRESS_WAIT_USER[] PROGMEM_I1        = ISTR("ERR Wait for User"); ////MSG_PROGRESS_WAIT_USER c=20
+static const char MSG_PROGRESS_ERR_INTERNAL[] PROGMEM_I1     = ISTR("ERR Internal"); ////MSG_PROGRESS_ERR_INTERNAL c=20
+static const char MSG_PROGRESS_ERR_HELP_FIL[] PROGMEM_I1     = ISTR("ERR Help filament"); ////MSG_PROGRESS_ERR_HELP_FIL c=20
+static const char MSG_PROGRESS_ERR_TMC[] PROGMEM_I1          = ISTR("ERR TMC failed"); ////MSG_PROGRESS_ERR_TMC c=20
+static const char MSG_PROGRESS_SELECT_SLOT[] PROGMEM_I1      = ISTR("Selecting fil. slot"); ////MSG_PROGRESS_SELECT_SLOT c=20
+static const char MSG_PROGRESS_PREPARE_BLADE[] PROGMEM_I1    = ISTR("Preparing blade"); ////MSG_PROGRESS_PREPARE_BLADE c=20
+static const char MSG_PROGRESS_PUSH_FILAMENT[] PROGMEM_I1    = ISTR("Pushing filament"); ////MSG_PROGRESS_PUSH_FILAMENT c=20
+static const char MSG_PROGRESS_PERFORM_CUT[] PROGMEM_I1      = ISTR("Performing cut"); ////MSG_PROGRESS_PERFORM_CUT c=20
+static const char MSG_PROGRESS_RETURN_SELECTOR[] PROGMEM_I1  = ISTR("Returning selector"); ////MSG_PROGRESS_RETURN_SELECTOR c=20
+static const char MSG_PROGRESS_PARK_SELECTOR[] PROGMEM_I1    = ISTR("Parking selector"); ////MSG_PROGRESS_PARK_SELECTOR c=20
+static const char MSG_PROGRESS_EJECT_FILAMENT[] PROGMEM_I1   = ISTR("Ejecting filament"); ////MSG_PROGRESS_EJECT_FILAMENT c=20 //@@todo duplicate
+static const char MSG_PROGRESS_RETRACT_FINDA[] PROGMEM_I1    = ISTR("Retract from FINDA"); ////MSG_PROGRESS_RETRACT_FINDA c=20
+static const char MSG_PROGRESS_HOMING[] PROGMEM_I1           = ISTR("Homing"); ////MSG_PROGRESS_HOMING c=20
+static const char MSG_PROGRESS_MOVING_SELECTOR[] PROGMEM_I1  = ISTR("Moving selector"); ////MSG_PROGRESS_MOVING_SELECTOR c=20
+static const char MSG_PROGRESS_FEED_FSENSOR[] PROGMEM_I1     = ISTR("Feeding to FSensor"); ////MSG_PROGRESS_FEED_FSENSOR c=20
+
+static const char * const progressTexts[] PROGMEM = {
+    _R(MSG_PROGRESS_OK),
+    _R(MSG_PROGRESS_ENGAGE_IDLER),
+    _R(MSG_PROGRESS_DISENGAGE_IDLER),
+    _R(MSG_PROGRESS_UNLOAD_FINDA),
+    _R(MSG_PROGRESS_UNLOAD_PULLEY),
+    _R(MSG_PROGRESS_FEED_FINDA),
+    _R(MSG_PROGRESS_FEED_EXTRUDER),
+    _R(MSG_PROGRESS_FEED_NOZZLE),
+    _R(MSG_PROGRESS_AVOID_GRIND),
+    _R(MSG_FINISHING_MOVEMENTS), //reuse from messages.cpp
+    _R(MSG_PROGRESS_DISENGAGE_IDLER), // err disengaging idler is the same text
+    _R(MSG_PROGRESS_ENGAGE_IDLER), // engage dtto.
+    _R(MSG_PROGRESS_WAIT_USER),
+    _R(MSG_PROGRESS_ERR_INTERNAL),
+    _R(MSG_PROGRESS_ERR_HELP_FIL),
+    _R(MSG_PROGRESS_ERR_TMC),
+    _R(MSG_UNLOADING_FILAMENT), //reuse from messages.cpp
+    _R(MSG_LOADING_FILAMENT), //reuse from messages.cpp
+    _R(MSG_PROGRESS_SELECT_SLOT),
+    _R(MSG_PROGRESS_PREPARE_BLADE),
+    _R(MSG_PROGRESS_PUSH_FILAMENT),
+    _R(MSG_PROGRESS_PERFORM_CUT),
+    _R(MSG_PROGRESS_RETURN_SELECTOR),
+    _R(MSG_PROGRESS_PARK_SELECTOR),
+    _R(MSG_PROGRESS_EJECT_FILAMENT),
+    _R(MSG_PROGRESS_RETRACT_FINDA),
+    _R(MSG_PROGRESS_HOMING),
+    _R(MSG_PROGRESS_MOVING_SELECTOR),
+    _R(MSG_PROGRESS_FEED_FSENSOR)
+};
+
+const char * const ProgressCodeToText(uint16_t pc){
+    // @@TODO ?? a better fallback option?
+    return ( pc <= (sizeof(progressTexts) / sizeof(progressTexts[0])) )
+       ? static_cast<const char * const>(pgm_read_ptr(&progressTexts[pc]))
+       : static_cast<const char * const>(pgm_read_ptr(&progressTexts[0]));
+}
+
+} // namespace MMU2

+ 9 - 0
Firmware/mmu2_progress_converter.h

@@ -0,0 +1,9 @@
+#pragma once
+#include <stdint.h>
+#include <stddef.h>
+
+namespace MMU2 {
+
+const char * const ProgressCodeToText(uint16_t pc);
+
+}

+ 366 - 0
Firmware/mmu2_protocol.cpp

@@ -0,0 +1,366 @@
+/// @file
+#include "mmu2_protocol.h"
+
+// protocol definition
+// command: Q0
+// meaning: query operation status
+// Query/command: query
+// Expected reply from the MMU:
+//  any of the running operation statuses: OID: [T|L|U|E|C|W|K][0-4]
+//  <OID> P[0-9]      : command being processed i.e. operation running, may contain a state number
+//  <OID> E[0-9][0-9] : error 1-9 while doing a tool change
+//  <OID> F[0-9]      : operation finished - will be repeated to "Q" messages until a new command is issued
+
+namespace modules {
+namespace protocol {
+
+// decoding automaton
+// states:  input -> transition into state
+// Code      QTLMUXPSBEWK -> msgcode
+//           \n ->start
+//           * ->error
+// error     \n ->start
+//           * ->error
+// msgcode   0-9 ->msgvalue
+//           * ->error
+// msgvalue  0-9 ->msgvalue
+//           \n ->start successfully accepted command
+
+DecodeStatus Protocol::DecodeRequest(uint8_t c) {
+    switch (rqState) {
+    case RequestStates::Code:
+        switch (c) {
+        case 'Q':
+        case 'T':
+        case 'L':
+        case 'M':
+        case 'U':
+        case 'X':
+        case 'P':
+        case 'S':
+        case 'B':
+        case 'E':
+        case 'W': // write is gonna be a special one
+        case 'K':
+        case 'F':
+        case 'f':
+        case 'H':
+        case 'R':
+            requestMsg.code = (RequestMsgCodes)c;
+            requestMsg.value = 0;
+            requestMsg.value2 = 0;
+            requestMsg.crc8 = 0;
+            rqState = (c == 'W') ? RequestStates::Address : RequestStates::Value; // prepare special automaton path for Write commands
+            return DecodeStatus::NeedMoreData;
+        default:
+            requestMsg.code = RequestMsgCodes::unknown;
+            rqState = RequestStates::Error;
+            return DecodeStatus::Error;
+        }
+    case RequestStates::Value:
+        if (IsHexDigit(c)) {
+            requestMsg.value <<= 4U;
+            requestMsg.value |= Char2Nibble(c);
+            return DecodeStatus::NeedMoreData;
+        } else if (IsCRCSeparator(c)) {
+            rqState = RequestStates::CRC;
+            return DecodeStatus::NeedMoreData;
+        } else {
+            requestMsg.code = RequestMsgCodes::unknown;
+            rqState = RequestStates::Error;
+            return DecodeStatus::Error;
+        }
+    case RequestStates::Address:
+        if (IsHexDigit(c)) {
+            requestMsg.value <<= 4U;
+            requestMsg.value |= Char2Nibble(c);
+            return DecodeStatus::NeedMoreData;
+        } else if (c == ' ') { // end of address, value coming
+            rqState = RequestStates::WriteValue;
+            return DecodeStatus::NeedMoreData;
+        } else {
+            requestMsg.code = RequestMsgCodes::unknown;
+            rqState = RequestStates::Error;
+            return DecodeStatus::Error;
+        }
+    case RequestStates::WriteValue:
+        if (IsHexDigit(c)) {
+            requestMsg.value2 <<= 4U;
+            requestMsg.value2 |= Char2Nibble(c);
+            return DecodeStatus::NeedMoreData;
+        } else if (IsCRCSeparator(c)) {
+            rqState = RequestStates::CRC;
+            return DecodeStatus::NeedMoreData;
+        } else {
+            requestMsg.code = RequestMsgCodes::unknown;
+            rqState = RequestStates::Error;
+            return DecodeStatus::Error;
+        }
+    case RequestStates::CRC:
+        if (IsHexDigit(c)) {
+            requestMsg.crc8 <<= 4U;
+            requestMsg.crc8 |= Char2Nibble(c);
+            return DecodeStatus::NeedMoreData;
+        } else if (IsNewLine(c)) {
+            // check CRC at this spot
+            if (requestMsg.crc8 != requestMsg.ComputeCRC8()) {
+                // CRC mismatch
+                requestMsg.code = RequestMsgCodes::unknown;
+                rqState = RequestStates::Error;
+                return DecodeStatus::Error;
+            } else {
+                rqState = RequestStates::Code;
+                return DecodeStatus::MessageCompleted;
+            }
+        }
+    default: //case error:
+        if (IsNewLine(c)) {
+            rqState = RequestStates::Code;
+            return DecodeStatus::MessageCompleted;
+        } else {
+            requestMsg.code = RequestMsgCodes::unknown;
+            rqState = RequestStates::Error;
+            return DecodeStatus::Error;
+        }
+    }
+}
+
+uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) {
+    txbuff[0] = (uint8_t)msg.code;
+    uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1);
+
+    i += AppendCRC(msg.CRC(), txbuff + i);
+
+    txbuff[i] = '\n';
+    ++i;
+    return i;
+    static_assert(7 <= MaxRequestSize(), "Request message length exceeded the maximum size, increase the magic constant in MaxRequestSize()");
+}
+
+uint8_t Protocol::EncodeWriteRequest(uint8_t address, uint16_t value, uint8_t *txbuff) {
+    const RequestMsg msg(RequestMsgCodes::Write, address, value);
+    uint8_t i = BeginEncodeRequest(msg, txbuff);
+    // dump the value
+    i += UInt16ToHex(value, txbuff + i);
+
+    i += AppendCRC(msg.CRC(), txbuff + i);
+
+    txbuff[i] = '\n';
+    ++i;
+    return i;
+}
+
+DecodeStatus Protocol::DecodeResponse(uint8_t c) {
+    switch (rspState) {
+    case ResponseStates::RequestCode:
+        switch (c) {
+        case 'Q':
+        case 'T':
+        case 'L':
+        case 'M':
+        case 'U':
+        case 'X':
+        case 'P':
+        case 'S':
+        case 'B':
+        case 'E':
+        case 'W':
+        case 'K':
+        case 'F':
+        case 'f':
+        case 'H':
+        case 'R':
+            responseMsg.request.code = (RequestMsgCodes)c;
+            responseMsg.request.value = 0;
+            responseMsg.request.value2 = 0;
+            responseMsg.request.crc8 = 0;
+            rspState = ResponseStates::RequestValue;
+            return DecodeStatus::NeedMoreData;
+        case 0x0a:
+        case 0x0d:
+            // skip leading whitespace if any (makes integration with other SW easier/tolerant)
+            return DecodeStatus::NeedMoreData;
+        default:
+            rspState = ResponseStates::Error;
+            return DecodeStatus::Error;
+        }
+    case ResponseStates::RequestValue:
+        if (IsHexDigit(c)) {
+            responseMsg.request.value <<= 4U;
+            responseMsg.request.value += Char2Nibble(c);
+            return DecodeStatus::NeedMoreData;
+        } else if (c == ' ') {
+            rspState = ResponseStates::ParamCode;
+            return DecodeStatus::NeedMoreData;
+        } else {
+            rspState = ResponseStates::Error;
+            return DecodeStatus::Error;
+        }
+    case ResponseStates::ParamCode:
+        switch (c) {
+        case 'P':
+        case 'E':
+        case 'F':
+        case 'A':
+        case 'R':
+        case 'B':
+            rspState = ResponseStates::ParamValue;
+            responseMsg.paramCode = (ResponseMsgParamCodes)c;
+            responseMsg.paramValue = 0;
+            return DecodeStatus::NeedMoreData;
+        default:
+            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
+            rspState = ResponseStates::Error;
+            return DecodeStatus::Error;
+        }
+    case ResponseStates::ParamValue:
+        if (IsHexDigit(c)) {
+            responseMsg.paramValue <<= 4U;
+            responseMsg.paramValue += Char2Nibble(c);
+            return DecodeStatus::NeedMoreData;
+        } else if (IsCRCSeparator(c)) {
+            rspState = ResponseStates::CRC;
+            return DecodeStatus::NeedMoreData;
+        } else {
+            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
+            rspState = ResponseStates::Error;
+            return DecodeStatus::Error;
+        }
+    case ResponseStates::CRC:
+        if (IsHexDigit(c)) {
+            responseMsg.request.crc8 <<= 4U;
+            responseMsg.request.crc8 += Char2Nibble(c);
+            return DecodeStatus::NeedMoreData;
+        } else if (IsNewLine(c)) {
+            // check CRC at this spot
+            if (responseMsg.request.crc8 != responseMsg.ComputeCRC8()) {
+                // CRC mismatch
+                responseMsg.paramCode = ResponseMsgParamCodes::unknown;
+                rspState = ResponseStates::Error;
+                return DecodeStatus::Error;
+            } else {
+                rspState = ResponseStates::RequestCode;
+                return DecodeStatus::MessageCompleted;
+            }
+        } else {
+            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
+            rspState = ResponseStates::Error;
+            return DecodeStatus::Error;
+        }
+    default: //case error:
+        if (IsNewLine(c)) {
+            rspState = ResponseStates::RequestCode;
+            return DecodeStatus::MessageCompleted;
+        } else {
+            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
+            return DecodeStatus::Error;
+        }
+    }
+}
+
+uint8_t Protocol::EncodeResponseCmdAR(const RequestMsg &msg, ResponseMsgParamCodes ar, uint8_t *txbuff) {
+    // BEWARE:
+    // ResponseMsg rsp(RequestMsg(msg.code, msg.value), ar, 0);
+    // ... is NOT the same as:
+    // ResponseMsg rsp(msg, ar, 0);
+    // ... because of the usually unused parameter value2 (which only comes non-zero in write requests).
+    // It took me a few hours to find out why the CRC from the MMU never matched all the other sides (unit tests and the MK3S)
+    // It is because this was the only place where the original request kept its value2 non-zero.
+    // In the response, we must make sure value2 is actually zero unless being sent along with it (which is not right now)
+    const ResponseMsg rsp(RequestMsg(msg.code, msg.value), ar, 0); // this needs some cleanup @@TODO - check assembly how bad is it
+    uint8_t i = BeginEncodeRequest(rsp.request, txbuff);
+    txbuff[i] = (uint8_t)ar;
+    ++i;
+    i += AppendCRC(rsp.CRC(), txbuff + i);
+    txbuff[i] = '\n';
+    ++i;
+    return i;
+}
+
+uint8_t Protocol::EncodeResponseReadFINDA(const RequestMsg &msg, uint8_t findaValue, uint8_t *txbuff) {
+    return EncodeResponseRead(msg, true, findaValue, txbuff);
+}
+
+uint8_t Protocol::EncodeResponseQueryOperation(const RequestMsg &msg, ResponseCommandStatus rcs, uint8_t *txbuff) {
+    const ResponseMsg rsp(msg, rcs.code, rcs.value);
+    uint8_t i = BeginEncodeRequest(msg, txbuff);
+    txbuff[i] = (uint8_t)rsp.paramCode;
+    ++i;
+    i += UInt16ToHex(rsp.paramValue, txbuff + i);
+    i += AppendCRC(rsp.CRC(), txbuff + i);
+    txbuff[i] = '\n';
+    return i + 1;
+}
+
+uint8_t Protocol::EncodeResponseRead(const RequestMsg &msg, bool accepted, uint16_t value2, uint8_t *txbuff) {
+    const ResponseMsg rsp(msg,
+        accepted ? ResponseMsgParamCodes::Accepted : ResponseMsgParamCodes::Rejected,
+        accepted ? value2 : 0 // be careful about this value for CRC computation - rejected status doesn't have any meaningful value which could be reconstructed from the textual form of the message
+    );
+    uint8_t i = BeginEncodeRequest(msg, txbuff);
+    txbuff[i] = (uint8_t)rsp.paramCode;
+    ++i;
+    if (accepted) {
+        // dump the value
+        i += UInt16ToHex(value2, txbuff + i);
+    }
+    i += AppendCRC(rsp.CRC(), txbuff + i);
+    txbuff[i] = '\n';
+    return i + 1;
+}
+
+uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) {
+    if (value == 0) {
+        *dst = '0';
+        return 1;
+    }
+
+    uint8_t v = value >> 4U;
+    uint8_t charsOut = 1;
+    if (v != 0) { // skip the first '0' if any
+        *dst = Nibble2Char(v);
+        ++dst;
+        charsOut = 2;
+    }
+    v = value & 0xfU;
+    *dst = Nibble2Char(v);
+    return charsOut;
+}
+
+uint8_t Protocol::UInt16ToHex(uint16_t value, uint8_t *dst) {
+    constexpr uint16_t topNibbleMask = 0xf000;
+    if (value == 0) {
+        *dst = '0';
+        return 1;
+    }
+    // skip initial zeros
+    uint8_t charsOut = 4;
+    while ((value & topNibbleMask) == 0) {
+        value <<= 4U;
+        --charsOut;
+    }
+    for (uint8_t i = 0; i < charsOut; ++i) {
+        uint8_t n = (value & topNibbleMask) >> (8U + 4U);
+        value <<= 4U;
+        *dst = Nibble2Char(n);
+        ++dst;
+    }
+    return charsOut;
+}
+
+uint8_t Protocol::BeginEncodeRequest(const RequestMsg &msg, uint8_t *dst) {
+    dst[0] = (uint8_t)msg.code;
+
+    uint8_t i = 1 + UInt8ToHex(msg.value, dst + 1);
+
+    dst[i] = ' ';
+    return i + 1;
+}
+
+uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) {
+    dst[0] = '*'; // reprap-style separator of CRC
+    return 1 + UInt8ToHex(crc, dst + 1);
+}
+
+} // namespace protocol
+} // namespace modules

+ 324 - 0
Firmware/mmu2_protocol.h

@@ -0,0 +1,324 @@
+/// @file protocol.h
+#pragma once
+#include <stdint.h>
+#include "mmu2_crc.h"
+
+namespace modules {
+
+/// @brief The MMU communication protocol implementation and related stuff.
+///
+/// See description of the new protocol in the MMU 2021 doc
+namespace protocol {
+
+/// Definition of request message codes
+enum class RequestMsgCodes : uint8_t {
+    unknown = 0,
+    Query = 'Q',
+    Tool = 'T',
+    Load = 'L',
+    Mode = 'M',
+    Unload = 'U',
+    Reset = 'X',
+    Finda = 'P',
+    Version = 'S',
+    Button = 'B',
+    Eject = 'E',
+    Write = 'W',
+    Cut = 'K',
+    FilamentType = 'F',
+    FilamentSensor = 'f',
+    Home = 'H',
+    Read = 'R'
+};
+
+/// Definition of response message parameter codes
+enum class ResponseMsgParamCodes : uint8_t {
+    unknown = 0,
+    Processing = 'P',
+    Error = 'E',
+    Finished = 'F',
+    Accepted = 'A',
+    Rejected = 'R',
+    Button = 'B' // the MMU registered a button press and is sending it to the printer for processing
+};
+
+/// A request message - requests are being sent by the printer into the MMU.
+struct RequestMsg {
+    RequestMsgCodes code; ///< code of the request message
+    uint8_t value; ///< value of the request message or address of variable to read/write
+    uint16_t value2; ///< in case or write messages - value to be written into the register
+
+    /// CRC8 check - please note we abuse this byte for CRC of ResponseMsgs as well.
+    /// The crc8 byte itself is not added into the CRC computation (obviously ;) )
+    /// Beware - adding any members of this data structure may need changing the way CRC is being computed!
+    uint8_t crc8;
+
+    constexpr uint8_t ComputeCRC8() const {
+        uint8_t crc = 0;
+        crc = modules::crc::CRC8::CCITT_updateCX(0, (uint8_t)code);
+        crc = modules::crc::CRC8::CCITT_updateCX(crc, value);
+        crc = modules::crc::CRC8::CCITT_updateW(crc, value2);
+        return crc;
+    }
+
+    /// @param code of the request message
+    /// @param value of the request message
+    inline constexpr RequestMsg(RequestMsgCodes code, uint8_t value)
+        : code(code)
+        , value(value)
+        , value2(0)
+        , crc8(ComputeCRC8()) {
+    }
+
+    /// Intended for write requests
+    /// @param code of the request message ('W')
+    /// @param address of the register
+    /// @param value to write into the register
+    inline constexpr RequestMsg(RequestMsgCodes code, uint8_t address, uint16_t value)
+        : code(code)
+        , value(address)
+        , value2(value)
+        , crc8(ComputeCRC8()) {
+    }
+
+    constexpr uint8_t CRC() const { return crc8; }
+};
+
+/// A response message - responses are being sent from the MMU into the printer as a response to a request message.
+struct ResponseMsg {
+    RequestMsg request; ///< response is always preceeded by the request message
+    ResponseMsgParamCodes paramCode; ///< code of the parameter
+    uint16_t paramValue; ///< value of the parameter
+
+    constexpr uint8_t ComputeCRC8() const {
+        uint8_t crc = request.ComputeCRC8();
+        crc = modules::crc::CRC8::CCITT_updateCX(crc, (uint8_t)paramCode);
+        crc = modules::crc::CRC8::CCITT_updateW(crc, paramValue);
+        return crc;
+    }
+
+    /// @param request the source request message this response is a reply to
+    /// @param paramCode code of the parameter
+    /// @param paramValue value of the parameter
+    inline constexpr ResponseMsg(RequestMsg request, ResponseMsgParamCodes paramCode, uint16_t paramValue)
+        : request(request)
+        , paramCode(paramCode)
+        , paramValue(paramValue) {
+        this->request.crc8 = ComputeCRC8();
+    }
+
+    constexpr uint8_t CRC() const { return request.crc8; }
+};
+
+/// Combined commandStatus and its value into one data structure (optimization purposes)
+struct ResponseCommandStatus {
+    ResponseMsgParamCodes code;
+    uint16_t value;
+    inline constexpr ResponseCommandStatus(ResponseMsgParamCodes code, uint16_t value)
+        : code(code)
+        , value(value) {}
+};
+
+/// Message decoding return values
+enum class DecodeStatus : uint_fast8_t {
+    MessageCompleted, ///< message completed and successfully lexed
+    NeedMoreData, ///< message incomplete yet, waiting for another byte to come
+    Error, ///< input character broke message decoding
+};
+
+/// Protocol class is responsible for creating/decoding messages in Rx/Tx buffer
+///
+/// Beware - in the decoding more, it is meant to be a statefull instance which works through public methods
+/// processing one input byte per call.
+class Protocol {
+public:
+    inline Protocol()
+        : rqState(RequestStates::Code)
+        , requestMsg(RequestMsgCodes::unknown, 0)
+        , rspState(ResponseStates::RequestCode)
+        , responseMsg(RequestMsg(RequestMsgCodes::unknown, 0), ResponseMsgParamCodes::unknown, 0) {
+    }
+
+    /// Takes the input byte c and steps one step through the state machine
+    /// @returns state of the message being decoded
+    DecodeStatus DecodeRequest(uint8_t c);
+
+    /// Decodes response message in rxbuff
+    /// @returns decoded response message structure
+    DecodeStatus DecodeResponse(uint8_t c);
+
+    /// Encodes request message msg into txbuff memory
+    /// It is expected the txbuff is large enough to fit the message
+    /// @returns number of bytes written into txbuff
+    static uint8_t EncodeRequest(const RequestMsg &msg, uint8_t *txbuff);
+
+    /// Encodes Write request message msg into txbuff memory
+    /// It is expected the txbuff is large enough to fit the message
+    /// @returns number of bytes written into txbuff
+    static uint8_t EncodeWriteRequest(uint8_t address, uint16_t value, uint8_t *txbuff);
+
+    /// @returns the maximum byte length necessary to encode a request message
+    /// Beneficial in case of pre-allocating a buffer for enconding a RequestMsg.
+    static constexpr uint8_t MaxRequestSize() { return 13; }
+
+    /// @returns the maximum byte length necessary to encode a response message
+    /// Beneficial in case of pre-allocating a buffer for enconding a ResponseMsg.
+    static constexpr uint8_t MaxResponseSize() { return 14; }
+
+    /// Encode generic response Command Accepted or Rejected
+    /// @param msg source request message for this response
+    /// @param ar code of response parameter
+    /// @param txbuff where to format the message
+    /// @returns number of bytes written into txbuff
+    static uint8_t EncodeResponseCmdAR(const RequestMsg &msg, ResponseMsgParamCodes ar, uint8_t *txbuff);
+
+    /// Encode response to Read FINDA query
+    /// @param msg source request message for this response
+    /// @param findaValue 1/0 (on/off) status of FINDA
+    /// @param txbuff where to format the message
+    /// @returns number of bytes written into txbuff
+    static uint8_t EncodeResponseReadFINDA(const RequestMsg &msg, uint8_t findaValue, uint8_t *txbuff);
+
+
+
+
+
+
+
+
+    /// Encode response to Query operation status
+    /// @param msg source request message for this response
+    /// @param code status of operation (Processing, Error, Finished)
+    /// @param value related to status of operation(e.g. error code or progress)
+    /// @param txbuff where to format the message
+    /// @returns number of bytes written into txbuff
+    static uint8_t EncodeResponseQueryOperation(const RequestMsg &msg, ResponseCommandStatus rcs, uint8_t *txbuff);
+
+    /// Encode response to Read query
+    /// @param msg source request message for this response
+    /// @param accepted true if the read query was accepted
+    /// @param value2 variable value
+    /// @param txbuff where to format the message
+    /// @returns number of bytes written into txbuff
+    static uint8_t EncodeResponseRead(const RequestMsg &msg, bool accepted, uint16_t value2, uint8_t *txbuff);
+
+    /// @returns the most recently lexed request message
+    inline const RequestMsg GetRequestMsg() const { return requestMsg; }
+
+    /// @returns the most recently lexed response message
+    inline const ResponseMsg GetResponseMsg() const { return responseMsg; }
+
+    /// resets the internal request decoding state (typically after an error)
+    void ResetRequestDecoder() {
+        rqState = RequestStates::Code;
+    }
+
+    /// resets the internal response decoding state (typically after an error)
+    void ResetResponseDecoder() {
+        rspState = ResponseStates::RequestCode;
+    }
+
+#ifndef UNITTEST
+private:
+#endif
+    enum class RequestStates : uint8_t {
+        Code, ///< starting state - expects message code
+        Value, ///< expecting code value
+        Address, ///< expecting address for Write command
+        WriteValue, ///< value to be written (Write command)
+        CRC, ///< CRC
+        Error ///< automaton in error state
+    };
+
+    RequestStates rqState;
+    RequestMsg requestMsg;
+
+    enum class ResponseStates : uint8_t {
+        RequestCode, ///< starting state - expects message code
+        RequestValue, ///< expecting code value
+        ParamCode, ///< expecting param code
+        ParamValue, ///< expecting param value
+        CRC, ///< expecting CRC value
+        Error ///< automaton in error state
+    };
+
+    ResponseStates rspState;
+    ResponseMsg responseMsg;
+
+    static constexpr bool IsNewLine(uint8_t c) {
+        return c == '\n' || c == '\r';
+    }
+    static constexpr bool IsDigit(uint8_t c) {
+        return c >= '0' && c <= '9';
+    }
+    static constexpr bool IsCRCSeparator(uint8_t c) {
+        return c == '*';
+    }
+    static constexpr bool IsHexDigit(uint8_t c) {
+        return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
+    }
+    static constexpr uint8_t Char2Nibble(uint8_t c) {
+        switch (c) {
+        case '0':
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+        case '6':
+        case '7':
+        case '8':
+        case '9':
+            return c - '0';
+        case 'a':
+        case 'b':
+        case 'c':
+        case 'd':
+        case 'e':
+        case 'f':
+            return c - 'a' + 10;
+        default:
+            return 0;
+        }
+    }
+
+    static constexpr uint8_t Nibble2Char(uint8_t n) {
+        switch (n) {
+        case 0:
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+            return n + '0';
+        case 0xa:
+        case 0xb:
+        case 0xc:
+        case 0xd:
+        case 0xe:
+        case 0xf:
+            return n - 10 + 'a';
+        default:
+            return 0;
+        }
+    }
+
+    /// @returns number of characters written
+    static uint8_t UInt8ToHex(uint8_t value, uint8_t *dst);
+
+    /// @returns number of characters written
+    static uint8_t UInt16ToHex(uint16_t value, uint8_t *dst);
+
+    static uint8_t BeginEncodeRequest(const RequestMsg &msg, uint8_t *dst);
+
+    static uint8_t AppendCRC(uint8_t crc, uint8_t *dst);
+};
+
+} // namespace protocol
+} // namespace modules
+
+namespace mp = modules::protocol;

+ 756 - 0
Firmware/mmu2_protocol_logic.cpp

@@ -0,0 +1,756 @@
+#include "mmu2_protocol_logic.h"
+#include "mmu2_log.h"
+#include "mmu2_fsensor.h"
+#include "system_timer.h"
+#include <string.h>
+
+namespace MMU2 {
+
+static const uint8_t supportedMmuFWVersion[3] PROGMEM = { 2, 1, 3 };
+
+void ProtocolLogic::CheckAndReportAsyncEvents() {
+    // even when waiting for a query period, we need to report a change in filament sensor's state
+    // - it is vital for a precise synchronization of moves of the printer and the MMU
+    uint8_t fs = (uint8_t)WhereIsFilament();
+    if (fs != lastFSensor) {
+        SendAndUpdateFilamentSensor();
+    }
+}
+
+void ProtocolLogic::SendQuery() {
+    SendMsg(RequestMsg(RequestMsgCodes::Query, 0));
+    scopeState = ScopeState::QuerySent;
+}
+
+void ProtocolLogic::SendFINDAQuery() {
+    SendMsg(RequestMsg(RequestMsgCodes::Finda, 0));
+    scopeState = ScopeState::FINDAReqSent;
+}
+
+void ProtocolLogic::SendAndUpdateFilamentSensor() {
+    SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament()));
+    scopeState = ScopeState::FilamentSensorStateSent;
+}
+
+void ProtocolLogic::SendButton(uint8_t btn) {
+    SendMsg(RequestMsg(RequestMsgCodes::Button, btn));
+    scopeState = ScopeState::ButtonSent;
+}
+
+void ProtocolLogic::SendVersion(uint8_t stage) {
+    SendMsg(RequestMsg(RequestMsgCodes::Version, stage));
+    scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage);
+}
+
+void ProtocolLogic::SendReadRegister(uint8_t index, ScopeState nextState) {
+    SendMsg(RequestMsg(RequestMsgCodes::Read, index));
+    scopeState = nextState;
+}
+
+void ProtocolLogic::SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState){
+    SendWriteMsg(RequestMsg(RequestMsgCodes::Write, index, value));
+    scopeState = nextState;
+}
+
+// searches for "ok\n" in the incoming serial data (that's the usual response of the old MMU FW)
+struct OldMMUFWDetector {
+    uint8_t ok;
+    inline constexpr OldMMUFWDetector():ok(0) { }
+    
+    enum class State : uint8_t { MatchingPart, SomethingElse, Matched };
+    
+    /// @returns true when "ok\n" gets detected
+    State Detect(uint8_t c){
+        // consume old MMU FW's data if any -> avoid confusion of protocol decoder
+        if(ok == 0 && c == 'o'){
+            ++ok;
+            return State::MatchingPart;
+        } else if(ok == 1 && c == 'k'){
+            ++ok;
+            return State::MatchingPart;
+        } else if(ok == 2 && c == '\n'){
+            return State::Matched;
+        }
+        return State::SomethingElse;
+    }
+};
+
+StepStatus ProtocolLogic::ExpectingMessage() {
+    int bytesConsumed = 0;
+    int c = -1;
+    
+    OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;)
+        
+    // try to consume as many rx bytes as possible (until a message has been completed)
+    while ((c = uart->read()) >= 0) {
+        ++bytesConsumed;
+        RecordReceivedByte(c);
+        switch (protocol.DecodeResponse(c)) {
+        case DecodeStatus::MessageCompleted:
+            rsp = protocol.GetResponseMsg();
+            LogResponse();
+            RecordUARTActivity(); // something has happened on the UART, update the timeout record
+            return MessageReady;
+        case DecodeStatus::NeedMoreData:
+            break;
+        case DecodeStatus::Error:{
+            // consume old MMU FW's data if any -> avoid confusion of protocol decoder
+            auto old = oldMMUh4x0r.Detect(c);
+            if( old == OldMMUFWDetector::State::Matched ){
+                // hack bad FW version - BEWARE - we silently assume that the first query is an "S0"
+                // The old MMU FW responds with "ok\n" and we fake the response to a bad FW version at this spot
+                rsp = ResponseMsg(RequestMsg(RequestMsgCodes::Version, 0), ResponseMsgParamCodes::Accepted, 0);
+                return MessageReady;
+            } else if( old == OldMMUFWDetector::State::MatchingPart ){
+                break;
+            }
+            }
+            [[fallthrough]]; // otherwise
+        default:
+            RecordUARTActivity(); // something has happened on the UART, update the timeout record
+            return ProtocolError;
+        }
+    }
+    if (bytesConsumed != 0) {
+        RecordUARTActivity(); // something has happened on the UART, update the timeout record
+        return Processing;    // consumed some bytes, but message still not ready
+    } else if (Elapsed(linkLayerTimeout)) {
+        return CommunicationTimeout;
+    }
+    return Processing;
+}
+
+void ProtocolLogic::SendMsg(RequestMsg rq) {
+    uint8_t txbuff[Protocol::MaxRequestSize()];
+    uint8_t len = Protocol::EncodeRequest(rq, txbuff);
+    uart->write(txbuff, len);
+    LogRequestMsg(txbuff, len);
+    RecordUARTActivity();
+}
+
+void ProtocolLogic::SendWriteMsg(RequestMsg rq){
+    uint8_t txbuff[Protocol::MaxRequestSize()];
+    uint8_t len = Protocol::EncodeWriteRequest(rq.value, rq.value2, txbuff);
+    uart->write(txbuff, len);
+    LogRequestMsg(txbuff, len);
+    RecordUARTActivity();
+}
+
+void ProtocolLogic::StartSeqRestart() {
+    retries = maxRetries;
+    SendVersion(0);
+}
+
+void ProtocolLogic::DelayedRestartRestart() {
+    scopeState = ScopeState::RecoveringProtocolError;
+}
+
+void ProtocolLogic::CommandRestart() {
+    scopeState = ScopeState::CommandSent;
+    SendMsg(rq);
+}
+
+void ProtocolLogic::IdleRestart() {
+    scopeState = ScopeState::Ready;
+}
+
+StepStatus ProtocolLogic::ProcessVersionResponse(uint8_t stage) {
+    if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != stage) {
+        // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0?
+        SendVersion(stage);
+    } else {
+        mmuFwVersion[stage] = rsp.paramValue;
+        if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) {
+            if (--retries == 0) {
+                return VersionMismatch;
+            } else {
+                SendVersion(stage);
+            }
+        } else {
+            dataTO.Reset(); // got a meaningful response from the MMU, stop data layer timeout tracking
+            SendVersion(stage + 1);
+        }
+    }
+    return Processing;
+}
+
+StepStatus ProtocolLogic::ScopeStep() {
+    if ( ! ExpectsResponse() ) {
+        // we are waiting for something
+        switch (currentScope) {
+        case Scope::DelayedRestart:
+            return DelayedRestartWait();
+        case Scope::Idle:
+            return IdleWait();
+        case Scope::Command:
+            return CommandWait();
+        case Scope::Stopped:
+            return StoppedStep();
+        default:
+            break;
+        }
+    } else {
+        // we are expecting a message
+        if (auto expmsg = ExpectingMessage(); expmsg != MessageReady) // this whole statement takes 12B
+            return expmsg;
+
+        // process message
+        switch (currentScope) {
+        case Scope::StartSeq:
+            return StartSeqStep(); // ~270B
+        case Scope::Idle:
+            return IdleStep(); // ~300B
+        case Scope::Command:
+            return CommandStep(); // ~430B
+        case Scope::Stopped:
+            return StoppedStep();
+        default:
+            break;
+        }
+    }
+    return Finished;
+}
+
+StepStatus ProtocolLogic::StartSeqStep() {
+    // solve initial handshake
+    switch (scopeState) {
+    case ScopeState::S0Sent: // received response to S0 - major
+    case ScopeState::S1Sent: // received response to S1 - minor
+    case ScopeState::S2Sent: // received response to S2 - minor
+        return ProcessVersionResponse((uint8_t)scopeState - (uint8_t)ScopeState::S0Sent);
+    case ScopeState::S3Sent: // received response to S3 - revision
+        if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != 3) {
+            // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0?
+            SendVersion(3);
+        } else {
+            mmuFwVersionBuild = rsp.paramValue; // just register the build number
+            // Start General Interrogation after line up.
+            // For now we just send the state of the filament sensor, but we may request
+            // data point states from the MMU as well. TBD in the future, especially with another protocol
+            SendAndUpdateFilamentSensor();
+        }
+        return Processing;
+    case ScopeState::FilamentSensorStateSent:
+        SwitchFromStartToIdle();
+        return Processing; // Returning Finished is not a good idea in case of a fast error recovery
+        // - it tells the printer, that the command which experienced a protocol error and recovered successfully actually terminated.
+        // In such a case we must return "Processing" in order to keep the MMU state machine running and prevent the printer from executing next G-codes.
+        break;
+    default:
+        return VersionMismatch;
+    }
+    return Finished;
+}
+
+StepStatus ProtocolLogic::DelayedRestartWait() {
+    if (Elapsed(heartBeatPeriod)) { // this basically means, that we are waiting until there is some traffic on
+        while (uart->read() != -1)
+            ; // clear the input buffer
+        // switch to StartSeq
+        Start();
+    }
+    return Processing;
+}
+
+StepStatus ProtocolLogic::CommandWait() {
+    if (Elapsed(heartBeatPeriod)) {
+        SendQuery();
+    } else {
+        // even when waiting for a query period, we need to report a change in filament sensor's state
+        // - it is vital for a precise synchronization of moves of the printer and the MMU
+        CheckAndReportAsyncEvents();
+    }
+    return Processing;
+}
+
+StepStatus ProtocolLogic::ProcessCommandQueryResponse() {
+    switch (rsp.paramCode) {
+    case ResponseMsgParamCodes::Processing:
+        progressCode = static_cast<ProgressCode>(rsp.paramValue);
+        errorCode = ErrorCode::OK;
+        SendAndUpdateFilamentSensor(); // keep on reporting the state of fsensor regularly
+        return Processing;
+    case ResponseMsgParamCodes::Error:
+        // in case of an error the progress code remains as it has been before
+        errorCode = static_cast<ErrorCode>(rsp.paramValue);
+        // keep on reporting the state of fsensor regularly even in command error state
+        // - the MMU checks FINDA and fsensor even while recovering from errors
+        SendAndUpdateFilamentSensor();
+        return CommandError;
+    case ResponseMsgParamCodes::Button:
+        // The user pushed a button on the MMU. Save it, do what we need to do
+        // to prepare, then pass it back to the MMU so it can work its magic.
+        buttonCode = static_cast<Buttons>(rsp.paramValue);
+        SendAndUpdateFilamentSensor();
+        return ButtonPushed;
+    case ResponseMsgParamCodes::Finished:
+        progressCode = ProgressCode::OK;
+        scopeState = ScopeState::Ready;
+        return Finished;
+    default:
+        return ProtocolError;
+    }
+}
+
+StepStatus ProtocolLogic::CommandStep() {
+    switch (scopeState) {
+    case ScopeState::CommandSent: {
+        switch (rsp.paramCode) { // the response should be either accepted or rejected
+        case ResponseMsgParamCodes::Accepted:
+            progressCode = ProgressCode::OK;
+            errorCode = ErrorCode::RUNNING;
+            scopeState = ScopeState::Wait;
+            break;
+        case ResponseMsgParamCodes::Rejected:
+            // rejected - should normally not happen, but report the error up
+            progressCode = ProgressCode::OK;
+            errorCode = ErrorCode::PROTOCOL_ERROR;
+            return CommandRejected;
+        default:
+            return ProtocolError;
+        }
+    } break;
+    case ScopeState::QuerySent:
+        return ProcessCommandQueryResponse();
+    case ScopeState::FilamentSensorStateSent:
+        SendFINDAQuery();
+        return Processing;
+    case ScopeState::FINDAReqSent:
+        findaPressed = rsp.paramValue;
+        SendReadRegister(4, ScopeState::StatisticsSent);
+        return Processing;
+    case ScopeState::StatisticsSent:
+        scopeState = ScopeState::Wait;
+        return Processing;
+    case ScopeState::ButtonSent:
+        if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
+            // Button was accepted, decrement the retry.
+            mmu2.DecrementRetryAttempts();
+        }
+        SendAndUpdateFilamentSensor();
+        break;
+    default:
+        return ProtocolError;
+    }
+    return Processing;
+}
+
+StepStatus ProtocolLogic::IdleWait() {
+    if (scopeState == ScopeState::Ready) { // check timeout
+        if (Elapsed(heartBeatPeriod)) {
+            SendQuery();
+            return Processing;
+        }
+    }
+    return Finished;
+}
+
+StepStatus ProtocolLogic::IdleStep() {
+    switch (scopeState) {
+    case ScopeState::QuerySent: // check UART
+        // If we are accidentally in Idle and we receive something like "T0 P1" - that means the communication dropped out while a command was in progress.
+        // That causes no issues here, we just need to switch to Command processing and continue there from now on.
+        // The usual response in this case should be some command and "F" - finished - that confirms we are in an Idle state even on the MMU side.
+        switch (rsp.request.code) {
+        case RequestMsgCodes::Cut:
+        case RequestMsgCodes::Eject:
+        case RequestMsgCodes::Load:
+        case RequestMsgCodes::Mode:
+        case RequestMsgCodes::Tool:
+        case RequestMsgCodes::Unload:
+            if (rsp.paramCode != ResponseMsgParamCodes::Finished) {
+                return SwitchFromIdleToCommand();
+            }
+            break;
+        case RequestMsgCodes::Reset:
+            // this one is kind of special
+            // we do not transfer to any "running" command (i.e. we stay in Idle),
+            // but in case there is an error reported we must make sure it gets propagated
+            switch (rsp.paramCode) {
+            case ResponseMsgParamCodes::Button:
+                // The user pushed a button on the MMU. Save it, do what we need to do
+                // to prepare, then pass it back to the MMU so it can work its magic.
+                buttonCode = static_cast<Buttons>(rsp.paramValue);
+                SendFINDAQuery();
+                return ButtonPushed;
+            case ResponseMsgParamCodes::Processing:
+                // @@TODO we may actually use this branch to report progress of manual operation on the MMU
+                // The MMU sends e.g. X0 P27 after its restart when the user presses an MMU button to move the Selector
+                // For now let's behave just like "finished"
+            case ResponseMsgParamCodes::Finished:
+                errorCode = ErrorCode::OK;
+                break;
+            default:
+                errorCode = static_cast<ErrorCode>(rsp.paramValue);
+                SendFINDAQuery(); // continue Idle state without restarting the communication
+                return CommandError;
+            }
+            break;
+        default:
+            return ProtocolError;
+        }
+        SendFINDAQuery();
+        return Processing;
+    case ScopeState::FINDAReqSent:
+        findaPressed = rsp.paramValue;
+        SendReadRegister(4, ScopeState::StatisticsSent);
+        return Processing;
+    case ScopeState::StatisticsSent:
+        failStatistics = rsp.paramValue;
+        scopeState = ScopeState::Ready;
+        return Finished;
+    case ScopeState::ButtonSent:
+        if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
+            // Button was accepted, decrement the retry.
+            mmu2.DecrementRetryAttempts();
+        }
+        SendFINDAQuery();
+        return Processing;
+    case ScopeState::ReadRegisterSent:
+        if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
+            // @@TODO just dump the value onto the serial
+        }
+        return Finished;
+    case ScopeState::WriteRegisterSent:
+        if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
+            // @@TODO do something? Retry if not accepted?
+        }
+        return Finished;
+    default:
+        return ProtocolError;
+    }
+
+    // The "return Finished" in this state machine requires a bit of explanation:
+    // The Idle state either did nothing (still waiting for the heartbeat timeout)
+    // or just successfully received the answer to Q0, whatever that was.
+    // In both cases, it is ready to hand over work to a command or something else,
+    // therefore we are returning Finished (also to exit mmu_loop() and unblock Marlin's loop!).
+    // If there is no work, we'll end up in the Idle state again
+    // and we'll send the heartbeat message after the specified timeout.
+    return Finished;
+}
+
+ProtocolLogic::ProtocolLogic(MMU2Serial *uart)
+    : currentScope(Scope::Stopped)
+    , scopeState(ScopeState::Ready)
+    , plannedRq(RequestMsgCodes::unknown, 0)
+    , lastUARTActivityMs(0)
+    , dataTO()
+    , rsp(RequestMsg(RequestMsgCodes::unknown, 0), ResponseMsgParamCodes::unknown, 0)
+    , state(State::Stopped)
+    , lrb(0)
+    , uart(uart)
+    , errorCode(ErrorCode::OK)
+    , progressCode(ProgressCode::OK)
+    , buttonCode(NoButton)
+    , lastFSensor((uint8_t)WhereIsFilament())
+    , findaPressed(false)
+    , failStatistics(0)
+    , mmuFwVersion { 0, 0, 0 }
+{}
+
+void ProtocolLogic::Start() {
+    state = State::InitSequence;
+    currentScope = Scope::StartSeq;
+    protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this
+    StartSeqRestart();
+}
+
+void ProtocolLogic::Stop() {
+    state = State::Stopped;
+    currentScope = Scope::Stopped;
+}
+
+void ProtocolLogic::ToolChange(uint8_t slot) {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Tool, slot));
+}
+
+void ProtocolLogic::Statistics() {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Version, 3));
+}
+
+void ProtocolLogic::UnloadFilament() {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Unload, 0));
+}
+
+void ProtocolLogic::LoadFilament(uint8_t slot) {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Load, slot));
+}
+
+void ProtocolLogic::EjectFilament(uint8_t slot) {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Eject, slot));
+}
+
+void ProtocolLogic::CutFilament(uint8_t slot) {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot));
+}
+
+void ProtocolLogic::ResetMMU() {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, 0));
+}
+
+void ProtocolLogic::Button(uint8_t index) {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Button, index));
+}
+
+void ProtocolLogic::Home(uint8_t mode) {
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Home, mode));
+}
+
+void ProtocolLogic::ReadRegister(uint8_t address){
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Read, address));
+}
+
+void ProtocolLogic::WriteRegister(uint8_t address, uint16_t data){
+    PlanGenericRequest(RequestMsg(RequestMsgCodes::Write, address, data));
+}
+
+void ProtocolLogic::PlanGenericRequest(RequestMsg rq) {
+    plannedRq = rq;
+    if (!ExpectsResponse()) {
+        ActivatePlannedRequest();
+    } // otherwise wait for an empty window to activate the request
+}
+
+bool ProtocolLogic::ActivatePlannedRequest() {
+    switch(plannedRq.code){
+    case RequestMsgCodes::Button:
+        // only issue the button to the MMU and do not restart the state machines
+        SendButton(plannedRq.value);
+        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
+        return true;
+    case RequestMsgCodes::Read:
+        SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent );
+        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
+        return true;
+    case RequestMsgCodes::Write:
+        SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent );
+        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
+        return true;
+    case RequestMsgCodes::unknown:
+        return false;
+    default:// commands
+        currentScope = Scope::Command;
+        SetRequestMsg(plannedRq);
+        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
+        CommandRestart();
+        return true;
+    }
+}
+
+StepStatus ProtocolLogic::SwitchFromIdleToCommand() {
+    currentScope = Scope::Command;
+    SetRequestMsg(rsp.request);
+    // we are recovering from a communication drop out, the command is already running
+    // and we have just received a response to a Q0 message about a command progress
+    return ProcessCommandQueryResponse();
+}
+
+void ProtocolLogic::SwitchToIdle() {
+    state = State::Running;
+    currentScope = Scope::Idle;
+    IdleRestart();
+}
+
+void ProtocolLogic::SwitchFromStartToIdle() {
+    state = State::Running;
+    currentScope = Scope::Idle;
+    IdleRestart();
+    SendQuery(); // force sending Q0 immediately
+}
+
+bool ProtocolLogic::Elapsed(uint32_t timeout) const {
+    return _millis() >= (lastUARTActivityMs + timeout);
+}
+
+void ProtocolLogic::RecordUARTActivity() {
+    lastUARTActivityMs = _millis();
+}
+
+void ProtocolLogic::RecordReceivedByte(uint8_t c) {
+    lastReceivedBytes[lrb] = c;
+    lrb = (lrb + 1) % lastReceivedBytes.size();
+}
+
+constexpr char NibbleToChar(uint8_t c) {
+    switch (c) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9:
+        return c + '0';
+    case 10:
+    case 11:
+    case 12:
+    case 13:
+    case 14:
+    case 15:
+        return (c - 10) + 'a';
+    default:
+        return 0;
+    }
+}
+
+void ProtocolLogic::FormatLastReceivedBytes(char *dst) {
+    for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) {
+        uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()];
+        dst[i * 3] = NibbleToChar(b >> 4);
+        dst[i * 3 + 1] = NibbleToChar(b & 0xf);
+        dst[i * 3 + 2] = ' ';
+    }
+    dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly
+}
+
+void ProtocolLogic::FormatLastResponseMsgAndClearLRB(char *dst) {
+    *dst++ = '<';
+    for (uint8_t i = 0; i < lrb; ++i) {
+        uint8_t b = lastReceivedBytes[i];
+        if (b < 32)
+            b = '.';
+        if (b > 127)
+            b = '.';
+        *dst++ = b;
+    }
+    *dst = 0; // terminate properly
+    lrb = 0;  // reset the input buffer index in case of a clean message
+}
+
+void ProtocolLogic::LogRequestMsg(const uint8_t *txbuff, uint8_t size) {
+    constexpr uint_fast8_t rqs = modules::protocol::Protocol::MaxRequestSize() + 2;
+    char tmp[rqs] = ">";
+    static char lastMsg[rqs] = "";
+    for (uint8_t i = 0; i < size; ++i) {
+        uint8_t b = txbuff[i];
+        if (b < 32)
+            b = '.';
+        if (b > 127)
+            b = '.';
+        tmp[i + 1] = b;
+    }
+    tmp[size + 1] = '\n';
+    tmp[size + 2] = 0;
+    if (!strncmp_P(tmp, PSTR(">S0*99.\n"), rqs) && !strncmp(lastMsg, tmp, rqs)) {
+        // @@TODO we skip the repeated request msgs for now
+        // to avoid spoiling the whole log just with ">S0" messages
+        // especially when the MMU is not connected.
+        // We'll lose the ability to see if the printer is actually
+        // trying to find the MMU, but since it has been reliable in the past
+        // we can live without it for now.
+    } else {
+        MMU2_ECHO_MSG(tmp);
+    }
+    memcpy(lastMsg, tmp, rqs);
+}
+
+void ProtocolLogic::LogError(const char *reason_P) {
+    char lrb[lastReceivedBytes.size() * 3];
+    FormatLastReceivedBytes(lrb);
+
+    MMU2_ERROR_MSGRPGM(reason_P);
+    SERIAL_ECHOPGM(", last bytes: ");
+    SERIAL_ECHOLN(lrb);
+}
+
+void ProtocolLogic::LogResponse() {
+    char lrb[lastReceivedBytes.size()];
+    FormatLastResponseMsgAndClearLRB(lrb);
+    MMU2_ECHO_MSG(lrb);
+    SERIAL_ECHOLN();
+}
+
+StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) {
+    if (dataTO.Record(ss)) {
+        LogError(msg_P);
+        return dataTO.InitialCause();
+    } else {
+        return Processing; // suppress short drop outs of communication
+    }
+}
+
+StepStatus ProtocolLogic::HandleCommunicationTimeout() {
+    uart->flush(); // clear the output buffer
+    protocol.ResetResponseDecoder();
+    Start();
+    return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout);
+}
+
+StepStatus ProtocolLogic::HandleProtocolError() {
+    uart->flush(); // clear the output buffer
+    state = State::InitSequence;
+    currentScope = Scope::DelayedRestart;
+    DelayedRestartRestart();
+    return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError);
+}
+
+StepStatus ProtocolLogic::Step() {
+    if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately
+        ActivatePlannedRequest();
+    }
+    auto currentStatus = ScopeStep();
+    switch (currentStatus) {
+    case Processing:
+        // we are ok, the state machine continues correctly
+        break;
+    case Finished: {
+        // We are ok, switching to Idle if there is no potential next request planned.
+        // But the trouble is we must report a finished command if the previous command has just been finished
+        // i.e. only try to find some planned command if we just finished the Idle cycle
+        bool previousCommandFinished = currentScope == Scope::Command; // @@TODO this is a nasty hack :(
+        if (!ActivatePlannedRequest()) {                               // if nothing is planned, switch to Idle
+            SwitchToIdle();
+        } else {
+            // if the previous cycle was Idle and now we have planned a new command -> avoid returning Finished
+            if (!previousCommandFinished && currentScope == Scope::Command) {
+                currentStatus = Processing;
+            }
+        }
+    } break;
+    case CommandRejected:
+        // we have to repeat it - that's the only thing we can do
+        // no change in state
+        // @@TODO wait until Q0 returns command in progress finished, then we can send this one
+        LogError(PSTR("Command rejected"));
+        CommandRestart();
+        break;
+    case CommandError:
+        LogError(PSTR("Command Error"));
+        // we shall probably transfer into the Idle state and await further instructions from the upper layer
+        // Idle state may solve the problem of keeping up the heart beat running
+        break;
+    case VersionMismatch:
+        LogError(PSTR("Version mismatch"));
+        Stop(); // cannot continue
+        break;
+    case ProtocolError:
+        currentStatus = HandleProtocolError();
+        break;
+    case CommunicationTimeout:
+        currentStatus = HandleCommunicationTimeout();
+        break;
+    default:
+        break;
+    }
+    return currentStatus;
+}
+
+uint8_t ProtocolLogic::CommandInProgress() const {
+    if (currentScope != Scope::Command)
+        return 0;
+    return (uint8_t)ReqMsg().code;
+}
+
+bool DropOutFilter::Record(StepStatus ss) {
+    if (occurrences == maxOccurrences) {
+        cause = ss;
+    }
+    --occurrences;
+    return occurrences == 0;
+}
+
+} // namespace MMU2

+ 309 - 0
Firmware/mmu2_protocol_logic.h

@@ -0,0 +1,309 @@
+#pragma once
+#include <stdint.h>
+// #include <array> //@@TODO Don't we have STL for AVR somewhere?
+template<typename T, uint8_t N>
+class array {
+    T data[N];
+public:
+    array() = default;
+    inline constexpr T* begin()const { return data; }
+    inline constexpr T* end()const { return data + N; }
+    constexpr uint8_t size()const { return N; }
+    inline T &operator[](uint8_t i){
+        return data[i];
+    }
+};
+
+#include "mmu2/error_codes.h"
+#include "mmu2/progress_codes.h"
+#include "mmu2/buttons.h"
+#include "mmu2_protocol.h"
+
+#include "mmu2_serial.h"
+
+/// New MMU2 protocol logic
+namespace MMU2 {
+
+using namespace modules::protocol;
+
+class ProtocolLogic;
+
+/// ProtocolLogic stepping statuses
+enum StepStatus : uint_fast8_t {
+    Processing = 0,
+    MessageReady, ///< a message has been successfully decoded from the received bytes
+    Finished,
+    CommunicationTimeout, ///< the MMU failed to respond to a request within a specified time frame
+    ProtocolError,        ///< bytes read from the MMU didn't form a valid response
+    CommandRejected,      ///< the MMU rejected the command due to some other command in progress, may be the user is operating the MMU locally (button commands)
+    CommandError,         ///< the command in progress stopped due to unrecoverable error, user interaction required
+    VersionMismatch,      ///< the MMU reports its firmware version incompatible with our implementation
+    CommunicationRecovered,
+    ButtonPushed, ///< The MMU reported the user pushed one of its three buttons.
+};
+
+static constexpr uint32_t linkLayerTimeout = 2000;                 ///< default link layer communication timeout
+static constexpr uint32_t dataLayerTimeout = linkLayerTimeout * 3; ///< data layer communication timeout
+static constexpr uint32_t heartBeatPeriod = linkLayerTimeout / 2;  ///< period of heart beat messages (Q0)
+
+static_assert(heartBeatPeriod < linkLayerTimeout && linkLayerTimeout < dataLayerTimeout, "Incorrect ordering of timeouts");
+
+///< Filter of short consecutive drop outs which are recovered instantly
+class DropOutFilter {
+    StepStatus cause;
+    uint8_t occurrences;
+public:
+    static constexpr uint8_t maxOccurrences = 10; // ideally set this to >8 seconds -> 12x heartBeatPeriod
+    static_assert(maxOccurrences > 1, "we should really silently ignore at least 1 comm drop out if recovered immediately afterwards");
+    DropOutFilter() = default;
+
+    /// @returns true if the error should be reported to higher levels (max. number of consecutive occurrences reached)
+    bool Record(StepStatus ss);
+
+    /// @returns the initial cause which started this drop out event
+    inline StepStatus InitialCause() const { return cause; }
+
+    /// Rearms the object for further processing - basically call this once the MMU responds with something meaningful (e.g. S0 A2)
+    inline void Reset() { occurrences = maxOccurrences; }
+};
+
+/// Logic layer of the MMU vs. printer communication protocol
+class ProtocolLogic {
+public:
+    ProtocolLogic(MMU2Serial *uart);
+
+    /// Start/Enable communication with the MMU
+    void Start();
+
+    /// Stop/Disable communication with the MMU
+    void Stop();
+
+    // Issue commands to the MMU
+    void ToolChange(uint8_t slot);
+    void Statistics();
+    void UnloadFilament();
+    void LoadFilament(uint8_t slot);
+    void EjectFilament(uint8_t slot);
+    void CutFilament(uint8_t slot);
+    void ResetMMU();
+    void Button(uint8_t index);
+    void Home(uint8_t mode);
+    void ReadRegister(uint8_t address);
+    void WriteRegister(uint8_t address, uint16_t data);
+
+    /// Step the state machine
+    StepStatus Step();
+
+    /// @returns the current/latest error code as reported by the MMU
+    ErrorCode Error() const { return errorCode; }
+
+    /// @returns the current/latest process code as reported by the MMU
+    ProgressCode Progress() const { return progressCode; }
+
+    /// @returns the current/latest button code as reported by the MMU
+    Buttons Button() const { return buttonCode; }
+
+    uint8_t CommandInProgress() const;
+
+    inline bool Running() const {
+        return state == State::Running;
+    }
+
+    inline bool FindaPressed() const {
+        return findaPressed;
+    }
+
+    inline uint16_t FailStatistics() const {
+        return failStatistics;
+    }
+
+    inline uint8_t MmuFwVersionMajor() const {
+        return mmuFwVersion[0];
+    }
+
+    inline uint8_t MmuFwVersionMinor() const {
+        return mmuFwVersion[1];
+    }
+
+    inline uint8_t MmuFwVersionRevision() const {
+        return mmuFwVersion[2];
+    }
+#ifndef UNITTEST
+private:
+#endif
+    StepStatus ExpectingMessage();
+    void SendMsg(RequestMsg rq);
+    void SendWriteMsg(RequestMsg rq);
+    void SwitchToIdle();
+    StepStatus SuppressShortDropOuts(const char *msg_P, StepStatus ss);
+    StepStatus HandleCommunicationTimeout();
+    StepStatus HandleProtocolError();
+    bool Elapsed(uint32_t timeout) const;
+    void RecordUARTActivity();
+    void RecordReceivedByte(uint8_t c);
+    void FormatLastReceivedBytes(char *dst);
+    void FormatLastResponseMsgAndClearLRB(char *dst);
+    void LogRequestMsg(const uint8_t *txbuff, uint8_t size);
+    void LogError(const char *reason_P);
+    void LogResponse();
+    StepStatus SwitchFromIdleToCommand();
+    void SwitchFromStartToIdle();
+
+    enum class State : uint_fast8_t {
+        Stopped,      ///< stopped for whatever reason
+        InitSequence, ///< initial sequence running
+        Running       ///< normal operation - Idle + Command processing
+    };
+
+    // individual sub-state machines - may be they can be combined into a union since only one is active at once
+    // or we can blend them into ProtocolLogic at the cost of a less nice code (but hopefully shorter)
+//    Stopped stopped;
+//    StartSeq startSeq;
+//    DelayedRestart delayedRestart;
+//    Idle idle;
+//    Command command;
+//    ProtocolLogicPartBase *currentState; ///< command currently being processed
+    
+    enum class Scope : uint_fast8_t {
+        Stopped,
+        StartSeq,
+        DelayedRestart,
+        Idle,
+        Command
+    };
+    Scope currentScope;
+
+    // basic scope members
+    /// @returns true if the state machine is waiting for a response from the MMU
+    bool ExpectsResponse() const { return ((uint8_t)scopeState & (uint8_t)ScopeState::NotExpectsResponse) == 0; }
+
+    /// Common internal states of the derived sub-automata
+    /// General rule of thumb: *Sent states are waiting for a response from the MMU
+    enum class ScopeState : uint_fast8_t {
+        S0Sent, // beware - due to optimization reasons these SxSent must be kept one after another
+        S1Sent,
+        S2Sent,
+        S3Sent,
+        QuerySent,
+        CommandSent,
+        FilamentSensorStateSent,
+        FINDAReqSent,
+        StatisticsSent,
+        ButtonSent,
+        ReadRegisterSent,
+        WriteRegisterSent,
+
+        // States which do not expect a message - MSb set
+        NotExpectsResponse = 0x80,
+        Wait = NotExpectsResponse + 1,
+        Ready = NotExpectsResponse + 2,
+        RecoveringProtocolError = NotExpectsResponse + 3,
+    };
+
+    ScopeState scopeState; ///< internal state of the sub-automaton
+
+    /// @returns the status of processing of the FINDA query response
+    /// @param finishedRV returned value in case the message was successfully received and processed
+    /// @param nextState is a state where the state machine should transfer to after the message was successfully received and processed
+    // StepStatus ProcessFINDAReqSent(StepStatus finishedRV, State nextState);
+
+    /// @returns the status of processing of the statistics query response
+    /// @param finishedRV returned value in case the message was successfully received and processed
+    /// @param nextState is a state where the state machine should transfer to after the message was successfully received and processed
+    // StepStatus ProcessStatisticsReqSent(StepStatus finishedRV, State nextState);
+
+    /// Called repeatedly while waiting for a query (Q0) period.
+    /// All event checks to report immediately from the printer to the MMU shall be done in this method.
+    /// So far, the only such a case is the filament sensor, but there can be more like this in the future.
+    void CheckAndReportAsyncEvents();
+    void SendQuery();
+    void SendFINDAQuery();
+    void SendAndUpdateFilamentSensor();
+    void SendButton(uint8_t btn);
+    void SendVersion(uint8_t stage);
+    void SendReadRegister(uint8_t index, ScopeState nextState);
+    void SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState);
+
+    StepStatus ProcessVersionResponse(uint8_t stage);
+
+    /// Top level split - calls the appropriate step based on current scope
+    StepStatus ScopeStep();
+
+    static constexpr uint8_t maxRetries = 6;
+    uint8_t retries;
+
+    void StartSeqRestart();
+    void DelayedRestartRestart();
+    void IdleRestart();
+    void CommandRestart();
+
+    StepStatus StartSeqStep();
+    StepStatus DelayedRestartWait();
+    StepStatus IdleStep();
+    StepStatus IdleWait();
+    StepStatus CommandStep();
+    StepStatus CommandWait();
+    StepStatus StoppedStep() { return Processing; }
+
+    StepStatus ProcessCommandQueryResponse();
+
+    inline void SetRequestMsg(RequestMsg msg) {
+        rq = msg;
+    }
+    inline const RequestMsg &ReqMsg() const { return rq; }
+    RequestMsg rq = RequestMsg(RequestMsgCodes::unknown, 0);
+
+    /// Records the next planned state, "unknown" msg code if no command is planned.
+    /// This is not intended to be a queue of commands to process, protocol_logic must not queue commands.
+    /// It exists solely to prevent breaking the Request-Response protocol handshake -
+    /// - during tests it turned out, that the commands from Marlin are coming in such an asynchronnous way, that
+    /// we could accidentally send T2 immediately after Q0 without waiting for reception of response to Q0.
+    ///
+    /// Beware, if Marlin manages to call PlanGenericCommand multiple times before a response comes,
+    /// these variables will get overwritten by the last call.
+    /// However, that should not happen under normal circumstances as Marlin should wait for the Command to finish,
+    /// which includes all responses (and error recovery if any).
+    RequestMsg plannedRq;
+
+    /// Plan a command to be processed once the immediate response to a sent request arrives
+    void PlanGenericRequest(RequestMsg rq);
+    /// Activate the planned state once the immediate response to a sent request arrived
+    bool ActivatePlannedRequest();
+
+    uint32_t lastUARTActivityMs; ///< timestamp - last ms when something occurred on the UART
+    DropOutFilter dataTO;        ///< Filter of short consecutive drop outs which are recovered instantly
+
+    ResponseMsg rsp; ///< decoded response message from the MMU protocol
+
+    State state; ///< internal state of ProtocolLogic
+
+    Protocol protocol; ///< protocol codec
+    
+    array<uint8_t, 16> lastReceivedBytes; ///< remembers the last few bytes of incoming communication for diagnostic purposes
+    uint8_t lrb;
+
+    MMU2Serial *uart; ///< UART interface
+
+    ErrorCode errorCode;       ///< last received error code from the MMU
+    ProgressCode progressCode; ///< last received progress code from the MMU
+    Buttons buttonCode;        ///< Last received button from the MMU.
+
+    uint8_t lastFSensor; ///< last state of filament sensor
+
+    bool findaPressed;
+    uint16_t failStatistics;
+
+    uint8_t mmuFwVersion[3];
+    uint16_t mmuFwVersionBuild;
+
+    friend class ProtocolLogicPartBase;
+    friend class Stopped;
+    friend class Command;
+    friend class Idle;
+    friend class StartSeq;
+    friend class DelayedRestart;
+
+    friend class MMU2;
+};
+
+} // namespace MMU2

+ 295 - 0
Firmware/mmu2_reporting.cpp

@@ -0,0 +1,295 @@
+#include "mmu2.h"
+#include "mmu2_reporting.h"
+#include "mmu2_error_converter.h"
+#include "mmu2/error_codes.h"
+#include "mmu2/buttons.h"
+#include "ultralcd.h"
+#include "Filament_sensor.h"
+#include "language.h"
+#include "temperature.h"
+#include "sound.h"
+
+namespace MMU2 {
+
+const char * const ProgressCodeToText(uint16_t pc); // we may join progress convertor and reporter together
+
+void BeginReport(CommandInProgress cip, uint16_t ec) {
+    custom_message_type = CustomMsg::MMUProgress;
+    lcd_setstatuspgm( _T(ProgressCodeToText(ec)) );
+}
+
+void EndReport(CommandInProgress cip, uint16_t ec) {
+    // clear the status msg line - let the printed filename get visible again
+    custom_message_type = CustomMsg::Status;
+}
+
+/**
+ * @brief Renders any characters that will be updated live on the MMU error screen.
+ *Currently, this is FINDA and Filament Sensor status and Extruder temperature.
+ */
+extern void ReportErrorHookDynamicRender(void){
+    // beware - this optimization abuses the fact, that FindaDetectsFilament returns 0 or 1 and '0' is followed by '1' in the ASCII table
+    lcd_putc_at(3, 2, mmu2.FindaDetectsFilament() + '0');
+    lcd_putc_at(8, 2, fsensor.getFilamentPresent() + '0');
+
+    // print active/changing filament slot
+    lcd_set_cursor(10, 2);
+    lcdui_print_extruder();
+
+    // Print active extruder temperature
+    lcd_set_cursor(16, 2);
+    lcd_printf_P(PSTR("%3d"), (int)(degHotend(0) + 0.5));
+}
+
+/**
+ * @brief Renders any characters that are static on the MMU error screen i.e. they don't change.
+ * @param[in] ei Error code index
+ */
+static void ReportErrorHookStaticRender(uint8_t ei) {
+    //! Show an error screen
+    //! When an MMU error occurs, the LCD content will look like this:
+    //! |01234567890123456789|
+    //! |MMU FW update needed|     <- title/header of the error: max 20 characters
+    //! |prusa3d.com/ERR04504|     <- URL 20 characters
+    //! |FI:1 FS:1  5>3 t201°|     <- status line, t is thermometer symbol
+    //! |>Retry >Done >MoreW |     <- buttons
+    bool two_choices = false;
+
+    // Read and determine what operations should be shown on the menu
+    const uint8_t button_operation   = PrusaErrorButtons(ei);
+    const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation);
+    const uint8_t button_op_middle  = BUTTON_OP_MIDDLE(button_operation);
+
+    // Check if the menu should have three or two choices
+    if (button_op_right == (uint8_t)ButtonOperations::NoOperation){
+        // Two operations not specified, the error menu should only show two choices
+        two_choices = true;
+    }
+
+    lcd_set_custom_characters_nextpage();
+    lcd_update_enable(false);
+    lcd_clear();
+
+    // Print title and header
+    lcd_printf_P(PSTR("%.20S\nprusa3d.com/ERR04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) );
+
+    ReportErrorHookSensorLineRender();
+    
+    // Render the choices
+    lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), _T(two_choices ? PrusaErrorButtonMore() : PrusaErrorButtonTitle(button_op_right)), two_choices ? 10 : 7, two_choices ? nullptr : _T(PrusaErrorButtonMore()));
+}
+
+extern void ReportErrorHookSensorLineRender()
+{
+    // Render static characters in third line
+    lcd_set_cursor(0, 2);
+    lcd_printf_P(PSTR("FI:  FS:    >  %c   %c"), LCD_STR_THERMOMETER[0], LCD_STR_DEGREE[0]);
+}
+
+
+/**
+ * @brief Monitors the LCD button selection without blocking MMU communication
+ * @param[in] ei Error code index
+ * @return 0 if there is no knob click --
+ * 1 if user clicked 'More' and firmware should render
+ * the error screen when ReportErrorHook is called next --
+ * 2 if the user selects an operation and we would like
+ * to exit the error screen. The MMU will raise the menu
+ * again if the error is not solved.
+ */
+static uint8_t ReportErrorHookMonitor(uint8_t ei) {
+    uint8_t ret = 0;
+    bool two_choices = false;
+    static int8_t enc_dif = lcd_encoder_diff;
+
+    if (lcd_encoder_diff == 0)
+    {
+         // lcd_update_enable(true) was called outside ReportErrorHookMonitor
+         // It will set lcd_encoder_diff to 0, sync enc_dif
+        enc_dif = 0;
+    }
+
+    // Read and determine what operations should be shown on the menu
+    const uint8_t button_operation   = PrusaErrorButtons(ei);
+    const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation);
+    const uint8_t button_op_middle  = BUTTON_OP_MIDDLE(button_operation);
+
+    // Check if the menu should have three or two choices
+    if (button_op_right == (uint8_t)ButtonOperations::NoOperation){
+        // Two operations not specified, the error menu should only show two choices
+        two_choices = true;
+    }
+
+    static int8_t current_selection = two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE;
+    static int8_t choice_selected = -1;
+
+    // Check if knob was rotated
+    if (abs(enc_dif - lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) {
+        if (two_choices == false) { // third_choice is not nullptr, safe to dereference
+            if (enc_dif > lcd_encoder_diff && current_selection != LCD_LEFT_BUTTON_CHOICE) {
+                // Rotating knob counter clockwise
+                current_selection--;
+            } else if (enc_dif < lcd_encoder_diff && current_selection != LCD_RIGHT_BUTTON_CHOICE) {
+                // Rotating knob clockwise
+                current_selection++;
+            }
+        } else {
+            if (enc_dif > lcd_encoder_diff && current_selection != LCD_LEFT_BUTTON_CHOICE) {
+                // Rotating knob counter clockwise
+                current_selection = LCD_LEFT_BUTTON_CHOICE;
+            } else if (enc_dif < lcd_encoder_diff && current_selection != LCD_MIDDLE_BUTTON_CHOICE) {
+                // Rotating knob clockwise
+                current_selection = LCD_MIDDLE_BUTTON_CHOICE;
+            }
+        }
+
+        // Update '>' render only
+        //! @brief Button menu
+        //!
+        //! @code{.unparsed}
+        //! |01234567890123456789|
+        //! |                    |
+        //! |                    |
+        //! |                    |
+        //! |>(left)             |
+        //! ----------------------
+        //! Three choices 
+        //! |>(left)>(mid)>(righ)|
+        //! ----------------------
+        //! Two choices
+        //! ----------------------
+        //! |>(left)   >(mid)    |
+        //! ----------------------
+        //! @endcode
+        //
+        lcd_set_cursor(0, 3);
+        lcd_print(current_selection == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
+        if (two_choices == false)
+        {
+            lcd_set_cursor(7, 3);
+            lcd_print(current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
+            lcd_set_cursor(13, 3);
+            lcd_print(current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
+        } else {
+            lcd_set_cursor(10, 3);
+            lcd_print(current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
+        }
+        // Consume rotation event and make feedback sound
+        enc_dif = lcd_encoder_diff;
+        Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
+    }
+
+    // Check if knob was clicked and consume the event
+    if (lcd_clicked()) {
+        Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
+        choice_selected = current_selection;
+    } else {
+        // continue monitoring
+        return ret;
+    }
+
+    if ((two_choices && choice_selected == LCD_MIDDLE_BUTTON_CHOICE)      // Two choices and middle button selected
+        || (!two_choices && choice_selected == LCD_RIGHT_BUTTON_CHOICE)) // Three choices and right most button selected
+    {
+        // 'More' show error description
+        lcd_show_fullscreen_message_and_wait_P(_T(PrusaErrorDesc(ei)));
+        ret = 1;
+    } else if(choice_selected == LCD_MIDDLE_BUTTON_CHOICE) {
+        SetButtonResponse((ButtonOperations)button_op_right);
+        ret = 2;
+    } else {
+        SetButtonResponse((ButtonOperations)button_op_middle);
+        ret = 2;
+    }
+
+    // Reset static variables to their default value
+    current_selection = two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE;
+    choice_selected = -1;
+    return ret;
+}
+
+enum class ReportErrorHookStates : uint8_t {
+    RENDER_ERROR_SCREEN  = 0,
+    MONITOR_SELECTION    = 1,
+    DISMISS_ERROR_SCREEN = 2,
+};
+
+enum ReportErrorHookStates ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
+
+void ReportErrorHook(uint16_t ec, uint8_t res) {
+    if (mmu2.MMUCurrentErrorCode() == ErrorCode::OK && res == MMU2::ErrorSourceMMU)
+    {
+        // If the error code suddenly changes to OK, that means
+        // a button was pushed on the MMU and the LCD should
+        // dismiss the error screen until MMU raises a new error
+        ReportErrorHookState = ReportErrorHookStates::DISMISS_ERROR_SCREEN;
+    } else {
+        // attempt an automatic Retry button
+        if( ReportErrorHookState == ReportErrorHookStates::MONITOR_SELECTION ){
+            if( mmu2.RetryIfPossible(ec) ){
+                ReportErrorHookState = ReportErrorHookStates::DISMISS_ERROR_SCREEN;
+            }
+        }
+    }
+
+    const uint8_t ei = PrusaErrorCodeIndex(ec);
+
+    switch ((uint8_t)ReportErrorHookState)
+    {
+    case (uint8_t)ReportErrorHookStates::RENDER_ERROR_SCREEN:
+        ReportErrorHookStaticRender(ei);
+        ReportErrorHookState = ReportErrorHookStates::MONITOR_SELECTION;
+        // Fall through
+    case (uint8_t)ReportErrorHookStates::MONITOR_SELECTION:
+        mmu2.is_mmu_error_monitor_active = true;
+        ReportErrorHookDynamicRender(); // Render dynamic characters
+        switch (ReportErrorHookMonitor(ei))
+        {
+            case 0:
+                // No choice selected, return to loop()
+                break;
+            case 1:
+                // More button selected, change state
+                ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
+                break;
+            case 2:
+                // Exit error screen and enable lcd updates
+                lcd_set_custom_characters();
+                lcd_update_enable(true);
+                lcd_return_to_status();
+                // Reset the state in case a new error is reported
+                mmu2.is_mmu_error_monitor_active = false;
+                ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
+                break;
+            default:
+                break;
+        }
+        return; // Always return to loop() to let MMU trigger a call to ReportErrorHook again
+        break;
+    case (uint8_t)ReportErrorHookStates::DISMISS_ERROR_SCREEN:
+        lcd_set_custom_characters();
+        lcd_update_enable(true);
+        lcd_return_to_status();
+        // Reset the state in case a new error is reported
+        mmu2.is_mmu_error_monitor_active = false;
+        ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
+        break;
+    default:
+        break;
+    }
+}
+
+void ReportProgressHook(CommandInProgress cip, uint16_t ec) {
+    if (cip != CommandInProgress::NoCommand)
+    {
+        custom_message_type = CustomMsg::MMUProgress;
+        lcd_setstatuspgm( _T(ProgressCodeToText(ec)) );
+    } else {
+        // If there is no command in progress we can display other
+        // useful information such as the name of the SD file 
+        // being printed
+        custom_message_type = CustomMsg::Status;
+    }
+}
+
+} // namespace MMU2

+ 50 - 0
Firmware/mmu2_reporting.h

@@ -0,0 +1,50 @@
+/// @file mmu2_reporting.h
+
+#pragma once
+#include <stdint.h>
+
+namespace MMU2 {
+
+enum CommandInProgress : uint8_t {
+    NoCommand = 0,
+    CutFilament = 'C',
+    EjectFilament = 'E',
+    Homing = 'H',
+    LoadFilament = 'L',
+    Reset = 'X',
+    ToolChange = 'T',
+    UnloadFilament = 'U',
+};
+
+/// Called at the begin of every MMU operation
+void BeginReport(CommandInProgress cip, uint16_t ec);
+
+/// Called at the end of every MMU operation
+void EndReport(CommandInProgress cip, uint16_t ec);
+
+/**
+ * @brief Called when the MMU or MK3S sends operation error (even repeatedly).
+ * Render MMU error screen on the LCD. This must be non-blocking
+ * and allow the MMU and printer to communicate with each other.
+ * @param[in] ec error code
+ * @param[in] res reporter error source, is either Printer (0) or MMU (1)
+ */
+void ReportErrorHook(uint16_t ec, uint8_t res);
+
+/// Called when the MMU sends operation progress update
+void ReportProgressHook(CommandInProgress cip, uint16_t ec);
+
+/// Remders the sensor status line. Also used by the "resume temperature" screen.
+void ReportErrorHookDynamicRender();
+
+/// Renders the static part of the sensor state line. Also used by "resuming temperature screen"
+void ReportErrorHookSensorLineRender();
+
+/// @returns true if the MMU is communicating and available
+/// can change at runtime
+bool MMUAvailable();
+
+/// Global Enable/Disable use MMU (to be stored in EEPROM)
+bool UseMMU();
+
+} // namespace

+ 31 - 0
Firmware/mmu2_serial.cpp

@@ -0,0 +1,31 @@
+#include "mmu2_serial.h"
+#include "uart2.h"
+
+namespace MMU2 {
+
+void MMU2Serial::begin(uint32_t baud){
+    uart2_init(baud); // @@TODO we may skip the baud rate setting in case of 8bit FW ... could save some bytes...
+}
+
+void MMU2Serial::close() {
+    // @@TODO - probably turn off the UART
+}
+
+int MMU2Serial::read() {
+    return fgetc(uart2io);
+}
+
+void MMU2Serial::flush() {
+    // @@TODO - clear the output buffer
+}
+
+size_t MMU2Serial::write(const uint8_t *buffer, size_t size) {
+    while(size--){
+        fputc(*buffer, uart2io);
+        ++buffer;
+    }
+}
+
+MMU2Serial mmu2Serial;
+
+} // namespace MMU2

+ 20 - 0
Firmware/mmu2_serial.h

@@ -0,0 +1,20 @@
+#pragma once
+#include <stdint.h>
+#include <stddef.h>
+
+namespace MMU2 {
+
+/// A minimal serial interface for the MMU
+class MMU2Serial {
+public:
+    MMU2Serial() = default;
+    void begin(uint32_t baud);
+    void close();
+    int read();
+    void flush();
+    size_t write(const uint8_t *buffer, size_t size);
+};
+
+extern MMU2Serial mmu2Serial;
+
+} // namespace MMU2

+ 81 - 73
Firmware/pat9125.cpp

@@ -4,7 +4,9 @@
 #include <avr/pgmspace.h>
 #include "config.h"
 #include <stdio.h>
+#include "Configuration_prusa.h"
 
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 //PAT9125 registers
 #define PAT9125_PID1			0x00
@@ -46,27 +48,26 @@ uint8_t pat9125_s = 0;
 
 
 // Init sequence, address & value.
-const PROGMEM uint8_t pat9125_init_seq1[] = {
+const PROGMEM uint8_t pat9125_init_bank0[] = {
 	// Disable write protect.
 	PAT9125_WP, 0x5a,
 	// Set the X resolution to zero to let the sensor know that it could safely ignore movement in the X axis.
-    PAT9125_RES_X, PAT9125_XRES,
-    // Set the Y resolution to a maximum (or nearly a maximum).
-    PAT9125_RES_Y, PAT9125_YRES,
-    // Set 12-bit X/Y data format.
-    PAT9125_ORIENTATION, 0x04,
-//	PAT9125_ORIENTATION, 0x04 | (xinv?0x08:0) | (yinv?0x10:0), //!? direction switching does not work
-    // Now continues the magic sequence from the PAT912EL Application Note: Firmware Guides for Tracking Optimization.
-    0x5e, 0x08,
-    0x20, 0x64,
-    0x2b, 0x6d,
-    0x32, 0x2f,
-    // stopper
-    0x0ff
+	PAT9125_RES_X, PAT9125_XRES,
+	// Set the Y resolution to a maximum (or nearly a maximum).
+	PAT9125_RES_Y, PAT9125_YRES,
+	// Set data format and sensor orientation.
+	PAT9125_ORIENTATION, ((PAT9125_12B_RES?0x04:0) | (PAT9125_INVERT_X?0x08:0) | (PAT9125_INVERT_Y?0x10:0) | (PAT9125_SWAP_XY?0x20:0)),
+	
+	// Now continues the magic sequence from the PAT912EL Application Note: Firmware Guides for Tracking Optimization.
+	0x5e, 0x08,
+	0x20, 0x64,
+	0x2b, 0x6d,
+	0x32, 0x2f,
+	0xff //end of sequence
 };
 
 // Init sequence, address & value.
-const PROGMEM uint8_t pat9125_init_seq2[] = {
+const PROGMEM uint8_t pat9125_init_bank1[] = {
 	// Magic sequence to enforce full frame rate of the sensor.
 	0x06, 0x028,
 	0x33, 0x0d0,
@@ -93,14 +94,14 @@ const PROGMEM uint8_t pat9125_init_seq2[] = {
 	0x6e, 0x022,
 	0x71, 0x007,
 	0x72, 0x008,
-	// stopper
-    0x0ff
+	0xff //end of sequence
 };
 
 
-uint8_t pat9125_rd_reg(uint8_t addr);
-void pat9125_wr_reg(uint8_t addr, uint8_t data);
-uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data);
+static uint8_t pat9125_rd_reg(uint8_t addr);
+static void pat9125_wr_reg(uint8_t addr, uint8_t data);
+static uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data);
+static uint8_t pat9125_wr_seq(const uint8_t* seq);
 
 extern FILE _uartout;
 #define uartout (&_uartout)
@@ -113,26 +114,23 @@ uint8_t pat9125_probe()
   #error not implemented
 #elif defined(PAT9125_SWI2C)
     swi2c_init();
-    return swi2c_readByte_A8(PAT9125_I2C_ADDR,0x00,NULL);
+    return swi2c_check(PAT9125_I2C_ADDR) == 0;
 #elif defined(PAT9125_I2C)
     twi_init();
-  #ifdef IR_SENSOR
-    // NOTE: this is called from the MK3S variant, so it should be kept minimal
-    uint8_t data;
-    return (twi_r8(PAT9125_I2C_ADDR,PAT9125_PID1,&data) == 0);
-  #else
-    return (pat9125_rd_reg(PAT9125_PID1) != 0);
-  #endif
+    return twi_check(PAT9125_I2C_ADDR) == 0;
 #endif
 }
 
 uint8_t pat9125_init(void)
 {
-    if (!pat9125_probe())
-        return 0;
+	if (!pat9125_probe())
+		return 0;
 
-    // Verify that the sensor responds with its correct product ID.
-    pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
+// Switch to bank0, not allowed to perform pat9125_wr_reg_verify on this register.
+	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0);
+
+	// Verify that the sensor responds with its correct product ID.
+	pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
 	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
 	if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
 	{
@@ -142,54 +140,49 @@ uint8_t pat9125_init(void)
 			return 0;
 	}
 
-#ifdef PAT9125_NEW_INIT
-	// Switch to bank0, not allowed to perform OTS_RegWriteRead.
-	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0);
+#if PAT9125_NEW_INIT
 	// Software reset (i.e. set bit7 to 1). It will reset to 0 automatically.
-	// After the reset, OTS_RegWriteRead is not allowed.
+	// pat9125_wr_reg_verify is not allowed because the register contents will change as soon as they are written. No point in verifying those.
 	pat9125_wr_reg(PAT9125_CONFIG, 0x97);
 	// Wait until the sensor reboots.
-	// Delay 1ms.
-	_delay_us(1000);
-	{
-		const uint8_t *ptr = pat9125_init_seq1;
-		for (;;) {
-			const uint8_t addr = pgm_read_byte_near(ptr ++);
-			if (addr == 0x0ff)
-				break;
-			if (! pat9125_wr_reg_verify(addr, pgm_read_byte_near(ptr ++)))
-				// Verification of the register write failed.
-				return 0;
-		}
-	}
-	// Delay 10ms.
-	_delay_ms(10);
-	// Switch to bank1, not allowed to perform OTS_RegWrite.
+	_delay_ms(1);
+	
+	//Write init sequence in bank0. MUST ALREADY BE IN bank0.
+	if (!pat9125_wr_seq(pat9125_init_bank0))
+		return 0;
+	
+	_delay_ms(10); // not sure why this is here. But I'll allow it.
+	
+	// Switch to bank1, not allowed to perform pat9125_wr_reg_verify on this register.
 	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x01);
-	{
-		const uint8_t *ptr = pat9125_init_seq2;
-		for (;;) {
-			const uint8_t addr = pgm_read_byte_near(ptr ++);
-			if (addr == 0x0ff)
-				break;
-			if (! pat9125_wr_reg_verify(addr, pgm_read_byte_near(ptr ++)))
-				// Verification of the register write failed.
-				return 0;
-		}
-	}
-	// Switch to bank0, not allowed to perform OTS_RegWriteRead.
+	//Write init sequence in bank1. MUST ALREADY BE IN bank1.
+	if (!pat9125_wr_seq(pat9125_init_bank1))
+		return 0;
+	
+	// Switch to bank0, not allowed to perform pat9125_wr_reg_verify on this register.
 	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x00);
+	
 	// Enable write protect.
-	pat9125_wr_reg(PAT9125_WP, 0x00);
+	pat9125_wr_reg(PAT9125_WP, 0x00); //prevents writing to registers over 0x09
 
 	pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
 	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
-#endif //PAT9125_NEW_INIT
 
+#else //PAT9125_NEW_INIT
+	// Disable write protect.
+	pat9125_wr_reg(PAT9125_WP, 0x5a); //allows writing to all registers
+	
 	pat9125_wr_reg(PAT9125_RES_X, PAT9125_XRES);
 	pat9125_wr_reg(PAT9125_RES_Y, PAT9125_YRES);
-	fprintf_P(uartout, PSTR("PAT9125_RES_X=%u\n"), pat9125_rd_reg(PAT9125_RES_X));
-	fprintf_P(uartout, PSTR("PAT9125_RES_Y=%u\n"), pat9125_rd_reg(PAT9125_RES_Y));
+	printf_P(PSTR("PAT9125_RES_X=%u\n"), pat9125_rd_reg(PAT9125_RES_X));
+	printf_P(PSTR("PAT9125_RES_Y=%u\n"), pat9125_rd_reg(PAT9125_RES_Y));
+	
+	pat9125_wr_reg(PAT9125_ORIENTATION, ((PAT9125_12B_RES?0x04:0) | (PAT9125_INVERT_X?0x08:0) | (PAT9125_INVERT_Y?0x10:0) | (PAT9125_SWAP_XY?0x20:0)));
+	
+	// Enable write protect.
+	pat9125_wr_reg(PAT9125_WP, 0x00); //prevents writing to registers over 0x09
+#endif //PAT9125_NEW_INIT
+
 	return 1;
 }
 
@@ -212,7 +205,7 @@ uint8_t pat9125_update(void)
 			if (iDX & 0x800) iDX -= 4096;
 			if (iDY & 0x800) iDY -= 4096;
 			pat9125_x += iDX;
-			pat9125_y -= iDY; //negative number, because direction switching does not work
+			pat9125_y += iDY;
 		}
 		return 1;
 	}
@@ -232,7 +225,7 @@ uint8_t pat9125_update_y(void)
 			if (pat9125_PID1 == 0xff) return 0;
 			int16_t iDY = ucYL | ((ucXYH << 8) & 0xf00);
 			if (iDY & 0x800) iDY -= 4096;
-			pat9125_y -= iDY; //negative number, because direction switching does not work
+			pat9125_y += iDY;
 		}
 		return 1;
 	}
@@ -251,7 +244,7 @@ uint8_t pat9125_update_bs(void)
 	return 0;
 }
 
-uint8_t pat9125_rd_reg(uint8_t addr)
+static uint8_t pat9125_rd_reg(uint8_t addr)
 {
 	uint8_t data = 0;
 #if defined(PAT9125_SWSPI)
@@ -274,7 +267,7 @@ uint8_t pat9125_rd_reg(uint8_t addr)
     return 0;
 }
 
-void pat9125_wr_reg(uint8_t addr, uint8_t data)
+static void pat9125_wr_reg(uint8_t addr, uint8_t data)
 {
 #if defined(PAT9125_SWSPI)
 	swspi_start();
@@ -296,8 +289,23 @@ void pat9125_wr_reg(uint8_t addr, uint8_t data)
     return;
 }
 
-uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data)
+static uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data)
 {
 	pat9125_wr_reg(addr, data);
 	return pat9125_rd_reg(addr) == data;
 }
+
+static uint8_t pat9125_wr_seq(const uint8_t* seq)
+{
+	for (;;) {
+		const uint8_t addr = pgm_read_byte(seq++);
+		if (addr == 0xff)
+			break;
+		if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++)))
+			// Verification of the register write failed.
+			return 0;
+	}
+	return 1;
+}
+
+#endif

+ 1 - 8
Firmware/pat9125.h

@@ -1,12 +1,7 @@
-//pat9125.h
-#ifndef PAT9125_H
-#define PAT9125_H
+#pragma once
 
 #include <inttypes.h>
 
-extern uint8_t pat9125_PID1;
-extern uint8_t pat9125_PID2;
-
 extern int16_t pat9125_x;
 extern int16_t pat9125_y;
 extern uint8_t pat9125_b;
@@ -17,5 +12,3 @@ extern uint8_t pat9125_init(void);
 extern uint8_t pat9125_update(void);    // update all sensor data
 extern uint8_t pat9125_update_y(void);  // update _y only
 extern uint8_t pat9125_update_bs(void); // update _b/_s only
-
-#endif //PAT9125_H

+ 0 - 2
Firmware/planner.cpp

@@ -911,8 +911,6 @@ block->steps_y.wide = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-p
     block->direction_bits |= (1<<E_AXIS); 
   }
 
-  block->active_extruder = extruder;
-
   //enable active axes
   #ifdef COREXY
   if((block->steps_x.wide != 0) || (block->steps_y.wide != 0))

+ 0 - 1
Firmware/planner.h

@@ -75,7 +75,6 @@ typedef struct {
   dda_usteps_t step_event_count;            // The number of step events required to complete this block
   uint32_t acceleration_rate;               // The acceleration rate used for acceleration calculation
   unsigned char direction_bits;             // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h)
-  unsigned char active_extruder;            // Selects the active extruder
   // accelerate_until and decelerate_after are set by calculate_trapezoid_for_block() and they need to be synchronized with the stepper interrupt controller.
   uint32_t accelerate_until;                // The index of the step event on which to stop acceleration
   uint32_t decelerate_after;                // The index of the step event on which to start decelerating

+ 26 - 12
Firmware/sound.h

@@ -1,18 +1,34 @@
+#pragma once
 #include <stdint.h>
-#ifndef SOUND_H
-#define SOUND_H
-
 
 #define e_SOUND_MODE_NULL 0xFF
-typedef enum : uint8_t
-     {e_SOUND_MODE_LOUD,e_SOUND_MODE_ONCE,e_SOUND_MODE_SILENT,e_SOUND_MODE_BLIND} eSOUND_MODE;
-#define e_SOUND_MODE_DEFAULT e_SOUND_MODE_LOUD
+typedef enum : uint8_t {
+    e_SOUND_MODE_LOUD,
+    e_SOUND_MODE_ONCE,
+    e_SOUND_MODE_SILENT,
+    e_SOUND_MODE_BLIND
+} eSOUND_MODE;
 
-typedef enum : uint8_t
-     {e_SOUND_TYPE_ButtonEcho,e_SOUND_TYPE_EncoderEcho,e_SOUND_TYPE_StandardPrompt,e_SOUND_TYPE_StandardConfirm,e_SOUND_TYPE_StandardWarning,e_SOUND_TYPE_StandardAlert,e_SOUND_TYPE_EncoderMove,e_SOUND_TYPE_BlindAlert} eSOUND_TYPE;
-typedef enum : uint8_t
-     {e_SOUND_CLASS_Echo,e_SOUND_CLASS_Prompt,e_SOUND_CLASS_Confirm,e_SOUND_CLASS_Warning,e_SOUND_CLASS_Alert} eSOUND_CLASS;
+#define e_SOUND_MODE_DEFAULT e_SOUND_MODE_LOUD
 
+typedef enum : uint8_t {
+    e_SOUND_TYPE_ButtonEcho,
+    e_SOUND_TYPE_EncoderEcho,
+    e_SOUND_TYPE_StandardPrompt,
+    e_SOUND_TYPE_StandardConfirm,
+    e_SOUND_TYPE_StandardWarning,
+    e_SOUND_TYPE_StandardAlert,
+    e_SOUND_TYPE_EncoderMove,
+    e_SOUND_TYPE_BlindAlert
+} eSOUND_TYPE;
+
+typedef enum : uint8_t { 
+    e_SOUND_CLASS_Echo, 
+    e_SOUND_CLASS_Prompt, 
+    e_SOUND_CLASS_Confirm, 
+    e_SOUND_CLASS_Warning, 
+    e_SOUND_CLASS_Alert 
+} eSOUND_CLASS;
 
 extern eSOUND_MODE eSoundMode;
 
@@ -25,5 +41,3 @@ extern void Sound_MakeCustom(uint16_t ms,uint16_t tone_ ,bool critical);
 
 //static void Sound_DoSound_Echo(void);
 //static void Sound_DoSound_Prompt(void);
-
-#endif // SOUND_H

+ 11 - 47
Firmware/stepper.cpp

@@ -36,12 +36,9 @@
 #include "tmc2130.h"
 #endif //TMC2130
 
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-#include "fsensor.h"
-int fsensor_counter; //counter for e-steps
-#endif //FILAMENT_SENSOR
+#include "Filament_sensor.h"
 
-#include "mmu.h"
+#include "mmu2.h"
 #include "ConfigurationStore.h"
 
 #include "Prusa_farm.h"
@@ -457,9 +454,6 @@ FORCE_INLINE void stepper_next_block()
 #endif /* LIN_ADVANCE */
       count_direction[E_AXIS] = 1;
     }
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-    fsensor_st_block_begin(count_direction[E_AXIS] < 0);
-#endif //FILAMENT_SENSOR
   }
   else {
       _NEXT_ISR(2000); // 1kHz.
@@ -704,9 +698,9 @@ FORCE_INLINE void stepper_tick_lowres()
 #ifdef LIN_ADVANCE
       e_steps += count_direction[E_AXIS];
 #else
-	#ifdef FILAMENT_SENSOR
-	  fsensor_counter += count_direction[E_AXIS];
-	#endif //FILAMENT_SENSOR
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+      fsensor.stStep(count_direction[E_AXIS] < 0);
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
       STEP_NC_LO(E_AXIS);
 #endif
     }
@@ -766,9 +760,9 @@ FORCE_INLINE void stepper_tick_highres()
 #ifdef LIN_ADVANCE
       e_steps += count_direction[E_AXIS];
 #else
-    #ifdef FILAMENT_SENSOR
-      fsensor_counter += count_direction[E_AXIS];
-    #endif //FILAMENT_SENSOR
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+      fsensor.stStep(count_direction[E_AXIS] < 0);
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
       STEP_NC_LO(E_AXIS);
 #endif
     }
@@ -963,21 +957,9 @@ FORCE_INLINE void isr() {
 
     // If current block is finished, reset pointer
     if (step_events_completed.wide >= current_block->step_event_count.wide) {
-#if !defined(LIN_ADVANCE) && defined(FILAMENT_SENSOR)
-		fsensor_st_block_chunk(fsensor_counter);
-		fsensor_counter = 0;
-#endif //FILAMENT_SENSOR
-
       current_block = NULL;
       plan_discard_current_block();
     }
-#if !defined(LIN_ADVANCE) && defined(FILAMENT_SENSOR)
-	else if ((abs(fsensor_counter) >= fsensor_chunk_len))
-  	{
-      fsensor_st_block_chunk(fsensor_counter);
-  	  fsensor_counter = 0;
-  	}
-#endif //FILAMENT_SENSOR
   }
 
 #ifdef TMC2130
@@ -1073,19 +1055,11 @@ FORCE_INLINE void advance_isr_scheduler() {
             STEP_NC_HI(E_AXIS);
             e_steps += (rev? 1: -1);
             STEP_NC_LO(E_AXIS);
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-            fsensor_counter += (rev? -1: 1);
-#endif
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+            fsensor.stStep(rev);
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
         }
         while(--max_ticks);
-
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-        if (abs(fsensor_counter) >= fsensor_chunk_len)
-        {
-            fsensor_st_block_chunk(fsensor_counter);
-            fsensor_counter = 0;
-        }
-#endif
     }
 
     // Schedule the next closest tick, ignoring advance if scheduled too
@@ -1668,13 +1642,3 @@ void microstep_readings()
       #endif
 }
 #endif //TMC2130
-
-
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-void st_reset_fsensor()
-{
-    CRITICAL_SECTION_START;
-    fsensor_counter = 0;
-    CRITICAL_SECTION_END;
-}
-#endif //FILAMENT_SENSOR

+ 0 - 5
Firmware/stepper.h

@@ -87,9 +87,4 @@ void microstep_readings();
   void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention
 #endif
 
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-// reset the internal filament sensor state
-void st_reset_fsensor();
-#endif
-
 #endif

+ 5 - 0
Firmware/strlen_cx.h

@@ -0,0 +1,5 @@
+#pragma once
+
+constexpr inline int strlen_constexpr(const char* str){
+    return *str ? 1 + strlen_constexpr(str + 1) : 0;
+}

+ 57 - 19
Firmware/swi2c.c

@@ -15,23 +15,49 @@
 #define SWI2C_ASHF   0x01 //address shift (<< 1)
 #define SWI2C_DMSK   0x7f //device address mask
 
+static void __delay(void);
+static void swi2c_start(void);
+static void swi2c_stop(void);
+// static void swi2c_ack(void);
+static void swi2c_nack(void);
+static uint8_t swi2c_wait_ack();
+static uint8_t swi2c_read(void);
+static void swi2c_write(uint8_t data);
 
-void __delay(void)
-{
-	_delay_us(1.5);
-}
 
 void swi2c_init(void)
 {
-	WRITE(SWI2C_SDA, 1);
-	WRITE(SWI2C_SCL, 1);
-	SET_OUTPUT(SWI2C_SDA);
-	SET_OUTPUT(SWI2C_SCL);
-	uint8_t i; for (i = 0; i < 100; i++)
+	SET_INPUT(SWI2C_SDA);
+	WRITE(SWI2C_SDA, 1); //SDA must be input with pullups while we are not sure if the slave is outputing or not
+
+	WRITE(SWI2C_SCL, 0);
+	SET_OUTPUT(SWI2C_SCL); //SCL can be an output at all times. The bus is not in a multi-master configuration.
+
+	for (uint8_t i = 0; i < 100; i++) //wait. Not sure what for, but wait anyway.
 		__delay();
+
+	for (uint8_t i = 0; i < 10; i++) { //send nack 10 times. This makes sure that the slave gets a nack regardless of it's state when we init the bus.
+		swi2c_nack();
+	}
+	swi2c_stop(); //"release" the bus by sending a stop condition.
+
+	SET_OUTPUT(SWI2C_SDA); //finally make the SDA line an output since the bus is idle for sure.
+}
+
+void swi2c_disable(void)
+{
+	SET_INPUT(SWI2C_SDA);
+	WRITE(SWI2C_SDA, 0);
+	SET_INPUT(SWI2C_SCL);
+	WRITE(SWI2C_SCL, 0);
 }
 
-void swi2c_start(void)
+static void __delay(void)
+{
+	_delay_us(1.5);
+}
+
+static void swi2c_start(void)
 {
 	WRITE(SWI2C_SDA, 0);
 	__delay();
@@ -39,7 +65,7 @@ void swi2c_start(void)
 	__delay();
 }
 
-void swi2c_stop(void)
+static void swi2c_stop(void)
 {
 	WRITE(SWI2C_SCL, 1);
 	__delay();
@@ -47,7 +73,8 @@ void swi2c_stop(void)
 	__delay();
 }
 
-void swi2c_ack(void)
+/*
+static void swi2c_ack(void)
 {
 	WRITE(SWI2C_SDA, 0);
 	__delay();
@@ -56,8 +83,19 @@ void swi2c_ack(void)
 	WRITE(SWI2C_SCL, 0);
 	__delay();
 }
+*/
 
-uint8_t swi2c_wait_ack()
+static void swi2c_nack(void)
+{
+	WRITE(SWI2C_SDA, 1);
+	__delay();
+	WRITE(SWI2C_SCL, 1);
+	__delay();
+	WRITE(SWI2C_SCL, 0);
+	__delay();
+}
+
+static uint8_t swi2c_wait_ack()
 {
 	SET_INPUT(SWI2C_SDA);
 	__delay();
@@ -77,13 +115,13 @@ uint8_t swi2c_wait_ack()
 	return ack;
 }
 
-uint8_t swi2c_read(void)
+static uint8_t swi2c_read(void)
 {
 	WRITE(SWI2C_SDA, 1);
 	__delay();
 	SET_INPUT(SWI2C_SDA);
 	uint8_t data = 0;
-	int8_t bit; for (bit = 7; bit >= 0; bit--)
+	for (uint8_t bit = 8; bit-- > 0;)
 	{
 		WRITE(SWI2C_SCL, 1);
 		__delay();
@@ -95,9 +133,9 @@ uint8_t swi2c_read(void)
 	return data;
 }
 
-void swi2c_write(uint8_t data)
+static void swi2c_write(uint8_t data)
 {
-	int8_t bit; for (bit = 7; bit >= 0; bit--)
+	for (uint8_t bit = 8; bit-- > 0;)
 	{
 		WRITE(SWI2C_SDA, data & _BV(bit));
 		__delay();
@@ -112,9 +150,9 @@ uint8_t swi2c_check(uint8_t dev_addr)
 {
 	swi2c_start();
 	swi2c_write((dev_addr & SWI2C_DMSK) << SWI2C_ASHF);
-	if (!swi2c_wait_ack()) { swi2c_stop(); return 0; }
+	if (!swi2c_wait_ack()) { swi2c_stop(); return 1; }
 	swi2c_stop();
-	return 1;
+	return 0;
 }
 
 #ifdef SWI2C_A8 //8bit address

+ 3 - 0
Firmware/swi2c.h

@@ -13,6 +13,9 @@ extern "C" {
 //initialize
 extern void swi2c_init(void);
 
+//deinit pins
+extern void swi2c_disable(void);
+
 //check device address acknowledge
 extern uint8_t swi2c_check(uint8_t dev_addr);
 

+ 1 - 1
Firmware/temp_model.h

@@ -5,7 +5,7 @@
 
 #include "planner.h"
 
-constexpr uint8_t TEMP_MODEL_CAL_S = 60;     // Maximum recording lenght during calibration (s)
+constexpr uint8_t TEMP_MODEL_CAL_S = 60;     // Maximum recording length during calibration (s)
 constexpr uint8_t TEMP_MODEL_CAL_R_STEP = 4; // Fan interpolation steps during calibration
 constexpr float TEMP_MODEL_fS = 0.065;       // simulation filter (1st-order IIR factor)
 constexpr float TEMP_MODEL_fE = 0.05;        // error filter (1st-order IIR factor)

+ 3 - 5
Firmware/temperature.cpp

@@ -97,6 +97,8 @@
 #include "temp_model.h"
 #endif
 
+#include "Filament_sensor.h"
+
 //===========================================================================
 //=============================public variables============================
 //===========================================================================
@@ -123,10 +125,6 @@ int current_voltage_raw_pwr = 0;
 int current_voltage_raw_bed = 0;
 #endif
 
-#ifdef IR_SENSOR_ANALOG
-uint16_t current_voltage_raw_IR = 0;
-#endif //IR_SENSOR_ANALOG
-
 int current_temperature_bed_raw = 0;
 float current_temperature_bed = 0.0;
   
@@ -1186,7 +1184,7 @@ FORCE_INLINE static void applyBabysteps() {
     int curTodo=babystepsTodo[axis]; //get rid of volatile for performance
 
     if(curTodo>0)
-    {
+{
       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
         babystep(axis,/*fwd*/true);
         babystepsTodo[axis]--; //less to do next time

+ 37 - 1
Firmware/twi.cpp

@@ -21,6 +21,7 @@
 
 
 #include <math.h>
+#include <util/delay.h>
 #include "config.h"
 #include "fastio.h"
 #include "twi.h"
@@ -29,8 +30,24 @@
 
 void twi_init(void)
 {
-  // activate internal pullups for twi.
+  // activate internal pullups for SDA
+  SET_INPUT(SDA_PIN);
   WRITE(SDA_PIN, 1);
+  
+  // start with the SDA pulled low
+  WRITE(SCL_PIN, 0);
+  SET_OUTPUT(SCL_PIN);
+  
+  // clock 10 cycles to make sure that the sensor is not stuck in a register read.
+  for (uint8_t i = 0; i < 10; i++) {
+    WRITE(SCL_PIN, 1);
+    _delay_us((1000000 / TWI_FREQ) / 2);
+    WRITE(SCL_PIN, 0);
+    _delay_us((1000000 / TWI_FREQ) / 2);
+  }
+
+  // activate internal pullups for SCL
+  SET_INPUT(SCL_PIN);
   WRITE(SCL_PIN, 1);
 
   // initialize twi prescaler and bit rate
@@ -101,6 +118,25 @@ static uint8_t twi_start(uint8_t address, uint8_t reg)
 }
 
 
+uint8_t twi_check(uint8_t address)
+{
+    // send start condition
+    TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
+    if(twi_wait(TW_START))
+        return 1;
+    
+      // send address
+    TWDR = TW_WRITE | (address << 1);
+    TWCR = _BV(TWEN) | _BV(TWINT);
+    if(twi_wait(TW_MT_SLA_ACK))
+        return 2;
+    
+    // send stop
+    twi_stop();
+    return 0;
+}
+
+
 uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data)
 {
   if(twi_start(address, reg))

+ 9 - 1
Firmware/twi.h

@@ -26,7 +26,7 @@
 #define TWI_FREQ 400000L
 #endif
 
-#define TWI_TIMEOUT_MS 100
+#define TWI_TIMEOUT_MS 10
 
 /*
  * Function twi_init
@@ -44,6 +44,14 @@ void twi_init(void);
  */
 void twi_disable(void);
 
+/*
+ * Function twi_check
+ * Desc     checks if a device exists on the bus
+ * Input    address: 7bit i2c device address
+ * Output   0 on device found at address
+ */
+uint8_t twi_check(uint8_t address);
+
 /*
  * Function twi_r8
  * Desc     read a single byte from a device

+ 3 - 3
Firmware/uart2.c

@@ -12,7 +12,7 @@
 #define uart2_txcomplete (UCSR2A & (1 << TXC2))
 #define uart2_txready    (UCSR2A & (1 << UDRE2))
 
-uint8_t uart2_ibuf[14] = {0, 0};
+uint8_t uart2_ibuf[20] = {0, 0};
 
 FILE _uart2io = {0};
 
@@ -33,13 +33,13 @@ int uart2_getchar(_UNUSED FILE *stream)
 }
 
 //uart init (io + FILE stream)
-void uart2_init(void)
+void uart2_init(uint32_t baudRate)
 {
 	DDRH &=	~0x01;
 	PORTH |= 0x01;
 	rbuf_ini(uart2_ibuf, sizeof(uart2_ibuf) - 4);
 	UCSR2A |= (1 << U2X2); // baudrate multiplier
-	UBRR2L = UART_BAUD_SELECT(UART2_BAUD, F_CPU); // select baudrate
+	UBRR2L = UART_BAUD_SELECT(baudRate, F_CPU); // select baudrate
 	UCSR2B = (1 << RXEN2) | (1 << TXEN2); // enable receiver and transmitter
 	UCSR2B |= (1 << RXCIE2); // enable rx interrupt
 	fdev_setup_stream(uart2io, uart2_putchar, uart2_getchar, _FDEV_SETUP_WRITE | _FDEV_SETUP_READ); //setup uart2 i/o stream

+ 1 - 1
Firmware/uart2.h

@@ -15,7 +15,7 @@ extern FILE _uart2io;
 #define uart2io (&_uart2io)
 
 
-extern void uart2_init(void);
+extern void uart2_init(uint32_t baudRate);
 
 extern int8_t uart2_rx_str_P(const char* str);
 

+ 626 - 649
Firmware/ultralcd.cpp

@@ -6,7 +6,6 @@
 #include "temperature.h"
 #include "ultralcd.h"
 #include "conv2str.h"
-#include "fsensor.h"
 #include "Marlin.h"
 #include "language.h"
 #include "cardreader.h"
@@ -29,10 +28,7 @@
 //#include "Configuration.h"
 #include "cmdqueue.h"
 
-#ifdef FILAMENT_SENSOR
-#include "pat9125.h"
-#include "fsensor.h"
-#endif //FILAMENT_SENSOR
+#include "Filament_sensor.h"
 
 #ifdef TMC2130
 #include "tmc2130.h"
@@ -40,12 +36,12 @@
 
 #include "sound.h"
 
-#include "mmu.h"
+#include "mmu2.h"
+#include "SpoolJoin.h"
 
 #include "static_assert.h"
 #include "first_lay_cal.h"
 
-#include "fsensor.h"
 #include "adc.h"
 #include "config.h"
 
@@ -70,10 +66,6 @@ uint8_t SilentModeMenu_MMU = 1; //activate mmu unit stealth mode
 
 int8_t FSensorStateMenu = 1;
 
-#ifdef IR_SENSOR_ANALOG
-bool bMenuFSDetect=false;
-#endif //IR_SENSOR_ANALOG
-
 LcdCommands lcd_commands_type = LcdCommands::Idle;
 static uint8_t lcd_commands_step = 0;
 
@@ -85,10 +77,6 @@ bool isPrintPaused = false;
 static ShortTimer display_time; //just timer for showing pid finished message on lcd;
 static uint16_t pid_temp = DEFAULT_PID_TEMP;
 
-static bool forceMenuExpire = false;
-static bool lcd_autoDeplete;
-
-
 static float manual_feedrate[] = MANUAL_FEEDRATE;
 
 /* LCD message status */
@@ -104,7 +92,7 @@ static const char separator[] PROGMEM = "--------------------";
 
 /** forward declarations **/
 
-static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg, uint8_t &nlines);
+static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg);
 // void copy_and_scalePID_i();
 // void copy_and_scalePID_d();
 
@@ -134,6 +122,7 @@ static void lcd_v2_calibration();
 
 static void mmu_fil_eject_menu();
 static void mmu_load_to_nozzle_menu();
+static void mmu_load_to_extruder_menu();
 static void preheat_or_continue();
 
 #ifdef MMU_HAS_CUTTER
@@ -221,14 +210,18 @@ enum class FanCheck : uint_least8_t {
 static FanCheck lcd_selftest_fan_auto(uint8_t _fan);
 #endif //FANCHECK
 
-#ifdef PAT9125
+#ifdef FILAMENT_SENSOR
+#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 static bool lcd_selftest_fsensor();
-#endif //PAT9125
+#elif FILAMENT_SENSOR_TYPE == FSENSOR_IR
+static bool selftest_irsensor();
+#elif FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG
 static bool selftest_irsensor();
-#ifdef IR_SENSOR_ANALOG
 static bool lcd_selftest_IRsensor(bool bStandalone=false);
 static void lcd_detect_IRsensor();
-#endif //IR_SENSOR_ANALOG
+#endif
+#endif //FILAMENT_SENSOR
+
 static void lcd_selftest_error(TestError error, const char *_error_1, const char *_error_2);
 static void lcd_colorprint_change();
 
@@ -452,19 +445,34 @@ void lcdui_print_percent_done(void)
 }
 
 // Print extruder status (5 chars total)
-void lcdui_print_extruder(void)
-{
-	int chars = 0;
-	if (mmu_extruder == tmp_extruder) {
-		if (mmu_extruder == MMU_FILAMENT_UNKNOWN) chars = lcd_printf_P(_N(" F?"));
-		else chars = lcd_printf_P(_N(" F%u"), mmu_extruder + 1);
-	}
-	else
-	{
-		if (mmu_extruder == MMU_FILAMENT_UNKNOWN) chars = lcd_printf_P(_N(" ?>%u"), tmp_extruder + 1);
-		else chars = lcd_printf_P(_N(" %u>%u"), mmu_extruder + 1, tmp_extruder + 1);
-	}
-	lcd_space(5 - chars);
+// Scenario 1: "F?"
+//              There is no filament loaded and no tool change is in progress
+// Scenario 2: "F[nr.]"
+//              [nr.] ranges from 1 to 5.
+//              Shows which filament is loaded. No tool change is in progress
+// Scenario 3: "?>[nr.]"
+//              [nr.] ranges from 1 to 5.
+//              There is no filament currently loaded, but [nr.] is currently being loaded via tool change
+// Scenario 4: "[nr1.] > [nr2.]"
+//              [nr1.] ranges from 1 to 5.
+//              [nr2.] ranges from 1 to 5.
+//              Filament [nr1.] was loaded, but [nr2.] is currently being loaded via tool change
+uint8_t lcdui_print_extruder(void) {
+    uint8_t chars = 0;
+    if (MMU2::mmu2.get_current_tool() == MMU2::mmu2.get_tool_change_tool()) {
+        if (MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN) {
+            chars = lcd_printf_P(_N(" F?"));
+        } else {
+            chars = lcd_printf_P(_N(" F%u"), MMU2::mmu2.get_current_tool() + 1);
+        }
+    } else {
+        if (MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN) {
+            chars = lcd_printf_P(_N(" ?>%u"), MMU2::mmu2.get_tool_change_tool() + 1);
+        } else {
+            chars = lcd_printf_P(_N(" %u>%u"), MMU2::mmu2.get_current_tool() + 1, MMU2::mmu2.get_tool_change_tool() + 1);
+        }
+    }
+    return chars;
 }
 
 // Print farm number (5 chars total)
@@ -549,8 +557,7 @@ void lcdui_print_time(void)
 }
 
 //! @Brief Print status line on status screen
-void lcdui_print_status_line(void)
-{
+void lcdui_print_status_line(void) {
     if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating
         heating_status_counter++;
         if (heating_status_counter > 13) {
@@ -622,17 +629,16 @@ void lcdui_print_status_line(void)
                 lcd_space(LCD_WIDTH);
                 lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO));
                 lcd_puts_P(PSTR(" : "));
-                lcd_print(custom_message_state-10);
+                lcd_print(custom_message_state - 10);
             } else {
-                if (custom_message_state == 3)
-                {
+                if (custom_message_state == 3) {
                     lcd_setstatuspgm(MSG_WELCOME);
                     custom_message_type = CustomMsg::Status;
                 }
-                if (custom_message_state > 3 && custom_message_state <= 10 ) {
+                if (custom_message_state > 3 && custom_message_state <= 10) {
                     lcd_set_cursor(0, 3);
                     lcd_space(19);
-                    lcd_puts_at_P(0, 3, _i("Calibration done"));////MSG_HOMEYZ_DONE c=20
+                    lcd_puts_at_P(0, 3, _i("Calibration done")); ////MSG_HOMEYZ_DONE c=20
                     custom_message_state--;
                 }
             }
@@ -653,17 +659,21 @@ void lcdui_print_status_line(void)
             lcd_set_cursor(0, 3);
             lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state);
             break;
-        case CustomMsg::TempCompPreheat: // temp compensation preheat
-            lcd_puts_at_P(0, 3, _i("PINDA Heating"));////MSG_PINDA_PREHEAT c=20
+        case CustomMsg::TempCompPreheat:              // temp compensation preheat
+            lcd_puts_at_P(0, 3, _i("PINDA Heating")); ////MSG_PINDA_PREHEAT c=20
             if (custom_message_state <= PINDA_HEAT_T) {
                 lcd_puts_P(PSTR(": "));
-                lcd_print(custom_message_state); //seconds
+                lcd_print(custom_message_state); // seconds
                 lcd_print(' ');
             }
             break;
-        case CustomMsg::Resuming: //Resuming
+        case CustomMsg::Resuming: // Resuming
             lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
             break;
+        case CustomMsg::MMUProgress:
+            // set up at mmu2_reporting.cpp, just do nothing here
+            lcd_print(lcd_status_message);
+            break;
         }
     }
 }
@@ -716,14 +726,15 @@ void lcdui_print_status_screen(void)
 	//Print SD status (7 chars)
 	lcdui_print_percent_done();
 
-	if (mmu_enabled)
-		//Print extruder status (5 chars)
-		lcdui_print_extruder();
-	else if (farm_mode)
-		//Print farm number (5 chars)
-		lcdui_print_farm();
-	else
-		lcd_space(5); //5 spaces
+    if (MMU2::mmu2.Enabled()) {
+        // Print extruder status (5 chars)
+        lcd_space(5 - lcdui_print_extruder());
+    } else if (farm_mode) {
+        // Print farm number (5 chars)
+        lcdui_print_farm();
+    } else {
+        lcd_space(5); // 5 spaces
+    }
 
 #ifdef CMD_DIAGNOSTICS
     //Print cmd queue diagnostics (8chars)
@@ -942,9 +953,9 @@ void lcd_commands()
                 enquecommand_P(PSTR("M140 S0")); // turn off heatbed
                 enquecommand_P(PSTR("G1 Z10 F1300.000")); //lift Z
                 enquecommand_P(PSTR("G1 X10 Y180 F4000")); //Go to parking position
-                if (mmu_enabled) enquecommand_P(PSTR("M702 C")); //unload from nozzle
+                if (MMU2::mmu2.Enabled()) enquecommand_P(PSTR("M702")); //unload from nozzle
                 enquecommand_P(PSTR("M84"));// disable motors
-                forceMenuExpire = true; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
+                lcd_return_to_status(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
                 lcd_commands_step = 1;
                 break;
             case 1:
@@ -1117,7 +1128,6 @@ static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize
 //! |                    |
 //! ----------------------
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 void lcd_menu_extruder_info()                     // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
 {
 
@@ -1160,7 +1170,6 @@ static void lcd_menu_fails_stats_mmu()
 //! |                    |
 //! ----------------------
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats_mmu_print()
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1185,15 +1194,25 @@ static void lcd_menu_fails_stats_mmu_print()
 //! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats_mmu_total()
 {
-	mmu_command(MmuCmd::S3);
-	lcd_timeoutToStatus.stop(); //infinite timeout
+    static uint8_t first_time_opening_menu = 0;
+    if (!first_time_opening_menu) {
+        // Send S3 Query; MMU responds with "S3 A%u" where %u is the number of drive errors
+        MMU2::mmu2.get_statistics();
+        first_time_opening_menu = 1;
+    }
+    lcd_timeoutToStatus.stop(); //infinite timeout
     lcd_home();
-    lcd_printf_P(PSTR("%S\n" " %-16.16S%-3d\n" " %-16.16S%-3d\n" " %-16.16S%-3d"), 
+    lcd_printf_P(PSTR("%S\n" " %-16.16S%-3d\n"/* " %-16.16S%-3d\n" " %-16.16S%-3d"*/), 
         _T(MSG_TOTAL_FAILURES),
-        _T(MSG_MMU_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT) ),
-        _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) ),
-        _i("MMU power fails"), clamp999( mmu_power_failures )); ////MSG_MMU_POWER_FAILS c=15
-    menu_back_if_clicked_fb();
+        _T(MSG_MMU_FAILS), clamp999( MMU2::mmu2.TotalFailStatistics() ));//,
+        //_T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) ),
+        //_i("MMU power fails"), clamp999( mmu_power_failures )); ////MSG_MMU_POWER_FAILS c=15
+    if (lcd_clicked())
+    {
+        first_time_opening_menu = 0;
+        lcd_quick_feedback();
+        menu_back();
+    }
 }
 
 #if defined(TMC2130) && defined(FILAMENT_SENSOR)
@@ -1209,7 +1228,6 @@ static const char failStatsFmt[] PROGMEM = "%S\n" " %-16.16S%-3d\n" " %-16.16S%-
 //! | Crash   X:000 Y:000|	MSG_CRASH c=7
 //! ----------------------
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats_total()
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1234,18 +1252,7 @@ static void lcd_menu_fails_stats_total()
 //! | Crash   X 000 Y 000|	MSG_CRASH c=7
 //! ----------------------
 //! @endcode
-//! @brief Show Last Print Failures Statistics with PAT9125
-//!
-//! @code{.unparsed}
-//! |01234567890123456789|
-//! |Last print failures |	MSG_LAST_PRINT_FAILURES c=20
-//! | Power failures  000|	MSG_POWER_FAILURES c=15
-//! | Runouts H 000 S 000|	MSG_RUNOUTS c=7
-//! | Crash   X:000 Y:000|	MSG_CRASH c=7
-//! ----------------------
-//! @endcode
-
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
+//! @todo leptun refactor this piece of code please
 static void lcd_menu_fails_stats_print()
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1254,23 +1261,11 @@ static void lcd_menu_fails_stats_print()
     uint8_t crashX = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_X);
     uint8_t crashY = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y);
     lcd_home();
-#ifndef PAT9125
     lcd_printf_P(failStatsFmt,
         _T(MSG_LAST_PRINT_FAILURES),
         _T(MSG_POWER_FAILURES), power,
         _T(MSG_FIL_RUNOUTS), filam,
         _T(MSG_CRASH), crashX, crashY);
-#else
-    // On the MK3 include detailed PAT9125 statistics about soft failures
-    lcd_printf_P(PSTR("%S\n"
-                      " %-16.16S%-3d\n"
-                      " %-7.7S H %-3d S %-3d\n"
-                      " %-7.7S X %-3d Y %-3d"),
-                 _T(MSG_LAST_PRINT_FAILURES),
-                 _T(MSG_POWER_FAILURES), power,
-                 _i("Runouts"), filam, fsensor_softfail, ////MSG_RUNOUTS c=7
-                 _T(MSG_CRASH), crashX, crashY);
-#endif
     menu_back_if_clicked_fb();
 }
 
@@ -1315,7 +1310,6 @@ static const char failStatsFmt[] PROGMEM = "%S\n" " %-16.16S%-3d\n" "%S\n" " %-1
 //! | Fil. runouts    000|	MSG_FIL_RUNOUTS c=15
 //! ----------------------
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats()
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1394,7 +1388,6 @@ static void lcd_menu_temperatures_line(const char *ipgmLabel, int value){
 //! ----------------------
 //! D - Degree sysmbol		LCD_STR_DEGREE
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_temperatures()
 {
     lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1410,7 +1403,7 @@ static void lcd_menu_temperatures()
     menu_back_if_clicked();
 }
 
-#if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || defined(IR_SENSOR_ANALOG)
+#if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || (defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG))
 #define VOLT_DIV_R1 10000
 #define VOLT_DIV_R2 2370
 #define VOLT_DIV_FAC ((float)VOLT_DIV_R2 / (VOLT_DIV_R2 + VOLT_DIV_R1))
@@ -1425,7 +1418,6 @@ static void lcd_menu_temperatures()
 //! | IR :         00.0V |  c=12 optional
 //! ----------------------
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_voltages()
 {
     lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1434,7 +1426,7 @@ static void lcd_menu_voltages()
     lcd_home();
     lcd_printf_P(PSTR(" PWR:      %4.1fV\n" " BED:      %4.1fV"), volt_pwr, volt_bed);
 #ifdef IR_SENSOR_ANALOG
-    lcd_printf_P(PSTR("\n IR :       %3.1fV"), Raw2Voltage(current_voltage_raw_IR));
+    lcd_printf_P(PSTR("\n IR :       %3.1fV"), fsensor.Raw2Voltage(fsensor.getVoltRaw()));
 #endif //IR_SENSOR_ANALOG
     menu_back_if_clicked();
 }
@@ -1451,7 +1443,6 @@ static void lcd_menu_voltages()
 //! |                    |
 //! ----------------------
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_belt_status()
 {
 	lcd_home();
@@ -1668,22 +1659,23 @@ static void lcd_support_menu()
   MENU_ITEM_BACK_P(_i("Date:"));////MSG_DATE c=17
   MENU_ITEM_BACK_P(PSTR(__DATE__));
 
-#ifdef IR_SENSOR_ANALOG
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
   MENU_ITEM_BACK_P(STR_SEPARATOR);
   MENU_ITEM_BACK_P(PSTR("Fil. sensor v.:"));
-  MENU_ITEM_BACK_P(FsensorIRVersionText());
+  MENU_ITEM_BACK_P(fsensor.getIRVersionText());
 #endif // IR_SENSOR_ANALOG
 
 	MENU_ITEM_BACK_P(STR_SEPARATOR);
-	if (mmu_enabled)
+	if (MMU2::mmu2.Enabled())
 	{
 		MENU_ITEM_BACK_P(_i("MMU2 connected"));  ////MSG_MMU_CONNECTED c=18
 		MENU_ITEM_BACK_P(PSTR(" FW:"));  ////c=17
 		if (((menu_item - 1) == menu_line) && lcd_draw_update)
 		{
-		    lcd_set_cursor(6, menu_row);
-			if ((mmu_version > 0) && (mmu_buildnr > 0))
-				lcd_printf_P(PSTR("%d.%d.%d-%d"), mmu_version/100, mmu_version%100/10, mmu_version%10, mmu_buildnr);
+			lcd_set_cursor(6, menu_row);
+			MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion();
+			if (mmu_version.major > 0)
+				lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build);
 			else
 				lcd_puts_P(_i("unknown"));  ////MSG_UNKNOWN c=13
 		}
@@ -1784,7 +1776,7 @@ void lcd_cutter_enabled()
 #endif //MMU_HAS_CUTTER
 
 void lcd_set_filament_autoload() {
-     fsensor_autoload_set(!fsensor_autoload_enabled);
+     fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled());
 }
 
 #if defined(FILAMENT_SENSOR) && defined(PAT9125)
@@ -1813,6 +1805,7 @@ switch(eFilamentAction)
      case FilamentAction::Load:
      case FilamentAction::AutoLoad:
      case FilamentAction::MmuLoad:
+     case FilamentAction::MmuLoadExtruder:
           lcd_puts_P(_i("to load filament"));     ////MSG_TO_LOAD_FIL c=20
           break;
      case FilamentAction::UnLoad:
@@ -1826,8 +1819,12 @@ switch(eFilamentAction)
      case FilamentAction::Lay1Cal:
           break;
      }
-if(lcd_clicked())
-     {
+    if(lcd_clicked()
+#ifdef FILAMENT_SENSOR
+/// @todo leptun - add this as a specific retest item
+        || (((eFilamentAction == FilamentAction::Load) || (eFilamentAction == FilamentAction::AutoLoad)) && fsensor.getFilamentLoadEvent())
+#endif //FILAMENT_SENSOR
+    ) {
      nLevel=2;
      if(!bFilamentPreheatState)
           {
@@ -1848,6 +1845,7 @@ if(lcd_clicked())
                enquecommand_P(PSTR("M702"));      // unload filament
                break;
           case FilamentAction::MmuLoad:
+          case FilamentAction::MmuLoadExtruder:
           case FilamentAction::MmuUnLoad:
           case FilamentAction::MmuEject:
           case FilamentAction::MmuCut:
@@ -1919,11 +1917,17 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed)
             menu_back(nLevel);
             menu_submenu(mmu_load_to_nozzle_menu);
             break;
+        case FilamentAction::MmuLoadExtruder:
+            nLevel = bFilamentPreheatState ? 1 : 2;
+            bFilamentAction = true;
+            menu_back(nLevel);
+            menu_submenu(mmu_load_to_extruder_menu);
+            break;
         case FilamentAction::MmuUnLoad:
             nLevel = bFilamentPreheatState ? 1 : 2;
             bFilamentAction = true;
             menu_back(nLevel);
-            extr_unload();
+            MMU2::mmu2.unload();
             break;
         case FilamentAction::MmuEject:
             nLevel = bFilamentPreheatState ? 1 : 2;
@@ -1973,6 +1977,7 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed)
             case FilamentAction::Load:
             case FilamentAction::AutoLoad:
             case FilamentAction::MmuLoad:
+            case FilamentAction::MmuLoadExtruder:
                 lcd_puts_P(_i("Preheating to load")); ////MSG_PREHEATING_TO_LOAD c=20
                 if (once) raise_z_above(MIN_Z_FOR_LOAD);
                 break;
@@ -2150,8 +2155,11 @@ void lcd_wait_interact() {
   lcd_clear();
 
   lcd_puts_at_P(0, 1, _i("Insert filament"));////MSG_INSERT_FILAMENT c=20
-  if (!fsensor_autoload_enabled) {
-	  lcd_puts_at_P(0, 2, _i("and press the knob"));////MSG_PRESS c=20 r=2
+#ifdef FILAMENT_SENSOR
+  if (!fsensor.getAutoLoadEnabled())
+#endif //FILAMENT_SENSOR
+  {
+    lcd_puts_at_P(0, 2, _i("and press the knob"));////MSG_PRESS c=20 r=2
   }
 }
 
@@ -2203,74 +2211,61 @@ void lcd_loading_filament() {
 
 
 
-void lcd_alright() {
-  int enc_dif = 0;
-  int cursor_pos = 1;
-
-
-
-
-  lcd_clear();
-
-  lcd_puts_at_P(0, 0, _i("Changed correctly?"));////MSG_CORRECTLY c=20
-  lcd_puts_at_P(1, 1, _T(MSG_YES));
-  lcd_puts_at_P(1, 2, _i("Filament not loaded"));////MSG_NOT_LOADED c=19
-  lcd_puts_at_P(1, 3, _i("Color not correct"));////MSG_NOT_COLOR c=19
-  lcd_putc_at(0, 1, '>');
+uint8_t lcd_alright() {
+    int8_t enc_dif = 0;
+    uint8_t cursor_pos = 1;
 
+    lcd_clear();
+    lcd_puts_at_P(0, 0, _i("Changed correctly?"));////MSG_CORRECTLY c=20
+    lcd_puts_at_P(1, 1, _T(MSG_YES));
+    lcd_puts_at_P(1, 2, _i("Filament not loaded"));////MSG_NOT_LOADED c=19
+    lcd_puts_at_P(1, 3, _i("Color not correct"));////MSG_NOT_COLOR c=19
+    lcd_putc_at(0, 1, '>');
 
-  enc_dif = lcd_encoder_diff;
-  lcd_consume_click();
-  while (lcd_change_fil_state == 0) {
 
-    manage_heater();
-    manage_inactivity(true);
+    enc_dif = lcd_encoder_diff;
+    lcd_consume_click();
+    while (1)
+    {
+        manage_heater();
+        manage_inactivity(true);
 
-    if ( abs((enc_dif - lcd_encoder_diff)) > 4 ) {
+        if (abs(enc_dif - lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP)
+        {
 
-      if ( (abs(enc_dif - lcd_encoder_diff)) > 1 ) {
-        if (enc_dif > lcd_encoder_diff ) {
-          cursor_pos --;
-        }
+            if (enc_dif > lcd_encoder_diff ) {
+                // Rotating knob counter clockwise
+                cursor_pos--;
+            } else if (enc_dif < lcd_encoder_diff) {
+                // Rotating knob clockwise
+                cursor_pos++;
+            }
+            if (cursor_pos > 3) {
+                cursor_pos = 3;
+                Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
+            } else if (cursor_pos < 1) {
+                cursor_pos = 1;
+                Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
+            }
 
-        if (enc_dif < lcd_encoder_diff  ) {
-          cursor_pos ++;
-        }
+            // Update '>' render only
+            lcd_puts_at_P(0, 1, PSTR(" \n \n "));
+            lcd_putc_at(0, cursor_pos, '>');
 
-        if (cursor_pos > 3) {
-          cursor_pos = 3;
-					Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
+            // Consume rotation event and make feedback sound
+            enc_dif = lcd_encoder_diff;
+            Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
+            _delay(100);
         }
 
-        if (cursor_pos < 1) {
-          cursor_pos = 1;
-					Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
+        if (lcd_clicked())
+        {
+            Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
+            lcd_clear();
+            lcd_return_to_status();
+            return cursor_pos;
         }
-        lcd_puts_at_P(0, 1, PSTR(" \n \n "));
-        lcd_putc_at(0, cursor_pos, '>');
-        enc_dif = lcd_encoder_diff;
-				Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
-        _delay(100);
-      }
-
-    }
-
-
-    if (lcd_clicked()) {
-			Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
-      lcd_change_fil_state = cursor_pos;
-      _delay(500);
-
-    }
-
-
-
-  };
-
-
-  lcd_clear();
-  lcd_return_to_status();
-
+    };
 }
 
 void show_preheat_nozzle_warning()
@@ -2284,33 +2279,29 @@ void show_preheat_nozzle_warning()
 
 void lcd_load_filament_color_check()
 {
-	bool clean = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, true);
-	while (!clean) {
-		lcd_update_enable(true);
-		lcd_update(2);
+	uint8_t clean = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE);
+	while (clean == LCD_MIDDLE_BUTTON_CHOICE) {
 		load_filament_final_feed();
 		st_synchronize();
-		clean = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, true);
+		clean = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE);
 	}
 }
 
 #ifdef FILAMENT_SENSOR
 static void lcd_menu_AutoLoadFilament()
 {
-     uint8_t nlines;
-     lcd_display_message_fullscreen_nonBlocking_P(_i("Autoloading filament is active, just press the knob and insert filament..."),nlines);////MSG_AUTOLOADING_ENABLED c=20 r=4
-     menu_back_if_clicked();
+    lcd_display_message_fullscreen_nonBlocking_P(_i("Autoloading filament is active, just press the knob and insert filament..."));////MSG_AUTOLOADING_ENABLED c=20 r=4
+    menu_back_if_clicked();
 }
 #endif //FILAMENT_SENSOR
 
-static void preheat_or_continue()
-{
-    if (target_temperature[0] >= extrude_min_temp)
-    {
+static void preheat_or_continue() {
+    if (target_temperature[0] >= extrude_min_temp) {
         bFilamentPreheatState = true;
         mFilamentItem(target_temperature[0], target_temperature_bed);
+    } else {
+        lcd_generic_preheat_menu();
     }
-    else lcd_generic_preheat_menu();
 }
 
 static void lcd_LoadFilament()
@@ -2343,7 +2334,6 @@ static void lcd_LoadFilament()
 //! |        00d 00h 00m |
 //! ----------------------
 //! @endcode
-//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations. Translations missing for "d"days, "h"ours, "m"inutes", "s"seconds".
 void lcd_menu_statistics()
 {
     lcd_timeoutToStatus.stop(); //infinite timeout
@@ -2980,10 +2970,10 @@ bool lcd_calibrate_z_end_stop_manual(bool only_z)
             }
         }
         // Let the user confirm, that the Z carriage is at the top end stoppers.
-        int8_t result = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Are left and right Z~carriages all up?"), false);////MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-        if (result == -1)
+        uint8_t result = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Are left and right Z~carriages all up?"), false);////MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
+        if (result == LCD_BUTTON_TIMEOUT)
             goto canceled;
-        else if (result == 1)
+        else if (result == LCD_MIDDLE_BUTTON_CHOICE)
             goto calibrated;
         // otherwise perform another round of the Z up dialog.
     }
@@ -3023,10 +3013,9 @@ static inline bool pgm_is_interpunction(const char *c_addr)
  *
  * This function is non-blocking
  * @param msg message to be displayed from PROGMEM
- * @param nlines
  * @return rest of the text (to be displayed on next page)
  */
-static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg, uint8_t &nlines)
+static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg)
 {
     lcd_set_cursor(0, 0);
     const char *msgend = msg;
@@ -3075,22 +3064,15 @@ static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg,
         lcd_print(LCD_STR_ARROW_2_DOWN[0]);
     }
 
-    nlines = row;
     return multi_screen ? msgend : NULL;
 }
 
-const char* lcd_display_message_fullscreen_P(const char *msg, uint8_t &nlines)
+const char* lcd_display_message_fullscreen_P(const char *msg)
 {
     // Disable update of the screen by the usual lcd_update(0) routine.
     lcd_update_enable(false);
     lcd_clear();
-//	uint8_t nlines;
-    return lcd_display_message_fullscreen_nonBlocking_P(msg, nlines);
-}
-const char* lcd_display_message_fullscreen_P(const char *msg) 
-{
-  uint8_t nlines;
-  return lcd_display_message_fullscreen_P(msg, nlines);
+    return lcd_display_message_fullscreen_nonBlocking_P(msg);
 }
 
 
@@ -3171,119 +3153,152 @@ lcd_wait_for_click_delay(0);
 //! @brief Show multiple screen message with yes and no possible choices and wait with possible timeout
 //! @param msg Message to show. If NULL, do not clear the screen and handle choice selection only.
 //! @param allow_timeouting if true, allows time outing of the screen
-//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
-//! @retval 1 yes choice selected by user
-//! @retval 0 no choice selected by user
-//! @retval -1 screen timed out
-int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes) //currently just max. n*4 + 3 lines supported (set in language header files)
+//! @param default_selection if 0, 'Yes' choice is selected by default, otherwise 'No' choice is preselected
+//! @retval 0 yes choice selected by user
+//! @retval 1 no choice selected by user
+//! @retval 0xFF button timeout (only possible if allow_timeouting is true)
+uint8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, uint8_t default_selection) //currently just max. n*4 + 3 lines supported (set in language header files)
 {
-    return lcd_show_multiscreen_message_two_choices_and_wait_P(msg, allow_timeouting, default_yes, _T(MSG_YES), _T(MSG_NO), 10);
+    return lcd_show_multiscreen_message_with_choices_and_wait_P(msg, allow_timeouting, default_selection, _T(MSG_YES), _T(MSG_NO), nullptr, 10);
 }
 //! @brief Show a two-choice prompt on the last line of the LCD
-//! @param first_selected Show first choice as selected if true, the second otherwise
+//! @param selected Show first choice as selected if true, the second otherwise
 //! @param first_choice text caption of first possible choice
 //! @param second_choice text caption of second possible choice
-void lcd_show_two_choices_prompt_P(bool first_selected, const char *first_choice, const char *second_choice, uint8_t second_col)
+//! @param second_col column on LCD where second choice is rendered. If third choice is set, this value is hardcoded to 7
+//! @param third_choice text caption of third, optional, choice.
+void lcd_show_choices_prompt_P(uint8_t selected, const char *first_choice, const char *second_choice, uint8_t second_col, const char *third_choice)
 {
     lcd_set_cursor(0, 3);
-    lcd_print(first_selected? '>': ' ');
+    lcd_print(selected == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
     lcd_puts_P(first_choice);
-    lcd_set_cursor(second_col, 3);
-    lcd_print(!first_selected? '>': ' ');
-    lcd_puts_P(second_choice);
+    if (third_choice)
+    {
+        lcd_set_cursor(7, 3);
+        lcd_print(selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
+        lcd_puts_P(second_choice);
+        lcd_set_cursor(13, 3);
+        lcd_print(selected == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
+        lcd_puts_P(third_choice);
+    } else {
+        lcd_set_cursor(second_col, 3);
+        lcd_print(selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
+        lcd_puts_P(second_choice);
+    }
 }
+
 //! @brief Show single or multiple screen message with two possible choices and wait with possible timeout
 //! @param msg Message to show. If NULL, do not clear the screen and handle choice selection only.
-//! @param allow_timeouting if true, allows time outing of the screen
-//! @param default_first if true, fist choice is selected by default, otherwise second choice is preselected
-//! @param first_choice text caption of first possible choice
-//! @param second_choice text caption of second possible choice
+//! @param allow_timeouting bool, if true, allows time outing of the screen
+//! @param default_selection uint8_t, Control which choice is selected first. 0: left most, 1: middle, 2: right most choice. The left most choice is selected by default
+//! @param first_choice text caption of first possible choice. Must be in PROGMEM
+//! @param second_choice text caption of second possible choice. Must be in PROGMEM
+//! @param third_choice text caption of second possible choice. Must be in PROGMEM. When not set to nullptr first_choice and second_choice may not be more than 5 characters long.
+//! @param second_col column on LCD where second_choice starts
+//! @retval 0 first choice selected by user
 //! @retval 1 first choice selected by user
-//! @retval 0 second choice selected by user
-//! @retval -1 screen timed out
-int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool allow_timeouting, bool default_first,
-        const char *first_choice, const char *second_choice, uint8_t second_col)
-{
-	const char *msg_next = msg? lcd_display_message_fullscreen_P(msg) : NULL;
-	bool multi_screen = msg_next != NULL;
+//! @retval 2 third choice selected by user
+//! @retval 0xFF button timeout (only possible if allow_timeouting is true)
+uint8_t lcd_show_multiscreen_message_with_choices_and_wait_P(
+    const char *const msg, bool allow_timeouting, uint8_t default_selection,
+    const char *const first_choice, const char *const second_choice, const char *const third_choice,
+    uint8_t second_col
+) {
+    const char *msg_next = msg ? lcd_display_message_fullscreen_P(msg) : NULL;
+    bool multi_screen = msg_next != NULL;
+    lcd_set_custom_characters_nextpage();
 
     // Initial status/prompt on single-screen messages
-	bool yes = default_first ? true : false;
-	if (!msg_next) lcd_show_two_choices_prompt_P(yes, first_choice, second_choice, second_col);
+    uint8_t current_selection = default_selection;
+    if (!msg_next) {
+        lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
+    }
+    // Wait for user confirmation or a timeout.
+    unsigned long previous_millis_cmd = _millis();
+    int8_t enc_dif = lcd_encoder_diff;
+    lcd_consume_click();
+    KEEPALIVE_STATE(PAUSED_FOR_USER);
+    for (;;) {
+        for (uint8_t i = 0; i < 100; ++i) {
+            delay_keep_alive(50);
+            if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) {
+                return LCD_BUTTON_TIMEOUT;
+            }
+            manage_heater();
+            manage_inactivity(true);
 
-	// Wait for user confirmation or a timeout.
-	unsigned long previous_millis_cmd = _millis();
-	int8_t enc_dif = lcd_encoder_diff;
-	lcd_consume_click();
-	KEEPALIVE_STATE(PAUSED_FOR_USER);
-	for (;;) {
-		for (uint8_t i = 0; i < 100; ++i) {
-			delay_keep_alive(50);
-			if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS)
-				return -1;
-			manage_heater();
-			manage_inactivity(true);
-
-			if (abs(enc_dif - lcd_encoder_diff) > 4) {
-				if (msg_next == NULL) {
-                    if ((enc_dif < lcd_encoder_diff && yes) ||
-                        ((enc_dif > lcd_encoder_diff && !yes)))
-                    {
-                        yes = !yes;
-                        lcd_show_two_choices_prompt_P(yes, first_choice, second_choice, second_col);
-                        Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
+            if (abs(enc_dif - lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) {
+                if (msg_next == NULL) {
+                    if (third_choice) { // third_choice is not nullptr, safe to dereference
+                        if (enc_dif > lcd_encoder_diff && current_selection != LCD_LEFT_BUTTON_CHOICE) {
+                            // Rotating knob counter clockwise
+                            current_selection--;
+                        } else if (enc_dif < lcd_encoder_diff && current_selection != LCD_RIGHT_BUTTON_CHOICE) {
+                            // Rotating knob clockwise
+                            current_selection++;
+                        }
+                    } else {
+                        if (enc_dif > lcd_encoder_diff && current_selection != LCD_LEFT_BUTTON_CHOICE) {
+                            // Rotating knob counter clockwise
+                            current_selection = LCD_LEFT_BUTTON_CHOICE;
+                        } else if (enc_dif < lcd_encoder_diff && current_selection != LCD_MIDDLE_BUTTON_CHOICE) {
+                            // Rotating knob clockwise
+                            current_selection = LCD_MIDDLE_BUTTON_CHOICE;
+                        }
                     }
-					enc_dif = lcd_encoder_diff;
-				}
-				else {
-					Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
-					break; //turning knob skips waiting loop
-				}
-			}
-			if (lcd_clicked()) {
-				Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
-				if (msg_next == NULL) {
-					KEEPALIVE_STATE(IN_HANDLER);
-					lcd_set_custom_characters();
-					return yes;
-				}
-				else break;
-			}
-		}
-		if (multi_screen) {
-			if (msg_next == NULL) {
-				msg_next = msg;
-			}
-			msg_next = lcd_display_message_fullscreen_P(msg_next);
-		}
-		if (msg_next == NULL) {
-            lcd_show_two_choices_prompt_P(yes, first_choice, second_choice, second_col);
-		}
-	}
+                    lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
+                    enc_dif = lcd_encoder_diff;
+                    Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
+                } else {
+                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
+                    break; // turning knob skips waiting loop
+                }
+            }
+            if (lcd_clicked()) {
+                Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
+                if (msg_next == NULL) {
+                    KEEPALIVE_STATE(IN_HANDLER);
+                    lcd_set_custom_characters();
+                    lcd_update_enable(true);
+                    return current_selection;
+                } else
+                    break;
+            }
+        }
+        if (multi_screen) {
+            if (msg_next == NULL) {
+                msg_next = msg;
+            }
+            msg_next = lcd_display_message_fullscreen_P(msg_next);
+        }
+        if (msg_next == NULL) {
+            lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
+        }
+    }
 }
 
 //! @brief Display and wait for a Yes/No choice using the last line of the LCD
 //! @param allow_timeouting if true, allows time outing of the screen
-//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
-//! @retval 1 yes choice selected by user
-//! @retval 0 no choice selected by user
-//! @retval -1 screen timed out
-int8_t lcd_show_yes_no_and_wait(bool allow_timeouting, bool default_yes)
+//! @param default_selection if 0, 'Yes' choice is selected by default, otherwise 'No' choice is preselected
+//! @retval 0 yes choice selected by user
+//! @retval 1 no choice selected by user
+//! @retval 0xFF button timeout (only possible if allow_timeouting is true)
+uint8_t lcd_show_yes_no_and_wait(bool allow_timeouting, uint8_t default_selection)
 {
-    return lcd_show_multiscreen_message_yes_no_and_wait_P(NULL, allow_timeouting, default_yes);
+    return lcd_show_multiscreen_message_yes_no_and_wait_P(NULL, allow_timeouting, default_selection);
 }
 
 //! @brief Show single screen message with yes and no possible choices and wait with possible timeout
 //! @param msg Message to show. If NULL, do not clear the screen and handle choice selection only.
 //! @param allow_timeouting if true, allows time outing of the screen
-//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
-//! @retval 1 yes choice selected by user
-//! @retval 0 no choice selected by user
-//! @retval -1 screen timed out
+//! @param default_selection if 0, 'Yes' choice is selected by default, otherwise 'No' choice is preselected
+//! @retval 0 yes choice selected by user
+//! @retval 1 no choice selected by user
+//! @retval 0xFF button timeout (only possible if allow_timeouting is true)
 //! @relates lcd_show_yes_no_and_wait
-int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes)
+uint8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, uint8_t default_selection)
 {
-    return lcd_show_multiscreen_message_yes_no_and_wait_P(msg, allow_timeouting, default_yes);
+    return lcd_show_multiscreen_message_yes_no_and_wait_P(msg, allow_timeouting, default_selection);
 }
 
 void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask)
@@ -3431,51 +3446,45 @@ static void lcd_show_sensors_state()
 	uint8_t idler_state = STATE_NA;
 
 	pinda_state = READ(Z_MIN_PIN);
-	if (mmu_enabled && !mmu_last_finda_response.expired(1000))
+	if (MMU2::mmu2.Enabled())
 	{
-		finda_state = mmu_finda;
+		finda_state = MMU2::mmu2.FindaDetectsFilament();
 	}
 	lcd_puts_at_P(0, 0, MSG_PINDA);
 	lcd_set_cursor(LCD_WIDTH - 14, 0);
 	lcd_print_state(pinda_state);
 	
-	if (mmu_enabled == true)
+	if (MMU2::mmu2.Enabled())
 	{
 		lcd_puts_at_P(10, 0, _n("FINDA"));////MSG_FINDA c=5
 		lcd_set_cursor(LCD_WIDTH - 3, 0);
 		lcd_print_state(finda_state);
 	}
-	
-	if (ir_sensor_detected) {
-		idler_state = !READ(IR_SENSOR_PIN);
-		lcd_puts_at_P(0, 1, _T(MSG_FSENSOR));
-		lcd_set_cursor(LCD_WIDTH - 3, 1);
-		lcd_print_state(idler_state);
-	}
-	
+#ifdef FILAMENT_SENSOR
+	idler_state = fsensor.getFilamentPresent();
+	lcd_puts_at_P(0, 1, _T(MSG_FSENSOR));
+	lcd_set_cursor(LCD_WIDTH - 3, 1);
+	lcd_print_state(idler_state);
+#endif //FILAMENT_SENSOR
 
-#ifdef PAT9125
-	// Display X and Y difference from Filament sensor    
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+    // Display X and Y difference from Filament sensor
     // Display Light intensity from Filament sensor
     //  Frame_Avg register represents the average brightness of all pixels within a frame (324 pixels). This
     //  value ranges from 0(darkest) to 255(brightest).
     // Display LASER shutter time from Filament sensor
     //  Shutter register is an index of LASER shutter time. It is automatically controlled by the chip's internal
-    //  auto-exposure algorithm. When the chip is tracking on a good reflection surface, the Shutter is small.
-    //  When the chip is tracking on a poor reflection surface, the Shutter is large. Value ranges from 0 to 46.
-    if (mmu_enabled == false)
-    {
-        // pat9125_update is already called while printing: only update manually when idling
-        if (!moves_planned() && !IS_SD_PRINTING && !usb_timer.running() && (lcd_commands_type != LcdCommands::Layer1Cal))
-            pat9125_update();
-
-        lcd_set_cursor(0, 2);
-        lcd_printf_P(_N(" Int: %3d  Xd:%6d\n"
-                        "Shut: %3d  Yd:%6d"),
-                     pat9125_b, pat9125_x,
-                     pat9125_s, pat9125_y);
-    }
-#endif //PAT9125
+    //  auto-exposure algorithm. When the chip is tracking on a reflective surface, the Shutter is small.
+    //  When the chip is tracking on a surface that absorbs IR (or doesn't reflect it), the Shutter is large.
+    //  The maximum value of the shutter is 17. The value of 16 seems to be reported as 17 even though the
+    //  Brightness value changes correctly as if the shutter changed to 16 (probably some bug with the sensor).
+    //  The shutter algorithm tries to keep the B value in the 70-110 range.
+    lcd_set_cursor(0, 2);
+    lcd_printf_P(_N("B: %3d     Xd:%6d\n"
+                    "S: %3d     Yd:%6d"),
+                 pat9125_b, pat9125_x,
+                 pat9125_s, pat9125_y);
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 }
 
 void lcd_menu_show_sensors_state()                // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
@@ -3538,34 +3547,6 @@ static void lcd_crash_mode_info2()
 }
 #endif //TMC2130
 
-#ifdef FILAMENT_SENSOR
-static void lcd_filament_autoload_info()
-{
-uint8_t nlines;
-	lcd_update_enable(true);
-	static uint32_t tim = 0;
-	if ((tim + 1000) < _millis())
-	{
-          lcd_display_message_fullscreen_nonBlocking_P(_i("Autoloading filament available only when filament sensor is turned on..."), nlines); ////MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-		tim = _millis();
-	}
-    menu_back_if_clicked();
-}
-
-static void lcd_fsensor_fail()
-{
-uint8_t nlines;
-	lcd_update_enable(true);
-	static uint32_t tim = 0;
-	if ((tim + 1000) < _millis())
-	{
-          lcd_display_message_fullscreen_nonBlocking_P(_i("ERROR: Filament sensor is not responding, please check connection."), nlines);////MSG_FSENS_NOT_RESPONDING c=20 r=4
-		tim = _millis();
-	}
-    menu_back_if_clicked();
-}
-#endif //FILAMENT_SENSOR
-
 //-//
 static void lcd_sound_state_set(void)
 {
@@ -3635,24 +3616,6 @@ static void crash_mode_switch()
 	else menu_goto(lcd_settings_menu, 9, true, true);
 }
 #endif //TMC2130
- 
-
-#ifdef FILAMENT_SENSOR
-static void lcd_fsensor_state_set()
-{
-	FSensorStateMenu = !FSensorStateMenu; //set also from fsensor_enable() and fsensor_disable()
-	if (!FSensorStateMenu) {
-		fsensor_disable();
-		if (fsensor_autoload_enabled && !mmu_enabled)
-			menu_submenu(lcd_filament_autoload_info);
-	}
-	else {
-		fsensor_enable();
-		if (fsensor_not_responding && !mmu_enabled)
-			menu_submenu(lcd_fsensor_fail);
-	}
-}
-#endif //FILAMENT_SENSOR
 
 #if (LANG_MODE != 0)
 
@@ -3660,7 +3623,7 @@ void menu_setlang(unsigned char lang)
 {
 	if (!lang_select(lang))
 	{
-		if (lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Copy selected language?"), false, true))////MSG_COPY_SEL_LANG c=20 r=3
+		if (lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Copy selected language?"), false, LCD_LEFT_BUTTON_CHOICE) == LCD_LEFT_BUTTON_CHOICE)////MSG_COPY_SEL_LANG c=20 r=3
 			lang_boot_update_start(lang);
 		lcd_update_enable(true);
 		lcd_clear();
@@ -3828,7 +3791,7 @@ void lcd_first_layer_calibration_reset()
 
 void lcd_v2_calibration()
 {
-	if (mmu_enabled)
+	if (MMU2::mmu2.Enabled())
 	{
 	    const uint8_t filament = choose_menu_P(
             _T(MSG_SELECT_FILAMENT),
@@ -3843,16 +3806,17 @@ void lcd_v2_calibration()
 	        return;
 	    }
 	}
+#ifdef FILAMENT_SENSOR
 	else if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
 	{
 	    bool loaded = false;
-	    if (fsensor_enabled && ir_sensor_detected)
+	    if (fsensor.isReady())
 	    {
-	        loaded = !READ(IR_SENSOR_PIN);
+	        loaded = fsensor.getFilamentPresent();
 	    }
 	    else
 	    {
-	        loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, true);
+	        loaded = !lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, LCD_LEFT_BUTTON_CHOICE);
 	        lcd_update_enabled = true;
 
 	    }
@@ -3873,6 +3837,7 @@ void lcd_v2_calibration()
 			return;
 		}
 	}
+#endif //FILAMENT_SENSOR
 
 	eFilamentAction = FilamentAction::Lay1Cal;
 	menu_goto(lcd_generic_preheat_menu, 0, true, true);
@@ -3881,7 +3846,7 @@ void lcd_v2_calibration()
 void lcd_wizard() {
 	bool result = true;
 	if (calibration_status() != CALIBRATION_STATUS_ASSEMBLED) {
-		result = lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Running Wizard will delete current calibration results and start from the beginning. Continue?"), false, false);////MSG_WIZARD_RERUN c=20 r=7
+		result = !lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Running Wizard will delete current calibration results and start from the beginning. Continue?"), false);////MSG_WIZARD_RERUN c=20 r=7
 	}
 	if (result) {
 		calibration_status_store(CALIBRATION_STATUS_ASSEMBLED);
@@ -3933,34 +3898,27 @@ static void wait_preheat()
 	
 }
 
-static void lcd_wizard_load()
-{
-	if (mmu_enabled)
-	{
-		lcd_show_fullscreen_message_and_wait_P(_i("Please insert filament into the first tube of the MMU, then press the knob to load it."));////MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-		tmp_extruder = 0;
-	} 
-	else
-	{
-		lcd_show_fullscreen_message_and_wait_P(_i("Please insert filament into the extruder, then press the knob to load it."));////MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-	}	
-	lcd_update_enable(false);
-	lcd_clear();
-	lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT));
-	loading_flag = true;
-	gcode_M701();
-}
-
-bool lcd_autoDepleteEnabled()
-{
-    return (lcd_autoDeplete && fsensor_enabled);
+static void lcd_wizard_load() {
+    if (MMU2::mmu2.Enabled()) {
+        lcd_show_fullscreen_message_and_wait_P(
+            _i("Please insert filament into the first tube of the MMU, then press the knob to load it.")); ////MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
+    } else {
+        lcd_show_fullscreen_message_and_wait_P(
+            _i("Please insert filament into the extruder, then press the knob to load it.")); ////MSG_WIZARD_LOAD_FILAMENT c=20 r=6
+    }
+    lcd_update_enable(false);
+    lcd_clear();
+    lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT));
+    loading_flag = true;
+    gcode_M701(FILAMENTCHANGE_FIRSTFEED, 0);
+    //enquecommand_P(PSTR("M701"));
 }
 
 static void wizard_lay1cal_message(bool cold)
 {
     lcd_show_fullscreen_message_and_wait_P(
             _i("Now I will calibrate distance between tip of the nozzle and heatbed surface.")); ////MSG_WIZARD_V2_CAL c=20 r=8
-    if (mmu_enabled)
+    if (MMU2::mmu2.Enabled())
     {
         lcd_show_fullscreen_message_and_wait_P(
                 _i("Select a filament for the First Layer Calibration and select it in the on-screen menu."));////MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
@@ -4014,7 +3972,7 @@ void lcd_wizard(WizState state)
 {
     using S = WizState;
 	bool end = false;
-	int8_t wizard_event;
+	uint8_t wizard_event;
 	const char *msg = NULL;
 	// Make sure EEPROM_WIZARD_ACTIVE is true if entering using different entry point
 	// other than WizState::Run - it is useful for debugging wizard.
@@ -4042,11 +4000,11 @@ void lcd_wizard(WizState state)
 				lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING));
 				state = S::Restore;
 			} else {
-				wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_WELCOME), false, true);
-				if (wizard_event) {
+				wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_WELCOME), false, LCD_LEFT_BUTTON_CHOICE);
+				if (wizard_event == LCD_LEFT_BUTTON_CHOICE) {
 					state = S::Restore;
 					eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);
-				} else {
+				} else { // MIDDLE_BUTTON_CHOICE
 					eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0);
 					end = true;
 				}
@@ -4081,8 +4039,10 @@ void lcd_wizard(WizState state)
 			lcd_show_fullscreen_message_and_wait_P(_i("Please remove shipping helpers first."));////MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
 			lcd_show_fullscreen_message_and_wait_P(_i("Now remove the test print from steel sheet."));////MSG_REMOVE_TEST_PRINT c=20 r=4
 			lcd_show_fullscreen_message_and_wait_P(_i("I will run z calibration now."));////MSG_WIZARD_Z_CAL c=20 r=8
-			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false, false);
-			if (!wizard_event) lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET));
+			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false);
+			if (wizard_event == LCD_MIDDLE_BUTTON_CHOICE) {
+				lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET));
+			}
 			wizard_event = gcode_M45(true, 0);
 			if (wizard_event) {
 				//current filament needs to be unloaded and then new filament should be loaded
@@ -4091,7 +4051,7 @@ void lcd_wizard(WizState state)
 				lcd_display_message_fullscreen_P(_i("Now I will preheat nozzle for PLA.")); ////MSG_WIZARD_WILL_PREHEAT c=20 r=4
 				wait_preheat();
 				//unload current filament
-				unload_filament(true);
+				unload_filament(FILAMENTCHANGE_FINALRETRACT, true);
 				//load filament
 				lcd_wizard_load();
 				setTargetHotend(0, 0); //we are finished, cooldown nozzle
@@ -4103,17 +4063,11 @@ void lcd_wizard(WizState state)
 		    //start to preheat nozzle and bed to save some time later
 			setTargetHotend(PLA_PREHEAT_HOTEND_TEMP, 0);
 			setTargetBed(PLA_PREHEAT_HPB_TEMP);
-			if (mmu_enabled)
-			{
-			    wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), true);
-			} else
-			{
-			    wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), true);
-			}
-			if (wizard_event) state = S::Lay1CalCold;
-			else
-			{
-			    if(mmu_enabled) state = S::LoadFilCold;
+			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), true);
+			if (wizard_event == LCD_LEFT_BUTTON_CHOICE) {
+				state = S::Lay1CalCold;
+			} else { // MIDDLE_BUTTON_CHOICE
+			    if(MMU2::mmu2.Enabled()) state = S::LoadFilCold;
 			    else state = S::Preheat;
 			}
 			break;
@@ -4143,7 +4097,7 @@ void lcd_wizard(WizState state)
             break;
 		case S::RepeatLay1Cal:
 			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Do you want to repeat last step to readjust distance between nozzle and heatbed?"), false);////MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-			if (wizard_event)
+			if (wizard_event == LCD_LEFT_BUTTON_CHOICE)
 			{
 				lcd_show_fullscreen_message_and_wait_P(_i("Please clean heatbed and then press the knob."));////MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 				state = S::Lay1CalCold;
@@ -4217,86 +4171,103 @@ void lcd_settings_linearity_correction_menu(void)
 #endif // TMC2130
 
 #ifdef FILAMENT_SENSOR
-#define SETTINGS_FILAMENT_SENSOR \
-do\
-{\
-    if (FSensorStateMenu == 0)\
-    {\
-        if (fsensor_not_responding && (mmu_enabled == false))\
-        {\
-            /* Filament sensor not working*/\
-            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_NA), lcd_fsensor_state_set);\
-            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), NULL, lcd_fsensor_fail);\
-        }\
-        else\
-        {\
-            /* Filament sensor turned off, working, no problems*/\
-            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_OFF), lcd_fsensor_state_set);\
-            if (mmu_enabled == false)\
-            {\
-                MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), NULL, lcd_filament_autoload_info);\
-            }\
-        }\
-    }\
-    else\
-    {\
-        /* Filament sensor turned on, working, no problems*/\
-        MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_ON), lcd_fsensor_state_set);\
-        if (mmu_enabled == false)\
-        {\
-            if (fsensor_autoload_enabled)\
-                MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), _T(MSG_ON), lcd_set_filament_autoload);\
-            else\
-                MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), _T(MSG_OFF), lcd_set_filament_autoload);\
-            /*if (fsensor_oq_meassure_enabled)*/\
-                /*MENU_ITEM_FUNCTION_P(_i("F. OQ meass. [on]"), lcd_set_filament_oq_meass);*//*////MSG_FSENS_OQMEASS_ON c=17*/\
-            /*else*/\
-                /*MENU_ITEM_FUNCTION_P(_i("F. OQ meass.[off]"), lcd_set_filament_oq_meass);*//*////MSG_FSENS_OQMEASS_OFF c=17*/\
-        }\
-    }\
-}\
-while(0)
 
-#else //FILAMENT_SENSOR
-#define SETTINGS_FILAMENT_SENSOR do{}while(0)
-#endif //FILAMENT_SENSOR
+static void fsensor_reinit() {
+    fsensor.init();
+}
 
-static void auto_deplete_switch()
-{
-    lcd_autoDeplete = !lcd_autoDeplete;
-    eeprom_update_byte((unsigned char *)EEPROM_AUTO_DEPLETE, lcd_autoDeplete);
+static void lcd_fsensor_enabled_set(void) {
+    fsensor.setEnabled(!fsensor.isEnabled());
 }
 
-static void settingsAutoDeplete()
+static void lcd_fsensor_runout_set() {
+    fsensor.setRunoutEnabled(!fsensor.getRunoutEnabled(), true);
+}
+
+static void lcd_fsensor_autoload_set() {
+    fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled(), true);
+}
+
+#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
+static void lcd_fsensor_jam_detection_set() {
+    fsensor.setJamDetectionEnabled(!fsensor.getJamDetectionEnabled(), true);
+}
+#endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
+
+static void lcd_fsensor_actionNA_set(void)
 {
-    if (mmu_enabled)
-    {
-        if (!fsensor_enabled)
-        {
-            MENU_ITEM_TOGGLE_P(MSG_AUTO_DEPLETE, _T(MSG_NA), NULL);
+    Filament_sensor::SensorActionOnError act = fsensor.getActionOnError();
+    switch(act) {
+        case Filament_sensor::SensorActionOnError::_Continue:
+            act = Filament_sensor::SensorActionOnError::_Pause;
+            break;
+        case Filament_sensor::SensorActionOnError::_Pause:
+            act = Filament_sensor::SensorActionOnError::_Continue;
+            break;
+        default:
+            act = Filament_sensor::SensorActionOnError::_Continue;
+    }
+    fsensor.setActionOnError(act, true);
+}
+
+static void lcd_fsensor_settings_menu() {
+    MENU_BEGIN();
+    MENU_ITEM_BACK_P(_T(MSG_BACK));
+    
+    MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), fsensor.isEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_enabled_set);
+    
+    if (fsensor.isEnabled()) {
+        if (fsensor.isError()) {
+            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), _T(MSG_NA), fsensor_reinit);
+            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), _T(MSG_NA), fsensor_reinit);
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit);
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
         }
-        else if (lcd_autoDeplete)
-        {
-            MENU_ITEM_TOGGLE_P(MSG_AUTO_DEPLETE, _T(MSG_ON), auto_deplete_switch);
+        else {
+            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), fsensor.getRunoutEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_runout_set);
+            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set);
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
+            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), fsensor.getJamDetectionEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_jam_detection_set);
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
         }
-        else
-        {
-            MENU_ITEM_TOGGLE_P(MSG_AUTO_DEPLETE, _T(MSG_OFF), auto_deplete_switch);
+        
+        switch(fsensor.getActionOnError()) {
+            case Filament_sensor::SensorActionOnError::_Continue:
+                MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_CONTINUE_SHORT), lcd_fsensor_actionNA_set);
+                break;
+            case Filament_sensor::SensorActionOnError::_Pause:
+                MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set);
+                break;
+            default:
+                lcd_fsensor_actionNA_set();
         }
     }
+    
+    MENU_END();
+}
+
+#endif //FILAMENT_SENSOR
+
+static void settingsSpoolJoin()
+{
+    if (MMU2::mmu2.Enabled())
+    {
+        MENU_ITEM_TOGGLE_P(MSG_SPOOL_JOIN, SpoolJoin::spooljoin.isSpoolJoinEnabled() ? _T(MSG_ON) : _T(MSG_OFF), SpoolJoin::spooljoin.toggleSpoolJoin);
+    }
 }
 
-#define SETTINGS_AUTO_DEPLETE \
+#define SETTINGS_SPOOLJOIN \
 do\
 {\
-    settingsAutoDeplete();\
+    settingsSpoolJoin();\
 }\
 while(0)\
 
 #ifdef MMU_HAS_CUTTER
 static void settingsCutter()
 {
-    if (mmu_enabled)
+    if (MMU2::mmu2.Enabled())
     {
         if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
         {
@@ -4325,6 +4296,25 @@ while(0)
 #define SETTINGS_CUTTER
 #endif //MMU_HAS_CUTTER
 
+static void mmu_enable_switch()
+{
+    uint8_t current_state = eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED);
+    // EEPROM update is handled by the stop and start functions.
+    if (current_state)
+    {
+        MMU2::mmu2.Stop();
+    }
+    else
+    {
+        MMU2::mmu2.Start();
+    }
+}
+
+static void mmu_reset()
+{
+    MMU2::mmu2.Reset(MMU2::MMU2::ResetForm::Software);
+}
+
 #ifdef TMC2130
 #define SETTINGS_SILENT_MODE \
 do\
@@ -4376,7 +4366,7 @@ while (0)
 #define SETTINGS_MMU_MODE \
 do\
 {\
-	if (mmu_enabled)\
+	if (MMU2::mmu2.Enabled())\
 	{\
 		if (SilentModeMenu_MMU == 0) MENU_ITEM_TOGGLE_P(_T(MSG_MMU_MODE), _T(MSG_NORMAL), lcd_silent_mode_mmu_set);\
 		else MENU_ITEM_TOGGLE_P(_T(MSG_MMU_MODE), _T(MSG_STEALTH), lcd_silent_mode_mmu_set);\
@@ -4678,41 +4668,6 @@ SETTINGS_VERSION;
 MENU_END();
 }
 
-#ifdef IR_SENSOR_ANALOG
-static void lcd_fsensor_actionNA_set(void)
-{
-switch(oFsensorActionNA)
-     {
-     case ClFsensorActionNA::_Continue:
-          oFsensorActionNA=ClFsensorActionNA::_Pause;
-          break;
-     case ClFsensorActionNA::_Pause:
-          oFsensorActionNA=ClFsensorActionNA::_Continue;
-          break;
-     default:
-          oFsensorActionNA=ClFsensorActionNA::_Continue;
-     }
-eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA,(uint8_t)oFsensorActionNA);
-}
-
-#define FSENSOR_ACTION_NA \
-do\
-{\
-    switch(oFsensorActionNA)\
-         {\
-         case ClFsensorActionNA::_Continue:\
-              MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_CONTINUE_SHORT), lcd_fsensor_actionNA_set);\
-              break;\
-         case ClFsensorActionNA::_Pause:\
-              MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set);\
-              break;\
-         default:\
-              oFsensorActionNA=ClFsensorActionNA::_Continue;\
-         }\
-}\
-while (0)
-#endif //IR_SENSOR_ANALOG
-
 template <uint8_t number>
 static void select_sheet_menu()
 {
@@ -4764,11 +4719,10 @@ void lcd_hw_setup_menu(void)                      // can not be "static"
     SETTINGS_NOZZLE;
     MENU_ITEM_SUBMENU_P(_i("Checks"), lcd_checking_menu);  ////MSG_CHECKS c=18
 
-#ifdef IR_SENSOR_ANALOG
-    FSENSOR_ACTION_NA;
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
     //! Fsensor Detection isn't ready for mmu yet it is temporarily disabled.
     //! @todo Don't forget to remove this as soon Fsensor Detection works with mmu
-    if(!mmu_enabled) MENU_ITEM_FUNCTION_P(PSTR("Fsensor Detection"), lcd_detect_IRsensor);
+    if(!MMU2::mmu2.Enabled()) MENU_ITEM_FUNCTION_P(PSTR("Fsensor Detection"), lcd_detect_IRsensor);
 #endif //IR_SENSOR_ANALOG
 
     if (_md->experimental_menu_visibility)
@@ -4802,12 +4756,21 @@ static void lcd_settings_menu()
 	    MENU_ITEM_GCODE_P(_i("Disable steppers"), PSTR("M84"));////MSG_DISABLE_STEPPERS c=18
     }
 
-	SETTINGS_FILAMENT_SENSOR;
+#ifdef FILAMENT_SENSOR
+    MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu);
+#endif //FILAMENT_SENSOR
 
-	SETTINGS_AUTO_DEPLETE;
+	SETTINGS_SPOOLJOIN;
 
 	SETTINGS_CUTTER;
 
+    MENU_ITEM_TOGGLE_P(PSTR("MMU"), eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED) ? _T(MSG_ON) : _T(MSG_OFF), mmu_enable_switch);
+
+    if (eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED))
+    {
+        MENU_ITEM_FUNCTION_P(PSTR("Reset MMU"), mmu_reset);
+    }
+
 	MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check);
 
 	SETTINGS_SILENT_MODE;
@@ -4928,7 +4891,7 @@ static void lcd_calibration_menu()
 //!
 //! Create list of items with header. Header can not be selected.
 //! Each item has text description passed by function parameter and
-//! number. There are 5 numbered items, if mmu_enabled, 4 otherwise.
+//! number. There are 5 numbered items, if MMU2::mmu2.Enabled(), 4 otherwise.
 //! Items are numbered from 1 to 4 or 5. But index returned starts at 0.
 //! There can be last item with different text and no number.
 //!
@@ -4939,7 +4902,7 @@ static void lcd_calibration_menu()
 uint8_t choose_menu_P(const char *header, const char *item, const char *last_item)
 {
     //following code should handle 3 to 127 number of items well
-    const int8_t items_no = last_item?(mmu_enabled?6:5):(mmu_enabled?5:4);
+    const int8_t items_no = last_item?(MMU2::mmu2.Enabled()?6:5):(MMU2::mmu2.Enabled()?5:4);
     const uint8_t item_len = item?strlen_P(item):0;
 	int8_t first = 0;
 	int8_t enc_dif = lcd_encoder_diff;
@@ -5100,8 +5063,8 @@ char reset_menu() {
 
 static void lcd_disable_farm_mode()
 {
-	int8_t disable = lcd_show_fullscreen_message_yes_no_and_wait_P(PSTR("Disable farm mode?"), true, false); //allow timeouting, default no
-	if (disable)
+	uint8_t disable = lcd_show_fullscreen_message_yes_no_and_wait_P(PSTR("Disable farm mode?"), true); //allow timeouting, default no
+	if (disable == LCD_LEFT_BUTTON_CHOICE)
 	{
 		enquecommand_P(PSTR("G99"));
 		lcd_return_to_status();
@@ -5111,104 +5074,141 @@ static void lcd_disable_farm_mode()
 	
 }
 
+static inline void load_all_wrapper(){
+    for(uint8_t i = 0; i < 5; ++i){
+        MMU2::mmu2.load_filament(i);
+    }
+}
 
+static inline void load_filament_wrapper(uint8_t i){
+    MMU2::mmu2.load_filament(i);
+}
 
-static void mmu_load_filament_menu()
-{
+static void mmu_load_filament_menu() {
     MENU_BEGIN();
     MENU_ITEM_BACK_P(_T(MSG_MAIN));
-    MENU_ITEM_FUNCTION_P(_i("Load all"), load_all); ////MSG_LOAD_ALL c=18
+    MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper);
     for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
-        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', extr_adj, i); ////MSG_LOAD_FILAMENT c=16
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i); ////MSG_LOAD_FILAMENT c=16
     MENU_END();
 }
 
-static void mmu_load_to_nozzle_menu()
-{
-    if (bFilamentAction)
-    {
+static inline void lcd_mmu_load_to_nozzle_wrapper(uint8_t index){
+    MMU2::mmu2.load_filament_to_nozzle(index);
+
+    // Ask user if the extruded color is correct:
+    lcd_return_to_status();
+    lcd_load_filament_color_check();
+    lcd_setstatuspgm(MSG_WELCOME);
+    custom_message_type = CustomMsg::Status;
+}
+
+static void mmu_load_to_nozzle_menu() {
+    if (bFilamentAction) {
         MENU_BEGIN();
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
-            MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', lcd_mmu_load_to_nozzle, i); ////MSG_LOAD_FILAMENT c=16
+            MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', lcd_mmu_load_to_nozzle_wrapper, i); ////MSG_LOAD_FILAMENT c=16
         MENU_END();
-    }
-    else
-    {
+    } else {
         eFilamentAction = FilamentAction::MmuLoad;
         preheat_or_continue();
     }
 }
 
-static void mmu_eject_filament(uint8_t filament)
-{
+static void mmu_eject_filament(uint8_t filament) {
     menu_back();
-    mmu_eject_filament(filament, true);
+    MMU2::mmu2.eject_filament(filament, true);
 }
 
-static void mmu_fil_eject_menu()
-{
-    if (bFilamentAction)
-    {
+static void mmu_fil_eject_menu() {
+    if (bFilamentAction) {
         MENU_BEGIN();
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
             MENU_ITEM_FUNCTION_NR_P(_T(MSG_EJECT_FILAMENT), i + '1', mmu_eject_filament, i); ////MSG_EJECT_FILAMENT c=16
         MENU_END();
-    }
-    else
-    {
+    } else {
         eFilamentAction = FilamentAction::MmuEject;
         preheat_or_continue();
     }
 }
 
 #ifdef MMU_HAS_CUTTER
+static inline void mmu_cut_filament_wrapper(uint8_t index){
+    MMU2::mmu2.cut_filament(index);
+}
 
-static void mmu_cut_filament_menu()
-{
-    if(bFilamentAction)
-    {
+static void mmu_cut_filament_menu() {
+    if (bFilamentAction) {
         MENU_BEGIN();
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
-            MENU_ITEM_FUNCTION_NR_P(_T(MSG_CUT_FILAMENT), i + '1', mmu_cut_filament, i); ////MSG_CUT_FILAMENT c=16
+            MENU_ITEM_FUNCTION_NR_P(_T(MSG_CUT_FILAMENT), i + '1', mmu_cut_filament_wrapper, i); ////MSG_CUT_FILAMENT c=16
         MENU_END();
-    }
-    else
-    {
+    } else {
         eFilamentAction=FilamentAction::MmuCut;
-        if(target_temperature[0] >= extrude_min_temp)
-        {
-            bFilamentPreheatState=true;
-            mFilamentItem(target_temperature[0],target_temperature_bed);
-        }
-        else lcd_generic_preheat_menu();
+        preheat_or_continue();
     }
 }
 #endif //MMU_HAS_CUTTER
 
+static inline void load_to_extruder_all_wrapper(){
+    for(uint8_t i = 0; i < 5; ++i){
+        MMU2::mmu2.load_to_extruder(i);
+    }
+}
+
+static inline void load_to_extruder_wrapper(uint8_t i){
+    MMU2::mmu2.load_to_extruder(i);
+}
+
+static void mmu_load_to_extruder_menu() {
+    if (bFilamentAction) {
+        MENU_BEGIN();
+        MENU_ITEM_BACK_P(_T(MSG_MAIN));
+        MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_to_extruder_all_wrapper);
+        for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
+            MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_to_extruder_wrapper, i); ////MSG_LOAD_FILAMENT c=16
+        MENU_END();
+    } else {
+        eFilamentAction = FilamentAction::MmuLoadExtruder;
+        preheat_or_continue();
+    }
+}
 
 // unload filament for single material printer (used in M702 gcode)
 // @param automatic: If true, unload_filament is part of a unload+load sequence (M600)
-void unload_filament(bool automatic)
+void unload_filament(float unloadLength, bool automatic)
 {
 	custom_message_type = CustomMsg::FilamentLoading;
 	lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT));
 
-    raise_z_above(automatic? MIN_Z_FOR_SWAP: MIN_Z_FOR_UNLOAD);
+    FSensorBlockRunout fsBlockRunout;
 
-	//		extr_unload2();
+    if (automatic)
+    {
+        // M600
+        raise_z_above(MIN_Z_FOR_SWAP);
+    }
 
-	current_position[E_AXIS] -= 45;
-	plan_buffer_line_curposXYZE(5200 / 60);
-	st_synchronize();
-	current_position[E_AXIS] -= 15;
-	plan_buffer_line_curposXYZE(1000 / 60);
-	st_synchronize();
-	current_position[E_AXIS] -= 20;
-	plan_buffer_line_curposXYZE(1000 / 60);
-	st_synchronize();
+    // Retract filament
+    current_position[E_AXIS] += -FILAMENT_UNLOAD_PURGE_RETRACT;
+    plan_buffer_line_curposXYZE(PAUSE_PARK_RETRACT_FEEDRATE);
+    st_synchronize();
+
+    // Wait for filament to cool
+    delay_keep_alive(FILAMENT_UNLOAD_PURGE_DELAY);
+
+    // Quickly purge
+    current_position[E_AXIS] += (FILAMENT_UNLOAD_PURGE_RETRACT + FILAMENT_UNLOAD_PURGE_LENGTH);
+    plan_buffer_line_curposXYZE(FILAMENT_UNLOAD_PURGE_FEEDRATE);
+    st_synchronize();
+
+    // Configurable length
+    current_position[E_AXIS] += unloadLength;
+    plan_buffer_line_curposXYZE(FILAMENT_CHANGE_UNLOAD_FEEDRATE);
+    st_synchronize();
 
 	lcd_display_message_fullscreen_P(_T(MSG_PULL_OUT_FILAMENT));
 
@@ -5232,6 +5232,7 @@ void unload_filament(bool automatic)
 	lcd_setstatuspgm(MSG_WELCOME);
 	custom_message_type = CustomMsg::Status;
 
+	eFilamentAction = FilamentAction::None;
 }
 
 #include "xflash.h"
@@ -5535,14 +5536,14 @@ static void lcd_main_menu()
                 MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu);
             }
 #if SDCARDDETECT < 1
-        MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21"));  // SD-card changed by user////MSG_CNG_SDCARD c=18
+        MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21"));  // SD-card changed by user ////MSG_CNG_SDCARD c=18
 #endif //SDCARDDETECT
         }
     } else {
         bMain=true;                                   // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
-        MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu);////MSG_NO_CARD c=18
+        MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu); ////MSG_NO_CARD c=18
 #if SDCARDDETECT < 1
-        MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface////MSG_INIT_SDCARD c=18
+        MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface ////MSG_INIT_SDCARD c=18
 #endif //SDCARDDETECT
     }
 #endif //SDSUPPORT
@@ -5558,18 +5559,22 @@ static void lcd_main_menu()
     }
 
     if ( ! ( IS_SD_PRINTING || usb_timer.running() || (lcd_commands_type == LcdCommands::Layer1Cal) ) ) {
-        if (mmu_enabled) {
+        if (MMU2::mmu2.Enabled()) {
             MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), mmu_load_filament_menu);
+            MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_TO_EXTRUDER), mmu_load_to_extruder_menu);
             MENU_ITEM_SUBMENU_P(_i("Load to nozzle"), mmu_load_to_nozzle_menu);////MSG_LOAD_TO_NOZZLE c=18
             MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), mmu_unload_filament);
             MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FILAMENT), mmu_fil_eject_menu);
 #ifdef  MMU_HAS_CUTTER
-            MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), mmu_cut_filament_menu);
+            if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0) {
+                MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), mmu_cut_filament_menu);
+            }
 #endif //MMU_HAS_CUTTER
         } else {
 #ifdef FILAMENT_SENSOR
-            if ((fsensor_autoload_enabled == true) && (fsensor_enabled == true) && (mmu_enabled == false))
+            if (fsensor.getAutoLoadEnabled()) {
                 MENU_ITEM_SUBMENU_P(_i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=18
+            }
             else
 #endif //FILAMENT_SENSOR
             {
@@ -5588,7 +5593,7 @@ static void lcd_main_menu()
 #if defined(TMC2130) || defined(FILAMENT_SENSOR)
     MENU_ITEM_SUBMENU_P(_i("Fail stats"), lcd_menu_fails_stats);////MSG_FAIL_STATS c=18
 #endif
-    if (mmu_enabled) {
+    if (MMU2::mmu2.Enabled()) {
         MENU_ITEM_SUBMENU_P(_i("Fail stats MMU"), lcd_menu_fails_stats_mmu);////MSG_MMU_FAIL_STATS c=18
     }
     MENU_ITEM_SUBMENU_P(_i("Support"), lcd_support_menu);////MSG_SUPPORT c=18
@@ -5731,25 +5736,10 @@ static void lcd_tune_menu()
 #endif
 
 #ifdef FILAMENT_SENSOR
-	if (FSensorStateMenu == 0) {
-          if (fsensor_not_responding && (mmu_enabled == false)) {
-               /* Filament sensor not working*/
-               MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_NA), lcd_fsensor_state_set);
-          }
-          else {
-               /* Filament sensor turned off, working, no problems*/
-               MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_OFF), lcd_fsensor_state_set);
-          }
-	}
-	else {
-		MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_ON), lcd_fsensor_state_set);
-	}
-#ifdef IR_SENSOR_ANALOG
-     FSENSOR_ACTION_NA;
-#endif //IR_SENSOR_ANALOG
+    MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu);
 #endif //FILAMENT_SENSOR
 
-	SETTINGS_AUTO_DEPLETE;
+	SETTINGS_SPOOLJOIN;
 
 	SETTINGS_CUTTER;
 
@@ -5933,7 +5923,7 @@ void print_stop()
     save_statistics(total_filament_used, t);
 
     // lift Z
-    raise_z_above(current_position[Z_AXIS] + 10, true);
+    raise_z(10);
 
     // if axis are homed, move to parking position.
     if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
@@ -5952,7 +5942,18 @@ void print_stop()
         fanSpeed = 0;
     }
 
-    if (mmu_enabled) extr_unload(); //M702 C
+    if (MMU2::mmu2.Enabled())
+    {
+        if (isPrintPaused)
+        {
+            // Restore temperature saved in ram after pausing print
+            restore_extruder_temperature_from_ram();
+        }
+        MMU2::mmu2.unload(); //M702 C
+    }
+
+    lcd_cooldown(); //turns off heaters and fan; goes to status screen.
+
     finishAndDisableSteppers(); //M84
     axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
 }
@@ -6201,49 +6202,48 @@ void lcd_belttest()
 }
 #endif //TMC2130
 
-#ifdef IR_SENSOR_ANALOG
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 // called also from marlin_main.cpp
 void printf_IRSensorAnalogBoardChange(){
-    printf_P(PSTR("Filament sensor board change detected: revision%S\n"), FsensorIRVersionText());
+    printf_P(PSTR("Filament sensor board change detected: revision%S\n"), fsensor.getIRVersionText());
 }
 
 static bool lcd_selftest_IRsensor(bool bStandalone)
 {
-    bool bPCBrev04;
-    uint16_t volt_IR_int;
-
-    volt_IR_int = current_voltage_raw_IR;
-    bPCBrev04=(volt_IR_int < IRsensor_Hopen_TRESHOLD);
+    FSensorBlockRunout fsBlockRunout;
+    IR_sensor_analog::SensorRevision oldSensorRevision = fsensor.getSensorRevision();
+    IR_sensor_analog::SensorRevision newSensorRevision;
+    uint16_t volt_IR_int = fsensor.getVoltRaw();
+    
+    newSensorRevision = (volt_IR_int < fsensor.IRsensor_Hopen_TRESHOLD) ? IR_sensor_analog::SensorRevision::_Rev04 : IR_sensor_analog::SensorRevision::_Old;
     printf_P(PSTR("Measured filament sensor high level: %4.2fV\n"), Raw2Voltage(volt_IR_int) );
-    if(volt_IR_int < IRsensor_Hmin_TRESHOLD){
+    if(volt_IR_int < fsensor.IRsensor_Hmin_TRESHOLD){
         if(!bStandalone)
             lcd_selftest_error(TestError::FsensorLevel,"HIGH","");
-        return(false);
+        return false;
     }
     lcd_show_fullscreen_message_and_wait_P(_i("Insert the filament (do not load it) into the extruder and then press the knob."));////MSG_INSERT_FIL c=20 r=6
-    volt_IR_int = current_voltage_raw_IR;
+    volt_IR_int = fsensor.getVoltRaw();
     printf_P(PSTR("Measured filament sensor low level: %4.2fV\n"), Raw2Voltage(volt_IR_int));
-    if(volt_IR_int > (IRsensor_Lmax_TRESHOLD)){
+    if(volt_IR_int > (fsensor.IRsensor_Lmax_TRESHOLD)){
         if(!bStandalone)
             lcd_selftest_error(TestError::FsensorLevel,"LOW","");
-        return(false);
+        return false;
     }
-    if((bPCBrev04 ? 1 : 0) != (uint8_t)oFsensorPCB){        // safer then "(uint8_t)bPCBrev04"
-        oFsensorPCB=bPCBrev04 ? ClFsensorPCB::_Rev04 : ClFsensorPCB::_Old;
+    if(newSensorRevision != oldSensorRevision) {
+        fsensor.setSensorRevision(newSensorRevision, true);
         printf_IRSensorAnalogBoardChange();
-        eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_PCB,(uint8_t)oFsensorPCB);
     }
-    return(true);
+    return true;
 }
 
 static void lcd_detect_IRsensor(){
     bool bAction;
     bool loaded;
-    bMenuFSDetect = true;                               // inhibits some code inside "manage_inactivity()"
     /// Check if filament is loaded. If it is loaded stop detection.
     /// @todo Add autodetection with MMU2s
-    loaded = ! READ(IR_SENSOR_PIN);
-    if(loaded ){
+    loaded = fsensor.getFilamentPresent();
+    if(loaded){
         lcd_show_fullscreen_message_and_wait_P(_i("Please unload the filament first, then repeat this action."));////MSG_UNLOAD_FILAMENT_REPEAT c=20 r=4
         return;
     } else {
@@ -6252,13 +6252,10 @@ static void lcd_detect_IRsensor(){
     }
     if(bAction){
         lcd_show_fullscreen_message_and_wait_P(_i("Sensor verified, remove the filament now."));////MSG_FS_VERIFIED c=20 r=3
-        // the fsensor board has been successfully identified, any previous "not responding" may be cleared now
-        fsensor_not_responding = false;
+        fsensor.init();
     } else {
         lcd_show_fullscreen_message_and_wait_P(_i("Verification failed, remove the filament and try again."));////MSG_FIL_FAILED c=20 r=5
-        // here it is unclear what to to with the fsensor_not_responding flag
     }
-    bMenuFSDetect=false;                              // de-inhibits some code inside "manage_inactivity()"
 }
 #endif //IR_SENSOR_ANALOG
 
@@ -6272,19 +6269,19 @@ bool lcd_selftest()
 	uint8_t _progress = 0;
 	bool _result = true;
 	bool _swapped_fan = false;
-#ifdef IR_SENSOR_ANALOG
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 	//!   Check if IR sensor is in unknown state, if so run Fsensor Detection
 	//!   As the Fsensor Detection isn't yet ready for the mmu2s we set temporarily the IR sensor 0.3 or older for mmu2s
 	//! @todo Don't forget to remove this as soon Fsensor Detection works with mmu
-	if( oFsensorPCB == ClFsensorPCB::_Undef) {
-		if (!mmu_enabled) {
+	if(fsensor.getSensorRevision() == IR_sensor_analog::SensorRevision::_Undef) {
+		if (!MMU2::mmu2.Enabled()) {
 			lcd_detect_IRsensor();
 		}
 		else {
-			eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_PCB,0);
+			fsensor.setSensorRevision(IR_sensor_analog::SensorRevision::_Old, true);
 		}
 	}
-#endif //IR_SENSOR_ANALOG
+#endif
 	lcd_wait_for_cool_down();
 	lcd_clear();
 	lcd_puts_at_P(0, 0, _i("Self test start"));////MSG_SELFTEST_START c=20
@@ -6420,9 +6417,7 @@ bool lcd_selftest()
 		//current_position[X_AXIS] += 0;
 		current_position[Y_AXIS] += 4;
 #endif //TMC2130
-		current_position[Z_AXIS] = current_position[Z_AXIS] + 10;
-		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
-		st_synchronize();
+		raise_z(10);
         set_destination_to_current();
 		_progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 1500);
 #ifdef TMC2130
@@ -6432,17 +6427,13 @@ bool lcd_selftest()
 #endif //TMC2130
 
 		//raise Z to not damage the bed during and hotend testing
-		current_position[Z_AXIS] += 20;
-		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
-		st_synchronize();
+		raise_z(20);
 	}
 
 #ifdef TMC2130
 	if (_result)
 	{
-		current_position[Z_AXIS] = current_position[Z_AXIS] + 10;
-		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
-		st_synchronize();
+		raise_z(10);
 		_progress = lcd_selftest_screen(TestScreen::Home, 0, 2, true, 0);
 		bool bres = tmc2130_home_calibrate(X_AXIS);
 		_progress = lcd_selftest_screen(TestScreen::Home, 1, 2, true, 0);
@@ -6472,8 +6463,8 @@ bool lcd_selftest()
 #ifdef FILAMENT_SENSOR
     if (_result)
     {
-
-        if (mmu_enabled)
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
+        if (MMU2::mmu2.Enabled())
         {        
 			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
             _result = selftest_irsensor();
@@ -6482,19 +6473,20 @@ bool lcd_selftest()
 				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 			}
         } else
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
         {
-#ifdef PAT9125
+#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
                _result = lcd_selftest_fsensor();
 			if (_result)
 			{
 				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 			}
-#endif //PAT9125
+#endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 #if 0
 	// Intentionally disabled - that's why we moved the detection to runtime by just checking the two voltages.
 	// The idea is not to force the user to remove and insert the filament on an assembled printer.
-//def IR_SENSOR_ANALOG
+//defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filament sensor
 			_result = lcd_selftest_IRsensor();
 			if (_result)
@@ -6562,7 +6554,6 @@ static bool lcd_selfcheck_axis_sg(uint8_t axis) {
 
 
 	raise_z_above(MESH_HOME_Z_SEARCH);
-	st_synchronize();
 	tmc2130_home_enter(1 << axis);
 
 // first axis length measurement begin	
@@ -7052,18 +7043,19 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const
 }
 
 #ifdef FILAMENT_SENSOR
-#ifdef PAT9125
+#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 static bool lcd_selftest_fsensor(void)
 {
-	fsensor_init();
-	if (fsensor_not_responding)
+	fsensor.init();
+	if (fsensor.isError())
 	{
 		lcd_selftest_error(TestError::WiringFsensor, "", "");
 	}
-	return (!fsensor_not_responding);
+	return (!fsensor.isError());
 }
-#endif //PAT9125
+#endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 
+#if (FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 //! @brief Self-test of infrared barrier filament sensor mounted on MK3S with MMUv2 printer
 //!
 //! Test whether sensor is not triggering filament presence when extruder idler is moving without filament.
@@ -7073,7 +7065,7 @@ static bool lcd_selftest_fsensor(void)
 //!  * Pre-heat to PLA extrude temperature.
 //!  * Unload filament possibly present.
 //!  * Move extruder idler same way as during filament load
-//!    and sample IR_SENSOR_PIN.
+//!    and sample the filament sensor.
 //!  * Check that pin doesn't go low.
 //!
 //! @retval true passed
@@ -7095,22 +7087,19 @@ static bool selftest_irsensor()
     {
         TempBackup tempBackup;
         setTargetHotend(ABS_PREHEAT_HOTEND_TEMP,active_extruder);
-        mmu_wait_for_heater_blocking();
         progress = lcd_selftest_screen(TestScreen::Fsensor, 0, 1, true, 0);
-        mmu_filament_ramming();
     }
     progress = lcd_selftest_screen(TestScreen::Fsensor, progress, 1, true, 0);
-    mmu_command(MmuCmd::U0);
-    manage_response(false, false);
+    MMU2::mmu2.unload();
 
     for(uint_least8_t i = 0; i < 200; ++i)
     {
         if (0 == (i % 32)) progress = lcd_selftest_screen(TestScreen::Fsensor, progress, 1, true, 0);
 
-        mmu_load_step(false);
+//@@TODO        mmu_load_step(false);
         while (blocks_queued())
         {
-            if (READ(IR_SENSOR_PIN) == 0)
+            if (fsensor.getFilamentPresent())
             {
                 lcd_selftest_error(TestError::TriggeringFsensor, "", "");
                 return false;
@@ -7131,6 +7120,7 @@ static bool selftest_irsensor()
     }
     return true;
 }
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 #endif //FILAMENT_SENSOR
 
 static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
@@ -7458,8 +7448,8 @@ static void menu_action_sdfile(const char* filename)
   //filename is just a pointer to card.filename, which changes everytime you try to open a file by filename. So you can't use filename directly
   //to open a file. Instead, the cached filename in cmd is used as that one is static for the whole lifetime of this function.
   if (!check_file(cmd + 4)) {
-	  result = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("File incomplete. Continue anyway?"), false, false);////MSG_FILE_INCOMPLETE c=20 r=3
-	  lcd_update_enable(true);
+      result = !lcd_show_fullscreen_message_yes_no_and_wait_P(_i("File incomplete. Continue anyway?"), false);////MSG_FILE_INCOMPLETE c=20 r=3
+      lcd_update_enable(true);
   }
   if (result) {
 	  enquecommand(cmd);
@@ -7480,12 +7470,6 @@ void menu_action_sddirectory(const char* filename)
 
 void ultralcd_init()
 {
-    {
-        uint8_t autoDepleteRaw = eeprom_read_byte(reinterpret_cast<uint8_t*>(EEPROM_AUTO_DEPLETE));
-        if (0xff == autoDepleteRaw) lcd_autoDeplete = false;
-        else lcd_autoDeplete = autoDepleteRaw;
-
-    }
     backlight_init();
 	lcd_init();
 	lcd_refresh();
@@ -7661,13 +7645,6 @@ static inline bool other_menu_expired()
             && menu_menu != lcd_babystep_z
             && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS));
 }
-static inline bool forced_menu_expire()
-{
-    bool retval = (menu_menu != lcd_status_screen
-            && forceMenuExpire);
-    forceMenuExpire = false;
-    return retval;
-}
 
 void menu_lcd_lcdupdate_func(void)
 {
@@ -7735,7 +7712,7 @@ void menu_lcd_lcdupdate_func(void)
 
 		(*menu_menu)();
 
-		if (z_menu_expired() || other_menu_expired() || forced_menu_expire())
+		if (z_menu_expired() || other_menu_expired())
 		{
 		// Exiting a menu. Let's call the menu function the last time with menu_leaving flag set to true
 		// to give it a chance to save its state.

+ 22 - 13
Firmware/ultralcd.h

@@ -36,7 +36,7 @@ void lcd_reset_alert_level();
 
 void lcd_adjust_z();
 void lcd_pick_babystep();
-void lcd_alright();
+uint8_t lcd_alright();
 void show_preheat_nozzle_warning();
 void lcd_wait_interact();
 void lcd_loading_filament();
@@ -64,20 +64,27 @@ void lcd_crash_detect_enable();
 void lcd_crash_detect_disable();
 #endif
 
-extern const char* lcd_display_message_fullscreen_P(const char *msg, uint8_t &nlines);
+enum LCDButtonChoice : uint_fast8_t {
+    LCD_LEFT_BUTTON_CHOICE = 0,
+    LCD_MIDDLE_BUTTON_CHOICE = 1,
+    LCD_RIGHT_BUTTON_CHOICE = 2,
+    LCD_BUTTON_TIMEOUT      = 0xFF,
+};
+
 extern const char* lcd_display_message_fullscreen_P(const char *msg);
 
 extern void lcd_return_to_status();
 extern void lcd_wait_for_click();
 extern bool lcd_wait_for_click_delay(uint16_t nDelay);
+void lcd_show_choices_prompt_P(uint8_t selected, const char *first_choice, const char *second_choice, uint8_t second_col, const char *third_choice = nullptr);
 extern void lcd_show_fullscreen_message_and_wait_P(const char *msg);
-// 0: no, 1: yes, -1: timeouted
-extern int8_t lcd_show_yes_no_and_wait(bool allow_timeouting = true, bool default_yes = false);
-// 0: no, 1: yes, -1: timeouted
-extern int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, bool default_yes = false);
-extern int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes,
-        const char *first_choice, const char *second_choice, uint8_t second_col = 7);
-extern int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, bool default_yes = false);
+extern uint8_t lcd_show_yes_no_and_wait(bool allow_timeouting = true, uint8_t default_selection = LCD_MIDDLE_BUTTON_CHOICE);
+extern uint8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, uint8_t default_selection = LCD_MIDDLE_BUTTON_CHOICE);
+extern uint8_t lcd_show_multiscreen_message_with_choices_and_wait_P(
+    const char * const msg, bool allow_timeouting, uint8_t default_selection,
+    const char * const first_choice, const char * const second_choice, const char * const third_choice = nullptr,
+    uint8_t second_col = 7);
+extern uint8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, uint8_t default_selection = LCD_MIDDLE_BUTTON_CHOICE);
 // Ask the user to move the Z axis up to the end stoppers and let
 // the user confirm that it has been done.
 
@@ -123,6 +130,7 @@ enum class CustomMsg : uint_least8_t
     M0Wait,          //!< M0/M1 Wait command working even from SD
     M117,            //!< M117 Set the status line message on the LCD
     Resuming,        //!< Resuming message
+    MMUProgress,     ///< MMU progress message
 };
 
 extern CustomMsg custom_message_type;
@@ -142,8 +150,7 @@ extern bool FarmOrUserECool();
 #define SILENT_MODE_OFF SILENT_MODE_POWER
 #endif
 
-#ifdef IR_SENSOR_ANALOG
-extern bool bMenuFSDetect;
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 void printf_IRSensorAnalogBoardChange();
 #endif //IR_SENSOR_ANALOG
 
@@ -173,6 +180,7 @@ enum class FilamentAction : uint_least8_t
     MmuUnLoad,
     MmuEject,
     MmuCut,
+    MmuLoadExtruder,
     Preheat,
     Lay1Cal,
 };
@@ -183,7 +191,7 @@ extern bool bFilamentAction;
 void mFilamentItem(uint16_t nTemp,uint16_t nTempBed);
 void mFilamentItemForce();
 void lcd_generic_preheat_menu();
-void unload_filament(bool automatic = false);
+void unload_filament(float unloadLength, bool automatic = false);
 
 
 void lcd_wait_for_heater();
@@ -207,7 +215,6 @@ void lcd_language();
 #endif
 
 void lcd_wizard();
-bool lcd_autoDepleteEnabled();
 
 //! @brief Wizard state
 enum class WizState : uint8_t
@@ -234,6 +241,8 @@ void lcd_wizard(WizState state);
 extern void lcd_experimental_toggle();
 extern void lcd_experimental_menu();
 
+uint8_t lcdui_print_extruder(void);
+
 #ifdef PINDA_TEMP_COMP
 extern void lcd_pinda_temp_compensation_toggle();
 #endif //PINDA_TEMP_COMP

+ 180 - 201
Firmware/util.cpp

@@ -227,7 +227,6 @@ void update_current_firmware_version_to_eeprom()
 }
 
 
-//-//
 #define MSG_PRINT_CHECKING_FAILED_TIMEOUT 30
 
 ClNozzleDiameter oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
@@ -236,207 +235,192 @@ ClCheckModel oCheckModel=ClCheckModel::_None;
 ClCheckVersion oCheckVersion=ClCheckVersion::_None;
 ClCheckGcode oCheckGcode=ClCheckGcode::_None;
 
-void fCheckModeInit()
-{
-oCheckMode=(ClCheckMode)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODE);
-if(oCheckMode==ClCheckMode::_Undef)
-     {
-     oCheckMode=ClCheckMode::_Warn;
-     eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode);
-     }
-if(farm_mode)
-     {
-     oCheckMode=ClCheckMode::_Strict;
-     if(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)==EEPROM_EMPTY_VALUE16)
-          eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT);
-     }
-oNozzleDiameter=(ClNozzleDiameter)eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER);
-if((oNozzleDiameter==ClNozzleDiameter::_Diameter_Undef)&& !farm_mode)
-     {
-     oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
-     eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)oNozzleDiameter);
-     eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT);
-     }
-oCheckModel=(ClCheckModel)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODEL);
-if(oCheckModel==ClCheckModel::_Undef)
-     {
-     oCheckModel=ClCheckModel::_Warn;
-     eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODEL,(uint8_t)oCheckModel);
-     }
-oCheckVersion=(ClCheckVersion)eeprom_read_byte((uint8_t*)EEPROM_CHECK_VERSION);
-if(oCheckVersion==ClCheckVersion::_Undef)
-     {
-     oCheckVersion=ClCheckVersion::_Warn;
-     eeprom_update_byte((uint8_t*)EEPROM_CHECK_VERSION,(uint8_t)oCheckVersion);
-     }
-oCheckGcode=(ClCheckGcode)eeprom_read_byte((uint8_t*)EEPROM_CHECK_GCODE);
-if(oCheckGcode==ClCheckGcode::_Undef)
-     {
-     oCheckGcode=ClCheckGcode::_Warn;
-     eeprom_update_byte((uint8_t*)EEPROM_CHECK_GCODE,(uint8_t)oCheckGcode);
-     }
+void fCheckModeInit() {
+    oCheckMode = (ClCheckMode)eeprom_read_byte((uint8_t *)EEPROM_CHECK_MODE);
+    if (oCheckMode == ClCheckMode::_Undef) {
+        oCheckMode = ClCheckMode::_Warn;
+        eeprom_update_byte((uint8_t *)EEPROM_CHECK_MODE, (uint8_t)oCheckMode);
+    }
+    if (farm_mode) {
+        oCheckMode = ClCheckMode::_Strict;
+        if (eeprom_read_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM) == EEPROM_EMPTY_VALUE16)
+            eeprom_update_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM, EEPROM_NOZZLE_DIAMETER_uM_DEFAULT);
+    }
+    oNozzleDiameter = (ClNozzleDiameter)eeprom_read_byte((uint8_t *)EEPROM_NOZZLE_DIAMETER);
+    if ((oNozzleDiameter == ClNozzleDiameter::_Diameter_Undef) && !farm_mode) {
+        oNozzleDiameter = ClNozzleDiameter::_Diameter_400;
+        eeprom_update_byte((uint8_t *)EEPROM_NOZZLE_DIAMETER, (uint8_t)oNozzleDiameter);
+        eeprom_update_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM, EEPROM_NOZZLE_DIAMETER_uM_DEFAULT);
+    }
+    oCheckModel = (ClCheckModel)eeprom_read_byte((uint8_t *)EEPROM_CHECK_MODEL);
+    if (oCheckModel == ClCheckModel::_Undef) {
+        oCheckModel = ClCheckModel::_Warn;
+        eeprom_update_byte((uint8_t *)EEPROM_CHECK_MODEL, (uint8_t)oCheckModel);
+    }
+    oCheckVersion = (ClCheckVersion)eeprom_read_byte((uint8_t *)EEPROM_CHECK_VERSION);
+    if (oCheckVersion == ClCheckVersion::_Undef) {
+        oCheckVersion = ClCheckVersion::_Warn;
+        eeprom_update_byte((uint8_t *)EEPROM_CHECK_VERSION, (uint8_t)oCheckVersion);
+    }
+    oCheckGcode = (ClCheckGcode)eeprom_read_byte((uint8_t *)EEPROM_CHECK_GCODE);
+    if (oCheckGcode == ClCheckGcode::_Undef) {
+        oCheckGcode = ClCheckGcode::_Warn;
+        eeprom_update_byte((uint8_t *)EEPROM_CHECK_GCODE, (uint8_t)oCheckGcode);
+    }
 }
 
-void nozzle_diameter_check(uint16_t nDiameter)
-{
-uint16_t nDiameter_um;
-
-if(oCheckMode==ClCheckMode::_None)
-     return;
-nDiameter_um=eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM);
-if(nDiameter==nDiameter_um)
-     return;
-//SERIAL_ECHO_START;
-//SERIAL_ECHOLNPGM("Printer nozzle diameter differs from the G-code ...");
-//SERIAL_ECHOPGM("actual  : ");
-//SERIAL_ECHOLN((float)(nDiameter_um/1000.0));
-//SERIAL_ECHOPGM("expected: ");
-//SERIAL_ECHOLN((float)(nDiameter/1000.0));
-switch(oCheckMode)
-     {
-     case ClCheckMode::_Warn:
-//          lcd_show_fullscreen_message_and_wait_P(_i("Printer nozzle diameter differs from the G-code. Continue?"));
-lcd_display_message_fullscreen_P(_i("Printer nozzle diameter differs from the G-code. Continue?"));////MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
-//???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
-lcd_update_enable(true);           // display / status-line recovery
-          break;
-     case ClCheckMode::_Strict:
-          lcd_show_fullscreen_message_and_wait_P(_i("Printer nozzle diameter differs from the G-code. Please check the value in settings. Print cancelled."));////MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-          lcd_print_stop();
-          break;
-     case ClCheckMode::_None:
-     case ClCheckMode::_Undef:
-          break;
-     }
-if(!farm_mode)
-     {
-     bSettings=false;                             // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
-     menu_submenu(lcd_hw_setup_menu);
-     }
+void nozzle_diameter_check(uint16_t nDiameter) {
+    uint16_t nDiameter_um;
+
+    if (oCheckMode == ClCheckMode::_None)
+        return;
+    nDiameter_um = eeprom_read_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM);
+    if (nDiameter == nDiameter_um)
+        return;
+    // SERIAL_ECHO_START;
+    // SERIAL_ECHOLNPGM("Printer nozzle diameter differs from the G-code ...");
+    // SERIAL_ECHOPGM("actual  : ");
+    // SERIAL_ECHOLN((float)(nDiameter_um/1000.0));
+    // SERIAL_ECHOPGM("expected: ");
+    // SERIAL_ECHOLN((float)(nDiameter/1000.0));
+    switch (oCheckMode) {
+    case ClCheckMode::_Warn:
+        //          lcd_show_fullscreen_message_and_wait_P(_i("Printer nozzle diameter differs from the G-code. Continue?"));
+        lcd_display_message_fullscreen_P(_i("Printer nozzle diameter differs from the G-code. Continue?")); ////MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
+        lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
+        //???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
+        lcd_update_enable(true); // display / status-line recovery
+        break;
+    case ClCheckMode::_Strict:
+        lcd_show_fullscreen_message_and_wait_P(_i(
+            "Printer nozzle diameter differs from the G-code. Please check the value in settings. Print cancelled.")); ////MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
+        lcd_print_stop();
+        break;
+    case ClCheckMode::_None:
+    case ClCheckMode::_Undef:
+        break;
+    }
+    if (!farm_mode) {
+        bSettings = false; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
+        menu_submenu(lcd_hw_setup_menu);
+    }
 }
 
-void printer_model_check(uint16_t nPrinterModel)
-{
-if(oCheckModel==ClCheckModel::_None)
-     return;
-if(nPrinterModel==nPrinterType)
-     return;
-//SERIAL_ECHO_START;
-//SERIAL_ECHOLNPGM("Printer model differs from the G-code ...");
-//SERIAL_ECHOPGM("actual  : ");
-//SERIAL_ECHOLN(nPrinterType);
-//SERIAL_ECHOPGM("expected: ");
-//SERIAL_ECHOLN(nPrinterModel);
-switch(oCheckModel)
-     {
-     case ClCheckModel::_Warn:
-//          lcd_show_fullscreen_message_and_wait_P(_i("Printer model differs from the G-code. Continue?"));
-lcd_display_message_fullscreen_P(_T(MSG_GCODE_DIFF_PRINTER_CONTINUE));
-lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
-//???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
-lcd_update_enable(true);           // display / status-line recovery
-          break;
-     case ClCheckModel::_Strict:
-          lcd_show_fullscreen_message_and_wait_P(_T(MSG_GCODE_DIFF_PRINTER_CANCELLED));
-          lcd_print_stop();
-          break;
-     case ClCheckModel::_None:
-     case ClCheckModel::_Undef:
-          break;
-     }
+void printer_model_check(uint16_t nPrinterModel) {
+    if (oCheckModel == ClCheckModel::_None)
+        return;
+    if (nPrinterModel == nPrinterType)
+        return;
+    // SERIAL_ECHO_START;
+    // SERIAL_ECHOLNPGM("Printer model differs from the G-code ...");
+    // SERIAL_ECHOPGM("actual  : ");
+    // SERIAL_ECHOLN(nPrinterType);
+    // SERIAL_ECHOPGM("expected: ");
+    // SERIAL_ECHOLN(nPrinterModel);
+    switch (oCheckModel) {
+    case ClCheckModel::_Warn:
+        //          lcd_show_fullscreen_message_and_wait_P(_i("Printer model differs from the G-code. Continue?"));
+        lcd_display_message_fullscreen_P(_T(MSG_GCODE_DIFF_PRINTER_CONTINUE));
+        lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
+        //???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
+        lcd_update_enable(true); // display / status-line recovery
+        break;
+    case ClCheckModel::_Strict:
+        lcd_show_fullscreen_message_and_wait_P(_T(MSG_GCODE_DIFF_PRINTER_CANCELLED));
+        lcd_print_stop();
+        break;
+    case ClCheckModel::_None:
+    case ClCheckModel::_Undef:
+        break;
+    }
 }
 
-uint8_t mCompareValue(uint16_t nX,uint16_t nY)
-{
-if(nX>nY)
-     return((uint8_t)ClCompareValue::_Greater);
-if(nX<nY)
-     return((uint8_t)ClCompareValue::_Less);
-return((uint8_t)ClCompareValue::_Equal);
+uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
+    if (nX > nY)
+        return ((uint8_t)ClCompareValue::_Greater);
+    if (nX < nY)
+        return ((uint8_t)ClCompareValue::_Less);
+    return ((uint8_t)ClCompareValue::_Equal);
 }
 
-void fw_version_check(const char *pVersion)
-{
-uint16_t aVersion[4];
-uint8_t nCompareValueResult;
-
-if(oCheckVersion==ClCheckVersion::_None)
-     return;
-parse_version(pVersion,aVersion);
-nCompareValueResult=mCompareValue(aVersion[0],eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR))<<6;
-nCompareValueResult+=mCompareValue(aVersion[1],eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR))<<4;
-nCompareValueResult+=mCompareValue(aVersion[2],eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION))<<2;
-nCompareValueResult+=mCompareValue(aVersion[3],eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR));
-if(nCompareValueResult==COMPARE_VALUE_EQUAL)
-     return;
-if((nCompareValueResult<COMPARE_VALUE_EQUAL)&&oCheckVersion==ClCheckVersion::_Warn)
-     return;
-//SERIAL_ECHO_START;
-//SERIAL_ECHOLNPGM("Printer FW version differs from the G-code ...");
-//SERIAL_ECHOPGM("actual  : ");
-//SERIAL_ECHOLN(FW_VERSION);
-//SERIAL_ECHOPGM("expected: ");
-//SERIAL_ECHOLN(pVersion);
-switch(oCheckVersion)
-     {
-     case ClCheckVersion::_Warn:
-//          lcd_show_fullscreen_message_and_wait_P(_i("Printer FW version differs from the G-code. Continue?"));
-lcd_display_message_fullscreen_P(_i("G-code sliced for a newer firmware. Continue?"));////MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
-//???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
-lcd_update_enable(true);           // display / status-line recovery
-          break;
-     case ClCheckVersion::_Strict:
-          lcd_show_fullscreen_message_and_wait_P(_i("G-code sliced for a newer firmware. Please update the firmware. Print cancelled."));////MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-          lcd_print_stop();
-          break;
-     case ClCheckVersion::_None:
-     case ClCheckVersion::_Undef:
-          break;
-     }
+void fw_version_check(const char *pVersion) {
+    uint16_t aVersion[4];
+    uint8_t nCompareValueResult;
+
+    if (oCheckVersion == ClCheckVersion::_None)
+        return;
+    parse_version(pVersion, aVersion);
+    nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6;
+    nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4;
+    nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2;
+    nCompareValueResult += mCompareValue(aVersion[3], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_FLAVOR));
+    if (nCompareValueResult == COMPARE_VALUE_EQUAL)
+        return;
+    if ((nCompareValueResult < COMPARE_VALUE_EQUAL) && oCheckVersion == ClCheckVersion::_Warn)
+        return;
+    // SERIAL_ECHO_START;
+    // SERIAL_ECHOLNPGM("Printer FW version differs from the G-code ...");
+    // SERIAL_ECHOPGM("actual  : ");
+    // SERIAL_ECHOLN(FW_VERSION);
+    // SERIAL_ECHOPGM("expected: ");
+    // SERIAL_ECHOLN(pVersion);
+    switch (oCheckVersion) {
+    case ClCheckVersion::_Warn:
+        //          lcd_show_fullscreen_message_and_wait_P(_i("Printer FW version differs from the G-code. Continue?"));
+        lcd_display_message_fullscreen_P(_i("G-code sliced for a newer firmware. Continue?")); ////MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
+        lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
+        //???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
+        lcd_update_enable(true); // display / status-line recovery
+        break;
+    case ClCheckVersion::_Strict:
+        lcd_show_fullscreen_message_and_wait_P(
+            _i("G-code sliced for a newer firmware. Please update the firmware. Print cancelled.")); ////MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
+        lcd_print_stop();
+        break;
+    case ClCheckVersion::_None:
+    case ClCheckVersion::_Undef:
+        break;
+    }
 }
 
-void gcode_level_check(uint16_t nGcodeLevel)
-{
-if(oCheckGcode==ClCheckGcode::_None)
-     return;
-if(nGcodeLevel==(uint16_t)GCODE_LEVEL)
-     return;
-if((nGcodeLevel<(uint16_t)GCODE_LEVEL)&&(oCheckGcode==ClCheckGcode::_Warn))
-     return;
-//SERIAL_ECHO_START;
-//SERIAL_ECHOLNPGM("Printer G-code level differs from the G-code ...");
-//SERIAL_ECHOPGM("actual  : ");
-//SERIAL_ECHOLN(GCODE_LEVEL);
-//SERIAL_ECHOPGM("expected: ");
-//SERIAL_ECHOLN(nGcodeLevel);
-switch(oCheckGcode)
-     {
-     case ClCheckGcode::_Warn:
-//          lcd_show_fullscreen_message_and_wait_P(_i("Printer G-code level differs from the G-code. Continue?"));
-lcd_display_message_fullscreen_P(_i("G-code sliced for a different level. Continue?"));////MSG_GCODE_DIFF_CONTINUE c=20 r=4
-lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
-//???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
-lcd_update_enable(true);           // display / status-line recovery
-          break;
-     case ClCheckGcode::_Strict:
-          lcd_show_fullscreen_message_and_wait_P(_i("G-code sliced for a different level. Please re-slice the model again. Print cancelled."));////MSG_GCODE_DIFF_CANCELLED c=20 r=7
-          lcd_print_stop();
-          break;
-     case ClCheckGcode::_None:
-     case ClCheckGcode::_Undef:
-          break;
-     }
+void gcode_level_check(uint16_t nGcodeLevel) {
+    if (oCheckGcode == ClCheckGcode::_None)
+        return;
+    if (nGcodeLevel == (uint16_t)GCODE_LEVEL)
+        return;
+    if ((nGcodeLevel < (uint16_t)GCODE_LEVEL) && (oCheckGcode == ClCheckGcode::_Warn))
+        return;
+    // SERIAL_ECHO_START;
+    // SERIAL_ECHOLNPGM("Printer G-code level differs from the G-code ...");
+    // SERIAL_ECHOPGM("actual  : ");
+    // SERIAL_ECHOLN(GCODE_LEVEL);
+    // SERIAL_ECHOPGM("expected: ");
+    // SERIAL_ECHOLN(nGcodeLevel);
+    switch (oCheckGcode) {
+    case ClCheckGcode::_Warn:
+        //          lcd_show_fullscreen_message_and_wait_P(_i("Printer G-code level differs from the G-code. Continue?"));
+        lcd_display_message_fullscreen_P(_i("G-code sliced for a different level. Continue?")); ////MSG_GCODE_DIFF_CONTINUE c=20 r=4
+        lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
+        //???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
+        lcd_update_enable(true); // display / status-line recovery
+        break;
+    case ClCheckGcode::_Strict:
+        lcd_show_fullscreen_message_and_wait_P(
+            _i("G-code sliced for a different level. Please re-slice the model again. Print cancelled.")); ////MSG_GCODE_DIFF_CANCELLED c=20 r=7
+        lcd_print_stop();
+        break;
+    case ClCheckGcode::_None:
+    case ClCheckGcode::_Undef:
+        break;
+    }
 }
 
 //-// -> cmdqueue ???
-#define PRINTER_NAME_LENGTH ((sizeof(PRINTER_MMU_NAME)>sizeof(PRINTER_NAME))?(sizeof(PRINTER_MMU_NAME)-1):(sizeof(PRINTER_NAME)-1))
+#define PRINTER_NAME_LENGTH ((sizeof(PRINTER_MMU_NAME) > sizeof(PRINTER_NAME)) ? (sizeof(PRINTER_MMU_NAME) - 1) : (sizeof(PRINTER_NAME) - 1))
 #define GCODE_DELIMITER '"'
 #define ELLIPSIS "..."
 
-char* code_string(const char* pStr,size_t* nLength)
-{
+char *code_string(const char *pStr, size_t *nLength) {
 char* pStrBegin;
 char* pStrEnd;
 
@@ -451,13 +435,12 @@ if(!pStrEnd)
 return pStrBegin;
 }
 
-void printer_smodel_check(const char* pStrPos)
-{
+void printer_smodel_check(const char *pStrPos) {
 char* pResult;
 size_t nLength,nPrinterNameLength;
 
 nPrinterNameLength = strlen_P(sPrinterName);
-pResult = code_string(pStrPos,&nLength);
+pResult=code_string(pStrPos,&nLength);
 
 if(pResult != NULL && nLength == nPrinterNameLength) {
      // Only compare them if the lengths match
@@ -483,20 +466,16 @@ lcd_update_enable(true);           // display / status-line recovery
      }
 }
 
-void fSetMmuMode(bool bMMu)
-{
-if(bMMu)
-     {
-     nPrinterType=pgm_read_word(&_nPrinterMmuType);
-     sPrinterName=_sPrinterMmuName;
-     }
-else {
-     nPrinterType=pgm_read_word(&_nPrinterType);
-     sPrinterName=_sPrinterName;
-     }
+void fSetMmuMode(bool bMMu) {
+    if (bMMu) {
+        nPrinterType = pgm_read_word(&_nPrinterMmuType);
+        sPrinterName = _sPrinterMmuName;
+    } else {
+        nPrinterType = pgm_read_word(&_nPrinterType);
+        sPrinterName = _sPrinterName;
+    }
 }
 
-
 void ip4_to_str(char* dest, uint8_t* IP)
 {
     sprintf_P(dest, PSTR("%u.%u.%u.%u"), IP[0], IP[1], IP[2], IP[3]);

+ 2 - 4
Firmware/util.h

@@ -1,5 +1,5 @@
-#ifndef UTIL_H
-#define UTIL_H
+#pragma once
+#include <stdint.h>
 
 extern const char* FW_VERSION_STR_P();
 
@@ -112,5 +112,3 @@ void fSetMmuMode(bool bMMu);
 
 #define IP4_STR_SIZE 16
 extern void ip4_to_str(char* dest, uint8_t* IP);
-
-#endif /* UTIL_H */

+ 8 - 4
Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h

@@ -10,6 +10,7 @@
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25
 #define PRINTER_NAME PRINTER_MK25_NAME
+#define PRINTER_NAME_ALTERNATE PRINTER_MK25S_NAME //the other similar printer to this.
 #define PRINTER_MMU_TYPE PRINTER_MK25_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25"
@@ -125,7 +126,7 @@
 
 // Filament sensor
 #define FILAMENT_SENSOR
-#define PAT9125
+#define FILAMENT_SENSOR_TYPE FSENSOR_PAT9125
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
@@ -135,7 +136,7 @@
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
-//#define DEBUG_FSENSOR_LOG          //Reports fsensor status to serial
+//#define DEBUG_CRASHDET_COUNTERS  //Display crash-detection counters on LCD
 //#define DEBUG_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -158,8 +159,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 
-//#define FSENSOR_QUALITY
-
 
 /*------------------------------------
  EXTRUDER SETTINGS
@@ -509,6 +508,11 @@
 
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
+// MMU Error pause position
+#define MMU_ERR_X_PAUSE_POS 125
+#define MMU_ERR_Y_PAUSE_POS 0
+#define MMU_ERR_Z_PAUSE_LIFT 20
+
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 /* A value of 1 or less for N_ARC_CORRECTION will trigger the use of Sin and Cos for every arc, which will improve accuracy at the

+ 8 - 4
Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h

@@ -10,6 +10,7 @@
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25
 #define PRINTER_NAME PRINTER_MK25_NAME
+#define PRINTER_NAME_ALTERNATE PRINTER_MK25S_NAME //the other similar printer to this.
 #define PRINTER_MMU_TYPE PRINTER_MK25_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25"
@@ -126,7 +127,7 @@
 
 // Filament sensor
 #define FILAMENT_SENSOR
-#define PAT9125
+#define FILAMENT_SENSOR_TYPE FSENSOR_PAT9125
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
@@ -136,7 +137,7 @@
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
-//#define DEBUG_FSENSOR_LOG          //Reports fsensor status to serial
+//#define DEBUG_CRASHDET_COUNTERS  //Display crash-detection counters on LCD
 //#define DEBUG_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -159,8 +160,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 
-//#define FSENSOR_QUALITY
-
 
 /*------------------------------------
  EXTRUDER SETTINGS
@@ -510,6 +509,11 @@
 
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
+// MMU Error pause position
+#define MMU_ERR_X_PAUSE_POS 125
+#define MMU_ERR_Y_PAUSE_POS 0
+#define MMU_ERR_Z_PAUSE_LIFT 20
+
 //#define HEATBED_ANALYSIS //for meash bed leveling and heatbed analysis D-codes D80 and D81
 //#define MICROMETER_LOGGING //related to D-codes D80 and D81, currently works on MK2.5 only (MK3 board pin definitions missing)
 

+ 8 - 4
Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h

@@ -10,6 +10,7 @@
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25S
 #define PRINTER_NAME PRINTER_MK25S_NAME
+#define PRINTER_NAME_ALTERNATE PRINTER_MK25_NAME //the other similar printer to this.
 #define PRINTER_MMU_TYPE PRINTER_MK25S_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25S"
@@ -125,7 +126,7 @@
 
 // Filament sensor
 #define FILAMENT_SENSOR
-#define IR_SENSOR
+#define FILAMENT_SENSOR_TYPE FSENSOR_IR
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
@@ -135,7 +136,7 @@
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
-//#define DEBUG_FSENSOR_LOG          //Reports fsensor status to serial
+//#define DEBUG_CRASHDET_COUNTERS  //Display crash-detection counters on LCD
 //#define DEBUG_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -158,8 +159,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 
-//#define FSENSOR_QUALITY
-
 
 /*------------------------------------
  EXTRUDER SETTINGS
@@ -516,6 +515,11 @@
 //#define MMU_ALWAYS_CUT
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
+// MMU Error pause position
+#define MMU_ERR_X_PAUSE_POS 125
+#define MMU_ERR_Y_PAUSE_POS 0
+#define MMU_ERR_Z_PAUSE_LIFT 20
+
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 /* A value of 1 or less for N_ARC_CORRECTION will trigger the use of Sin and Cos for every arc, which will improve accuracy at the

+ 8 - 4
Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h

@@ -10,6 +10,7 @@
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25S
 #define PRINTER_NAME PRINTER_MK25S_NAME
+#define PRINTER_NAME_ALTERNATE PRINTER_MK25_NAME //the other similar printer to this.
 #define PRINTER_MMU_TYPE PRINTER_MK25S_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25S"
@@ -126,7 +127,7 @@
 
 // Filament sensor
 #define FILAMENT_SENSOR
-#define IR_SENSOR
+#define FILAMENT_SENSOR_TYPE FSENSOR_IR
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
@@ -136,7 +137,7 @@
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
-//#define DEBUG_FSENSOR_LOG          //Reports fsensor status to serial
+//#define DEBUG_CRASHDET_COUNTERS  //Display crash-detection counters on LCD
 //#define DEBUG_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -159,8 +160,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 
-//#define FSENSOR_QUALITY
-
 
 /*------------------------------------
  EXTRUDER SETTINGS
@@ -517,6 +516,11 @@
 //#define MMU_ALWAYS_CUT
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
+// MMU Error pause position
+#define MMU_ERR_X_PAUSE_POS 125
+#define MMU_ERR_Y_PAUSE_POS 0
+#define MMU_ERR_Z_PAUSE_LIFT 20
+
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 /* A value of 1 or less for N_ARC_CORRECTION will trigger the use of Sin and Cos for every arc, which will improve accuracy at the

+ 9 - 4
Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h

@@ -11,6 +11,7 @@
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK3
 #define PRINTER_NAME PRINTER_MK3_NAME
+#define PRINTER_NAME_ALTERNATE PRINTER_MK3S_NAME //the other similar printer to this.
 #define PRINTER_MMU_TYPE PRINTER_MK3_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK3_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK3"
@@ -150,7 +151,8 @@
 
 // Filament sensor
 #define FILAMENT_SENSOR
-#define PAT9125
+#define FILAMENT_SENSOR_TYPE FSENSOR_PAT9125
+#define FSENSOR_PROBING
 
 // Backlash - 
 //#define BACKLASH_X
@@ -177,7 +179,7 @@
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
-//#define DEBUG_FSENSOR_LOG          //Reports fsensor status to serial
+//#define DEBUG_CRASHDET_COUNTERS  //Display crash-detection counters on LCD
 //#define DEBUG_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -202,8 +204,6 @@
 #define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 
-//#define FSENSOR_QUALITY
-
 
 #define LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
@@ -681,6 +681,11 @@
 #define MMU_HAS_CUTTER
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
+// MMU Error pause position
+#define MMU_ERR_X_PAUSE_POS 125
+#define MMU_ERR_Y_PAUSE_POS 0
+#define MMU_ERR_Z_PAUSE_LIFT 20
+
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 /* A value of 1 or less for N_ARC_CORRECTION will trigger the use of Sin and Cos for every arc, which will improve accuracy at the

+ 9 - 4
Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h

@@ -10,6 +10,7 @@
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK3S
 #define PRINTER_NAME PRINTER_MK3S_NAME
+#define PRINTER_NAME_ALTERNATE PRINTER_MK3_NAME //the other similar printer to this.
 #define PRINTER_MMU_TYPE PRINTER_MK3S_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK3S_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK3S"
@@ -152,7 +153,8 @@
 
 // Filament sensor
 #define FILAMENT_SENSOR
-#define IR_SENSOR
+#define FILAMENT_SENSOR_TYPE FSENSOR_IR_ANALOG
+#define FSENSOR_PROBING
 
 // Backlash - 
 //#define BACKLASH_X
@@ -179,7 +181,7 @@
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
-//#define DEBUG_FSENSOR_LOG          //Reports fsensor status to serial
+//#define DEBUG_CRASHDET_COUNTERS  //Display crash-detection counters on LCD
 //#define DEBUG_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -204,8 +206,6 @@
 #define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 
-//#define FSENSOR_QUALITY
-
 
 #define LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
@@ -693,6 +693,11 @@
 //#define MMU_ALWAYS_CUT
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
+// MMU Error pause position
+#define MMU_ERR_X_PAUSE_POS 125
+#define MMU_ERR_Y_PAUSE_POS 0
+#define MMU_ERR_Z_PAUSE_LIFT 20
+
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 /* A value of 1 or less for N_ARC_CORRECTION will trigger the use of Sin and Cos for every arc, which will improve accuracy at the

+ 0 - 8
Firmware/variants/obsolete/1_75mm_MK2-RAMBo10a-E3Dv6full.h

@@ -180,14 +180,6 @@ CHANGE FILAMENT SETTINGS
 ADDITIONAL FEATURES SETTINGS
 *------------------------------------*/
 
-// Define Prusa filament runout sensor
-//#define FILAMENT_RUNOUT_SUPPORT
-
-#ifdef FILAMENT_RUNOUT_SUPPORT
-#define FILAMENT_RUNOUT_SENSOR 1
-#define FILAMENT_RUNOUT_SCRIPT "M600"
-#endif
-
 // temperature runaway
 #define TEMP_RUNAWAY_BED_HYSTERESIS 5
 #define TEMP_RUNAWAY_BED_TIMEOUT 360

+ 0 - 8
Firmware/variants/obsolete/1_75mm_MK2-RAMBo13a-E3Dv6full.h

@@ -179,14 +179,6 @@ CHANGE FILAMENT SETTINGS
 ADDITIONAL FEATURES SETTINGS
 *------------------------------------*/
 
-// Define Prusa filament runout sensor
-//#define FILAMENT_RUNOUT_SUPPORT
-
-#ifdef FILAMENT_RUNOUT_SUPPORT
-#define FILAMENT_RUNOUT_SENSOR 1
-#define FILAMENT_RUNOUT_SCRIPT "M600"
-#endif
-
 // temperature runaway
 #define TEMP_RUNAWAY_BED_HYSTERESIS 5
 #define TEMP_RUNAWAY_BED_TIMEOUT 360

+ 0 - 146
Tests/AutoDeplete_test.cpp

@@ -1,146 +0,0 @@
-/**
- * @file
- * @author Marek Bel
- */
-
-#include "catch.hpp"
-
-#include "../Firmware/AutoDeplete.h"
-
-TEST_CASE( "AutoDeplete test.", "[AutoDeplete]" )
-{
-    CHECK(ad_allDepleted() == false);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 1);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-
-    ad_markDepleted(1);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 2);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markDepleted(3);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 2);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 4);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markDepleted(4);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 2);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 0);
-    CHECK(ad_getAlternative(4) == 0);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markDepleted(4);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 2);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 0);
-    CHECK(ad_getAlternative(4) == 0);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markDepleted(0);
-
-    CHECK(ad_getAlternative(0) == 2);
-    CHECK(ad_getAlternative(1) == 2);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 2);
-    CHECK(ad_getAlternative(4) == 2);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markDepleted(2);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 1);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == true);
-
-    ad_markDepleted(2);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 1);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == true);
-
-    ad_markLoaded(4);
-
-    CHECK(ad_getAlternative(0) == 4);
-    CHECK(ad_getAlternative(1) == 4);
-    CHECK(ad_getAlternative(2) == 4);
-    CHECK(ad_getAlternative(3) == 4);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markLoaded(0);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 4);
-    CHECK(ad_getAlternative(2) == 4);
-    CHECK(ad_getAlternative(3) == 4);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markLoaded(3);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 3);
-    CHECK(ad_getAlternative(2) == 3);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markLoaded(3);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 3);
-    CHECK(ad_getAlternative(2) == 3);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markLoaded(2);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 2);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markLoaded(1);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 1);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-    ad_markLoaded(1);
-
-    CHECK(ad_getAlternative(0) == 0);
-    CHECK(ad_getAlternative(1) == 1);
-    CHECK(ad_getAlternative(2) == 2);
-    CHECK(ad_getAlternative(3) == 3);
-    CHECK(ad_getAlternative(4) == 4);
-    CHECK(ad_allDepleted() == false);
-
-}

+ 4 - 3
lang/fw-build.sh

@@ -53,7 +53,7 @@ for lang in $LANGUAGES; do
     binfile="$TMPDIR/lang_$lang.bin"
 
     color 4 "compiling language \"$lang\" from $pofile" >&2
-    ./lang-check.py --map "$MAP" "$pofile"
+    ./lang-check.py --map "$MAP" "$pofile" --no-suggest
     if [ "$?" != 0 ]; then
         color 1 "$pofile: NG! - translation contains warnings or errors" >&2
     fi
@@ -61,8 +61,9 @@ for lang in $LANGUAGES; do
     ./lang-build.py "$MAP" "$pofile" "$binfile"
 
     # ensure each catalog fits the reserved size
-    if [[ $(stat -c '%s' "$binfile") -gt $maxsize ]]; then
-        color 1 "$pofile: NG! - language data exceeds $maxsize bytes" >&2
+    currentsize=$(stat -c '%s' "$binfile")
+    if [[ $currentsize -gt $maxsize ]]; then
+        color 1 "$pofile: NG! - language data exceeds $maxsize bytes, it uses $currentsize" >&2
         finish 1
     fi
 done

+ 14 - 3
lang/lang-check.py

@@ -119,7 +119,7 @@ def ign_char_first(c):
 def ign_char_last(c):
     return c.isalnum() or c in {'.', "'"}
 
-def check_translation(entry, msgids, is_pot, no_warning, no_suggest, warn_empty, warn_same, information):
+def check_translation(entry, msgids, is_pot, no_warning, no_suggest, warn_empty, warn_same, information, shorter):
     """Check strings to display definition."""
 
     # do not check obsolete/deleted entriees
@@ -221,7 +221,7 @@ def check_translation(entry, msgids, is_pot, no_warning, no_suggest, warn_empty,
             print_wrapped(wrapped_source, rows, cols)
             print()
 
-    # Check for translation lenght
+    # Check for translation length too long
     if (rows_count_translation > rows) or (rows == 1 and len(translation) > cols):
         errors += 1
         print(red('[E]: Text is longer than definition on line %d: cols=%d rows=%d (rows diff=%d)'
@@ -230,6 +230,14 @@ def check_translation(entry, msgids, is_pot, no_warning, no_suggest, warn_empty,
                                 wrapped_source, wrapped_translation,
                                 rows, cols)
 
+    # Check for translation length shorter
+    if shorter and (rows_count_translation < rows-1):
+        print(yellow('[S]: Text is shorter than definition on line %d: cols=%d rows=%d (rows diff=%d)'
+                % (line, cols, rows, rows_count_translation-rows)))
+        print_source_translation(source, translation,
+                                wrapped_source, wrapped_translation,
+                                rows, cols)
+
     # Different count of % sequences
     if source.count('%') != translation.count('%') and len(translation) > 0:
         errors += 1
@@ -313,6 +321,9 @@ def main():
     parser.add_argument(
         "--warn-same", action="store_true",
         help="Warn about one-word translations which are identical to the source")
+    parser.add_argument(
+        "--shorter", action="store_true",
+        help="Show message if it is shorter than expected.")
 
     # load the translations
     args = parser.parse_args()
@@ -333,7 +344,7 @@ def main():
     status = True
     for translation in polib.pofile(args.po):
         status &= check_translation(translation, msgids, args.pot, args.no_warning, args.no_suggest,
-                                    args.warn_empty, args.warn_same, args.information)
+                                    args.warn_empty, args.warn_same, args.information, args.shorter)
     return 0 if status else 1
 
 if __name__ == "__main__":

+ 1 - 0
lang/lib/charset.py

@@ -1,5 +1,6 @@
 # Mapping from LCD source encoding to unicode characters
 CUSTOM_CHARS = {
+    '\x06': '⏬',
     '\x04': '🔃',
     '\xe4': 'µ',
     '\xdf': '°',

+ 951 - 579
lang/po/Firmware.pot

@@ -7,352 +7,372 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr ""
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr ""
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr ""
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ""
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr ""
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr ""
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr ""
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr ""
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr ""
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr ""
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr ""
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr ""
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr ""
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr ""
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr ""
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr ""
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr ""
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr ""
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr ""
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 msgstr ""
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr ""
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr ""
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr ""
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr ""
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr ""
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr ""
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr ""
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr ""
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr ""
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid ""
+"Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr ""
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr ""
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr ""
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr ""
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr ""
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr ""
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr ""
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr ""
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr ""
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr ""
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr ""
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr ""
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr ""
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr ""
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr ""
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr ""
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -360,39 +380,46 @@ msgid ""
 msgstr ""
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr ""
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr ""
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr ""
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr ""
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr ""
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet."
@@ -401,294 +428,418 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 msgstr ""
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr ""
 
-#. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
-msgid "ERROR:"
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
 msgstr ""
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr ""
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
+#. MSG_ERROR c=10
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
+msgid "ERROR:"
 msgstr ""
 
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr ""
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr ""
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr ""
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr ""
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr ""
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr ""
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr ""
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
 msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
+
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
 msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr ""
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr ""
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr ""
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr ""
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr ""
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr ""
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr ""
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr ""
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr ""
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr ""
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr ""
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41
+#: ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr ""
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr ""
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr ""
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr ""
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr ""
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again."
 " Print cancelled."
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr ""
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr ""
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr ""
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr ""
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr ""
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -696,326 +847,379 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 msgstr ""
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr ""
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr ""
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 msgstr ""
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr ""
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr ""
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr ""
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware."
+" If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr ""
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr ""
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr ""
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr ""
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr ""
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr ""
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr ""
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr ""
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr ""
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr ""
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
 msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr ""
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr ""
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr ""
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr ""
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr ""
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr ""
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
 msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
 msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr ""
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
 msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr ""
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr ""
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
 msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
 msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr ""
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr ""
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr ""
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr ""
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr ""
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr ""
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr ""
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr ""
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr ""
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr ""
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr ""
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr ""
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr ""
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr ""
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr ""
 
@@ -1025,178 +1229,203 @@ msgid "New firmware version available:"
 msgstr ""
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr ""
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr ""
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr ""
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr ""
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr ""
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr ""
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr ""
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr ""
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr ""
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr ""
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr ""
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr ""
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr ""
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr ""
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 msgstr ""
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr ""
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr ""
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1208,78 +1437,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr ""
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 msgstr ""
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr ""
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr ""
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr ""
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr ""
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr ""
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr ""
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr ""
 
@@ -1288,289 +1512,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr ""
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr ""
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr ""
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr ""
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr ""
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr ""
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr ""
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr ""
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr ""
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr ""
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr ""
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr ""
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr ""
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr ""
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr ""
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr ""
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr ""
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr ""
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First"
 " steps, section Calibration flow."
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 msgstr ""
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr ""
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr ""
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr ""
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr ""
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr ""
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr ""
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr ""
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr ""
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr ""
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr ""
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 msgstr ""
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr ""
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr ""
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr ""
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr ""
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 msgstr ""
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr ""
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr ""
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr ""
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr ""
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr ""
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr ""
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr ""
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr ""
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr ""
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr ""
 
@@ -1580,31 +1857,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr ""
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr ""
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr ""
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr ""
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1613,18 +1890,18 @@ msgid ""
 msgstr ""
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr ""
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr ""
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr ""
 
@@ -1636,112 +1913,171 @@ msgid ""
 msgstr ""
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr ""
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr ""
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr ""
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr ""
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr ""
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr ""
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr ""
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr ""
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr ""
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr ""
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr ""
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr ""
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr ""
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1749,73 +2085,109 @@ msgid ""
 msgstr ""
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 msgstr ""
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr ""
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr ""
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr ""
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr ""
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr ""
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr ""
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr ""
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector"
+" is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr ""
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr ""
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr ""
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1824,210 +2196,210 @@ msgid ""
 msgstr ""
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr ""
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr ""
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr ""
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr ""
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr ""
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr ""
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr ""
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr ""
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr ""
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr ""
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this"
 " version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr ""
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr ""
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr ""
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr ""
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr ""
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr ""
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr ""
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr ""
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr ""

+ 1015 - 590
lang/po/Firmware_cs.po

@@ -16,153 +16,154 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr " 0.3 nebo starsi"
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr " 0.4 nebo novejsi"
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr "%s ocekavana verze"
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ">Zrusit"
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr "Doladeni Z:"
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr "Vse OK"
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr "Vse je hotovo. Tisku zdar!"
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr "Abeceda"
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr "Okoli"
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr "Dojely oba Z voziky k~hornimu dorazu?"
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr "Asist."
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr ""
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr "Automat."
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr "AutoZavedeni fil."
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-"Automaticke zavadeni filamentu je mozne pouze pri zapnutem filament "
-"senzoru..."
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 "Automaticke zavadeni filamentu aktivni, stisknete tlacitko a vlozte "
 "filament..."
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr "Osa"
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr "Delka osy"
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr "Zpet"
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr "Podlozka"
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr "Zahrivani bedu"
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr "Bed OK."
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr "Korekce podlozky"
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
@@ -170,50 +171,55 @@ msgstr ""
 "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr "Podlozka/Topeni"
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr "Stav remenu"
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr "Test remenu"
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr "Detekovan vypadek proudu.Obnovit tisk?"
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr "Jasny"
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr "Podsviceni"
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr "Kalibrace XYZ"
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr "Kalibrovat Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -222,13 +228,13 @@ msgstr ""
 "tlacitkem."
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr "Kalibruji Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -237,140 +243,151 @@ msgstr ""
 "tlacitkem."
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr "Kalibruji vychozi p."
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr "Kalibrace"
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr "Kalibrace OK"
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr "Karta vyjmuta"
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr "Vymenit filament"
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr "Zmena uspesna!"
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr "Vymena ok?"
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr "Kontrola osy X"
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr "Kontrola osy Y"
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr "Kontrola osy Z"
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr "Kontrola podlozky"
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr "Kontrola endstopu"
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr "Kontroluji soubor"
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr "Kontrola hotend"
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr "Kontrola senzoru"
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr "Kontrola"
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr "Barva neni cista"
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr "Komunitni prekl."
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr "Pokr."
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr "Zchladit"
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr "Kopirovat vybrany jazyk?"
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr "Naraz"
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr "Det. narazu"
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr "Detekovan naraz."
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -381,39 +398,46 @@ msgstr ""
 "Normal modu"
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr "Ustrihnout"
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr "Strihani"
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Strihani filamentu"
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr "Datum:"
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr "Temny"
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr "Vypnout motory"
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -424,229 +448,352 @@ msgstr ""
 "podle manualu, kapitola Zaciname, odstavec Nastaveni prvni vrstvy."
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 msgstr ""
 "Chcete opakovat posledni krok a pozmenit vzdalenost mezi tryskou a podlozkou?"
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr "Korekce E:"
 
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr ""
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgstr "CHYBA:"
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
-msgstr "CHYBA: Filament senzor nereaguje, zkontrolujte prosim zapojeni."
-
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr "Vysunout fil."
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr "Vysouvam filament"
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr "Koncovy spinac"
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr "Kon. spinac nesepnut"
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr "Konc. spinace"
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr ""
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr "Levy vent.:"
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr ""
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr "F. autozav."
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr "FS reakce"
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
-msgstr "FS 0.3 nebo starsi"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
-msgstr "FS 0.4 a novejsi"
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
+msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr "Selhani"
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr "Selhani MMU"
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr "Falesne spusteni"
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr "Rychlost vent."
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr "Test ventilatoru"
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr "Kontr. vent."
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr "Vypadky filam."
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr "Fil. senzor"
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr "Filament vytlacen a spravne barvy?"
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr "Filament nezaveden"
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr "Senzor filamentu"
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr "Spotrebovano filam."
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr "Soubor nekompletni. Pokracovat?"
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr "Dokoncovani pohybu"
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr "Kal. prvni vrstvy"
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 "Nejdriv pomoci selftestu zkontoluji nejcastejsi chyby vznikajici pri "
 "sestaveni tiskarny."
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr "Opravte chybu a pote stisknete tlacitko na jednotce MMU."
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr "Prutok"
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr "Predni tiskovy vent?"
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr "Vpredu [μm]"
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr "Predni/levy vent."
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-code je pripraven pro jinou verzi. Pokracovat?"
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
@@ -655,14 +802,14 @@ msgstr ""
 "zrusen."
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-code je pripraven pro jiny typ tiskarny. Pokracovat?"
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
@@ -671,12 +818,12 @@ msgstr ""
 "Tisk zrusen."
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-code je pripraven pro novejsi firmware. Pokracovat?"
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
@@ -685,42 +832,42 @@ msgstr ""
 "zrusen."
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr "HW nastaveni"
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr "Topeni/Termistor"
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr "Zahrivani"
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr "Zahrivani preruseno bezpecnostnim casovacem."
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr "Zahrivani OK."
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -730,7 +877,7 @@ msgstr ""
 "nastaveni, ve kterem zkalibrujeme osu Z. Pak budete moct zacit tisknout."
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -739,24 +886,45 @@ msgstr ""
 "kalibracnim procesem?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr "Vys. vykon"
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Nyni provedu xyz kalibraci. Zabere to priblizne 12 min."
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr "Nyni provedu z kalibraci."
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
@@ -765,295 +933,327 @@ msgstr ""
 "- Tiskove platy"
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr "Informace"
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr "Vlozte filament"
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr "Vlozte filament (nezavadejte) do extruderu a stisknete tlacitko"
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr "Je filament zaveden?"
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr "Je tiskovy plat na podlozce?"
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr "Opakovani"
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr "Posledni tisk"
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr "Selhani posl. tisku"
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr "Vlevo"
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr "Levy vent na trysce?"
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr "Vlevo [μm]"
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr "Normalni"
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr "Ztlumeny"
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr "Korekce lin."
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr "Doladeni osy Z"
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
-msgstr "Zavest vse"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
+msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr "Zavest filament"
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr "Zavest do trysky"
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr "Cisteni barvy"
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr "Zavadeni filamentu"
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr "Uvolnena remenicka"
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr "Hlasity"
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
-msgstr "MK3 firmware detekovan na MK3S tiskarne"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
+msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
-msgstr "MK3S firmware detekovan na tiskarne MK3"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
+msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr "MMU mod"
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr "MMU OK. Pokracuji v tisku..."
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
-msgstr "MMU OK. Pokracuji v nahrivani..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
+msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
-msgstr "MMU OK. Pokracuji..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
+msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr "Selhani MMU"
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr "Zavedeni MMU selhalo"
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr "MMU selhani zav"
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
-msgstr "MMU potrebuje zasah uzivatele."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
+msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
-msgstr "MMU vyp. proudu"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
+msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr "MMU2 pripojeno"
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr "Komp. magnetu"
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr "Hlavni nabidka"
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr "Merene zkos."
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr "Merim referencni vysku kalibracniho bodu"
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr ""
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr ""
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr "Mod"
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr "Probiha zmena modu..."
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr ""
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr "Posunout X"
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr "Posunout Y"
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr "Posunout Z"
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr "Posunout osu"
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr ""
 
@@ -1063,153 +1263,161 @@ msgid "New firmware version available:"
 msgstr "Vysla nova verze firmware:"
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr "Ne"
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr "Zadna SD karta"
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr "Bez pohybu."
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr "Zadne"
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr "Nezapojeno"
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr "Netoci se"
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr "Nyni zkalibruji vzdalenost mezi koncem trysky a povrchem podlozky."
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Nyni predehreji trysku pro PLA."
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr "Nyni odstrante testovaci vytisk z tiskoveho platu."
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr "Tryska"
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr "Tryska"
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr "Vyp"
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr "Neplatne hodnoty nastaveni. Bude pouzito vychozi PID, Esteps atd."
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr "Zap"
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr "Jednou"
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr "PID kal."
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr "PID kal. ukoncena"
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr "PID kalibrace"
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr "Nahrivani PINDA"
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr "PINDA kal."
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr "PINDA kalibrace selhala"
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
@@ -1217,19 +1425,36 @@ msgstr ""
 "PINDA kalibrace dokoncena a je nyni aktivni. Zabere je mozno deaktivovat v "
 "menu Nastaveni->Tepl. kal."
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr "Pauza"
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr "Pozastavit tisk"
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1238,7 +1463,7 @@ msgstr ""
 "prvnich 4 bodu. Pokud tryska zachyti papir, okamzite vypnete tiskarnu."
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1252,30 +1477,30 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr "Prosim zkontrolujte zapojeni IR senzoru a vyjmuty filament"
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr "Zkontrolujte:"
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr "Prosim ocistete podlozku a stisknete tlacitko."
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 "Prosim vlozte filament do extruderu a stisknete tlacitko k jeho zavedeni"
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
@@ -1284,50 +1509,45 @@ msgstr ""
 "zavedeni"
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr "Prosim nejdriv zavedte filament"
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr "Prosim otevrete idler a manualne odstrante filament."
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr "Umistete prosim tiskovy plat na podlozku"
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr "Pro vysunuti filamentu stisknete prosim tlacitko"
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr "Prosim vyjmete urychlene filament"
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr "Prosim vyjmete filament a pote stisknete tlacitko."
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr "Nejprve prosim sundejte transportni soucastky."
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr "Odstrante prosim tiskovy plat z podlozky."
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr "Nejprve spustte kalibraci XYZ."
 
@@ -1336,113 +1556,109 @@ msgstr "Nejprve spustte kalibraci XYZ."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Prosim vyjmete filament a zopakujte tuto akci"
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr "Prosim aktualizujte firmware ve vasi MMU2 jednotce. Cekam na reset."
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr "Prosim aktualizujte."
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr "Prosim cekejte"
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr "Vypadky proudu"
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr "Predehrev"
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr "Predehrejte trysku!"
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr "Predehrev trysky. Prosim cekejte."
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr "Predehrev ke strihu"
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr "Predehrev k vysunuti"
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr "Predehrev k zavedeni"
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr "Predehrev k vyjmuti"
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr "Stisknete tlacitko"
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Pro nahrati trysky a pokracovani stisknete tlacitko."
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr "Pro pokracovani nahrivani trysky stisknete tlacitko."
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr "Tisk prerusen"
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr "Tiskovy vent.:"
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr "Tisk z SD"
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr "Tisk pozastaven"
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr "Cas tisku"
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr "IP adr. tiskarny:"
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
@@ -1451,12 +1667,12 @@ msgstr ""
 "kapitola Zaciname, odstavec Postup kalibrace."
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Prumer trysky tiskarny se lisi od G-code. Pokracovat?"
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
@@ -1464,65 +1680,110 @@ msgstr ""
 "Prumer trysky tiskarny se lisi od G-code. Prosim zkontrolujte nastaveni. "
 "Tisk zrusen."
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr ""
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr "Vzadu [μm]"
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr "Obnovovani tisku"
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr "Vyjmete stary filament a stisknete tlacitko pro zavedeni noveho."
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr "Prejmenovat"
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr ""
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr "Reset XYZ kalibr."
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr "Pokracovat"
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr "Obnoveni tisku"
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr "Vpravo"
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr "Vpravo [μm]"
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
@@ -1530,101 +1791,113 @@ msgstr ""
 "Spusteni Pruvodce vymaze ulozene vysledky vsech kalibraci a spusti "
 "kalibracni proces od zacatku. Pokracovat?"
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr "SD karta"
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr "ZASTAVENO."
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr "Hledam kalibracni bod podlozky"
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr "Vybrat"
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 msgstr "Zvolte filament pro kalibraci prvni vrstvy z nasledujiciho menu"
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr "Vyberte extruder:"
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr "Zvolte filament:"
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr "Vyber jazyka"
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr "Vyberte teplotu predehrati trysky ktera odpovida vasemu materialu."
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr "Zvolte teplotu, ktera odpovida vasemu materialu."
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr ""
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr ""
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr ""
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr "Chyba Selftestu!"
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr "Selftest selhal"
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr "Pro kalibraci presneho rehomovani bude nyni spusten selftest."
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr "Senzor info"
 
@@ -1634,31 +1907,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Senzor overen, vyjmete filament."
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr "Nastavte teplotu:"
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr "Nastaveni"
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr "Tezke zkos."
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr "Plat"
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1671,18 +1944,18 @@ msgstr ""
 "%cReset"
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr "Stav konc. spin."
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr "Tichy"
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr "Lehke zkos."
 
@@ -1696,112 +1969,171 @@ msgstr ""
 "setrideni je 100."
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Vyskytl se problem, srovnavam osu Z ..."
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr "Trideni"
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr "Trideni souboru"
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr "Zvuk"
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr "Rychlost"
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr "Toci se"
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr "Je vyzadovana stabilni pokojova teplota 21-26C a pevna podlozka."
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr "Statistika"
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr "Tichy"
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr "Tiskove platy"
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr "Zastavit tisk"
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr "Prisne"
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr "Podpora"
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr "Prohozene"
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr "Teplota"
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr "Teploty"
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1811,7 +2143,7 @@ msgstr ""
 "vysku. Postupujte podle obrazku v handbooku (kapitola Kalibrace)."
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
@@ -1820,66 +2152,102 @@ msgstr ""
 "Zaciname, sekce Postup kalibrace."
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr "Cas"
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr ""
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr "Celkem"
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr "Celkem selhani"
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr "Filament celkem"
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr "Celkovy cas tisku"
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr "Ladit"
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr "Vyjmout filament"
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr "Vysouvam filament"
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr "Overeni selhalo, vyjmete filament a zkuste znovu."
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr "Napeti"
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1892,218 +2260,275 @@ msgstr ""
 "Stealth modu"
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr "Ceka se na uzivatele"
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr "Cekani na zchladnuti PINDA"
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Cekani na zchladnuti trysky a podlozky."
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr "Varovat"
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Varovani: doslo ke zmene typu tiskarny a motherboardu."
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr "Varovani: doslo ke zmene typu motherboardu."
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr "Varovani: doslo ke zmene typu tiskarny."
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr "Bylo vysunuti filamentu uspesne?"
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr "Chyba zapojeni"
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr "Pruvodce"
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr "Korekce X:"
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr "Detaily XYZ kal."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "Kalibrace XYZ v poradku. Zkoseni bude automaticky vyrovnano pri tisku."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr "Kalibrace XYZ v poradku. X/Y osy mirne zkosene. Dobra prace!"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Kalibrace XYZ selhala. Nahlednete do manualu."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Kalibrace XYZ v poradku. X/Y osy jsou kolme. Gratuluji!"
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr "Y vzdalenost od min"
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr "Korekce Y:"
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr "Ano"
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "Pruvodce muzete kdykoliv znovu spustit z menu Kalibrace -> Pruvodce"
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr "Korekce Z:"
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr "Pocet mereni Z"
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr "[0;0] odsazeni bodu"
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr "a stisknete tlacitko"
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr "k zavedeni filamentu"
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr "k vyjmuti filamentu"
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr "neznamy"
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr "neznamy stav"
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr "🔃Obnovit"
 
+#~ msgid ""
+#~ "Autoloading filament available only when filament sensor is turned on..."
+#~ msgstr ""
+#~ "Automaticke zavadeni filamentu je mozne pouze pri zapnutem filament "
+#~ "senzoru..."
+
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Detekovan naraz. Obnovit tisk?"
 
+#~ msgid "Cutting filament"
+#~ msgstr "Strihani filamentu"
+
+#~ msgid "ERROR: Filament sensor is not responding, please check connection."
+#~ msgstr "CHYBA: Filament senzor nereaguje, zkontrolujte prosim zapojeni."
+
+#~ msgid "FS v0.3 or older"
+#~ msgstr "FS 0.3 nebo starsi"
+
+#~ msgid "FS v0.4 or newer"
+#~ msgstr "FS 0.4 a novejsi"
+
+#~ msgid "Fix the issue and then press button on MMU unit."
+#~ msgstr "Opravte chybu a pote stisknete tlacitko na jednotce MMU."
+
+#~ msgid "Load all"
+#~ msgstr "Zavest vse"
+
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Kal. prvni vrstvy"
+
+#~ msgid "MK3 firmware detected on MK3S printer"
+#~ msgstr "MK3 firmware detekovan na MK3S tiskarne"
+
+#~ msgid "MK3S firmware detected on MK3 printer"
+#~ msgstr "MK3S firmware detekovan na tiskarne MK3"
+
+#~ msgid "MMU OK. Resuming position..."
+#~ msgstr "MMU OK. Pokracuji v tisku..."
+
+#~ msgid "MMU OK. Resuming temperature..."
+#~ msgstr "MMU OK. Pokracuji v nahrivani..."
+
+#~ msgid "MMU OK. Resuming..."
+#~ msgstr "MMU OK. Pokracuji..."
+
+#~ msgid "MMU load failed"
+#~ msgstr "Zavedeni MMU selhalo"
+
+#~ msgid "MMU needs user attention."
+#~ msgstr "MMU potrebuje zasah uzivatele."
+
+#~ msgid "MMU power fails"
+#~ msgstr "MMU vyp. proudu"
+
+#~ msgid "Please remove filament and then press the knob."
+#~ msgstr "Prosim vyjmete filament a pote stisknete tlacitko."
+
+#~ msgid "Please update firmware in your MMU2. Waiting for reset."
+#~ msgstr "Prosim aktualizujte firmware ve vasi MMU2 jednotce. Cekam na reset."
+
+#~ msgid "Press the knob to resume nozzle temperature."
+#~ msgstr "Pro pokracovani nahrivani trysky stisknete tlacitko."

+ 949 - 579
lang/po/Firmware_da.po

@@ -16,352 +16,371 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr ""
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr ""
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr ""
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ""
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr ""
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr ""
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr ""
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr ""
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr ""
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr ""
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr ""
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr ""
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr ""
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr ""
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr ""
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr ""
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr ""
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr ""
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr ""
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 msgstr ""
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr ""
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr ""
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr ""
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr ""
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr ""
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr ""
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr ""
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr ""
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr ""
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr ""
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr ""
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr ""
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr ""
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr ""
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr ""
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr ""
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr ""
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr ""
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr ""
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr ""
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr ""
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr ""
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr ""
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr ""
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr ""
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -369,39 +388,46 @@ msgid ""
 msgstr ""
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr ""
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr ""
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr ""
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr ""
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr ""
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -410,294 +436,417 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 msgstr ""
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr ""
 
-#. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
-msgid "ERROR:"
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
 msgstr ""
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
+#. MSG_ERROR c=10
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
+msgid "ERROR:"
 msgstr ""
 
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr ""
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr ""
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr ""
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr ""
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr ""
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr ""
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr ""
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
 msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
+
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
 msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr ""
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr ""
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr ""
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr ""
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr ""
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr ""
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr ""
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr ""
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr ""
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr ""
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr ""
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr ""
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr ""
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr ""
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr ""
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr ""
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr ""
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr ""
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr ""
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr ""
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr ""
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -705,7 +854,7 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -714,319 +863,372 @@ msgstr ""
 "dig gennem installationsprocessen?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr ""
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr ""
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 msgstr ""
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr ""
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr ""
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr ""
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr ""
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr ""
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr ""
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr ""
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr ""
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr ""
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr ""
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr ""
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr ""
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr ""
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
 msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr ""
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr ""
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr ""
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr ""
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr ""
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr ""
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
 msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
 msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr ""
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
 msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr ""
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr ""
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
 msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
 msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr ""
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr ""
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr ""
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr ""
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr ""
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr ""
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr ""
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr ""
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr ""
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr ""
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr ""
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr ""
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr ""
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr ""
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr ""
 
@@ -1036,178 +1238,203 @@ msgid "New firmware version available:"
 msgstr ""
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr ""
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr ""
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr ""
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr ""
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr ""
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr ""
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr ""
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr ""
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr ""
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr ""
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr ""
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr ""
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr ""
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr ""
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 msgstr ""
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr ""
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr ""
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1219,78 +1446,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr ""
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 msgstr ""
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr ""
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr ""
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr ""
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr ""
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr ""
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr ""
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr ""
 
@@ -1299,289 +1521,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr ""
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr ""
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr ""
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr ""
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr ""
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr ""
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr ""
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr ""
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr ""
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr ""
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr ""
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr ""
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr ""
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr ""
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr ""
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr ""
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr ""
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr ""
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 msgstr ""
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr ""
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr ""
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr ""
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr ""
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr ""
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr ""
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr ""
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr ""
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr ""
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr ""
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 msgstr ""
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr ""
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr ""
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr ""
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr ""
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 msgstr ""
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr ""
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr ""
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr ""
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr ""
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr ""
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr ""
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr ""
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr ""
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr ""
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr ""
 
@@ -1591,31 +1866,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr ""
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr ""
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr ""
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr ""
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1624,18 +1899,18 @@ msgid ""
 msgstr ""
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr ""
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr ""
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr ""
 
@@ -1647,112 +1922,171 @@ msgid ""
 msgstr ""
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr ""
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr ""
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr ""
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr ""
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr ""
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr ""
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr ""
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr ""
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr ""
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr ""
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr ""
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr ""
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr ""
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1760,73 +2094,109 @@ msgid ""
 msgstr ""
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 msgstr ""
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr ""
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr ""
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr ""
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr ""
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr ""
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr ""
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr ""
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr ""
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr ""
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr ""
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1835,210 +2205,210 @@ msgid ""
 msgstr ""
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr ""
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr ""
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr ""
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr ""
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr ""
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr ""
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr ""
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr ""
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr ""
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr ""
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr ""
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr ""
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr ""
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr ""
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr ""
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr ""
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr ""
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr ""
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr ""

+ 1053 - 588
lang/po/Firmware_de.po

@@ -16,152 +16,154 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr " 0.3 oder älter"
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr " 0.4 oder neuer"
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr "%s Level erwartet"
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ">Abbruch"
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr "Z Anpassen:"
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr "Alles richtig"
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr "Alles abgeschlossen. Viel Spaß beim Drucken!"
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr "Alphabet"
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr "Immer"
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr "Raumtemp."
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr "Sind linke+rechte Z- Schlitten ganz oben?"
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr "Assist."
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr "Auto"
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr "Startposition"
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr "Auto Leist"
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr "AutoLaden Filament"
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-"Automatisches Laden Filament nur bei eingeschaltetem Fil. sensor verfügbar..."
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 "Automatisches Laden Filament ist aktiv, Knopf drücken und Filament "
 "einlegen..."
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr "Vermeide schleifen"
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr "Achse"
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr "Achsenlänge"
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr "Zurück"
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr "Bett"
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr "Bett aufwärmen"
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr "Bett OK"
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr "Bett Level Korr."
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
@@ -169,50 +171,55 @@ msgstr ""
 "Z-Kal. fehlgeschlg. Sensor nicht ausgelöst. Schmutzige Düse? Warte auf Reset."
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr "Bett/Heizung"
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr "Gurtstatus"
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr "Riementest"
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr "Stromausfall! Druck wiederherstellen?"
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr "Hell"
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr "Helligkeit"
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr "KOMMUNIKATIONSFEHLER"
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr "Kalibrierung XYZ"
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr "Kalibrierung Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -221,13 +228,13 @@ msgstr ""
 "Anschliessend den Knopf drücken."
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr "Kalibriere Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -236,140 +243,153 @@ msgstr ""
 "Anschliessend den Knopf drücken."
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr "Kalibriere Start"
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr "Kalibrierung"
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr "Kalibrierung OK"
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr "Kann Selektor oder Riemenscheibe nicht bewegen."
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+"Die Aktion kann nicht ausgeführt werden, das Filament ist bereits geladen. "
+"Entladen Sie es zuerst."
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr "SD Karte entfernt"
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr "Wechsel SD Karte"
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr "Filament-Wechsel"
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr "Wechsel erfolgr.!"
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr "Wechsel ok?"
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr "Prüfe X Achse"
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr "Prüfe Y Achse"
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr "Prüfe Z Achse"
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr "Prüfe Bett"
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr "Prüfe Endschalter"
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr "Überprüfe Datei"
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr "Prüfe Düse"
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr "Prüfe Sensoren"
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr "Kontrolle"
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr "Falsche Farbe"
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr "Von der Community"
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr "Weit."
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr "Abkühlen"
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr "Gewählte Sprache kopieren?"
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr "Crash"
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr "Crash Erk."
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr "Crash erkannt."
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -380,39 +400,46 @@ msgstr ""
 "genutzt werden"
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr "Fil. schneiden"
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr "Messer"
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Schneide filament"
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr "Datum:"
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr "Dimm"
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr "Deaktiv."
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr "Motoren aus"
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr "Spannrol. auskuppeln"
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -424,7 +451,7 @@ msgstr ""
 "Abschnitt Erste Schicht Kalibrierung."
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
@@ -432,222 +459,357 @@ msgstr ""
 "Möchten Sie den letzten Schritt wiederholen, um den Abstand zwischen Düse "
 "und Druckbett neu einzustellen?"
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr "Klar"
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr "E-Korrektur:"
 
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr "FEHL. Fil.Hilfe"
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr "FEHLER Intern"
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr "FEHLER TMC"
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr "FEHL. Warte Benutzer"
+
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgstr "FEHLER:"
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
-msgstr "FEHLER: Filament- sensor reagiert nicht, bitte Verbindung prüfen."
-
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr "Filamentauswurf"
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr "werfe Filament aus"
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr "Endanschlag"
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr "Ende nicht getroffen"
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr "Endschalter"
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr "Spannrol. einkuppeln"
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr "Extruder"
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr "Extruderlüfter:"
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr "Extruder Info"
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr "F. autoladen"
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr "FS. Auslauf"
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr "FIL. BEREITS GELADEN"
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr "FINDA N. AUSGELÖST"
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+"Die FINDA schaltete sich beim Entladen nicht aus. Versuchen Sie, Fil. "
+"manuell zu entladen. Überprüfen Sie, dass sich Fil. bewegen kann und die "
+"FINDA funktioniert."
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+"FINDA hat beim Laden des Filaments nicht ausgelöst. Stellen Sie sicher, dass "
+"sich das Filament bewegen kann und FINDA funktioniert."
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr "FINDA NICHT FIL.FREI"
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr "FS Aktion"
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
-msgstr "FS v0.3 oder älter"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr "FSENSOR N. AUSGELÖST"
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
-msgstr "FS v0.4 oder neuer"
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr "FSENSOR ZU FRÜH"
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr "FSENSOR N. FIL.FREI"
+
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
+msgstr "FW-LAUFZEITFEHLER"
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr "Fehlerstatistik"
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr "MMU-Fehler"
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr "Falschtriggerung"
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr "Lüfter-Tempo"
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr "Lüftertest"
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr "Lüfter Check"
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr "Zufuhr zur FINDA"
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr "Zufuhr zum FSensor"
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr "Zufuhr zum Extruder"
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr "Zufuhr zur Düse"
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr "Fil. Mängel"
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr "Fil. Sensor"
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr "Filament"
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr "Filament extrudiert mit richtiger Farbe?"
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr "Fil. nicht geladen"
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr "Filamentsensor"
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+"Der FSensor hat sich beim Entladen des Fil. nicht abgeschaltet. Stellen Sie "
+"sicher, dass sich das Fil. bewegen kann und der Sensor funktioniert."
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+"Der FSensor hat beim Laden des Filaments nicht ausgelöst. Stellen Sie "
+"sicher, dass das Filament den Sensor erreicht hat und der Sensor "
+"funktioniert."
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+"Der FSensor wurde beim Laden in den Extruder zu früh ausgelöst. Prüfen Sie, "
+"dass nichts im PTFE-Schlauch fest- sitzt und der Sensor richtig liest."
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr "Filament benutzt"
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr "Datei unvollständig Trotzdem fortfahren?"
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr "Bewegung beenden"
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr "Erste-Schicht Kal."
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 "Zunächst führe ich den Selbsttest durch, um die häufigsten Probleme beim "
 "Zusammenbau zu überprüfen."
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr "Beseitigen Sie das Problem und drücken Sie dann den Knopf am MMU."
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr "Durchfluss"
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr "Drucklüfter?"
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr "Vorne [μm]"
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr "Druck/Extr. Lüfter"
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-Code ist für einen anderen Level geslict. Fortfahren?"
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
@@ -656,14 +818,14 @@ msgstr ""
 "erneut. Druck abgebrochen."
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-Code ist für einen anderen Drucker geslict. Fortfahren?"
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
@@ -672,12 +834,12 @@ msgstr ""
 "erneut. Druck abgebrochen."
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-Code ist für eine neuere Firmware geslict. Fortfahren?"
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
@@ -686,42 +848,42 @@ msgstr ""
 "Druck abgebrochen."
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr "Gcode"
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr "HW Einstellungen"
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr "Heizung/Thermistor"
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr "Aufwärmen"
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr "Heizung durch Sicherheitstimer deaktiviert."
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr "Aufwärmen OK."
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -732,7 +894,7 @@ msgstr ""
 "Danach sind Sie bereit für den Druck."
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -741,26 +903,47 @@ msgstr ""
 "durch den Einricht- ungsablauf führe?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr "Hohe leist"
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr "Startposition"
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 "Ich werde jetzt die XYZ-Kalibrierung durchführen. Es wird ca. 12 Minuten "
 "dauern."
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr "Ich werde jetzt die Z Kalibrierung durchführen."
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr "SPANNRO. STARTP.FEH."
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr "SPANNROL. SITZT FEST"
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr "UNGÜLTIGER FIL.PLATZ"
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
@@ -769,27 +952,27 @@ msgstr ""
 "Voreinstellungen unter Einstellungen - HW Setup - Stahlbleche."
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr "Verbesserung des Bettkalibrierungspunkts"
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr "Infoanzeige"
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr "Init. SD Karte"
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr "Filament einlegen"
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
@@ -797,269 +980,310 @@ msgstr ""
 "Stecken Sie das Filament (nicht laden) in den Extruder und drücken Sie dann "
 "den Knopf."
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+"Interner Laufzeitfehler. Versuchen Sie, die MMU-Einheit zurückzusetzen oder "
+"die Firmware zu aktualisieren. Wenn das Problem weiterhin besteht, wenden "
+"Sie sich an den Support"
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr "Ist das Filament geladen?"
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr "Liegt das Stahlblech auf dem Heizbett?"
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr "Wiederholung"
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr "Letzter Druck"
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr "Letzte Druckfehler"
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr "Links"
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr "Extruderlüfter?"
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr "Links [μm]"
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr "Hell.wert"
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr "Dimmwert"
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr "Lineare Korrektur"
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr "Z einstellen"
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
 msgstr "Alle laden"
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr "Filament laden"
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr "Lade zum Extruder"
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr "In Düse laden"
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr "Lade Farbe"
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr "Filament lädt"
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr "Lose Riemenscheibe"
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr "Laut"
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
-msgstr "MK3-Firmware am MK3S-Drucker erkannt"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
+msgstr "MMU FW UPDATE NÖTIG"
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
-msgstr "MK3S-Firmware auf MK3-Drucker erkannt"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
+msgstr "MMU Firmware interner Fehler, bitte setzen Sie die MMU zurück."
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr "MMU Mod."
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr "MMU OK. Position wiederherstellen..."
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
-msgstr "MMU OK. Temperatur wiederherstellen..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
+msgstr "MMU REAGIERT NICHT"
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
-msgstr "MMU OK. Weiterdrucken..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
+msgstr "MMU-Neuversuch: Wiederherstelle die Temperatur..."
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr "MMU Fehler"
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr "MMU Ladefehler"
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr "MMU Ladefehler"
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
-msgstr "MMU erfordert Benutzereingriff."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
+msgstr ""
+"MMU-Einheit antwortet nicht korrekt. Überprüfen Sie die Verkabelung und die "
+"Anschlüsse. Wenn das Problem weiterhin besteht, wenden Sie sich an den "
+"Support."
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
-msgstr "MMU Netzfehler"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
+msgstr ""
+"MMU-Einheit antwortet nicht. Überprüfen Sie die Verkabelung und die "
+"Anschlüsse. Wenn das Problem weiterhin besteht, wenden Sie sich an den "
+"Support."
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr "MMU2 verbunden"
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr "Magnet Komp."
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr "Hauptmenü"
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr "Schräglauf"
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr "Messen der Referenzhöhe des Kalibrierpunktes"
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr "Gitter"
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr "MeshBett Ausgleich"
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr "Modus"
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr "Moduswechsel erfolgt..."
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr "Modell"
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr "Weiter Details online."
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr "Mehr⏬"
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr "Motor"
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr "Bewege X"
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr "Bewege Y"
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr "Bewege Z"
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr "Achse bewegen"
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr "Bewege Selektor"
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr "N/V"
 
@@ -1069,155 +1293,163 @@ msgid "New firmware version available:"
 msgstr "Neue Firmware- Version verfügbar:"
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr "Nein"
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr "Keine SD Karte"
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr "Keine Bewegung."
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr "Ohne"
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr "Normal"
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr "Nicht angeschlossen"
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr "Dreht sich nicht"
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 "Jetzt werde ich den Abstand zwischen Düsenspitze und Druckbett kalibrieren."
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Jetzt werde ich die Düse für PLA vorheizen."
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr "Testdruck jetzt von Stahlblech entfernen."
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr "Düse"
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr "Düsen Dia."
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr "OK"
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr "Aus"
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 "Alte Einstellungen gefunden. Standard PID, E-Steps u.s.w. werden gesetzt."
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr "An"
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr "Einmal"
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr "PAUSE THERM. FEHLER"
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr "PID Kal."
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr "PID Kalib. fertig"
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr "PID Kalibrierung"
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr "PINDA erwärmen"
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr "PINDA Kal."
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr "PINDA-Kalibrierung fehlgeschlagen"
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
@@ -1225,19 +1457,36 @@ msgstr ""
 "PINDA Kalibrierung ist fertig + aktiv. Es kann ausgeschaltet werden im Menu "
 "Einstellungen -> PINDA kal."
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr "RIEHMENS. SITZT FEST"
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr "Parke Selektor"
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr "Pause"
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr "Druck pausieren"
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr "Führe Schnitt aus"
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1247,7 +1496,7 @@ msgstr ""
 "ausschalten."
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1261,23 +1510,23 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr "Bitte IR Sensor Verbindungen über- prüfen und Filament entladen ist."
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr "Bitte prüfen:"
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr "Bitte reinigen Sie das Heizbett und drücken Sie dann den Knopf."
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 "Bitte entfernen Sie überstehendes Filament von der Düse. Klicken wenn sauber."
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
@@ -1285,7 +1534,7 @@ msgstr ""
 "Knopf, um es zu laden."
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
@@ -1294,50 +1543,45 @@ msgstr ""
 "Sie dann den Knopf, um es zu laden."
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr "Bitte laden Sie zuerst das Filament."
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr "Bitte Spannrolle öffnen und Filament von Hand entfernen"
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr "Bitte legen Sie das Stahlblech auf das Heizbett."
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr "Bitte drücken Sie den Knopf um das Filament zu entladen."
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr "Bitte ziehen Sie das Filament sofort heraus"
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr "Bitte Filament entfernen und dann den Knopf drücken"
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr "Bitte zuerst Transportsicherungen entfernen."
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr "Bitte entfernen Sie das Stahlblech vom Heizbett."
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr "Bitte zuerst XYZ Kalibrierung ausführen."
 
@@ -1346,113 +1590,109 @@ msgstr "Bitte zuerst XYZ Kalibrierung ausführen."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Bitte entladen Sie erst das Filament und versuchen Sie es nochmal."
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr "Bitte aktualisieren Sie die Firmware in der MMU2. Warte auf Reset."
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr "Bitte aktualisieren."
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr "Bitte warten"
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr "Netzfehler"
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr "Vorheizen"
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr "Düse vorheizen!"
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr "Vorheizen der Düse. Bitte warten."
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr "Heizen zum Schnitt"
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr "Heizen zum Auswurf"
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr "Heizen zum Laden"
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr "Heizen zum Entladen"
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr "Bereite Messer vor"
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr "Knopf drücken zum"
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Bitte drücken Sie den Knopf um die Düse vorzuheizen und fortzufahren."
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr "Drücken Sie den Knopf um die Düsentemperatur wiederherzustellen"
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr "Druck abgebrochen"
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr "Drucklüfter:"
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr "Drucken von SD"
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr "Druck pausiert"
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr "Druckzeit"
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr "Drucker IP Adr.:"
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
@@ -1461,12 +1701,12 @@ msgstr ""
 "Erste Schritte, Abschnitt Kalibrie- rungsablauf."
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Der Durchmesser der Druckerdüse weicht vom G-Code ab. Fortfahren?"
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
@@ -1474,67 +1714,116 @@ msgstr ""
 "Der Durchmesser der Druckerdüse weicht vom G-Code ab. Bitte überprüfen Sie "
 "den Wert in den Einstellungen. Druck abgebrochen."
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+"Der Riemenscheiben- motor ist blockiert. Sicherstellen, dass sich die "
+"Riemenscheibe bewegen kann und die Verkabelung überprüfen."
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr "Schiebe Filament"
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr "QUEUE VOLL"
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr "RPi port"
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr "Hinten [μm]"
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr "Druck wiederherst"
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 "Entfernen Sie das alte Filament und drücken Sie den Knopf, um das neue zu "
 "laden."
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr "Umbenennen"
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+"Der angeforderte Filamentplatz ist auf dieser Hardware nicht verfügbar. "
+"Prüfen Sie den G-Code auf Plätze außerhalb des Bereichs (T0-T4)."
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr "Reset"
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr "Reset MMU"
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr "Reset XYZ Kalibr."
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr "Druck fortsetzen"
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr "Druck fortgesetzt"
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr "Einziehen von FINDA"
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr "Wdh."
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr "Selektor zurückfahr."
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr "Rechts"
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr "Rechts [μm]"
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
@@ -1542,36 +1831,41 @@ msgstr ""
 "Der Assistent wird die aktuellen Kalibrierungsdaten löschen und von vorne "
 "beginnen. Fortfahren?"
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Mängel"
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr "SD Karte"
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr "SELEK. STARTPOSFEHL."
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr "SELEKTOR SITZT FEST"
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr "GESTOPPT."
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr "Suche Bett Kalibrierpunkt"
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr "Auswahl"
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
@@ -1580,65 +1874,72 @@ msgstr ""
 "im On-Screen-Menu aus."
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr "Wähle extruder:"
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr "Wähle filament:"
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr "Wähle Sprache"
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr "Bitte Vorheiztemperatur auswählen, die Ihrem Material entspricht."
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr "Wählen Sie die Temperatur, die zu Ihrem Material passt."
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr "Wähle Filament Platz"
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr "Selbsttest OK"
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr "Selbsttest start"
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr "Selbsttest"
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr "Selbsttest Fehler!"
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr "Selbsttest Error"
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr "Selbsttest wird gestartet, um Startposition zu kalibrieren."
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr "Sensor Info"
 
@@ -1648,31 +1949,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Sensor überprüft, entladen Sie jetzt das Filament."
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr "Temp. einstellen:"
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr "Einstellungen"
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr "Sehr schräg"
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr "Stahlblech"
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1685,18 +1986,18 @@ msgstr ""
 "%cReset"
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr "Endschalter Status"
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr "Leise"
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr "Leicht schräg"
 
@@ -1709,113 +2010,179 @@ msgstr ""
 "Einige Dateien wur- den nicht sortiert. Max. Dateien pro Verzeichnis = 100."
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Fehler aufgetreten, Z-Kalibrierung erforderlich..."
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr "Sort."
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr "Sortiere Dateien"
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr "Ton"
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr "Geschwindigkeit"
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr "Dreht sich"
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 "Stabile Umgebungs- temperatur 21-26C und feste Stand- fläche erforderlich"
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr "Statistiken"
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr "Leise"
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr "Stahlbleche"
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr "Stop"
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr "Druck abbrechen"
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr "Strikt"
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr "Support"
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr "Ausgetauscht"
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr "THERMISCHE ANOMALIE"
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr "TM kal. fehlgeschlg."
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr "TMC TREIBER FEHLER"
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr "TMC TREIBER RESET"
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr "TMC KURZSCHLUSS"
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr "TMC ÜBERHITZ.FEHL."
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr "TMC UNTERSPANN.FEHL."
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr "Temp. Model Autokal."
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr "Temperatur"
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr "Temperaturen"
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr "Teste filament"
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+"Die Spannrolle kann die Startposition nicht richtig erreichen. Prüfen Sie, "
+"ob irgendetwas seine Bewegung blockiert."
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+"Die MMU-Einheit meldet, dass ihre FW-Version nicht mit der Firmware des "
+"Druckers kompatibel ist. Stellen Sie sicher, dass die MMU-Firmware auf dem "
+"neuesten Stand ist."
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+"Der Selektor kann die Startposition nicht richtig erreichen. Prüfen Sie, ob "
+"irgendetwas seine Bewegung blockiert."
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1826,7 +2193,7 @@ msgstr ""
 "im Handbuch (Kapitel Kalibrierung)."
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
@@ -1835,68 +2202,106 @@ msgstr ""
 "Sie das Handbuch, Kapitel Erste Schritte, Abschnitt Kalibrierablauf."
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr "Zeit"
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr "Timeout"
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr "Gesamt"
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr "Gesamte Fehler"
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr "Gesamtes Filament"
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr "Gesamte Druckzeit"
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr "Feineinstellung"
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr "ENTLADE MANUELL"
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+"Unerwarteter FINDA-Wert. Stellen Sie sicher, dass sich kein Filament unter "
+"FINDA befindet und der Selektor frei ist. Prüfen Sie die FINDA-Verbindung."
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr "Entla."
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr "Fil. entladen"
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr "Filament auswerfen"
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr "Entlade zur FINDA"
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr "Entlade zur Riemens."
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 "Überprüfung fehl- geschlagen, entladen Sie das Filament und versuchen Sie es "
 "erneut."
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr "Spannungen"
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr "WARNUNG TMC ZU HEISS"
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1909,99 +2314,99 @@ msgstr ""
 "Stealth Modus"
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr "Warte auf Benutzer.."
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr "Warten, bis PINDA- Sonde abgekühlt ist"
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Warten bis Heizung und Bett abgekühlt sind"
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr "Warnen"
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Warnung: Druckertyp und Platinentyp wurden beide geändert."
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr "Warnung: Platinentyp wurde geändert."
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr "Warnung: Druckertyp wurde geändert."
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr "Konnten Sie das Filament entnehmen?"
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr "Verdrahtungsfehler"
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr "Assistent"
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr "X-Korrektur:"
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr "XFLASH init"
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr "XYZ Kal. Details"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "XYZ Kalibrierung in Ordnung. Schräglauf wird automatisch korrigiert."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 "XYZ Kalibrierung in Ordnung. X/Y Achsen sind etwas schräg. Gut gemacht!"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 "XYZ-Kalibrierung beeinträchtigt. Vordere Kalibrierpunkte nicht erreichbar."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
@@ -2009,125 +2414,185 @@ msgstr ""
 "erreichbar."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt ist nicht "
 "erreichbar."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "XYZ-Kalibrierung ok. X/Y-Achsen sind senkrecht zueinander Glückwunsch!"
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr "Y Entfernung vom Min"
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr "Y-Korrektur:"
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr "Ja"
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 "Sie können den Assistenten immer im Menu neu starten: Kalibrierung -> "
 "Assistent"
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr "Z-Korrektur:"
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr "Z-Test Nr."
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr "[0;0] Punktversatz"
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr "und Knopf drücken"
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr "um Filament laden"
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr "um Filament entladen"
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr "unbekannt"
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr "Status unbekannt"
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr "🔃Aktualisiere"
 
+#~ msgid ""
+#~ "Autoloading filament available only when filament sensor is turned on..."
+#~ msgstr ""
+#~ "Automatisches Laden Filament nur bei eingeschaltetem Fil. sensor "
+#~ "verfügbar..."
+
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Crash erkannt. Druck fortführen?"
 
+#~ msgid "Cutting filament"
+#~ msgstr "Schneide filament"
+
+#~ msgid "ERROR: Filament sensor is not responding, please check connection."
+#~ msgstr "FEHLER: Filament- sensor reagiert nicht, bitte Verbindung prüfen."
+
+#~ msgid "FS v0.3 or older"
+#~ msgstr "FS v0.3 oder älter"
+
+#~ msgid "FS v0.4 or newer"
+#~ msgstr "FS v0.4 oder neuer"
+
+#~ msgid "Fix the issue and then press button on MMU unit."
+#~ msgstr "Beseitigen Sie das Problem und drücken Sie dann den Knopf am MMU."
+
+#~ msgid "Load all"
+#~ msgstr "Alle laden"
+
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Erste-Schicht Kal."
+
+#~ msgid "MK3 firmware detected on MK3S printer"
+#~ msgstr "MK3-Firmware am MK3S-Drucker erkannt"
+
+#~ msgid "MK3S firmware detected on MK3 printer"
+#~ msgstr "MK3S-Firmware auf MK3-Drucker erkannt"
+
+#~ msgid "MMU OK. Resuming position..."
+#~ msgstr "MMU OK. Position wiederherstellen..."
+
+#~ msgid "MMU OK. Resuming temperature..."
+#~ msgstr "MMU OK. Temperatur wiederherstellen..."
+
+#~ msgid "MMU OK. Resuming..."
+#~ msgstr "MMU OK. Weiterdrucken..."
+
+#~ msgid "MMU load failed"
+#~ msgstr "MMU Ladefehler"
+
+#~ msgid "MMU needs user attention."
+#~ msgstr "MMU erfordert Benutzereingriff."
+
+#~ msgid "MMU power fails"
+#~ msgstr "MMU Netzfehler"
+
+#~ msgid "Please remove filament and then press the knob."
+#~ msgstr "Bitte Filament entfernen und dann den Knopf drücken"
+
+#~ msgid "Please update firmware in your MMU2. Waiting for reset."
+#~ msgstr "Bitte aktualisieren Sie die Firmware in der MMU2. Warte auf Reset."
+
+#~ msgid "Press the knob to resume nozzle temperature."
+#~ msgstr "Drücken Sie den Knopf um die Düsentemperatur wiederherzustellen"
+
+#~ msgid "Runouts"
+#~ msgstr "Mängel"

+ 1020 - 590
lang/po/Firmware_es.po

@@ -16,151 +16,153 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr " 0.3 o mayor"
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr " 0.4 o mas nueva"
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr "%s nivel esperado"
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ">Cancelar"
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr "Ajustar-Z:"
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr "Todo bien"
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr "Terminado! Feliz impresion!"
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr "Alfabet"
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr "Ambiente"
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr "Carros Z izq./der. estan arriba maximo?"
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr "Asist."
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr "Llevar al origen"
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr "Encendido"
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr "Carga auto. filam."
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-"La carga automatica solo funciona si el sensor de filamento esta activado..."
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 "La carga automatica esta activada, pulse el dial e inserte el filamento..."
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr "Eje"
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr "Longitud del eje"
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr "atras"
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr "Base"
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr "Calentando Base"
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr "Base preparada"
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr "Corr. de la cama"
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
@@ -168,50 +170,55 @@ msgstr ""
 "Nivelacion fallada. Sensor no funciona. Restos en boquilla? Esperando reset."
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr "Base/Calentador"
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr "Estado de correa"
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr "Test cinturon"
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr "Se fue la luz. Re- anudar la impresion?"
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr "Brill."
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr "Brillo"
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr "Calibrar XYZ"
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr "Calibrar Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -220,13 +227,13 @@ msgstr ""
 "superiores. Despues haz clic."
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr "Calibrando Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -235,140 +242,151 @@ msgstr ""
 "superiores. Despues haz clic."
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr "Calibrar pos.inicial"
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr "Calibracion"
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr "Calibracion OK"
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr "Tarjeta retirada"
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr "Cambiar filamento"
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr "Cambio correcto!"
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr "Cambio correcto?"
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr "Control sensor X"
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr "Control sensor Y"
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr "Control sensor Z"
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr "Control base cal."
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr "Control endstops"
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr "Verif. archivo"
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr "Control fusor"
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr "Comprobando sensores"
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr "Comprobaciones"
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr "Color no homogeneo"
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr "Desde la comunidad"
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr ""
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr "Enfriar"
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr "Copiar idioma seleccionado?"
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr "Choque"
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr "Det. choque"
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr "Choque detectado."
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -379,39 +397,46 @@ msgstr ""
 "Modo normal"
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr "Cortar filament"
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr "Cuchillo"
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Corte de filament"
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr "Fecha:"
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr "Oscuro"
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr "Apagar motores"
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -423,230 +448,352 @@ msgstr ""
 "primera capa."
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 msgstr ""
 "Quieres repetir el ultimo paso para reajustar la distancia boquilla-base?"
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr "Corregir-E:"
 
-#. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
-msgid "ERROR:"
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
 msgstr ""
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr ""
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
+#. MSG_ERROR c=10
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
+msgid "ERROR:"
 msgstr ""
-"ERROR:Sensor de fi- lamento no responde Por favor, comprue- ba la conexion."
 
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr "Expulsar fil."
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr "Expulsando filamento"
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr "Endstop no alcanzado"
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr ""
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr "Extruir"
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr "Vent.extrusor:"
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr "Info. del extrusor"
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr "Autocarg.fil."
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr "FS accion"
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
-msgstr "FS 0.3 o mayor"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
-msgstr "FS 0.4 o mas nueva"
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
+msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr "Estadistica Fallos"
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr "Total Fallos MMU"
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr "Falsa activacion"
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr "Velocidad Vent"
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr "Test ventiladores"
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr "Comprob.vent"
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr "Fil. acabado"
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr "Sensor Fil."
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr "Filamento"
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr "Es nitido el color nuevo?"
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr "Fil. no introducido"
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr "Sensor de fil."
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr "Filamento usado"
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr "Archivo incompleto. Continuar de todos modos?"
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr "Term. movimientos"
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr "Cal. primera cap."
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 "Primero, hare el Selftest para comprobar los problemas de montaje mas "
 "comunes."
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr "Corrige el problema y pulsa el boton en la unidad MMU."
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr "Flujo"
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr "Vent. frontal?"
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr "Frontal [μm]"
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr "Vents. front/izqui"
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr "Codigo G laminado para un nivel diferente. Continuar?"
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
@@ -655,14 +802,14 @@ msgstr ""
 "nuevo. Impresion cancelada."
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "Codigo G laminado para un tipo de impresora diferente. Continuar?"
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
@@ -671,12 +818,12 @@ msgstr ""
 "de nuevo. Impresion cancelada."
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "Codigo G laminado para nuevo firmware. Continuar?"
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
@@ -685,42 +832,42 @@ msgstr ""
 "Impresion cancelada."
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr "Configuracion HW"
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr "Calentador/Termistor"
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr "Calentando..."
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr "Calentadores desactivados por el temporizador de seguridad."
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr "Calentando acabado."
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -731,7 +878,7 @@ msgstr ""
 "listo para imprimir."
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -740,24 +887,45 @@ msgstr ""
 "configuracion?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr "Rend.pleno"
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Hare la calibracion XYZ. Tardara 12 min. aproximadamente."
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr "Voy a hacer Calibracion Z ahora."
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
@@ -766,296 +934,328 @@ msgstr ""
 "Ajustes HW - Planchas acero."
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr "Monitorizar"
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr "Introducir filamento"
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr ""
 "Inserte el filamento (no lo cargue) en el extrusor y luego presione el dial."
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr "Esta el filamento cargado?"
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr "Esta coloc.la lamina sobre la base?"
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr "Iteracion"
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr "Ultima impresion"
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr "Ultimos imp. fallos"
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr "Izquierda"
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr "Vent. izquierdo?"
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr "Izquierda [μm]"
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr "Valor brill."
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr "Valor oscuro"
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr "Correc. Linealidad"
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr "Micropaso Eje Z"
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
-msgstr "Intr. todos fil."
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
+msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr "Introducir filam."
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr "Cargar a boquilla"
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr "Cambiando color"
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr "Introduciendo filam."
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr "Polea suelta"
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr "Alto"
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
-msgstr "Firmware MK3 detectado en impresora MK3S"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
+msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
-msgstr "Firmware MK3S detectado en impresora MK3"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
+msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr "Modo MMU"
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr "MMU OK. Restaurando posicion..."
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
-msgstr "MMU OK. Restaurando temperatura..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
+msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
-msgstr "MMU OK. Resumiendo..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
+msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr "Fallos MMU"
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr "Carga MMU fallida"
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr "Carga MMU falla"
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
-msgstr "MMU necesita atencion del usuario."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
+msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
-msgstr "Fallo red MMU"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
+msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr "MMU2 conectado"
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr "Comp. imanes"
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr "Menu principal"
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr "No a escuadra"
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr "Midiendo altura del punto de calibracion"
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr "Malla"
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr "Nivela. Mesh Level"
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr "Modo"
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr "Cambio de modo progresando ..."
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr "Modelo"
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr "Mover X"
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr "Mover Y"
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr "Mover Z"
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr "Mover ejes"
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr "N/D"
 
@@ -1065,51 +1265,51 @@ msgid "New firmware version available:"
 msgstr "Nuevo firmware disponible:"
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr ""
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr "No hay tarjeta SD"
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr "Sin movimiento"
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr "Ninguno"
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr "No hay conexion"
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr "Ventilador no gira"
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
@@ -1117,105 +1317,113 @@ msgstr ""
 "la base."
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Ahora precalentare la boquilla para PLA."
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr "Ahora retira la prueba de la lamina de acero."
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr "Boquilla"
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr "D-boquilla"
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr "Ina"
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 "Se han encontrado ajustes anteriores. Se ajustara el PID, los pasos del "
 "extrusor, etc"
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr "Act"
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr "Una vez"
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr "Cal. PID"
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr "Cal. PID terminada"
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr "Calibracion PID"
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr "Calentando PINDA"
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr "Cal. PINDA"
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr "Fallo de la calibracion de PINDA"
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
@@ -1223,19 +1431,36 @@ msgstr ""
 "La calibracion PINDA esta finalizada y activa. Se puede desactivar en el "
 "menu Configuracion->Cal. PINDA"
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr "Pausa"
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr "Pausar impresion"
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1245,7 +1470,7 @@ msgstr ""
 "impresora inmediatamente."
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1260,22 +1485,22 @@ msgstr ""
 "Por favor comprueba la conexion del IR sensor y filamento esta descargado."
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr "Controla:"
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr "Limpia la superficie de la base, por favor, y luego presione el dial."
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Limpia boquilla para calibracion. Click cuando acabes."
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
@@ -1283,7 +1508,7 @@ msgstr ""
 "cargarlo."
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
@@ -1292,52 +1517,47 @@ msgstr ""
 "dial para cargarlo."
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr "Por favor, cargar primero el filamento."
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr ""
 "Por favor abate el rodillo de empuje (idler) y retira el filamento "
 "manualmente."
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr "Por favor coloca la chapa de acero en la base calefactable."
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr "Por favor, pulsa el dial para descargar el filamento"
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr "Por favor retire el filamento de inmediato"
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr "Por favor quite el filamento y luego presione el dial."
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr "Por favor retira los soportes de envio primero."
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr "Por favor retire la chapa de acero de la base calefactable."
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr "Por favor realiza la calibracion XYZ primero."
 
@@ -1346,113 +1566,109 @@ msgstr "Por favor realiza la calibracion XYZ primero."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Primero descargue el filamento, luego repita esta accion."
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr "Por favor actualice el firmware en tu MMU2. Esperando el reseteo."
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr "Actualize por favor"
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr "Por Favor Espere"
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr "Fallas energia"
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr "Precalentar"
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr "Precalienta extrusor"
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr "Precalentando nozzle. Espera por favor."
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr "Precalent. laminar"
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr "Precalent. expulsar"
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr "Precalent. cargar"
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr "Precalent. descargar"
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr "Pulsa el dial"
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Pulsa el dial para precalentar la boquilla y continue."
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr "Presione el dial para continuar con la temperatura de la boquilla."
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr "Impresion cancelada"
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr "Vent.fusor:"
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr "Menu tarjeta SD"
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr "Impresion en pausa"
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr "Tiempo de imp."
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr "Dir. IP impresora:"
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
@@ -1461,12 +1677,12 @@ msgstr ""
 "Primeros pasos Calibracion flujo."
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Diametro nozzle impresora difiere de cod.G. Continuar?"
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
@@ -1474,67 +1690,112 @@ msgstr ""
 "Diametro nozzle Impresora difiere de cod.G. Comprueba los valores en "
 "ajustes. Impresion cancelada."
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr "Puerto RPi"
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr "Trasera [μm]"
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr "Recuper. impresion"
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 "Retire el filamento viejo y presione el dial para comenzar a cargar el nuevo "
 "filamento."
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr "Renombrar"
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr ""
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr ""
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr "Reanudar impres."
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr "Continuan. impresion"
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr "Derecha"
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr "Derecha [μm]"
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
@@ -1542,36 +1803,41 @@ msgstr ""
 "Ejecutar el Wizard borrara los valores de calibracion actuales y comenzara "
 "de nuevo. Continuar?"
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Falla"
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr "Tarj. SD"
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr "PARADA"
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr "Buscando punto de calibracion base"
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr "Seleccionar"
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
@@ -1580,69 +1846,76 @@ msgstr ""
 "el menu en pantalla."
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr "Elegir extrusor:"
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr "Selecciona filam.:"
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr "Cambiar el idioma"
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 "Selecciona la temperatura para precalentar la boquilla que se ajuste a tu "
 "material."
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr "Selecciona la temperatura adecuada a tu material."
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr ""
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr "Iniciar Selftest"
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr ""
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr "Error Selftest!"
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr "Fallo Selftest"
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 "Se realizara el auto-test para calibrar con precision la vuelta a la "
 "posicion inicial sin sensores."
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr "Info sensor"
 
@@ -1652,31 +1925,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Sensor verificado, retire el filamento ahora."
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr "Establecer temp.:"
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr "Configuracion"
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr "Severo sesgar"
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr "Lamina"
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1689,18 +1962,18 @@ msgstr ""
 "%cReset"
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr "Mostrar endstops"
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr "Acallar"
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr "Ligera sesgar"
 
@@ -1714,113 +1987,172 @@ msgstr ""
 "ordenar."
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Problema encontrado, nivelacion Z forzosa ..."
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr "Ordenar"
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr "Ordenando archivos"
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr "Sonido"
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr "Velocidad"
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr "Ventilador girando"
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 "Se necesita una temperatura ambiente ente 21 y 26C y un soporte rigido."
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr "Estadisticas"
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr "Sigilo"
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr "Lamina de acero"
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr "Detener impresion"
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr "Estrict"
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr "Soporte"
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr "Intercambiado"
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr "Temperatura"
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr "Temperaturas"
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1831,7 +2163,7 @@ msgstr ""
 "de calibracion)."
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
@@ -1840,66 +2172,102 @@ msgstr ""
 "capitulo Primeros pasos, seccion Calibracion del flujo."
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr "Fecha"
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr "Expirar"
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr ""
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr "Fallos totales"
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr "Filamento total"
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr "Tiempo total"
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr "Ajustar"
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr "Soltar filamento"
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr "Soltando filamento"
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr "La verificacion fallo, retire el filamento e intente nuevamente."
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr "Voltajes"
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1912,220 +2280,282 @@ msgstr ""
 "Modo silencio"
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr "Esperando ordenes..."
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr "Esperando a que se enfrie la sonda PINDA"
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Esperando enfriamiento de la base y extrusor."
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr "Aviso"
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 "Aviso: tanto el tipo de impresora como el tipo de la placa han cambiado."
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr "Cuidado: el tipo de placa ha cambiado."
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr "Cuidado: Ha cambiado el tipo de impresora."
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr "Se descargo con exito el filamento?"
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr "Error de conexion"
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr ""
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr "Corregir-X:"
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr "Detalles cal. XYZ"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "Calibracion XYZ correcta. La inclinacion se corregira automaticamente."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen "
 "trabajo!"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr "Calibrazion XYZ comprometida. Puntos frontales no alcanzables."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr "Calibrazion XYZ comprometida. Punto frontal derecho no alcanzable."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 "Calibracion XYZ fallada. Puntos de calibracion en la base no encontrados."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr "Calibracion XYZ fallada. Puntos frontales no alcanzables."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Calibracion XYZ fallada. Consulta el manual por favor."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr "Calibracion XYZ fallad. Punto frontal derecho no alcanzable."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Calibracion XYZ ok. Ejes X/Y perpendiculares. Enhorabuena!"
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr "Dist. en Y desde min"
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr "Corregir-Y:"
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr "Si"
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "Siempre puedes acceder al asistente desde Calibracion -> Wizard"
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr "Corregir-Z:"
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr "Z-sensor nr."
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr "[0;0] punto offset"
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr "y presione el dial"
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr "para cargar el fil."
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr "para descargar fil."
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr "desconocido"
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr "estado desconocido"
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr "🔃Actualizar"
 
+#~ msgid ""
+#~ "Autoloading filament available only when filament sensor is turned on..."
+#~ msgstr ""
+#~ "La carga automatica solo funciona si el sensor de filamento esta "
+#~ "activado..."
+
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Choque detectado. Continuar impresion?"
 
+#~ msgid "Cutting filament"
+#~ msgstr "Corte de filament"
+
+#~ msgid "ERROR: Filament sensor is not responding, please check connection."
+#~ msgstr ""
+#~ "ERROR:Sensor de fi- lamento no responde Por favor, comprue- ba la "
+#~ "conexion."
+
+#~ msgid "FS v0.3 or older"
+#~ msgstr "FS 0.3 o mayor"
+
+#~ msgid "FS v0.4 or newer"
+#~ msgstr "FS 0.4 o mas nueva"
+
+#~ msgid "Fix the issue and then press button on MMU unit."
+#~ msgstr "Corrige el problema y pulsa el boton en la unidad MMU."
+
+#~ msgid "Load all"
+#~ msgstr "Intr. todos fil."
+
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Cal. primera cap."
+
+#~ msgid "MK3 firmware detected on MK3S printer"
+#~ msgstr "Firmware MK3 detectado en impresora MK3S"
+
+#~ msgid "MK3S firmware detected on MK3 printer"
+#~ msgstr "Firmware MK3S detectado en impresora MK3"
+
+#~ msgid "MMU OK. Resuming position..."
+#~ msgstr "MMU OK. Restaurando posicion..."
+
+#~ msgid "MMU OK. Resuming temperature..."
+#~ msgstr "MMU OK. Restaurando temperatura..."
+
+#~ msgid "MMU OK. Resuming..."
+#~ msgstr "MMU OK. Resumiendo..."
+
+#~ msgid "MMU load failed"
+#~ msgstr "Carga MMU fallida"
+
+#~ msgid "MMU needs user attention."
+#~ msgstr "MMU necesita atencion del usuario."
+
+#~ msgid "MMU power fails"
+#~ msgstr "Fallo red MMU"
+
+#~ msgid "Please remove filament and then press the knob."
+#~ msgstr "Por favor quite el filamento y luego presione el dial."
+
+#~ msgid "Please update firmware in your MMU2. Waiting for reset."
+#~ msgstr "Por favor actualice el firmware en tu MMU2. Esperando el reseteo."
+
+#~ msgid "Press the knob to resume nozzle temperature."
+#~ msgstr "Presione el dial para continuar con la temperatura de la boquilla."
+
+#~ msgid "Runouts"
+#~ msgstr "Falla"

+ 1020 - 590
lang/po/Firmware_fr.po

@@ -16,151 +16,153 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr " 0.3 ou +ancien"
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr " 0.4 ou +recent"
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr "niveau %s attendu"
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ">Annuler"
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr "Ajuster Z:"
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr "Tout est correct"
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr "Tout est pret. Bonne impression!"
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr ""
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr "Ambiant"
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr "Z~carriages gauche + droite tout en haut?"
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr ""
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr "Mise a 0 des axes"
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr "Puiss.auto"
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr "Autocharge du fil."
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-"Chargement auto du filament uniquement si le capteur de filament est active."
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 "Chargement auto. du fil. active, appuyez sur le bouton et inserez le fil."
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr "Axe"
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr "Longueur de l'axe"
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr "Retour"
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr "Lit"
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr "Chauffe du lit"
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr "Plateau termine"
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr "Reglage plateau"
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
@@ -169,50 +171,55 @@ msgstr ""
 "attente d'un reset."
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr "Lit/Chauffage"
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr "Statut courroie"
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr "Test de courroie"
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr "Coupure detectee. Reprendre impres.?"
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr "Brill."
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr "Luminosite"
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr "Calibrer XYZ"
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr "Calibrer Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -221,13 +228,13 @@ msgstr ""
 "l'axe Z jusqu'aux butees. Cliquez une fois fait."
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr "Calibration Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -236,140 +243,151 @@ msgstr ""
 "Z jusqu'aux butees. Cliquez une fois fait."
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr "Calib. mise a 0"
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr ""
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr "Calibration terminee"
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr "Carte retiree"
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr "Changer filament"
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr "Changement reussi!"
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr "Change correctement?"
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr "Verification axe X"
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr "Verification axe Y"
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr "Verification axe Z"
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr "Verif. plateau chauf"
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr "Verification butees"
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr "Verific. fichier"
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr "Verif. du hotend"
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr "Verif. des capteurs"
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr "Verifications"
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr "Couleur incorrecte"
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr "Fait de community"
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr ""
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr "Refroidissement"
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr "Copier la langue choisie?"
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr ""
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr "Detect.crash"
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr "Crash detecte."
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -381,39 +399,46 @@ msgstr ""
 "mode Normal"
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr "Coupe filament"
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr "Coupeur"
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Je coupe filament"
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr ""
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr "Sombre"
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr "Desactiver moteurs"
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -425,7 +450,7 @@ msgstr ""
 "Calibration de la premiere couche."
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
@@ -433,222 +458,345 @@ msgstr ""
 "Voulez-vous refaire l'etape pour reajuster la hauteur entre la buse et le "
 "plateau chauffant?"
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr "Correct-E:"
 
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr ""
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgstr "ERREUR:"
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
-msgstr "ERREUR: Le capteur de filament ne repond pas, verifiez le branchement."
-
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr "Remonter le fil."
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr "Le fil. remonte"
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr "Butee"
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr "Butee non atteinte"
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr "Butees"
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr "Extrudeur"
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr "Vent. extrudeur:"
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr "Infos extrudeur"
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr "F. autocharg."
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr ""
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
-msgstr "FS v0.3 ou +ancien"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
-msgstr "FS v0.4 ou +recent"
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
+msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr "Stat. d'echec"
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr "Stat. d'echec MMU"
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr "Faux declenchement"
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr "Vitesse vent."
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr "Test du ventilateur"
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr "Verif vent."
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr "Fins filament"
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr "Capteur Fil."
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr "Filament extrude et avec bonne couleur?"
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr "Filament non charge"
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr "Capteur de fil."
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr "Filament utilise"
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr "Fichier incomplet. Continuer qd meme?"
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr "Mouvement final"
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr "Cal. 1ere couche"
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 "D'abord, je vais lancer le Auto-test pour verifier les problemes "
 "d'assemblage les plus communs."
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr "Corrigez le probleme et appuyez sur le bouton sur la MMU."
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr "Flux"
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr "Ventilo impr avant?"
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr "Avant [μm]"
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr "Ventilos avt/gauche"
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr "Le G-code a ete prepare pour un niveau different. Continuer?"
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
@@ -657,15 +805,15 @@ msgstr ""
 "modele a nouveau. L'impression a ete annulee."
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 "Le G-code a ete prepare pour une autre version de l'imprimante. Continuer?"
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
@@ -674,13 +822,13 @@ msgstr ""
 "decouper le modele a nouveau. L'impression a ete annulee."
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 "Le G-code a ete prepare pour une version plus recente du firmware. Continuer?"
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
@@ -689,42 +837,42 @@ msgstr ""
 "mettre a jour le firmware. L'impression annulee."
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr "Config HW"
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr "Chauffage/Thermistor"
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr "Chauffe"
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr "Chauffage desactivee par le compteur de securite."
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr "Chauffe terminee."
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -735,7 +883,7 @@ msgstr ""
 "calibrer le Z-axis. Apres cela, tout sera pret pour imprimer."
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -744,25 +892,46 @@ msgstr ""
 "guide a travers le processus d'installation?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr "Haut.puiss"
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 "Je vais maintenant lancer la calibration XYZ. Cela prendra 12 min environ."
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr "Je vais maintenant lancer la calibration Z."
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
@@ -771,27 +940,27 @@ msgstr ""
 "Reglages - Config HW - Plaque en acier."
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr "Ecran d'info"
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr "Inserez le filament"
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
@@ -799,269 +968,301 @@ msgstr ""
 "Veuillez inserer le filament ( ne le chargez pas) dans l'extrudeur, puis "
 "appuyez sur le bouton."
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr "Fil. est-il charge?"
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr "Est la plaque sur le plat. chauffant?"
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr ""
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr "Derniere impres."
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr "Echecs derniere imp."
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr "Gauche"
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr "Ventilo gauche?"
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr "Gauche [μm]"
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr "Niveau brill"
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr "Niv. sombre"
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr "Correction lin."
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr "Ajuster Z en dir."
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
-msgstr "Charger un par un"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
+msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr "Charger filament"
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr "Charger la buse"
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr "Charg. de la couleur"
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr "Chargement du fil."
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr "Poulie lache"
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr "Fort"
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
-msgstr "Firmware MK3 detecte sur imprimante MK3S"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
+msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
-msgstr "Firmware MK3S detecte sur imprimante MK3"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
+msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr "Mode MMU"
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr "MMU OK. Reprise de la position ..."
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
-msgstr "MMU OK. Rechauffage de la buse..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
+msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
-msgstr "MMU OK. Reprise ..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
+msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr "Echecs MMU"
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr "Def. charg. MMU"
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr "Def. charg. MMU"
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
-msgstr "Le MMU necessite l'attention de l'utilisateur."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
+msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
-msgstr "Def. alim. MMU"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
+msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr "MMU2 connecte"
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr "Compens. aim."
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr "Menu principal"
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr "Var. mesuree"
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr "Je mesure la hauteur de reference du point de calibrage"
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr ""
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr ""
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr ""
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr "Changement de mode en cours..."
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr "Modele"
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr "Moteur"
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr "Deplacer X"
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr "Deplacer Y"
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr "Deplacer Z"
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr "Deplacer l'axe"
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr "I/D"
 
@@ -1071,51 +1272,51 @@ msgid "New firmware version available:"
 msgstr "Nouvelle version de firmware disponible:"
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr "Non"
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr "Pas de carte SD"
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr "Pas de mouvement."
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr "Aucun"
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr "Non connecte"
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr "Ne tourne pas"
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
@@ -1123,104 +1324,112 @@ msgstr ""
 "surface du plateau chauffant."
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Maintenant je vais prechauffer la buse pour du PLA."
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr "Retirez maintenant l'impression de test de la plaque en acier."
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr "Buse"
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr "Diam. buse"
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr ""
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 "Anciens reglages trouves. Le PID, les Esteps etc. par defaut seront regles"
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr ""
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr "1 fois"
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr "Calib. PID"
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr "Calib. PID terminee"
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr "Calibration PID"
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr "Chauffe de la PINDA"
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr "Calib. PINDA"
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr "Echec de la calibration en PINDA"
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
@@ -1228,19 +1437,36 @@ msgstr ""
 "La calibration en PINDA est terminee et activee. Il peut etre desactivee "
 "dans le menu Reglages-> Calib. PINDA"
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr ""
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr "Pause de l'impr."
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1249,7 +1475,7 @@ msgstr ""
 "premiers points. Si la buse accroche le papier, eteignez vite l'imprimante."
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1263,22 +1489,22 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr "SVP, verifiez la connexion du capteur IR et decharge le filament."
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr "Verifiez:"
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr "Nettoyez plateau chauffant en acier et appuyez sur le bouton."
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Nettoyez la buse pour la calibration. Cliquez une fois fait."
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
@@ -1286,7 +1512,7 @@ msgstr ""
 "pour le charger."
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
@@ -1295,50 +1521,45 @@ msgstr ""
 "le bouton pour le charger."
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr "Veuillez d'abord charger un filament."
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr "Ouvrez l'idler et retirez le filament manuellement."
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr "Placez la plaque en acier sur le plateau chauffant."
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr "Appuyez sur le bouton pour decharger le filament"
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr "Retirez immediatement le filament"
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr "Veuillez retirer le filament puis appuyez sur le bouton."
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr "Retirez d'abord les protections de transport."
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr "Retirez la plaque en acier du plateau chauffant."
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr "Veuillez d'abord lancer la calibration XYZ."
 
@@ -1347,114 +1568,109 @@ msgstr "Veuillez d'abord lancer la calibration XYZ."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "SVP, dechargez le filament et reessayez."
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr ""
-"Veuillez mettre a jour le firmware de votre MMU2. En attente d'un reset."
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr "Mettez a jour le FW."
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr "Merci de patienter"
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr "Coup.de courant"
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr "Prechauffage"
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr "Prechauffez la buse!"
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr "Prechauffage de la buse. Merci de patienter."
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr "Chauffe pour couper"
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr "Chauf. pour remonter"
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr "Chauffe pour charger"
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr "Chauf.pour decharger"
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr "App. sur sur bouton"
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Appuyez sur le bouton pour prechauffer la buse et continuer."
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr "Appuyez sur le bouton pour rechauffer la buse."
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr "Impression annulee"
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr "Vent. impr:"
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr "Impr. depuis la SD"
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr "Impression en pause"
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr "Temps d'impression"
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr "Adr.IP imprimante:"
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
@@ -1463,14 +1679,14 @@ msgstr ""
 "Premiers pas, section Processus de calibration."
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 "Diametre de la buse dans les reglages ne correspond pas a celui dans le G-"
 "Code. Continuer?"
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
@@ -1478,66 +1694,111 @@ msgstr ""
 "Diametre de la buse dans les reglages ne correspond pas a celui dans le G-"
 "Code. Merci de verifier le parametre dans les reglages. Impression annulee."
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr "Port RPi"
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr "Arriere [μm]"
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr "Recup. impression"
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 "Retirez l'ancien filament puis appuyez sur le bouton pour charger le nouveau."
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr "Renommer"
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr "Reinitialiser"
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr "Reinit. calib. XYZ"
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr "Reprise impression"
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr "Reprise de l'impr."
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr "Droite"
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr "Droite [μm]"
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
@@ -1545,36 +1806,41 @@ msgstr ""
 "Lancement de l'Assistant supprimera les resultats actuels de calibration et "
 "commencera du debut. Continuer?"
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Fins"
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr "Carte SD"
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr "ARRETE."
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr "Recherche point calibration du plateau"
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr "Selectionner"
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
@@ -1583,68 +1849,75 @@ msgstr ""
 "selectionnez-le depuis le menu a l'ecran."
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr "Choisir extrudeur:"
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr "Choix du filament:"
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr "Choisir langue"
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 "Selectionnez la temperature de prechauffage de la buse qui correspond a "
 "votre materiau."
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr "Selectionnez la temperature qui correspond a votre materiau."
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr "Auto-test OK"
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr "Debut auto-test"
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr "Auto-test"
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr "Erreur auto-test!"
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr "Echec de l'auto-test"
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 "Le Selftest sera lance pour calibrer la remise a zero precise sans capteur"
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr "Info capteur"
 
@@ -1654,31 +1927,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Capteur verifie, retirez le filament maintenant."
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr "Regler temp.:"
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr "Reglages"
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr "Deviat.sev."
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr "Plaque"
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1691,18 +1964,18 @@ msgstr ""
 "%cReinitialiser"
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr "Afficher butees"
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr "Furtif"
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr "Deviat.leg."
 
@@ -1715,113 +1988,172 @@ msgstr ""
 "Certains fichiers ne seront pas tries. Max 100 fichiers tries par dossier."
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Probleme rencontre, cliquez sur le bouton pour niveller l'axe Z..."
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr "Tri"
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr "Tri des fichiers"
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr "Son"
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr "Vitesse"
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr "Tourne"
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 "Une temperature ambiante stable de 21-26C et un support stable sont requis."
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr "Statistiques"
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr "Furtif"
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr "Plaques en acier"
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr "Arreter impression"
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr "Stricte"
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr ""
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr "Echange"
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr ""
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr ""
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1832,7 +2164,7 @@ msgstr ""
 "(chapitre Calibration)."
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
@@ -1841,66 +2173,102 @@ msgstr ""
 "chapitre Premiers pas, section Processus de calibration."
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr "Heure"
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr ""
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr "Totale"
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr "Total des echecs"
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr "Filament total"
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr "Temps total impr."
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr "Regler"
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr "Decharger fil."
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr "Dechargement fil."
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr "Verification en echec, retirez le filament et reessayez."
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr "Tensions"
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1913,101 +2281,101 @@ msgstr ""
 "mode furtif"
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr "Attente utilisateur."
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr "Attente du refroidissement de la sonde PINDA"
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Attente du refroidissement des buse et plateau chauffant"
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr "Avert"
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Attention: Types d'imprimante et de carte mere modifies"
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr "Attention: Type de carte mere modifie."
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr "Attention: Type d'imprimante modifie"
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr "Dechargement du filament reussi?"
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr "Erreur de cablage"
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr "Assistant"
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr "Correct-X:"
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr "Details calib. XYZ"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "Calibration XYZ OK. L'ecart sera corrige automatiquement."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 "Calibration XYZ OK. Les axes X/Y sont legerement non perpendiculaires. Bon "
 "boulot!"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 "Calibration XYZ compromise. Les points de calibration en avant ne sont pas "
 "atteignables."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
@@ -2015,126 +2383,188 @@ msgstr ""
 "atteignable."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 "Echec calibration XYZ. Le point de calibration du plateau n'a pas ete trouve."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 "Echec calibration XYZ. Les points de calibration en avant ne sont pas "
 "atteignables."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Echec calibration XYZ. Consultez le manuel."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 "Echec calibration XYZ. Le point de calibration avant droit n'est pas "
 "atteignable."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Calibration XYZ OK. Les axes X/Y sont perpendiculaires. Felicitations!"
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr "Distance Y du min"
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr "Correct-Y:"
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr "Oui"
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 "Vous pouvez toujours relancer l'Assistant dans Calibration > Assistant."
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr "Correct-Z:"
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr "Mesurer x-fois"
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr "Offset point [0;0]"
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr "et appuyez sur le bouton"
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr "pour charger le fil."
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr "pour decharger fil."
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr "inconnu"
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr "Etat inconnu"
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr "🔃Rafraichir"
 
+#~ msgid ""
+#~ "Autoloading filament available only when filament sensor is turned on..."
+#~ msgstr ""
+#~ "Chargement auto du filament uniquement si le capteur de filament est "
+#~ "active."
+
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Crash detecte. Poursuivre l'impression?"
 
+#~ msgid "Cutting filament"
+#~ msgstr "Je coupe filament"
+
+#~ msgid "ERROR: Filament sensor is not responding, please check connection."
+#~ msgstr ""
+#~ "ERREUR: Le capteur de filament ne repond pas, verifiez le branchement."
+
+#~ msgid "FS v0.3 or older"
+#~ msgstr "FS v0.3 ou +ancien"
+
+#~ msgid "FS v0.4 or newer"
+#~ msgstr "FS v0.4 ou +recent"
+
+#~ msgid "Fix the issue and then press button on MMU unit."
+#~ msgstr "Corrigez le probleme et appuyez sur le bouton sur la MMU."
+
+#~ msgid "Load all"
+#~ msgstr "Charger un par un"
+
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Cal. 1ere couche"
+
+#~ msgid "MK3 firmware detected on MK3S printer"
+#~ msgstr "Firmware MK3 detecte sur imprimante MK3S"
+
+#~ msgid "MK3S firmware detected on MK3 printer"
+#~ msgstr "Firmware MK3S detecte sur imprimante MK3"
+
+#~ msgid "MMU OK. Resuming position..."
+#~ msgstr "MMU OK. Reprise de la position ..."
+
+#~ msgid "MMU OK. Resuming temperature..."
+#~ msgstr "MMU OK. Rechauffage de la buse..."
+
+#~ msgid "MMU OK. Resuming..."
+#~ msgstr "MMU OK. Reprise ..."
+
+#~ msgid "MMU load failed"
+#~ msgstr "Def. charg. MMU"
+
+#~ msgid "MMU needs user attention."
+#~ msgstr "Le MMU necessite l'attention de l'utilisateur."
+
+#~ msgid "MMU power fails"
+#~ msgstr "Def. alim. MMU"
+
+#~ msgid "Please remove filament and then press the knob."
+#~ msgstr "Veuillez retirer le filament puis appuyez sur le bouton."
+
+#~ msgid "Please update firmware in your MMU2. Waiting for reset."
+#~ msgstr ""
+#~ "Veuillez mettre a jour le firmware de votre MMU2. En attente d'un reset."
+
+#~ msgid "Press the knob to resume nozzle temperature."
+#~ msgstr "Appuyez sur le bouton pour rechauffer la buse."
+
+#~ msgid "Runouts"
+#~ msgstr "Fins"

+ 1018 - 590
lang/po/Firmware_hr.po

@@ -16,151 +16,152 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr " 0.3 ili stariji"
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr " 0.4 ili noviji"
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr "%s level ocekivan"
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ">Otkazati"
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr "Podesavanje Z:"
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr "Sve je u redu"
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr "Sve je gotovo. Sretno printanje!"
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr "Abeceda"
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr "Ambijent"
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr "Jesu lijevi i desni Z~nosaci podignuti?"
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr "Pomoc"
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr "Pocetna tocka"
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr "Auto napaj"
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr "Autopunj filamenta"
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-"Automatsko punjenje filamenta moguce je samo kada je sensor filamenta "
-"ukljucen.."
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr "Auto punjenje fil. je aktivno, pritisnite gumb i umetnite fil.."
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr "Os"
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr "Duljina osi"
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr "Vrati"
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr "Podloga"
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr "Podloga se zagrijava"
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr "Podloga zagrijana"
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr "Podloga ispravna"
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
@@ -169,50 +170,55 @@ msgstr ""
 "mlaznici? Ceka se resetiranje."
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr "Grijac/Podloga"
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr "Status remena"
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr "Testiranje remena"
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr "Doslo je do gasenja. Oporaviti print?"
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr "Svijet"
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr "Svjetlina"
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr "Kalibrirajte XYZ"
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr "Kalibrirajte Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -221,13 +227,13 @@ msgstr ""
 "Kliknite kada je zavrseno."
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr "Kalibriracija Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -236,140 +242,151 @@ msgstr ""
 "Kliknite kada je zavrseno."
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr "Kalibracija nultocke"
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr "Kalibriranje"
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr "Kalibracija gotova"
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr "Kartica je uklonjena"
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr "Promijeni filament"
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr "Promijena uspjesna!"
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr "Ispravno izmjenjeno?"
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr "Provjera X osi"
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr "Provjera Y osi"
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr "Provjera Z osi"
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr "Provjera podloge"
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr "Provjera granicnika"
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr "Provjera datoteke"
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr "Provjera hotenda"
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr "Provjera senzora"
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr "Provjere"
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr "Boja nije ispravna"
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr "Napravilo zajedno"
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr "Nast."
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr "Ohladi"
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr "Kopirati odabrani jezik?"
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr "Udar"
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr "Udar detekti."
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr "Udar otkriven."
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -377,39 +394,46 @@ msgid ""
 msgstr "Detekcija udarca moze biti ukljuceno samo u Normalnom nacinu rada"
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr "Odrezite fil."
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr "Rezac"
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Rezanje filamenta"
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr "Datum:"
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr "Tamno"
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr "Onemoguci stepere"
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -421,7 +445,7 @@ msgstr ""
 "prvog sloja."
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
@@ -429,222 +453,345 @@ msgstr ""
 "Zelite li ponoviti zadnji korak za ponovno podesavanje udaljenosti izmedu "
 "mlaznice i grijace podloge?"
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr "E-ispravan:"
 
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr ""
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgstr "POGRESKA:"
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
-msgstr "POGRESKA: Senzor filamenta ne reagira, provjerite vezu."
-
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr "Izbaci filament"
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr "Izbacivanje fil."
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr "Granicnik"
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr "Granicnik nije aktiv"
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr "Granicnici"
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr "Ekstruder"
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr "Ekstruder vent:"
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr "Info o ekstruderu"
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr "F. auto.punj"
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr "FS Akcija"
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
-msgstr "FS v0.3 il stariji"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
-msgstr "FS v0.4 ili noviji"
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
+msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr "Neuspjesna stat"
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr "Neuspjes. MMU stat"
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr "Lazno aktiviranje"
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr "Brzina vent"
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr "Test ventilatora"
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr "Provjera vent"
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr "Bez filmaneta"
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr "Fil. senzor"
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr "Ekstrudiranje fil.s sa ispravnom bojom?"
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr "Fil. nije napunjen"
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr "Senzor filamenta"
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr "Iskoristeni fil."
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr "Datoteka je nepotpuna. Svejedno nastaviti?"
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr "Zavrsni pokreti"
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr "Prvi sloj kalib."
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 "Prvo cu pokrenuti samotestiranje kako bih provjerio najcesce probleme sa "
 "montazom."
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr "Rijesite problem, a zatim pritisnite gumb na MMU jedinici."
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr "Protok"
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr "Prednji print vent?"
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr "Prednj str[μm]"
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr "Prednji/lijevi vent"
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-kod izrezan za drugu razinu. Nastavite?"
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
@@ -653,14 +800,14 @@ msgstr ""
 "otkazan."
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-kod izrezan za drugu vrstu printera. Nastavite?"
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
@@ -669,12 +816,12 @@ msgstr ""
 "je otkazan."
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-kod izrezan za noviji firmware. Nastavite?"
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
@@ -683,42 +830,42 @@ msgstr ""
 "otkazan."
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr "HW podesavanje"
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr "Grijac/Termostat"
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr "Grijanje"
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr "Grijanje je onemoguceno sigurnosnim mjeracem vremena."
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr "Grijanje obavljeno."
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -729,7 +876,7 @@ msgstr ""
 "printanje."
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -738,24 +885,45 @@ msgstr ""
 "postupak postavljanja?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr "Visoka sna"
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Sada cu pokrenuti xyz kalibraciju. Trebat ce cca. 12 min."
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr "Sada cu pokrenuti z kalibraciju."
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
@@ -764,296 +932,328 @@ msgstr ""
 "postavke u Postavke - HW Podesavanje - Celicne ploce."
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr "Info zaslon"
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr "Umetnite filament"
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr ""
 "Umetnite filament (nemojte ga puniti) u ekstruder i zatim pritisnite gumb."
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr "Je li filament napunjen?"
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr "Je li celicna ploca na grijanoj podlozi?"
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr "Ponavljanje"
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr "Zadnji print"
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr "Zadnji neusp. print"
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr "Lijevo"
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr "Lijevi hotend vent?"
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr "Lijeva str[μm]"
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr "Razina svjet"
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr "Razina zatam"
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr "Lin. ispravak"
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr "Live podesavanje Z"
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
-msgstr "Napuni sve"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
+msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr "Napunite filament"
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr "Punjenje u mlazn"
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr "Ucitavanje boje"
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr "Punjenje filamenta"
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr "Labava remenica"
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr "Glasno"
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
-msgstr "MK3 firmware otkriven na MK3S printeru"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
+msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
-msgstr "MK3S firmware detektiran na MK3 printeru"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
+msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr "MMU Mod"
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr "MMU OK. Nastavak pozicije..."
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
-msgstr "MMU OK. Nastavak temperature..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
+msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
-msgstr "MMU OK. Nastavak..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
+msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr "MMU ne uspijeva"
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr "Neusp. MMU punjenje"
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr "Neusp. MMU punj"
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
-msgstr "MMU treba paznju korisnika."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
+msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
-msgstr "Neusp. MMU nap"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
+msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr "MMU2 spojen"
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr "Magnet. komp."
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr "Nazad"
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr "Mjereni nagib"
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr "Mjerenje referentne visine kalibracijske tocke"
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr "Mreza"
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr "Izrav. mrez. podl"
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr "Mod"
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr "Promjena moda u tijeku..."
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr ""
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr "Pomaknite X"
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr "Pomaknite Y"
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr "Pomaknite Z"
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr "Pomaknite os"
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr ""
 
@@ -1063,51 +1263,51 @@ msgid "New firmware version available:"
 msgstr "Dostupna nova verzija firmwera:"
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr "Ne"
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr "Nema SD kartice"
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr "Bez pomaka."
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr "Nema"
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr "Nije povezano"
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr "Ne okrece se"
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
@@ -1115,103 +1315,111 @@ msgstr ""
 "podloge."
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Sada cu zagrijati mlaznicu za PLA."
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr "Sada uklonite probni print sa celicne ploce."
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr "Mlaznica"
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr "Mlaznica."
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr ""
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr "Pronadene stare postavke. Postavit ce se zadani PID, Esteps itd."
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr ""
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr "Jednom"
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr "PID kal."
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr "PID kal. zavrsena"
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr "PID kalibracija"
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr "PINDA se Zagrijava"
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr "PINDA kal."
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr "Kalibracija PINDA nije uspjela"
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
@@ -1219,19 +1427,36 @@ msgstr ""
 "Kalibracija PINDA je zavrsena i aktivna. Moze se onemoguciti u izborniku "
 "Postavke->PINDA. kal."
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr "Pauza"
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr "Pauzirajte print"
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1240,7 +1465,7 @@ msgstr ""
 "mlaznica uhvati papir, odmah iskljucite printer."
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1254,28 +1479,28 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr "Provjerite IR prikljucak senzora, izvadite filament ako postoji."
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr "Molimo provjerite:"
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr "Ocistite grijacu podlogu, a zatim pritisnite gumb."
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Molimo ocistite mlaznicu radi kalibracije. Kliknite kada ste gotovi."
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr "Umetnite filament u ekstruder, a zatim pritisnite gumb za punjenje."
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
@@ -1283,50 +1508,45 @@ msgstr ""
 "Umetnite filament u prvu cijev MMU-a, a zatim pritisnite gumb za punjenje."
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr "Molimo prvo ubacite filament."
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr "Molimo otvorite klizac i rucno uklonite filament."
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr "Stavite celicnu plocu na grijacu podlogu."
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr "Pritisnite gumb za praznjenje filamenta"
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr "Molimo odmah izvucite filament"
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr "Molimo uklonite filament i zatim pritisnite gumb."
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr "Najprije uklonite prijevozne osloce."
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr "Molimo uklonite celicnu plocu sa grijace podloge."
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr "Prvo pokrenite XYZ kalibraciju."
 
@@ -1335,113 +1555,109 @@ msgstr "Prvo pokrenite XYZ kalibraciju."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Prvo izvadite filament, a zatim ponovite ovu radnju."
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr "Azurirajte firmwer u svom MMU2. Ceka se resetiranje."
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr "Molimo nadogradite."
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr "Molimo pricekajte"
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr "Prekidi struje"
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr "Predgrijavanje"
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr "Predgr. mlaznicu!"
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr "Predgrijavanje mlaznice. Molim vas pricekajte."
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr "Predgr. za rezanje"
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr "Predgr. za izbaci."
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr "Predgr. za punjenje"
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr "Predgr. za praznj."
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr "Pritisnite gumb"
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Pritisnite gumb za predgrijavanje mlaznice i nastavite."
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr "Pritisnite gumb za nastavak temperature mlaznice."
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr "Print je prekinut"
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr "Vent printa:"
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr "Printaj sa SD"
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr "Print pauziran"
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr "Vrijeme printanja"
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr ""
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
@@ -1450,12 +1666,12 @@ msgstr ""
 "koraci, odjeljak Tijek kalibracije."
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Promjer mlaznice printera razlikuje se od G-koda. Nastavite?"
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
@@ -1463,67 +1679,112 @@ msgstr ""
 "Promjer mlaznice printera razlikuje se od G-koda. Molimo provjerite "
 "vrijednost u postavkama. Print je otkazan."
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr "RPi utor"
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr "Zad. str.[μm]"
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr "Oporavak printa"
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 "Uklonite stari filament i pritisnite gumb za pocetak stavljanja novog "
 "filamenta."
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr "Preimenuj"
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr "Resetiraj"
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr "Reset XYZ kalibr."
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr "Nastavite print"
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr "Nastavak printa"
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr "Tocno"
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr "Desna str.[μm]"
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
@@ -1531,36 +1792,41 @@ msgstr ""
 "Pokrenuti carobnjak ce izbrisati trenutne rezultate kalibracije i poceti "
 "ispocetka. Nastavite?"
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Nestalo"
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr "SD karti"
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr "ZAUSTAVLJENO."
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr "Trazenje tocke kalibracije podloge"
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr "Odaberi"
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
@@ -1569,68 +1835,75 @@ msgstr ""
 "zaslonu."
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr "Odaberite ekstruder:"
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr "Odaberi filament:"
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr "Izaberi jezik"
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 "Odaberite temperaturu predgrijavanja mlaznice koja odgovara vasem materijalu."
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr "Odaberite temperaturu koja odgovara vasem materijalu."
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr "Samotestiranje OK"
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr "Pocetak selftesta"
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr ""
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr ""
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr "Selftest nije uspio"
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 "Provest ce se selftest radi kalibracije preciznog ponovnog postavljanja bez "
 "senzora."
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr "Info senzora"
 
@@ -1640,31 +1913,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Senzor je provjeren, odmah uklonite filament."
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr "Postavi temperaturu:"
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr "Postavke"
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr "Veliki nagib"
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr "Ploca"
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1677,18 +1950,18 @@ msgstr ""
 "%cResetiraj"
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr "Pokazi granicnike"
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr "Tih"
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr "Lagani nagib"
 
@@ -1702,113 +1975,172 @@ msgstr ""
 "je 100."
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Naisao je neki problem, nametnuto Z-niveliranje..."
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr "Vrsta"
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr "Sortiranje datoteka"
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr "Zvuk"
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr "Brzina"
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr "Okrece se"
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 "Potrebna je stabilna temperatura okoline 21-26C, potrebno je cvrsto postolje."
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr "Statistika"
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr "Tiho"
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr "Celicna ploca"
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr "Zaustavi print"
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr "Strogo"
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr "Podrska"
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr "Zamjenjeno"
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr "Temperatura"
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr "Temperature"
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1818,7 +2150,7 @@ msgstr ""
 "optimalnu visinu. Provjerite slike u prirucniku (poglavlje Kalibracija)."
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
@@ -1827,66 +2159,102 @@ msgstr ""
 "poglavlje Prvi koraci, odjeljak Tijek kalibracije."
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr "Vrijeme"
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr "Pauza"
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr "Ukupno"
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr "Totalne pogreske"
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr "Totalno filamenta"
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr "Vrijeme printanja"
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr "Ugodi"
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr "Ispraznite fil."
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr "Praznjenje filamenta"
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr "Provjera nije uspjela, uklonite filament i pokusajte ponovno."
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr "Voltaza"
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1898,221 +2266,281 @@ msgstr ""
 "u tihom modu"
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr "Ceka se korisnik..."
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr "Ceka se hladenje PINDA sonde"
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Ceka se hladjenje mlaznice i podloge"
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr "Upozore"
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Upozorenje: promijenjeni su i tip printera i tip maticne ploce."
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr "Upozorenje: tip maticne ploce je promijenjen."
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr "Upozorenje: promijenjena je vrsta printera."
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr "Je li praznjenje fil. bilo uspjesno?"
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr "Greska u ozicenju"
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr "Carobnjak"
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr "X-ispravan:"
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr "XYZ detalji kal"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "XYZ kalibracija u redu. Iskrivljenost ce se automatski ispraviti."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr "XYZ kalibracija je u redu. Osi X/Y su malo nagnute. Bravo!"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 "XYZ kalibracija je ugrozena. Prednje kalibracijske tocke nisu dostupne."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 "XYZ kalibracija je ugrozena. Desna prednja tocka kalibracije nije dostupna."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 "XYZ kalibracija nije uspjela. Tocka kalibracije podloga nije pronadena."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 "XYZ kalibracija nije uspjela. Prednje kalibracijske tocke nisu dostupne."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "XYZ kalibracija nije uspjela. Molimo pogledajte prirucnik."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 "XYZ kalibracija nije uspjela. Desna prednja tocka kalibracije nije dostupna."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "XYZ kalibracija u redu. Osi X/Y su okomite. Cestitamo!"
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr "Y distanca od min"
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr "Y-ispravan:"
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr "Da"
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "Carobnjak uvijek mozete nastaviti iz Kalibracija -> Carobnjak."
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr "Z-ispravan:"
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr "Z-sonda br."
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr "[0;0] razmak tocke"
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr "i pritisnite gumb"
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr "da napuni filament"
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr "da isprazni filament"
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr "nepoznato"
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr "nepoznato stanje"
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr "🔃Osvjeziti"
 
+#~ msgid ""
+#~ "Autoloading filament available only when filament sensor is turned on..."
+#~ msgstr ""
+#~ "Automatsko punjenje filamenta moguce je samo kada je sensor filamenta "
+#~ "ukljucen.."
+
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Otkriven je udar. Nastaviti print?"
 
+#~ msgid "Cutting filament"
+#~ msgstr "Rezanje filamenta"
+
+#~ msgid "ERROR: Filament sensor is not responding, please check connection."
+#~ msgstr "POGRESKA: Senzor filamenta ne reagira, provjerite vezu."
+
+#~ msgid "FS v0.3 or older"
+#~ msgstr "FS v0.3 il stariji"
+
+#~ msgid "FS v0.4 or newer"
+#~ msgstr "FS v0.4 ili noviji"
+
+#~ msgid "Fix the issue and then press button on MMU unit."
+#~ msgstr "Rijesite problem, a zatim pritisnite gumb na MMU jedinici."
+
+#~ msgid "Load all"
+#~ msgstr "Napuni sve"
+
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Prvi sloj kal."
+
+#~ msgid "MK3 firmware detected on MK3S printer"
+#~ msgstr "MK3 firmware otkriven na MK3S printeru"
+
+#~ msgid "MK3S firmware detected on MK3 printer"
+#~ msgstr "MK3S firmware detektiran na MK3 printeru"
+
+#~ msgid "MMU OK. Resuming position..."
+#~ msgstr "MMU OK. Nastavak pozicije..."
+
+#~ msgid "MMU OK. Resuming temperature..."
+#~ msgstr "MMU OK. Nastavak temperature..."
+
+#~ msgid "MMU OK. Resuming..."
+#~ msgstr "MMU OK. Nastavak..."
+
+#~ msgid "MMU load failed"
+#~ msgstr "Neusp. MMU punjenje"
+
+#~ msgid "MMU needs user attention."
+#~ msgstr "MMU treba paznju korisnika."
+
+#~ msgid "MMU power fails"
+#~ msgstr "Neusp. MMU nap"
+
+#~ msgid "Please remove filament and then press the knob."
+#~ msgstr "Molimo uklonite filament i zatim pritisnite gumb."
+
+#~ msgid "Please update firmware in your MMU2. Waiting for reset."
+#~ msgstr "Azurirajte firmwer u svom MMU2. Ceka se resetiranje."
+
+#~ msgid "Press the knob to resume nozzle temperature."
+#~ msgstr "Pritisnite gumb za nastavak temperature mlaznice."
+
+#~ msgid "Runouts"
+#~ msgstr "Nestalo"

+ 1016 - 588
lang/po/Firmware_hu.po

@@ -16,149 +16,152 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr " 0.3 vagy regebbi"
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr " 0.4 v. ujabb"
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr "Vart szint: %s"
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ">Megsem"
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr "Z allitasa:"
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr "Minden rendben"
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr "Keszen vagyunk. Jo nyomtatast!"
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr "Abece"
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr "Kornyezet"
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr "A Z tengely a felso vegponton van?"
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr "Seged"
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr "Autom."
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr ""
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr "Auto ero"
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr "Fil. auto.betolt."
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr "Filament autom. betolteste csak bekapcs. fil. szenzorral mukodik."
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr "Autom. betoltes be, nyomd meg a gombot es helyzed be a filamentet."
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr "Tengely"
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr "Tengely hossz"
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr "Vissza"
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr "Asztal"
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr "Asztal futes"
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr "Asztal kesz"
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr "Szint. korrekcio"
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
@@ -167,50 +170,55 @@ msgstr ""
 "az ujrainditast."
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr "Asztal/Fej futes"
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr "Szij allapot"
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr "Szij teszt"
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr "Aramkieses volt, nyomt. folytatasa?"
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr "Fenyes"
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr "Fenyero"
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr "XYZ kalibracio"
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr "Z kalibracio"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -219,13 +227,13 @@ msgstr ""
 "nem er, majd nyomd meg ha keszen vagy."
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr "Z kalibralasa"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -234,140 +242,151 @@ msgstr ""
 "er, majd nyomd meg ha keszen vagy."
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr "Home poz. kalibralas"
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr "Kalibracio"
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr "Kalibracio kesz"
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr "Kartya eltavolitva"
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr "Filament csere"
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr "Csere sikerult!"
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr "Sikerult a csere?"
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr "X tengely ellenorzes"
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr "Y tengely ellenorzes"
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr "Z tengely ellenorzes"
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr "Asztal ellenorzese"
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr "Vegallaskapcs. ellen"
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr "Fajl ellenorzese"
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr "Hotend ellenorzese"
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr "Szenz. ellenorzese"
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr "Ellenorzesek"
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr "Szin nem jo"
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr "Kozossegi"
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr "Folyt"
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr "Lehutes"
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr "Kivalasztott nyelv masolasa?"
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr "Utkozes"
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr "Utkozes erz."
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr "Utkozes erzekelve."
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -378,39 +397,46 @@ msgstr ""
 "kapcsolhato be"
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr "Filament vagasa"
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr "Vago"
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Filament vagasa"
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr "Datum:"
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr "Sotet"
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr "Motorok kikapcsol."
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -422,7 +448,7 @@ msgstr ""
 "bekezdest."
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
@@ -430,222 +456,345 @@ msgstr ""
 "Meg szeretned ismetelni az utolso lepest, hogy finomhangold a fuvoka es az "
 "asztal kozotti tavolsagot?"
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr "E-korrekcio:"
 
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr ""
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgstr "HIBA:"
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
-msgstr "HIBA: A fil. szenzor nem valaszol, ellenorizd a csatlakozast."
-
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr "Filament kiadasa"
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr "Filament kiadasa"
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr "Vegallaskapcsolo"
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr "Vegallask. nem kapcs"
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr "Vegallaskapcsolok"
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr ""
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr "Extruder vent.:"
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr ""
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr "F. autobetolt"
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr "FSz akcio"
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
-msgstr "FS v0.3 v. regebbi"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
-msgstr "FS v0.4 vagy ujabb"
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
+msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr "Hiba statisztika"
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr "MMU hiba stat."
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr "Hamis kivalto ok"
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr "Vent. sebesseg"
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr "Ventillator teszt"
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr "Vent.proba"
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr "Fil. kifutasok"
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr "Fil. szenzor"
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr "Filament es a szine rendben?"
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr "Fil. nincs betoltve"
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr "Filament szenzor"
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr "Felhasznalt filam."
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr "A fajl vege hianyzik. Folytatod igy is?"
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr "Mozdulat befejezese"
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr "Elso reteg kal."
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 "Elsokent lefuttatom az onellenorzest, hogy megnezzem a leggyakoribb "
 "osszeszerelesi problemakat."
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr "Hozd helyre a hibat, majd nyomd meg a gombot az MMU egysegen."
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr ""
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr "Elso targyhuto vent?"
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr "Elulso old[μm]"
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr "Elso/bal ventillator"
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr "A G-kod mas szintre lett elokesztve. Folytassam?"
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
@@ -654,14 +803,14 @@ msgstr ""
 "megallitva."
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "A G-kod mas nyomtato tipusra lett elokesztve. Folytassam?"
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
@@ -670,12 +819,12 @@ msgstr ""
 "Nyomtatas megallitva."
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "A G-kod ujabb firmverre lett elokesztve. Folytassam?"
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
@@ -684,42 +833,42 @@ msgstr ""
 "Nyomtatas megallitva."
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr "HW beallitas"
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr "Futotest/Termisztor"
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr "Futes folyamatban"
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr "A bizonsagi idozito leallitotta a futest"
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr "Futes kesz."
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -730,7 +879,7 @@ msgstr ""
 "nyomtathatsz is."
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -739,24 +888,45 @@ msgstr ""
 "a beallitasi folyamaton?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr "Magas ero"
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Lefuttatom az XYZ kalibraciot. Ez kb. 12 percet vesz igenybe."
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr "Lefuttatom a Z kalibraciot."
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
@@ -765,27 +935,27 @@ msgstr ""
 "Acellapok menupont alatt."
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr "Info kepernyo"
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr "Helyezd be a filam."
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
@@ -793,269 +963,301 @@ msgstr ""
 "Helyezd be a filamentet az extruderbe (ne toltsd be), majd nyomtd meg a "
 "gombot."
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr "Filament behelyezve?"
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr "Rajta van az acellap a targyasztalon?"
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr "Iteracio"
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr "Utolso nyomtatas"
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr "Utolso nyomt. hibak"
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr "Bal"
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr "Bal hotend vent.?"
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr "Bal [μm]"
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr "Fenyes szint"
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr "Sotet szint"
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr "Lin. korrekcio"
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr "Z magassag beall."
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
-msgstr "Osszes betolt."
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
+msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr "Filament betolt."
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr "Betolt. fuvokahoz"
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr "Szin tisztitasa"
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr "Filament betoltese"
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr "Laza szijtarcsa"
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr "Hangos"
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
-msgstr "MK3 firmver telepitve MK3S nyomtatora"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
+msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
-msgstr "MK3S firmver eszlelve MK3 nyomtaton"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
+msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr "MMU Mod"
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr "MMU OK. Pozicio visszaallitasa..."
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
-msgstr "MMU OK. Homerseklet visszaallitasa..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
+msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
-msgstr "MMU OK. Folytatom..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
+msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr "MMU hibak"
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr "MMU betolt.hiba"
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr "MMU bet. hibak"
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
-msgstr "Az MMU felhasznaloi figyelmet igenyel."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
+msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
-msgstr "MMU tap hibak"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
+msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr "MMU2 csatlakozott"
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr "Magnes komp."
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr "Fomenu"
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr "Meroleg. hiba"
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr "Kalibracios pont magassaganak merese"
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr "Halo"
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr "Asztal szintezes"
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr "Mod"
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr "Modvaltas folyamatban..."
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr "Modell"
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr "X mozgatasa"
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr "Y mozgatasa"
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr "Z mozgatasa"
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr "Tengely mozgatasa"
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr ""
 
@@ -1065,172 +1267,197 @@ msgid "New firmware version available:"
 msgstr "Uj firmver verzio erheto el:"
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr "Nem"
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr "Nincs SD kartya"
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr "Nincs mozgas."
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr "Nincs"
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr "Nincs csatlakoztatva"
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr "Nem forog"
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 "Most beallitjuk a fuvoka hegye es a targyasztal felulete kozotti tavolsagot."
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Felfutom a fuvokat PLA-hoz."
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr "Vedd le a tesztnyomatot az acellaprol."
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr "Fuvoka"
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr "Fuv. atm."
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr "Ki"
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr "Regi beallitasokat talaltam. Az alap PID, Esteps, stb. lesz beallitva."
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr "Be"
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr "Egyszer"
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr "PID kalibracio"
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr "PID kal. kesz"
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr "PID kalibracio"
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr "PINDA Futes"
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr "PINDA kal."
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr "PINDA kalibracio sikertelen."
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 msgstr "PINDA kalibracio sikeres es aktiv. A Beallitasok ->PINDA kal."
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr "Szun."
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr "Nyomtatas szunet"
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1239,7 +1466,7 @@ msgstr ""
 "fuvoka hozzaer a papirlaphoz, azonnal kapcsold ki a nyomtatot."
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1253,24 +1480,24 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr "Nezd meg az IR szenzor csatlakoz., vedd ki a filam., ha bent van."
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr "Kerlek ellenorizd:"
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr "Kerlek, tisztisd le a targyasztalt, majd nyomd meg a gombot."
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 "Kerlek, tisztisd meg a fuvokat kalibracio elott. Nyomd meg a gombot, ha "
 "keszen vagy."
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
@@ -1278,7 +1505,7 @@ msgstr ""
 "betolteshez."
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
@@ -1287,51 +1514,46 @@ msgstr ""
 "a betolteshez."
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr "Kerlek eloszor toltsd be a filamentet."
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr ""
 "Kerlek, nyisd ki a nyomogorgo ajtajat, es tavolitsd el a filamentet kezzel."
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr "Kerlek, helyzed az acellapot a targyasztalra."
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr "Kerlek, nyomd meg a gombot a filament kiadasahoz"
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr "Kerlek, huzd ki a filamentet most"
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr "Kerlek, tavolitsd el a filamentet, majd nyomd meg a gombot."
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr "Tavolitsd el a szallitasi segedanyagokat."
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr "Kerlek, tavolisd el az acellapot az asztalrol."
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr "Kerlek, elobb futtasd le az XYZ kalibraciot."
 
@@ -1340,113 +1562,109 @@ msgstr "Kerlek, elobb futtasd le az XYZ kalibraciot."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Kerlek eloszor vedd ki a filamentet, majd probalkozz ujra."
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr "Kerlek, frissitsd az MMU2 firmverjet. Varom az ujrainditast."
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr "Kerlek frissits."
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr "Kerlek varj"
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr "Aramkimaradasok"
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr "Elofutes"
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr "Futsd fel a fuvokat!"
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr "Fuvoka futese folyamatban. Kerlek, varj."
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr "Melegites vagashoz"
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr "Melegites kiadashoz"
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr "Felfutes betolteshez"
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr "Felfutes kiadashoz"
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr "Nyomd meg a gombot"
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Nyomd meg a gombot a folytatashoz es a fuvoka felfutesehez."
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr "Nyomd meg a gombot a fuvoka ismetelt felfutesehez."
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr "Nyomt. megszakitva"
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr "Targyhuto:"
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr "Nyomtatas SD-rol"
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr "Nyomt. szuneteltetve"
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr "Nyomtatasi ido"
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr "Nyomtato IP cime:"
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
@@ -1455,12 +1673,12 @@ msgstr ""
 "lepesek fejezetenek Kalibracio menete bekezdeset."
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "A nyomtato fuvoka atmeroje elter a G-kodtol. Folytasasm?"
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
@@ -1468,67 +1686,112 @@ msgstr ""
 "A nyomtato fuvoka atmeroje elter a G-kodtol. Ellenorizd az erteket a "
 "beallitasokban. Nyomtatas megallitva."
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr ""
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr "Hatso old.[μm]"
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr "Nyomt. visszaallit"
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 "Vedd ki a regi filamentet, majd nyomd meg a gombot az uj filament "
 "betoltesehez."
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr "Atnevezes"
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr "Ujrainditas"
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr "XYZ kal. nullazas"
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr "Nyomt. folytatasa"
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr "Nyomtatas folytatasa"
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr "Jobb"
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr "Jobb old.[μm]"
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
@@ -1536,104 +1799,116 @@ msgstr ""
 "A Varazslo futtatasa nullazza a jelenlegi kalibracios ertekeket es elolrol "
 "fog mindent kezdeni. Folytatod?"
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Kifutas"
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr "SDkartya"
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr "MEGALLITVA."
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr "Kalibracios pont keresese az asztalon"
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr "Kivalasztas"
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 msgstr "Valassz egy filamentet az elso reteg kalibraciojahoz a menubol."
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr "Extruder valasztas:"
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr "Valassz filamentet:"
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr "Valassz nyelvet"
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 "Valaszd ki a fuvoka homersekletet, amelyik megfelel az altalad hasznalt "
 "anyaghoz ajanlott homersekletnek."
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr "Valassz homersekletet, ami megfelel a filamenthez."
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr "Ondiagnosztika OK"
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr "Ondiagnosztika indul"
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr "Ondiagnosztika"
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr "Ondiagnosztika hiba!"
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr "Ondiag. sikertelen"
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 "A pontos szenzor nelkuli homing erdekeben lefuttatom az ondiagnosztikat."
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr "Szenzor info"
 
@@ -1643,31 +1918,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Szenzor OK, vedd ki a filamentet most."
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr "Homerseklet beall.:"
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr "Beallitasok"
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr "NagyMerol.hiba"
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr "Acellap"
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1680,18 +1955,18 @@ msgstr ""
 "%cUjrainditas"
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr "Vegallaskapcsolok"
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr "Halk"
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr "Kis merol.hiba"
 
@@ -1705,112 +1980,171 @@ msgstr ""
 "konyvtaron belul."
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Hiba tortent, Z szintezes indul..."
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr "Rendez"
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr "Fajlok rendezese"
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr "Hang"
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr "Sebesseg"
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr "Forog"
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr "Stabil 21-26C homerseklet es egy merev allvany (asztal) szukseges."
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr "Statisztika"
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr "Halk"
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr "Acellapok"
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr "Nyomt. megallitasa"
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr "Szigoru"
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr "Tamogatas"
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr "Felcserelve"
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr "Homerseklet"
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr "Homersekletek"
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1821,7 +2155,7 @@ msgstr ""
 "Kalibracio fejezeteben."
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
@@ -1830,66 +2164,102 @@ msgstr ""
 "fejezetenek Kalibracio menete bekezdeset."
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr "Ido"
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr "Idotullepes"
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr "Ossz."
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr "Ossz. hiba"
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr "Osszes filament"
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr "Ossz. nyomt. ido"
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr "Finomhangolas"
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr "Filament kiadasa"
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr "Filament kiadasa"
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr "Ellenorzes sikertelen, vedd ki a filamentet es probald ujra."
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr "Feszultsegek"
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1902,224 +2272,282 @@ msgstr ""
 "Halk modban"
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr "Var. a felhasznalora"
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr "A PINDA szenzor kihuleset varom."
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr "A fuvoka es az asztal kihuleset varom."
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr "Figylem."
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Figyelem: a nyomtato es az alaplap tipusa is megvaltozott."
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr "Figyelem: az alaplap tipusa megvaltozott."
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr "Figyelem: a nyomtato tipusa megvaltozott."
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr "Sikerult kivenni a filamentet?"
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr "Kabelezesi hiba"
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr "Varazslo"
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr "X-korrekcio:"
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr "XYZ kal. reszlet"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 "XYZ kalibracio OK. Az esetleges X/Y merolegessegi hiba automatikusan "
 "korrigalva lesz."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 "XYZ kalibracio sikerult. Az X/Y tengelyeken enyhe merolegessegi hiba van."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 "Az XYZ kalibracio sikertelen. Az elulso kalibracios pontok nem erhetoek el."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 "Az XYZ kalibracio sikertelen. A jobb kalibracios pontok nem erhetoek el."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 "Az XYZ kalibracio sikertelen. Az asztal kalibracios pontja nem erheto el."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 "Az XYZ kalibracio sikertelen. Az elulso kalibracios pontok nem erhetoek el."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "XYZ kalibracio sikertelen. Kerlek, nezz bele a kezikonyvbe."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 "Az XYZ kalibracio sikertelen. A jobb kalibracios pontok nem erhetoek el."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "XYZ kalibracio OK. Az X/Y tengelyek merolegesek. Gratulalok!"
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr "Y-minimum tavolsag"
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr "Y-korrekcio:"
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr "Igen"
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "A Varazsolt barmikor elered a Kalibracio -> Varazslo menubol."
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr "Z-korrekcio:"
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr "Z meres szama"
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr "[0;0] pont offszet"
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr "es nyomd meg a gombot"
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr "filam. betoltesehez"
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr "filament kiadasahoz"
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr "ismeretlen"
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr "ismeretlen allapot"
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr "🔃Frissites"
 
+#~ msgid ""
+#~ "Autoloading filament available only when filament sensor is turned on..."
+#~ msgstr "Filament autom. betolteste csak bekapcs. fil. szenzorral mukodik."
+
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Utkozes erzekelve. Folytassam a nyomtatast?"
 
+#~ msgid "Cutting filament"
+#~ msgstr "Filament vagasa"
+
+#~ msgid "ERROR: Filament sensor is not responding, please check connection."
+#~ msgstr "HIBA: A fil. szenzor nem valaszol, ellenorizd a csatlakozast."
+
+#~ msgid "FS v0.3 or older"
+#~ msgstr "FS v0.3 v. regebbi"
+
+#~ msgid "FS v0.4 or newer"
+#~ msgstr "FS v0.4 vagy ujabb"
+
+#~ msgid "Fix the issue and then press button on MMU unit."
+#~ msgstr "Hozd helyre a hibat, majd nyomd meg a gombot az MMU egysegen."
+
+#~ msgid "Load all"
+#~ msgstr "Osszes betolt."
+
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117. Elso reteg kalibr."
+
+#~ msgid "MK3 firmware detected on MK3S printer"
+#~ msgstr "MK3 firmver telepitve MK3S nyomtatora"
+
+#~ msgid "MK3S firmware detected on MK3 printer"
+#~ msgstr "MK3S firmver eszlelve MK3 nyomtaton"
+
+#~ msgid "MMU OK. Resuming position..."
+#~ msgstr "MMU OK. Pozicio visszaallitasa..."
+
+#~ msgid "MMU OK. Resuming temperature..."
+#~ msgstr "MMU OK. Homerseklet visszaallitasa..."
+
+#~ msgid "MMU OK. Resuming..."
+#~ msgstr "MMU OK. Folytatom..."
+
+#~ msgid "MMU load failed"
+#~ msgstr "MMU betolt.hiba"
+
+#~ msgid "MMU needs user attention."
+#~ msgstr "Az MMU felhasznaloi figyelmet igenyel."
+
+#~ msgid "MMU power fails"
+#~ msgstr "MMU tap hibak"
+
+#~ msgid "Please remove filament and then press the knob."
+#~ msgstr "Kerlek, tavolitsd el a filamentet, majd nyomd meg a gombot."
+
+#~ msgid "Please update firmware in your MMU2. Waiting for reset."
+#~ msgstr "Kerlek, frissitsd az MMU2 firmverjet. Varom az ujrainditast."
+
+#~ msgid "Press the knob to resume nozzle temperature."
+#~ msgstr "Nyomd meg a gombot a fuvoka ismetelt felfutesehez."
+
+#~ msgid "Runouts"
+#~ msgstr "Kifutas"

+ 1017 - 589
lang/po/Firmware_it.po

@@ -16,150 +16,152 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr " 0.3 o inferiore"
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr " 0.4 o superiore"
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr "atteso livello %s"
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ">Annulla"
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr "Compensaz. Z:"
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr "Nessun errore"
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr "Tutto fatto. Buona stampa!"
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr "Alfabeti"
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr "Ambiente"
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr "I carrelli Z sin/des sono altezza max?"
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr "Assist."
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr "Auto"
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr "Trova origine"
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr "Automatico"
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr "Autocaric. filam."
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-"Caricamento automatico filamento disponibile solo con il sensore attivo..."
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr "Caricamento automatico attivo, premi la manopola e inserisci il filam."
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr "Assi"
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr "Lunghezza dell'asse"
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr "Indietro"
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr "Piano"
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr "Riscald. piano"
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr "Piano fatto."
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr "Correz. liv.piano"
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
@@ -168,50 +170,55 @@ msgstr ""
 "reset."
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr "Piano/Riscald."
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr "Stato cinghie"
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr "Test cinghie"
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr "Blackout rilevato. Recuperare stampa?"
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr "Chiaro"
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr "Luminosita'"
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr "Calibra XYZ"
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr "Calibra Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -220,13 +227,13 @@ msgstr ""
 "all'altezza massima. Click per terminare."
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr "Calibrando Z"
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
@@ -235,140 +242,151 @@ msgstr ""
 "all'altezza massima. Click per terminare."
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr "Calibrazione Home"
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr "Calibrazione"
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr "Calibr. completa"
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr "SD rimossa"
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr "Cambia filamento"
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr "Cambio riuscito!"
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr "Cambio corretto?"
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr "Verifica asse X"
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr "Verifica asse Y"
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr "Verifica asse Z"
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr "Verifica piano"
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr "Verifica finecorsa"
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr "Verifica file"
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr "Verifica ugello"
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr "Controllo sensori"
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr "Controlli"
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr "Colore non puro"
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr "Contribuiti"
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr "Cont."
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr "Raffredda"
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr "Copiare la lingua selezionata?"
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr "Impatto"
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr "Rileva.crash"
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr "Rilevato impatto."
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -379,39 +397,46 @@ msgstr ""
 "in Modalita normale"
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr "Taglia filamento"
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr "Tagliatr."
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Tagliando filam."
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr "Data:"
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr "Scuro"
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr "Disabilita motori"
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -423,7 +448,7 @@ msgstr ""
 "Calibrazione primo strato."
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
@@ -431,222 +456,345 @@ msgstr ""
 "Desideri ripetere l'ultimo passaggio per migliorare la distanza fra ugello e "
 "piatto?"
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr "Correzione-E:"
 
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
+msgstr ""
+
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgstr "ERRORE:"
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
-msgstr "ERRORE: il sensore filam. non risponde,Controllare conness."
-
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr "Espelli fil."
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr "Espellendo filamento"
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr "Finecorsa"
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr "Finec. fuori portata"
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr "Finecorsa"
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr "Estrusore"
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr "Vent. estrusore:"
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr "Info estrusore"
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr "Autocar.fil."
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr "Azione FS"
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
-msgstr "FS 0.3 o inferiore"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
-msgstr "FS 0.4 o superiore"
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
+msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr "Stat. fallimenti"
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr "Stat.fall. MMU"
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr "Falso innesco"
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr "Velocita vent."
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr "Test ventola"
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr "Control.vent"
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr "Fil. esauriti"
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr "Sensore fil."
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr "Filamento"
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr "Filamento estruso e con colore corretto?"
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr "Fil. non caricato"
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr "Sensore filam."
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr "Fil. utilizzato"
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr "File incompleto. Continuare comunque?"
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr "Finaliz. spostamenti"
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr "Cal. primo strato"
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 "Per primo avviero l'autotest per controllare gli errori di assemblaggio piu "
 "comuni."
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr "Risolvere il problema e premere il bottone sull'unita MMU."
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr "Flusso"
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr "Ventola frontale?"
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr "Fronte [μm]"
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr "Ventola frontale/sin"
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-code processato per un livello diverso. Continuare?"
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
@@ -655,14 +803,14 @@ msgstr ""
 "slice del modello. Stampa annullata."
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-code processato per una stampante diversa. Continuare?"
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
@@ -671,12 +819,12 @@ msgstr ""
 "slice del modello. Stampa annullata."
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-code processato per un firmware piu recente. Continuare?"
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
@@ -685,42 +833,42 @@ msgstr ""
 "firmware. Stampa annullata."
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr "Impostazioni HW"
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr "Riscald./Termist."
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr "Riscaldamento..."
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr "Riscaldamento fermato dal timer di sicurezza."
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr "Riscald. completo"
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -731,7 +879,7 @@ msgstr ""
 "stampare."
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -740,24 +888,45 @@ msgstr ""
 "processo di configurazione?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr "Forte"
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Adesso avviero una Calibrazione XYZ. Puo durare circa 12 min."
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr "Adesso avviero la Calibrazione Z."
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
@@ -766,296 +935,328 @@ msgstr ""
 "Setup HW - Piastre in Acciaio."
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr "Schermata info"
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr "Inserire filamento"
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr ""
 "Inserire filamento (senza caricarlo) nell'estrusore e premere la manopola."
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr "Il filamento e' stato caricato?"
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr "Piastra d'acciaio su piano riscaldato?"
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr "Iterazione"
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr "Ultima stampa"
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr "Errori ultima stampa"
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr "Sinistra"
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr "Vent SX hotend?"
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr "Sinistra [μm]"
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr "Liv. Chiaro"
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr "Liv. Scuro"
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr "Correzione lineare"
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr "Compensazione Z"
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
-msgstr "Caricare tutti"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
+msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr "Carica filamento"
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr "Carica ugello"
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr "Caricando colore"
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr "Caricando filamento"
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr "Puleggia lenta"
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr "Forte"
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
-msgstr "Firmware MK3 rilevato su stampante MK3S"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
+msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
-msgstr "Firmware MK3S rilevato su stampante MK3"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
+msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr "Mod. MMU"
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr "MMU OK. riprendendo la posizione..."
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
-msgstr "MMU OK. Ripristino temperatura..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
+msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
-msgstr "MMU OK. Riprendendo..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
+msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr "Fallimenti MMU"
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr "Caricam. MMU fallito"
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr "Car MMU falliti"
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
-msgstr "Il MMU richiede attenzione dall'utente."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
+msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
-msgstr "Manc. corr. MMU"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
+msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr "MMU2 connessa"
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr "Comp. Magneti"
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr "Menu principale"
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr "Dev. misurata"
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr "Misura altezza di rif. del punto di calib."
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr "Griglia"
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr "Liv. griglia piano"
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr "Mod."
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr "Cambio modalita in corso..."
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr "Modello"
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr "Motore"
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr "Sposta X"
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr "Sposta Y"
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr "Sposta Z"
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr "Muovi asse"
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr "N/D"
 
@@ -1065,155 +1266,163 @@ msgid "New firmware version available:"
 msgstr "Nuova vers. firmware disponibile:"
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr "No"
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr "Nessuna SD"
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr "Nessun movimento."
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr "Nessuno"
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr "Normale"
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr "Non connesso"
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr "Non gira"
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr "Adesso calibro la distanza fra ugello e superfice del piatto."
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Adesso preriscaldero l'ugello per PLA."
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr "Ora rimuovete la stampa di prova dalla piastra in acciaio."
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr "Ugello"
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr "Dia.Ugello"
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr "Off"
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 "Sono state trovate impostazioni vecchie. Verranno impostati i valori "
 "predefiniti di PID, Esteps etc."
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr "On"
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr "Singolo"
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr "Calibrazione PID"
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr "Calib. PID completa"
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr "Calibrazione PID"
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr "Riscaldamento PINDA"
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr "Calib. PINDA"
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr "Calibrazione temperatura fallita"
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
@@ -1221,19 +1430,36 @@ msgstr ""
 "Calibrazione PINDA completata e attiva. Puo essere disattivata dal menu "
 "Impostazioni ->Calib. PINDA"
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr "Pausa"
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr "Metti in pausa"
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1242,7 +1468,7 @@ msgstr ""
 "punti. In caso l'ugello muova il foglio spegnere subito la stampante."
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1256,29 +1482,29 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr "Controllare il collegamento al sensore e rimuovere il filamento."
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr "Verifica:"
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr "Per favore pulisci il piatto, poi premi la manopola."
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Pulire l'ugello per la calibrazione, poi fare click."
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 "Inserisci il filamento nell'estrusore, poi premi la manopola per caricarlo."
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
@@ -1287,50 +1513,45 @@ msgstr ""
 "manopola per caricarlo."
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr "Per favore prima carica il filamento."
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr "Aprire la guida filam. e rimuovere il filam. a mano"
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr "Per favore posizionate la piastra d'acciaio sul piano riscaldato."
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr "Premete la manopola per scaricare il filamento"
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr "Estrarre il filamento immediatamente"
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr "Rimuovi il filamento e quindi premi la manopola."
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr "Per favore rimuovete i materiali da spedizione"
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr "Rimuovete la piastra di acciaio dal piano riscaldato"
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr "Esegui la calibrazione XYZ prima."
 
@@ -1339,113 +1560,109 @@ msgstr "Esegui la calibrazione XYZ prima."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Scaricare prima il filamento, poi ripetere l'operazione."
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr "Aggiorna il firmware sul tuo MMU2. In attesa di reset."
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr "Prego aggiornare."
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr "Attendere"
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr "Interr. corr."
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr "Preriscalda"
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr "Prerisc. ugello!"
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr "Preriscaldando l'ugello. Attendere prego."
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr "Preriscalda. taglio"
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr "Preriscalda. espuls."
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr "Preriscald. carico"
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr "Preriscald. scarico"
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr "Premere la manopola"
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Premete la manopola per preriscaldare l'ugello e continuare."
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr "Premete la manopola per recuperare la temperatura dell'ugello."
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr "Stampa interrotta"
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr "Vent.stam:"
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr "Stampa da SD"
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr "Stampa in pausa"
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr "Tempo di stampa"
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr "Ind. IP stampante:"
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
@@ -1454,12 +1671,12 @@ msgstr ""
 "Primi Passi, sezione Sequenza di Calibrazione."
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Diametro ugello diverso da G-Code. Continuare?"
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
@@ -1467,67 +1684,112 @@ msgstr ""
 "Diametro ugello diverso dal G-Code. Controlla il valore nelle impostazioni. "
 "Stampa annullata."
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr "Porta RPi"
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr "Retro [μm]"
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr "Recupero stampa"
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 "Rimuovi il filamento precedente e premi la manopola per caricare il nuovo "
 "filamento."
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr "Rinomina"
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr "Reset"
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr "Reset calibr. XYZ."
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr "Riprendi stampa"
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr "Riprendi stampa"
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr "Destra"
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr "Destra [μm]"
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
@@ -1535,36 +1797,41 @@ msgstr ""
 "Se avvi il Wizard perderai la calibrazione preesistente e dovrai "
 "ricominciare dall'inizio. Continuare?"
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Esaurim"
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr "Mem. SD"
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr "ARRESTATO."
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr "Ricerca punti calibrazione piano"
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr "Seleziona"
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
@@ -1573,67 +1840,74 @@ msgstr ""
 "menu sullo schermo."
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr "Seleziona estrusore:"
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr "Seleziona il filam.:"
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr "Seleziona lingua"
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 "Selezionate la temperatura per il preriscaldamento dell'ugello adatta al "
 "vostro materiale."
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr "Seleziona la temperatura appropriata per il tuo materiale."
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr "Autotest OK"
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr "Avvia autotest"
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr "Autotest"
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr "Errore Autotest!"
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr "Autotest fallito"
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr "Verra effettuato un self test per calibrare l'homing senza sensori"
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr "Info Sensore"
 
@@ -1643,31 +1917,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Sensore verificato, rimuovere il filamento."
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr "Imposta temperatura:"
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr "Impostazioni"
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr "Deviaz. forte"
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr "Piano"
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1680,18 +1954,18 @@ msgstr ""
 "%cReset"
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr "Stato finecorsa"
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr "Silenz."
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr "Deviaz. lieve"
 
@@ -1705,113 +1979,172 @@ msgstr ""
 "e 100 perche siano ordinati."
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Sono stati rilevati problemi, avviato livellamento Z ..."
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr "Ordina"
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr "Ordinando i file"
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr "Suono"
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr "Velocita"
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr "Gira"
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 "Sono necessari una temperatura ambiente di 21-26C e una superficie rigida."
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr "Statistiche"
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr "Silenz."
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr "Piani d'acciaio"
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr "Arresta stampa"
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr "Esatto"
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr "Supporto"
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr "Scambiato"
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr "Temperatura"
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr "Temperature"
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1822,7 +2155,7 @@ msgstr ""
 "manuale (capitolo sulla calibrazione)."
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
@@ -1831,66 +2164,102 @@ msgstr ""
 "Primi Passi, sezione Sequenza di Calibrazione."
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr "Cron."
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr "Timeout"
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr "Totale"
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr "Totale fallimenti"
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr "Filamento totale"
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr "Tempo stampa totale"
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr "Regola"
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr "Scarica filam."
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr "Scaricando filamento"
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr "Verifica fallita, rimuovere il filamento e riprovare."
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr "Voltaggi"
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1903,222 +2272,281 @@ msgstr ""
 "Modalita silenziosa"
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr "Attendendo utente..."
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr "In attesa del raffreddamento della sonda PINDA"
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr "In attesa del raffreddamento dell'ugello e del piano"
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr "Avviso"
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Attenzione: tipo di stampante e di scheda madre cambiati."
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr "Avviso: tipo di scheda madre cambiato"
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr "Avviso: tipo di stampante cambiato."
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr "Filamento scaricato con successo?"
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr "Errore cablaggio"
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr "Wizard"
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr "Correzione-X:"
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr "XYZ Cal. dettagli"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 "Calibrazione XYZ corretta. La distorsione verra compensata automaticamente."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr "Calibrazione XYZ compromessa. Punti anteriori non raggiungibili."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 "Calibrazione XYZ fallita. Il punto di calibrazione sul piano non e' stato "
 "trovato."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Calibrazione XYZ fallita. Si prega di consultare il manuale."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Calibrazione XYZ OK. Gli assi X/Y sono perpendicolari. Complimenti!"
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr "Distanza Y dal min"
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr "Correzione-Y:"
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr "Si"
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 "E possibile riprendere il Wizard in qualsiasi momento attraverso "
 "Calibrazione -> Wizard."
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr "Correzione-Z:"
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr "Nr. Z-test"
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr "[0;0] punto offset"
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr "e cliccare manopola"
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr "per caricare il fil."
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr "per scaricare fil."
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr "sconosciuto"
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr "stato sconosciuto"
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr "🔃Ricaricare"
 
+#~ msgid ""
+#~ "Autoloading filament available only when filament sensor is turned on..."
+#~ msgstr ""
+#~ "Caricamento automatico filamento disponibile solo con il sensore attivo..."
+
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Scontro rilevato. Riprendere la stampa?"
 
+#~ msgid "Cutting filament"
+#~ msgstr "Tagliando filam."
+
+#~ msgid "ERROR: Filament sensor is not responding, please check connection."
+#~ msgstr "ERRORE: il sensore filam. non risponde,Controllare conness."
+
+#~ msgid "FS v0.3 or older"
+#~ msgstr "FS 0.3 o inferiore"
+
+#~ msgid "FS v0.4 or newer"
+#~ msgstr "FS 0.4 o superiore"
+
+#~ msgid "Fix the issue and then press button on MMU unit."
+#~ msgstr "Risolvere il problema e premere il bottone sull'unita MMU."
+
+#~ msgid "Load all"
+#~ msgstr "Caricare tutti"
+
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Calibr. primo strato"
+
+#~ msgid "MK3 firmware detected on MK3S printer"
+#~ msgstr "Firmware MK3 rilevato su stampante MK3S"
+
+#~ msgid "MK3S firmware detected on MK3 printer"
+#~ msgstr "Firmware MK3S rilevato su stampante MK3"
+
+#~ msgid "MMU OK. Resuming position..."
+#~ msgstr "MMU OK. riprendendo la posizione..."
+
+#~ msgid "MMU OK. Resuming temperature..."
+#~ msgstr "MMU OK. Ripristino temperatura..."
+
+#~ msgid "MMU OK. Resuming..."
+#~ msgstr "MMU OK. Riprendendo..."
+
+#~ msgid "MMU load failed"
+#~ msgstr "Caricam. MMU fallito"
+
+#~ msgid "MMU needs user attention."
+#~ msgstr "Il MMU richiede attenzione dall'utente."
+
+#~ msgid "MMU power fails"
+#~ msgstr "Manc. corr. MMU"
+
+#~ msgid "Please remove filament and then press the knob."
+#~ msgstr "Rimuovi il filamento e quindi premi la manopola."
+
+#~ msgid "Please update firmware in your MMU2. Waiting for reset."
+#~ msgstr "Aggiorna il firmware sul tuo MMU2. In attesa di reset."
+
+#~ msgid "Press the knob to resume nozzle temperature."
+#~ msgstr "Premete la manopola per recuperare la temperatura dell'ugello."
+
+#~ msgid "Runouts"
+#~ msgstr "Esaurim"

+ 949 - 579
lang/po/Firmware_lb.po

@@ -16,352 +16,371 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr ""
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr ""
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr ""
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ""
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr ""
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr ""
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr ""
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr ""
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr ""
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr ""
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr ""
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr ""
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr ""
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr ""
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr ""
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr ""
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr ""
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr ""
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr ""
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 msgstr ""
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr ""
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr ""
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr ""
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr ""
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr ""
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr ""
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr ""
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr ""
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr ""
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr ""
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr ""
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr ""
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr ""
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr ""
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr ""
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr ""
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr ""
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr ""
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr ""
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr ""
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr ""
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr ""
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr ""
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr ""
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr ""
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -369,39 +388,46 @@ msgid ""
 msgstr ""
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr ""
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr ""
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr ""
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr ""
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr ""
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -410,294 +436,417 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 msgstr ""
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr ""
 
-#. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
-msgid "ERROR:"
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
 msgstr ""
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
+#. MSG_ERROR c=10
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
+msgid "ERROR:"
 msgstr ""
 
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr ""
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr ""
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr ""
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr ""
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr ""
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr ""
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr ""
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
 msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
+
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
 msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr ""
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr ""
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr ""
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr ""
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr ""
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr ""
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr ""
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr ""
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr ""
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr ""
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr ""
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr ""
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr ""
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr ""
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr ""
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr ""
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr ""
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr ""
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr ""
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr ""
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr ""
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -705,7 +854,7 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -714,319 +863,372 @@ msgstr ""
 "duerch de Setupprozess guideieren?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr ""
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr ""
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 msgstr ""
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr ""
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr ""
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr ""
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr ""
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr ""
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr ""
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr ""
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr ""
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr ""
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr ""
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr ""
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr ""
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr ""
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
 msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr ""
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr ""
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr ""
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr ""
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr ""
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr ""
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
 msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
 msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr ""
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
 msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr ""
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr ""
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
 msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
 msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr ""
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr ""
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr ""
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr ""
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr ""
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr ""
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr ""
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr ""
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr ""
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr ""
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr ""
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr ""
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr ""
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr ""
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr ""
 
@@ -1036,178 +1238,203 @@ msgid "New firmware version available:"
 msgstr ""
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr ""
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr ""
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr ""
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr ""
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr ""
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr ""
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr ""
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr ""
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr ""
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr ""
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr ""
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr ""
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr ""
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr ""
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 msgstr ""
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr ""
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr ""
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1219,78 +1446,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr ""
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 msgstr ""
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr ""
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr ""
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr ""
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr ""
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr ""
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr ""
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr ""
 
@@ -1299,289 +1521,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr ""
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr ""
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr ""
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr ""
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr ""
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr ""
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr ""
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr ""
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr ""
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr ""
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr ""
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr ""
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr ""
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr ""
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr ""
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr ""
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr ""
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr ""
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 msgstr ""
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr ""
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr ""
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr ""
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr ""
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr ""
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr ""
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr ""
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr ""
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr ""
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr ""
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 msgstr ""
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr ""
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr ""
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr ""
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr ""
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 msgstr ""
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr ""
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr ""
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr ""
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr ""
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr ""
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr ""
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr ""
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr ""
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr ""
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr ""
 
@@ -1591,31 +1866,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr ""
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr ""
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr ""
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr ""
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1624,18 +1899,18 @@ msgid ""
 msgstr ""
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr ""
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr ""
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr ""
 
@@ -1647,112 +1922,171 @@ msgid ""
 msgstr ""
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr ""
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr ""
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr ""
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr ""
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr ""
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr ""
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr ""
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr ""
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr ""
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr ""
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr ""
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr ""
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr ""
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1760,73 +2094,109 @@ msgid ""
 msgstr ""
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 msgstr ""
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr ""
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr ""
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr ""
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr ""
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr ""
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr ""
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr ""
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr ""
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr ""
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr ""
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1835,210 +2205,210 @@ msgid ""
 msgstr ""
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr ""
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr ""
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr ""
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr ""
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr ""
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr ""
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr ""
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr ""
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr ""
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr ""
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr ""
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr ""
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr ""
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr ""
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr ""
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr ""
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr ""
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr ""
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr ""

+ 949 - 579
lang/po/Firmware_lt.po

@@ -16,352 +16,371 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. MSG_IR_03_OR_OLDER c=18
-#: ../../Firmware/fsensor.cpp:178 ../../Firmware/messages.cpp:161
+#: ../../Firmware/Filament_sensor.cpp:287
+#: ../../Firmware/Filament_sensor.cpp:362 ../../Firmware/messages.cpp:165
 msgid " 0.3 or older"
 msgstr ""
 
 #. MSG_IR_04_OR_NEWER c=18
-#: ../../Firmware/fsensor.cpp:180 ../../Firmware/messages.cpp:160
+#: ../../Firmware/Filament_sensor.cpp:289
+#: ../../Firmware/Filament_sensor.cpp:365 ../../Firmware/messages.cpp:164
 msgid " 0.4 or newer"
 msgstr ""
 
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgstr ""
 
 #. MSG_CANCEL c=10
-#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1976
-#: ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/messages.cpp:18 ../../Firmware/ultralcd.cpp:1980
+#: ../../Firmware/ultralcd.cpp:3806
 msgid ">Cancel"
 msgstr ""
 
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgstr ""
 
 #. MSG_WIZARD_DONE c=20 r=3
-#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:4179
-#: ../../Firmware/ultralcd.cpp:4188
+#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4133
+#: ../../Firmware/ultralcd.cpp:4142
 msgid "All is done. Happy printing!"
 msgstr ""
 
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgstr ""
 
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgstr ""
 
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgstr ""
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2991
+#: ../../Firmware/ultralcd.cpp:2981
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgstr ""
 
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgstr ""
 
 #. MSG_AUTO_HOME c=18
-#: ../../Firmware/Marlin_main.cpp:3268 ../../Firmware/messages.cpp:9
-#: ../../Firmware/ultralcd.cpp:4908
+#: ../../Firmware/Marlin_main.cpp:3261 ../../Firmware/messages.cpp:9
+#: ../../Firmware/ultralcd.cpp:4871
 msgid "Auto home"
 msgstr ""
 
 #. MSG_AUTO_POWER c=10
-#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:5787
+#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:5777
 msgid "Auto power"
 msgstr ""
 
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgstr ""
 
-#. MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3557
-msgid ""
-"Autoloading filament available only when filament sensor is turned on..."
-msgstr ""
-
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 
+#. MSG_PROGRESS_AVOID_GRIND c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:16
+#: ../../Firmware/mmu2_progress_converter.cpp:42
+msgid "Avoiding grind"
+msgstr ""
+
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgstr ""
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgstr ""
 
 #. MSG_BACK c=18
-#: ../../Firmware/messages.cpp:59 ../../Firmware/ultralcd.cpp:2759
-#: ../../Firmware/ultralcd.cpp:5869 ../../Firmware/ultralcd.cpp:7849
+#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:2749
+#: ../../Firmware/ultralcd.cpp:4223 ../../Firmware/ultralcd.cpp:5859
+#: ../../Firmware/ultralcd.cpp:7826
 msgid "Back"
 msgstr ""
 
 #. MSG_BED c=13
-#: ../../Firmware/Marlin_main.cpp:2048 ../../Firmware/Marlin_main.cpp:4764
-#: ../../Firmware/Marlin_main.cpp:4816 ../../Firmware/messages.cpp:12
-#: ../../Firmware/ultralcd.cpp:1411 ../../Firmware/ultralcd.cpp:5729
-#: ../../Firmware/ultralcd.cpp:5899
+#: ../../Firmware/Marlin_main.cpp:2029 ../../Firmware/Marlin_main.cpp:4792
+#: ../../Firmware/Marlin_main.cpp:4844 ../../Firmware/messages.cpp:12
+#: ../../Firmware/ultralcd.cpp:1404 ../../Firmware/ultralcd.cpp:5734
+#: ../../Firmware/ultralcd.cpp:5889
 msgid "Bed"
 msgstr ""
 
 #. MSG_BED_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6257 ../../Firmware/messages.cpp:14
-#: ../../Firmware/ultralcd.cpp:578
+#: ../../Firmware/Marlin_main.cpp:6293 ../../Firmware/messages.cpp:14
+#: ../../Firmware/ultralcd.cpp:585
 msgid "Bed Heating"
 msgstr ""
 
 #. MSG_BED_DONE c=20
-#: ../../Firmware/Marlin_main.cpp:6295 ../../Firmware/messages.cpp:13
-#: ../../Firmware/ultralcd.cpp:581
+#: ../../Firmware/Marlin_main.cpp:6331 ../../Firmware/messages.cpp:13
+#: ../../Firmware/ultralcd.cpp:588
 msgid "Bed done"
 msgstr ""
 
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgstr ""
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:2211 ../../Firmware/Marlin_main.cpp:2990
-#: ../../Firmware/Marlin_main.cpp:3000
-#: ../../Firmware/mesh_bed_calibration.cpp:2862
-#: ../../Firmware/mesh_bed_calibration.cpp:2870
-#: ../../Firmware/mesh_bed_calibration.cpp:2896 ../../Firmware/messages.cpp:15
+#: ../../Firmware/Marlin_main.cpp:2209 ../../Firmware/Marlin_main.cpp:2985
+#: ../../Firmware/Marlin_main.cpp:2995
+#: ../../Firmware/mesh_bed_calibration.cpp:2858
+#: ../../Firmware/mesh_bed_calibration.cpp:2866
+#: ../../Firmware/mesh_bed_calibration.cpp:2892 ../../Firmware/messages.cpp:15
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 msgstr ""
 
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgstr ""
 
 #. MSG_BELT_STATUS c=18
-#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1466
-#: ../../Firmware/ultralcd.cpp:1734
+#: ../../Firmware/messages.cpp:17 ../../Firmware/ultralcd.cpp:1457
+#: ../../Firmware/ultralcd.cpp:1726
 msgid "Belt status"
 msgstr ""
 
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgstr ""
 
 #. MSG_RECOVER_PRINT c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:1604 ../../Firmware/Marlin_main.cpp:1626
-#: ../../Firmware/messages.cpp:77
+#: ../../Firmware/Marlin_main.cpp:1585 ../../Firmware/Marlin_main.cpp:1607
+#: ../../Firmware/messages.cpp:81
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgstr ""
 
 #. MSG_BRIGHTNESS c=18
-#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:4858
-#: ../../Firmware/ultralcd.cpp:5797
+#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:4821
+#: ../../Firmware/ultralcd.cpp:5787
 msgid "Brightness"
 msgstr ""
 
+#. MSG_TITLE_COMMUNICATION_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:147 ../../Firmware/mmu2/errors_list.h:185
+msgid "COMMUNICATION ERROR"
+msgstr ""
+
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgstr ""
 
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:2167 ../../Firmware/messages.cpp:19
-#: ../../Firmware/ultralcd.cpp:626
+#: ../../Firmware/Marlin_main.cpp:2166 ../../Firmware/messages.cpp:19
+#: ../../Firmware/ultralcd.cpp:633
 msgid "Calibrating Z"
 msgstr ""
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 msgstr ""
 
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgstr ""
 
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgstr ""
 
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgstr ""
 
+#. MSG_DESC_CANNOT_MOVE c=20 r=4
+#: ../../Firmware/mmu2/errors_list.h:203 ../../Firmware/mmu2/errors_list.h:243
+#: ../../Firmware/mmu2/errors_list.h:245
+msgid "Can't move Selector or Idler."
+msgstr ""
+
+#. MSG_DESC_FILAMENT_ALREADY_LOADED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:228 ../../Firmware/mmu2/errors_list.h:266
+msgid "Cannot perform the action, filament is already loaded. Unload it first."
+msgstr ""
+
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgstr ""
 
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgstr ""
 
 #. MSG_FILAMENTCHANGE c=18
-#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5505
-#: ../../Firmware/ultralcd.cpp:5738
+#: ../../Firmware/messages.cpp:39 ../../Firmware/ultralcd.cpp:5506
+#: ../../Firmware/ultralcd.cpp:5743
 msgid "Change filament"
 msgstr ""
 
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgstr ""
 
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgstr ""
 
 #. MSG_CHECKING_X c=20
-#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6186
-#: ../../Firmware/ultralcd.cpp:7313
+#: ../../Firmware/messages.cpp:21 ../../Firmware/ultralcd.cpp:6187
+#: ../../Firmware/ultralcd.cpp:7303
 msgid "Checking X axis"
 msgstr ""
 
 #. MSG_CHECKING_Y c=20
-#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6195
-#: ../../Firmware/ultralcd.cpp:7314
+#: ../../Firmware/messages.cpp:22 ../../Firmware/ultralcd.cpp:6196
+#: ../../Firmware/ultralcd.cpp:7304
 msgid "Checking Y axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_BED c=20
-#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:7316
+#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:7306
 msgid "Checking bed"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgstr ""
 
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgstr ""
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
-#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7319
-#: ../../Firmware/ultralcd.cpp:7320
+#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:7309
+#: ../../Firmware/ultralcd.cpp:7310
 msgid "Checking sensors"
 msgstr ""
 
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgstr ""
 
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgstr ""
 
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgstr ""
 
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgstr ""
 
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgstr ""
 
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgstr ""
 
 #. MSG_CRASH c=7
-#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1229
-#: ../../Firmware/ultralcd.cpp:1270 ../../Firmware/ultralcd.cpp:1280
+#: ../../Firmware/messages.cpp:26 ../../Firmware/ultralcd.cpp:1247
+#: ../../Firmware/ultralcd.cpp:1276
 msgid "Crash"
 msgstr ""
 
 #. MSG_CRASHDETECT c=13
-#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4352
-#: ../../Firmware/ultralcd.cpp:5773 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5779
+#: ../../Firmware/messages.cpp:28 ../../Firmware/ultralcd.cpp:4339
+#: ../../Firmware/ultralcd.cpp:4340 ../../Firmware/ultralcd.cpp:4342
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5765
+#: ../../Firmware/ultralcd.cpp:5769
 msgid "Crash det."
 msgstr ""
 
 #. MSG_CRASH_DETECTED c=20
-#: ../../Firmware/Marlin_main.cpp:597 ../../Firmware/messages.cpp:27
+#: ../../Firmware/Marlin_main.cpp:586 ../../Firmware/messages.cpp:27
 msgid "Crash detected."
 msgstr ""
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 "Crash detection can\n"
 "be turned on only in\n"
@@ -369,39 +388,46 @@ msgid ""
 msgstr ""
 
 #. MSG_CUT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5183
-#: ../../Firmware/ultralcd.cpp:5575
+#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:5155
+#: ../../Firmware/ultralcd.cpp:5578
 msgid "Cut filament"
 msgstr ""
 
 #. MSG_CUTTER c=9
-#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4311
-#: ../../Firmware/ultralcd.cpp:4316 ../../Firmware/ultralcd.cpp:4321
+#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4287 ../../Firmware/ultralcd.cpp:4292
 msgid "Cutter"
 msgstr ""
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgstr ""
 
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgstr ""
 
+#. MSG_BTN_DISABLE_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:286 ../../Firmware/mmu2/errors_list.h:296
+msgid "Disable"
+msgstr ""
+
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgstr ""
 
+#. MSG_PROGRESS_DISENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:10
+#: ../../Firmware/mmu2_progress_converter.cpp:36
+#: ../../Firmware/mmu2_progress_converter.cpp:44
+msgid "Disengaging idler"
+msgstr ""
+
 #. MSG_BABYSTEP_Z_NOT_SET c=20 r=12
-#: ../../Firmware/Marlin_main.cpp:1549 ../../Firmware/Marlin_main.cpp:3408
+#: ../../Firmware/Marlin_main.cpp:1530 ../../Firmware/Marlin_main.cpp:3400
 #: ../../Firmware/messages.cpp:11
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -410,294 +436,417 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 msgstr ""
 
+#. MSG_BTN_CONTINUE c=5
+#: ../../Firmware/mmu2/errors_list.h:282 ../../Firmware/mmu2/errors_list.h:292
+msgid "Done"
+msgstr ""
+
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgstr ""
 
-#. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
-msgid "ERROR:"
+#. MSG_PROGRESS_ERR_HELP_FIL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:19
+#: ../../Firmware/mmu2_progress_converter.cpp:48
+msgid "ERR Help filament"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_INTERNAL c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:18
+#: ../../Firmware/mmu2_progress_converter.cpp:47
+msgid "ERR Internal"
+msgstr ""
+
+#. MSG_PROGRESS_ERR_TMC c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:20
+#: ../../Firmware/mmu2_progress_converter.cpp:49
+msgid "ERR TMC failed"
 msgstr ""
 
-#. MSG_FSENS_NOT_RESPONDING c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3570
-msgid "ERROR: Filament sensor is not responding, please check connection."
+#. MSG_PROGRESS_WAIT_USER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:17
+#: ../../Firmware/mmu2_progress_converter.cpp:46
+msgid "ERR Wait for User"
+msgstr ""
+
+#. MSG_ERROR c=10
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
+msgid "ERROR:"
 msgstr ""
 
 #. MSG_EJECT_FILAMENT c=17
-#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5164
-#: ../../Firmware/ultralcd.cpp:5573
+#: ../../Firmware/messages.cpp:60 ../../Firmware/ultralcd.cpp:5137
+#: ../../Firmware/ultralcd.cpp:5575
 msgid "Eject filament"
 msgstr ""
 
-#. MSG_EJECTING_FILAMENT c=20
-#: ../../Firmware/mmu.cpp:1076
+#. MSG_PROGRESS_EJECT_FILAMENT c=20
+#. @@todo duplicate
+#: ../../Firmware/mmu2_progress_converter.cpp:27
+#: ../../Firmware/mmu2_progress_converter.cpp:58
 msgid "Ejecting filament"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgstr ""
 
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgstr ""
 
+#. MSG_PROGRESS_ENGAGE_IDLER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:9
+#: ../../Firmware/mmu2_progress_converter.cpp:35
+#: ../../Firmware/mmu2_progress_converter.cpp:45
+msgid "Engaging idler"
+msgstr ""
+
 #. MSG_EXTRUDER c=17
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:30
-#: ../../Firmware/ultralcd.cpp:3503
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:30
+#: ../../Firmware/ultralcd.cpp:3512
 msgid "Extruder"
 msgstr ""
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7329
+#: ../../Firmware/messages.cpp:35 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7319
 msgid "Extruder fan:"
 msgstr ""
 
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgstr ""
 
 #. MSG_FSENSOR_AUTOLOAD c=13
-#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4237
-#: ../../Firmware/ultralcd.cpp:4245 ../../Firmware/ultralcd.cpp:4256
-#: ../../Firmware/ultralcd.cpp:4258
+#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:4230
+#: ../../Firmware/ultralcd.cpp:4237
 msgid "F. autoload"
 msgstr ""
 
+#. MSG_FSENSOR_JAM_DETECTION c=13
+#: ../../Firmware/messages.cpp:46 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:4239
+msgid "F. jam detect"
+msgstr ""
+
+#. MSG_FSENSOR_RUNOUT c=13
+#: ../../Firmware/messages.cpp:44 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4236
+msgid "F. runout"
+msgstr ""
+
+#. MSG_TITLE_FIL_ALREADY_LOADED c=20
+#: ../../Firmware/mmu2/errors_list.h:148 ../../Firmware/mmu2/errors_list.h:186
+msgid "FILAMENT ALREADY LOA"
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:118 ../../Firmware/mmu2/errors_list.h:156
+msgid "FINDA DIDNT TRIGGER"
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:197 ../../Firmware/mmu2/errors_list.h:237
+msgid ""
+"FINDA didn't switch off while unloading filament. Try unloading manually. "
+"Ensure filament can move and FINDA works."
+msgstr ""
+
+#. MSG_DESC_FINDA_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:196 ../../Firmware/mmu2/errors_list.h:236
+msgid ""
+"FINDA didn't trigger while loading the filament. Ensure the filament can "
+"move and FINDA works."
+msgstr ""
+
+#. MSG_TITLE_FINDA_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:119 ../../Firmware/mmu2/errors_list.h:157
+msgid "FINDA: FILAM. STUCK"
+msgstr ""
+
 #. MSG_FS_ACTION c=10
-#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:4712
-#: ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:4245
+#: ../../Firmware/ultralcd.cpp:4248
 msgid "FS Action"
 msgstr ""
 
-#. MSG_FS_V_03_OR_OLDER c=18
-#: ../../Firmware/Marlin_main.cpp:9482
-msgid "FS v0.3 or older"
+#. MSG_TITLE_FSENSOR_DIDNT_TRIGGER c=20
+#: ../../Firmware/mmu2/errors_list.h:120 ../../Firmware/mmu2/errors_list.h:158
+msgid "FSENSOR DIDNT TRIGG."
 msgstr ""
 
-#. MSG_FS_V_04_OR_NEWER c=18
-#: ../../Firmware/Marlin_main.cpp:9474
-msgid "FS v0.4 or newer"
+#. MSG_TITLE_FSENSOR_TOO_EARLY c=20
+#: ../../Firmware/mmu2/errors_list.h:123 ../../Firmware/mmu2/errors_list.h:161
+msgid "FSENSOR TOO EARLY"
+msgstr ""
+
+#. MSG_TITLE_FSENSOR_DIDNT_GO_OFF c=20
+#: ../../Firmware/mmu2/errors_list.h:121 ../../Firmware/mmu2/errors_list.h:159
+msgid "FSENSOR: FIL. STUCK"
+msgstr ""
+
+#. MSG_TITLE_FW_RUNTIME_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:152 ../../Firmware/mmu2/errors_list.h:190
+msgid "FW RUNTIME ERROR"
 msgstr ""
 
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgstr ""
 
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgstr ""
 
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgstr ""
 
 #. MSG_FAN_SPEED c=14
-#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5731
-#: ../../Firmware/ultralcd.cpp:5901
+#: ../../Firmware/messages.cpp:34 ../../Firmware/ultralcd.cpp:5736
+#: ../../Firmware/ultralcd.cpp:5891
 msgid "Fan speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN c=20
-#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:7151
-#: ../../Firmware/ultralcd.cpp:7309 ../../Firmware/ultralcd.cpp:7310
-#: ../../Firmware/ultralcd.cpp:7311
+#: ../../Firmware/messages.cpp:90 ../../Firmware/ultralcd.cpp:7141
+#: ../../Firmware/ultralcd.cpp:7299 ../../Firmware/ultralcd.cpp:7300
+#: ../../Firmware/ultralcd.cpp:7301
 msgid "Fan test"
 msgstr ""
 
 #. MSG_FANS_CHECK c=13
-#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:5764
+#: ../../Firmware/messages.cpp:31 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:5754
 msgid "Fans check"
 msgstr ""
 
+#. MSG_PROGRESS_FEED_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:13
+#: ../../Firmware/mmu2_progress_converter.cpp:39
+msgid "Feeding to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_FSENSOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:31
+#: ../../Firmware/mmu2_progress_converter.cpp:62
+msgid "Feeding to FSensor"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_EXTRUDER c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:14
+#: ../../Firmware/mmu2_progress_converter.cpp:40
+msgid "Feeding to extruder"
+msgstr ""
+
+#. MSG_PROGRESS_FEED_NOZZLE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:15
+#: ../../Firmware/mmu2_progress_converter.cpp:41
+msgid "Feeding to nozzle"
+msgstr ""
+
 #. MSG_FIL_RUNOUTS c=15
-#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1228
-#: ../../Firmware/ultralcd.cpp:1269 ../../Firmware/ultralcd.cpp:1335
-#: ../../Firmware/ultralcd.cpp:1337
+#: ../../Firmware/messages.cpp:32 ../../Firmware/ultralcd.cpp:1246
+#: ../../Firmware/ultralcd.cpp:1275 ../../Firmware/ultralcd.cpp:1329
+#: ../../Firmware/ultralcd.cpp:1331
 msgid "Fil. runouts"
 msgstr ""
 
 #. MSG_FSENSOR c=12
-#: ../../Firmware/messages.cpp:45 ../../Firmware/ultralcd.cpp:3459
-#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4242
-#: ../../Firmware/ultralcd.cpp:4252 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5749 ../../Firmware/ultralcd.cpp:5753
+#: ../../Firmware/messages.cpp:47 ../../Firmware/ultralcd.cpp:3473
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4768
+#: ../../Firmware/ultralcd.cpp:5747
 msgid "Fil. sensor"
 msgstr ""
 
 #. MSG_FILAMENT c=17
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:33 ../../Firmware/ultralcd.cpp:3843
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:33
+#: ../../Firmware/ultralcd.cpp:3806
 msgid "Filament"
 msgstr ""
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
-#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2295
-#: ../../Firmware/ultralcd.cpp:2301
+#: ../../Firmware/messages.cpp:37 ../../Firmware/ultralcd.cpp:2290
+#: ../../Firmware/ultralcd.cpp:2294
 msgid "Filament extruding & with correct color?"
 msgstr ""
 
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgstr ""
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
-#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7034
-#: ../../Firmware/ultralcd.cpp:7038 ../../Firmware/ultralcd.cpp:7042
-#: ../../Firmware/ultralcd.cpp:7338
+#: ../../Firmware/messages.cpp:96 ../../Firmware/ultralcd.cpp:7025
+#: ../../Firmware/ultralcd.cpp:7029 ../../Firmware/ultralcd.cpp:7033
+#: ../../Firmware/ultralcd.cpp:7328
 msgid "Filament sensor"
 msgstr ""
 
+#. MSG_DESC_FSENSOR_DIDNT_GO_OFF c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:199 ../../Firmware/mmu2/errors_list.h:239
+msgid ""
+"Filament sensor didn't switch off while unloading filament. Ensure filament "
+"can move and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_DIDNT_TRIGGER c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:198 ../../Firmware/mmu2/errors_list.h:238
+msgid ""
+"Filament sensor didn't trigger while loading the filament. Ensure the "
+"filament reached the fsensor and the sensor works."
+msgstr ""
+
+#. MSG_DESC_FSENSOR_TOO_EARLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:201 ../../Firmware/mmu2/errors_list.h:241
+msgid ""
+"Filament sensor triggered too early while loading to extruder. Check there "
+"isn't anything stuck in PTFE tube. Check that sensor reads properly."
+msgstr ""
+
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgstr ""
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 
 #. MSG_FINISHING_MOVEMENTS c=20
-#: ../../Firmware/messages.cpp:41 ../../Firmware/ultralcd.cpp:5322
-#: ../../Firmware/ultralcd.cpp:5638
+#: ../../Firmware/messages.cpp:41 ../../Firmware/mmu2_progress_converter.cpp:43
+#: ../../Firmware/ultralcd.cpp:5323 ../../Firmware/ultralcd.cpp:5643
 msgid "Finishing movements"
 msgstr ""
 
 #. MSG_V2_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4906
-#: ../../Firmware/ultralcd.cpp:5432
+#: ../../Firmware/messages.cpp:125 ../../Firmware/ultralcd.cpp:4869
+#: ../../Firmware/ultralcd.cpp:5433
 msgid "First layer cal."
 msgstr ""
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4074
+#: ../../Firmware/ultralcd.cpp:4032
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 
-#. MSG_MMU_FIX_ISSUE c=20 r=4
-#: ../../Firmware/mmu.cpp:728
-msgid "Fix the issue and then press button on MMU unit."
-msgstr ""
-
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgstr ""
 
 #. MSG_SELFTEST_PART_FAN c=20
-#: ../../Firmware/messages.cpp:83 ../../Firmware/ultralcd.cpp:7004
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:6995
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Front print fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgstr ""
 
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
-#: ../../Firmware/util.cpp:418
+#: ../../Firmware/util.cpp:402
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
-#: ../../Firmware/messages.cpp:131 ../../Firmware/util.cpp:335
-#: ../../Firmware/util.cpp:471
+#: ../../Firmware/messages.cpp:135 ../../Firmware/util.cpp:323
+#: ../../Firmware/util.cpp:454
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
-#: ../../Firmware/messages.cpp:132 ../../Firmware/util.cpp:341
-#: ../../Firmware/util.cpp:477
+#: ../../Firmware/messages.cpp:136 ../../Firmware/util.cpp:329
+#: ../../Firmware/util.cpp:460
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:385
+#: ../../Firmware/util.cpp:370
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 msgstr ""
 
 #. MSG_GCODE c=8
-#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4663
-#: ../../Firmware/ultralcd.cpp:4666 ../../Firmware/ultralcd.cpp:4669
-#: ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4653
+#: ../../Firmware/ultralcd.cpp:4656 ../../Firmware/ultralcd.cpp:4659
+#: ../../Firmware/ultralcd.cpp:4662
 msgid "Gcode"
 msgstr ""
 
 #. MSG_HW_SETUP c=18
-#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:4680
-#: ../../Firmware/ultralcd.cpp:4734 ../../Firmware/ultralcd.cpp:4826
+#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4670
+#: ../../Firmware/ultralcd.cpp:4689 ../../Firmware/ultralcd.cpp:4789
 msgid "HW Setup"
 msgstr ""
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgstr ""
 
 #. MSG_HEATING c=20
-#: ../../Firmware/Marlin_main.cpp:6200 ../../Firmware/messages.cpp:46
-#: ../../Firmware/ultralcd.cpp:570
+#: ../../Firmware/Marlin_main.cpp:6236 ../../Firmware/messages.cpp:48
+#: ../../Firmware/ultralcd.cpp:577
 msgid "Heating"
 msgstr ""
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:9395
+#: ../../Firmware/Marlin_main.cpp:9477
 msgid "Heating disabled by safety timer."
 msgstr ""
 
 #. MSG_HEATING_COMPLETE c=20
-#: ../../Firmware/Marlin_main.cpp:6231 ../../Firmware/messages.cpp:47
-#: ../../Firmware/ultralcd.cpp:573
+#: ../../Firmware/Marlin_main.cpp:6267 ../../Firmware/messages.cpp:49
+#: ../../Firmware/ultralcd.cpp:580
 msgid "Heating done."
 msgstr ""
 
-#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
-#: ../../Firmware/messages.cpp:119 ../../Firmware/ultralcd.cpp:4050
+#. MSG_WIZARD_WELCOME_SHIPPING c=20 r=12
+#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4008
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -705,7 +854,7 @@ msgid ""
 msgstr ""
 
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
@@ -714,319 +863,372 @@ msgstr ""
 "padetu jums atlikti sarankos procesa?"
 
 #. MSG_HIGH_POWER c=10
-#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5788
+#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5778
 msgid "High power"
 msgstr ""
 
+#. MSG_PROGRESS_HOMING c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:29
+#: ../../Firmware/mmu2_progress_converter.cpp:60
+msgid "Homing"
+msgstr ""
+
 #. MSG_WIZARD_XYZ_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4083
+#: ../../Firmware/ultralcd.cpp:4041
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgstr ""
 
+#. MSG_TITLE_IDLER_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:127 ../../Firmware/mmu2/errors_list.h:164
+msgid "IDLER CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_IDLER_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:126 ../../Firmware/mmu2/errors_list.h:165
+msgid "IDLER CANNOT MOVE"
+msgstr ""
+
+#. MSG_TITLE_INVALID_TOOL c=20
+#: ../../Firmware/mmu2/errors_list.h:149 ../../Firmware/mmu2/errors_list.h:187
+msgid "INVALID TOOL"
+msgstr ""
+
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 msgstr ""
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
-#: ../../Firmware/mesh_bed_calibration.cpp:2531
+#: ../../Firmware/mesh_bed_calibration.cpp:2530
 msgid "Improving bed calibration point"
 msgstr ""
 
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgstr ""
 
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgstr ""
 
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgstr ""
 
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 msgstr ""
 
+#. MSG_DESC_FW_RUNTIME_ERROR c=20 r=11
+#: ../../Firmware/mmu2/errors_list.h:232 ../../Firmware/mmu2/errors_list.h:270
+msgid ""
+"Internal runtime error. Try resetting the MMU unit or updating the firmware. "
+"If the issue persists, contact support."
+msgstr ""
+
 #. MSG_FILAMENT_LOADED c=20 r=2
-#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3863
-#: ../../Firmware/ultralcd.cpp:4116 ../../Firmware/ultralcd.cpp:4119
+#: ../../Firmware/messages.cpp:38 ../../Firmware/ultralcd.cpp:3827
+#: ../../Firmware/ultralcd.cpp:4074
 msgid "Is filament loaded?"
 msgstr ""
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3309 ../../Firmware/Marlin_main.cpp:4883
-#: ../../Firmware/messages.cpp:106 ../../Firmware/ultralcd.cpp:4092
+#: ../../Firmware/Marlin_main.cpp:3301 ../../Firmware/Marlin_main.cpp:4911
+#: ../../Firmware/messages.cpp:110 ../../Firmware/ultralcd.cpp:4050
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 
 #. MSG_ITERATION c=12
-#: ../../Firmware/mesh_bed_calibration.cpp:2253 ../../Firmware/messages.cpp:49
+#: ../../Firmware/mesh_bed_calibration.cpp:2252 ../../Firmware/messages.cpp:51
 msgid "Iteration"
 msgstr ""
 
 #. MSG_LAST_PRINT c=18
-#: ../../Firmware/messages.cpp:52 ../../Firmware/ultralcd.cpp:1156
-#: ../../Firmware/ultralcd.cpp:1304
+#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:1166
+#: ../../Firmware/ultralcd.cpp:1299
 msgid "Last print"
 msgstr ""
 
 #. MSG_LAST_PRINT_FAILURES c=20
-#: ../../Firmware/messages.cpp:53 ../../Firmware/ultralcd.cpp:1177
-#: ../../Firmware/ultralcd.cpp:1267 ../../Firmware/ultralcd.cpp:1277
-#: ../../Firmware/ultralcd.cpp:1334
+#: ../../Firmware/messages.cpp:55 ../../Firmware/ultralcd.cpp:1186
+#: ../../Firmware/ultralcd.cpp:1273 ../../Firmware/ultralcd.cpp:1328
 msgid "Last print failures"
 msgstr ""
 
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgstr ""
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
-#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:7010
-#: ../../Firmware/ultralcd.cpp:7157 ../../Firmware/ultralcd.cpp:7162
+#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7001
+#: ../../Firmware/ultralcd.cpp:7147 ../../Firmware/ultralcd.cpp:7152
 msgid "Left hotend fan?"
 msgstr ""
 
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgstr ""
 
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgstr ""
 
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgstr ""
 
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgstr ""
 
 #. MSG_BABYSTEP_Z c=18
-#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4846
-#: ../../Firmware/ultralcd.cpp:5501
+#: ../../Firmware/messages.cpp:10 ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:5502
 msgid "Live adjust Z"
 msgstr ""
 
 #. MSG_LOAD_ALL c=18
-#: ../../Firmware/ultralcd.cpp:5128
-msgid "Load all"
+#: ../../Firmware/messages.cpp:172 ../../Firmware/ultralcd.cpp:5098
+#: ../../Firmware/ultralcd.cpp:5178
+msgid "Load All"
 msgstr ""
 
 #. MSG_LOAD_FILAMENT c=17
-#: ../../Firmware/messages.cpp:54 ../../Firmware/ultralcd.cpp:5130
-#: ../../Firmware/ultralcd.cpp:5141 ../../Firmware/ultralcd.cpp:5570
-#: ../../Firmware/ultralcd.cpp:5584
+#: ../../Firmware/messages.cpp:56 ../../Firmware/ultralcd.cpp:5100
+#: ../../Firmware/ultralcd.cpp:5119 ../../Firmware/ultralcd.cpp:5180
+#: ../../Firmware/ultralcd.cpp:5571 ../../Firmware/ultralcd.cpp:5589
 msgid "Load filament"
 msgstr ""
 
+#. MSG_LOAD_TO_EXTRUDER c=18
+#: ../../Firmware/messages.cpp:57 ../../Firmware/ultralcd.cpp:5572
+msgid "Load to extruder"
+msgstr ""
+
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgstr ""
 
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgstr ""
 
 #. MSG_LOADING_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:3638 ../../Firmware/messages.cpp:55
-#: ../../Firmware/mmu.cpp:872 ../../Firmware/mmu.cpp:906
-#: ../../Firmware/mmu.cpp:1014 ../../Firmware/mmu.cpp:1026
-#: ../../Firmware/ultralcd.cpp:2204 ../../Firmware/ultralcd.cpp:3957
+#: ../../Firmware/Marlin_main.cpp:3651 ../../Firmware/messages.cpp:58
+#: ../../Firmware/mmu2.cpp:438 ../../Firmware/mmu2.cpp:468
+#: ../../Firmware/mmu2_progress_converter.cpp:51
+#: ../../Firmware/ultralcd.cpp:2212 ../../Firmware/ultralcd.cpp:3919
 msgid "Loading filament"
 msgstr ""
 
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgstr ""
 
 #. MSG_SOUND_LOUD c=7
-#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4460
 msgid "Loud"
 msgstr ""
 
-#. MSG_MK3_FIRMWARE_ON_MK3S c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:880
-msgid "MK3 firmware detected on MK3S printer"
+#. MSG_TITLE_FW_UPDATE_NEEDED c=20
+#: ../../Firmware/mmu2/errors_list.h:151 ../../Firmware/mmu2/errors_list.h:189
+msgid "MMU FW UPDATE NEEDED"
 msgstr ""
 
-#. MSG_MK3S_FIRMWARE_ON_MK3 c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:873
-msgid "MK3S firmware detected on MK3 printer"
+#. MSG_DESC_QUEUE_FULL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:230 ../../Firmware/mmu2/errors_list.h:268
+msgid "MMU Firmware internal error, please reset the MMU."
 msgstr ""
 
 #. MSG_MMU_MODE c=8
-#: ../../Firmware/messages.cpp:134 ../../Firmware/ultralcd.cpp:4389
-#: ../../Firmware/ultralcd.cpp:4390
+#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4379
+#: ../../Firmware/ultralcd.cpp:4380
 msgid "MMU Mode"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING_POSITION c=20 r=4
-#: ../../Firmware/mmu.cpp:763
-msgid "MMU OK. Resuming position..."
-msgstr ""
-
-#. MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
-#: ../../Firmware/mmu.cpp:756
-msgid "MMU OK. Resuming temperature..."
+#. MSG_TITLE_MMU_NOT_RESPONDING c=20
+#: ../../Firmware/mmu2/errors_list.h:146 ../../Firmware/mmu2/errors_list.h:184
+msgid "MMU NOT RESPONDING"
 msgstr ""
 
-#. MSG_MMU_OK_RESUMING c=20 r=4
-#: ../../Firmware/mmu.cpp:774
-msgid "MMU OK. Resuming..."
+#. MSG_MMU_RESTORE_TEMP c=20 r=4
+#: ../../Firmware/mmu2.cpp:598
+msgid "MMU Retry: Restoring temperature..."
 msgstr ""
 
 #. MSG_MMU_FAILS c=15
-#: ../../Firmware/messages.cpp:64 ../../Firmware/ultralcd.cpp:1178
-#: ../../Firmware/ultralcd.cpp:1201
+#: ../../Firmware/messages.cpp:68 ../../Firmware/ultralcd.cpp:1187
+#: ../../Firmware/ultralcd.cpp:1215
 msgid "MMU fails"
 msgstr ""
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
-#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:1179
-#: ../../Firmware/ultralcd.cpp:1202
+#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:1188
 msgid "MMU load fails"
 msgstr ""
 
-#. MSG_MMU_USER_ATTENTION c=20 r=3
-#: ../../Firmware/mmu.cpp:723
-msgid "MMU needs user attention."
+#. MSG_DESC_COMMUNICATION_ERROR c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:227 ../../Firmware/mmu2/errors_list.h:265
+msgid ""
+"MMU unit not responding correctly. Check the wiring and connectors. If the "
+"issue persists, contact support."
 msgstr ""
 
-#. MSG_MMU_POWER_FAILS c=15
-#: ../../Firmware/ultralcd.cpp:1203
-msgid "MMU power fails"
+#. MSG_DESC_MMU_NOT_RESPONDING c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:226 ../../Firmware/mmu2/errors_list.h:264
+msgid ""
+"MMU unit not responding. Check the wiring and connectors. If the issue "
+"persists, contact support."
 msgstr ""
 
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgstr ""
 
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgstr ""
 
 #. MSG_MAIN c=18
-#: ../../Firmware/messages.cpp:58 ../../Firmware/ultralcd.cpp:1155
-#: ../../Firmware/ultralcd.cpp:1303 ../../Firmware/ultralcd.cpp:1346
-#: ../../Firmware/ultralcd.cpp:1653 ../../Firmware/ultralcd.cpp:4803
-#: ../../Firmware/ultralcd.cpp:4900 ../../Firmware/ultralcd.cpp:5127
-#: ../../Firmware/ultralcd.cpp:5139 ../../Firmware/ultralcd.cpp:5162
-#: ../../Firmware/ultralcd.cpp:5181 ../../Firmware/ultralcd.cpp:5725
+#: ../../Firmware/messages.cpp:62 ../../Firmware/ultralcd.cpp:1165
+#: ../../Firmware/ultralcd.cpp:1298 ../../Firmware/ultralcd.cpp:1340
+#: ../../Firmware/ultralcd.cpp:1644 ../../Firmware/ultralcd.cpp:4757
+#: ../../Firmware/ultralcd.cpp:4863 ../../Firmware/ultralcd.cpp:5097
+#: ../../Firmware/ultralcd.cpp:5117 ../../Firmware/ultralcd.cpp:5135
+#: ../../Firmware/ultralcd.cpp:5153 ../../Firmware/ultralcd.cpp:5177
+#: ../../Firmware/ultralcd.cpp:5730
 msgid "Main"
 msgstr ""
 
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgstr ""
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3290
-#: ../../Firmware/mesh_bed_calibration.cpp:2840 ../../Firmware/messages.cpp:62
+#: ../../Firmware/Marlin_main.cpp:3282
+#: ../../Firmware/mesh_bed_calibration.cpp:2836 ../../Firmware/messages.cpp:66
 msgid "Measuring reference height of calibration point"
 msgstr ""
 
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgstr ""
 
 #. MSG_MESH_BED_LEVELING c=18
-#: ../../Firmware/messages.cpp:145 ../../Firmware/ultralcd.cpp:4831
-#: ../../Firmware/ultralcd.cpp:4918
+#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4794
+#: ../../Firmware/ultralcd.cpp:4881
 msgid "Mesh Bed Leveling"
 msgstr ""
 
 #. MSG_MODE c=6
-#: ../../Firmware/messages.cpp:100 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4346 ../../Firmware/ultralcd.cpp:4366
-#: ../../Firmware/ultralcd.cpp:4369 ../../Firmware/ultralcd.cpp:4372
-#: ../../Firmware/ultralcd.cpp:4375 ../../Firmware/ultralcd.cpp:5771
-#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5785
-#: ../../Firmware/ultralcd.cpp:5786 ../../Firmware/ultralcd.cpp:5787
-#: ../../Firmware/ultralcd.cpp:5788 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4336 ../../Firmware/ultralcd.cpp:4356
+#: ../../Firmware/ultralcd.cpp:4359 ../../Firmware/ultralcd.cpp:4362
+#: ../../Firmware/ultralcd.cpp:4365 ../../Firmware/ultralcd.cpp:5761
+#: ../../Firmware/ultralcd.cpp:5768 ../../Firmware/ultralcd.cpp:5775
+#: ../../Firmware/ultralcd.cpp:5776 ../../Firmware/ultralcd.cpp:5777
+#: ../../Firmware/ultralcd.cpp:5778 ../../Firmware/ultralcd.cpp:5862
 msgid "Mode"
 msgstr ""
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgstr ""
 
 #. MSG_MODEL c=8
-#: ../../Firmware/messages.cpp:129 ../../Firmware/ultralcd.cpp:4583
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4589
-#: ../../Firmware/ultralcd.cpp:4592
+#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4573
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4579
+#: ../../Firmware/ultralcd.cpp:4582
 msgid "Model"
 msgstr ""
 
+#. MSG_DESC_TMC c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:207 ../../Firmware/mmu2/errors_list.h:246
+#: ../../Firmware/mmu2/errors_list.h:247 ../../Firmware/mmu2/errors_list.h:248
+#: ../../Firmware/mmu2/errors_list.h:249 ../../Firmware/mmu2/errors_list.h:250
+#: ../../Firmware/mmu2/errors_list.h:251 ../../Firmware/mmu2/errors_list.h:252
+#: ../../Firmware/mmu2/errors_list.h:253 ../../Firmware/mmu2/errors_list.h:254
+#: ../../Firmware/mmu2/errors_list.h:255 ../../Firmware/mmu2/errors_list.h:256
+#: ../../Firmware/mmu2/errors_list.h:257 ../../Firmware/mmu2/errors_list.h:258
+#: ../../Firmware/mmu2/errors_list.h:259 ../../Firmware/mmu2/errors_list.h:260
+#: ../../Firmware/mmu2/errors_list.h:261 ../../Firmware/mmu2/errors_list.h:262
+#: ../../Firmware/mmu2/errors_list.h:263
+msgid "More details online."
+msgstr ""
+
+#. MSG_BTN_MORE c=5
+#: ../../Firmware/mmu2/errors_list.h:287
+#: ../../Firmware/mmu2_error_converter.cpp:153
+msgid "More⏬"
+msgstr ""
+
 #. MSG_SELFTEST_MOTOR c=18
-#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:6990
-#: ../../Firmware/ultralcd.cpp:6999 ../../Firmware/ultralcd.cpp:7017
+#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:6981
+#: ../../Firmware/ultralcd.cpp:6990 ../../Firmware/ultralcd.cpp:7008
 msgid "Motor"
 msgstr ""
 
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgstr ""
 
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgstr ""
 
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgstr ""
 
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgstr ""
 
+#. MSG_PROGRESS_MOVING_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:30
+#: ../../Firmware/mmu2_progress_converter.cpp:61
+msgid "Moving selector"
+msgstr ""
+
 #. MSG_NA c=3
-#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:124
-#: ../../Firmware/ultralcd.cpp:2510 ../../Firmware/ultralcd.cpp:2555
-#: ../../Firmware/ultralcd.cpp:3419 ../../Firmware/ultralcd.cpp:4236
-#: ../../Firmware/ultralcd.cpp:4284 ../../Firmware/ultralcd.cpp:5745
-#: ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/menu.cpp:196 ../../Firmware/messages.cpp:128
+#: ../../Firmware/ultralcd.cpp:2500 ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:3434 ../../Firmware/ultralcd.cpp:4229
+#: ../../Firmware/ultralcd.cpp:4230 ../../Firmware/ultralcd.cpp:4232
+#: ../../Firmware/ultralcd.cpp:5834
 msgid "N/A"
 msgstr ""
 
@@ -1036,178 +1238,203 @@ msgid "New firmware version available:"
 msgstr ""
 
 #. MSG_NO c=4
-#: ../../Firmware/messages.cpp:66 ../../Firmware/ultralcd.cpp:2812
-#: ../../Firmware/ultralcd.cpp:3188 ../../Firmware/ultralcd.cpp:4793
-#: ../../Firmware/ultralcd.cpp:5996
+#: ../../Firmware/messages.cpp:70 ../../Firmware/ultralcd.cpp:2802
+#: ../../Firmware/ultralcd.cpp:3170 ../../Firmware/ultralcd.cpp:4747
+#: ../../Firmware/ultralcd.cpp:5997
 msgid "No"
 msgstr ""
 
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgstr ""
 
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgstr ""
 
 #. MSG_NONE c=8
-#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4413
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:4583 ../../Firmware/ultralcd.cpp:4592
-#: ../../Firmware/ultralcd.cpp:4622 ../../Firmware/ultralcd.cpp:4631
-#: ../../Firmware/ultralcd.cpp:4663 ../../Firmware/ultralcd.cpp:4672
+#: ../../Firmware/messages.cpp:130 ../../Firmware/ultralcd.cpp:4403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:4573 ../../Firmware/ultralcd.cpp:4582
+#: ../../Firmware/ultralcd.cpp:4612 ../../Firmware/ultralcd.cpp:4621
+#: ../../Firmware/ultralcd.cpp:4653 ../../Firmware/ultralcd.cpp:4662
 msgid "None"
 msgstr ""
 
 #. MSG_NORMAL c=7
-#: ../../Firmware/messages.cpp:104 ../../Firmware/ultralcd.cpp:4344
-#: ../../Firmware/ultralcd.cpp:4389 ../../Firmware/ultralcd.cpp:4405
-#: ../../Firmware/ultralcd.cpp:4424 ../../Firmware/ultralcd.cpp:5771
+#: ../../Firmware/messages.cpp:108 ../../Firmware/ultralcd.cpp:4334
+#: ../../Firmware/ultralcd.cpp:4379 ../../Firmware/ultralcd.cpp:4395
+#: ../../Firmware/ultralcd.cpp:4414 ../../Firmware/ultralcd.cpp:5761
 msgid "Normal"
 msgstr ""
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_NO c=19
-#: ../../Firmware/messages.cpp:87 ../../Firmware/ultralcd.cpp:7176
-#: ../../Firmware/ultralcd.cpp:7191 ../../Firmware/ultralcd.cpp:7199
+#: ../../Firmware/messages.cpp:91 ../../Firmware/ultralcd.cpp:7166
+#: ../../Firmware/ultralcd.cpp:7181 ../../Firmware/ultralcd.cpp:7189
 msgid "Not spinning"
 msgstr ""
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4090
+#: ../../Firmware/ultralcd.cpp:4048
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 
 #. MSG_NOZZLE c=10
-#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:1410
-#: ../../Firmware/ultralcd.cpp:4501 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4507 ../../Firmware/ultralcd.cpp:4510
-#: ../../Firmware/ultralcd.cpp:5728 ../../Firmware/ultralcd.cpp:5890
+#: ../../Firmware/messages.cpp:71 ../../Firmware/ultralcd.cpp:1403
+#: ../../Firmware/ultralcd.cpp:4491 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4497 ../../Firmware/ultralcd.cpp:4500
+#: ../../Firmware/ultralcd.cpp:5733 ../../Firmware/ultralcd.cpp:5880
 msgid "Nozzle"
 msgstr ""
 
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgstr ""
 
+#. MSG_PROGRESS_OK c=4
+#: ../../Firmware/mmu2_progress_converter.cpp:8
+#: ../../Firmware/mmu2_progress_converter.cpp:34
+msgid "OK"
+msgstr ""
+
 #. MSG_OFF c=3
-#: ../../Firmware/menu.cpp:467 ../../Firmware/messages.cpp:122
-#: ../../Firmware/ultralcd.cpp:4242 ../../Firmware/ultralcd.cpp:4258
-#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4321
-#: ../../Firmware/ultralcd.cpp:4350 ../../Firmware/ultralcd.cpp:4819
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4842
-#: ../../Firmware/ultralcd.cpp:5652 ../../Firmware/ultralcd.cpp:5749
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5775
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:40 ../../Firmware/menu.cpp:467
+#: ../../Firmware/messages.cpp:126 ../../Firmware/ultralcd.cpp:4225
+#: ../../Firmware/ultralcd.cpp:4236 ../../Firmware/ultralcd.cpp:4237
+#: ../../Firmware/ultralcd.cpp:4239 ../../Firmware/ultralcd.cpp:4264
+#: ../../Firmware/ultralcd.cpp:4292 ../../Firmware/ultralcd.cpp:4340
+#: ../../Firmware/ultralcd.cpp:4775 ../../Firmware/ultralcd.cpp:4782
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:5657 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5765 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "Off"
 msgstr ""
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
-#: ../../Firmware/Marlin_main.cpp:1532
+#: ../../Firmware/Marlin_main.cpp:1513
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 
 #. MSG_ON c=3
-#: ../../Firmware/messages.cpp:123 ../../Firmware/ultralcd.cpp:4252
-#: ../../Firmware/ultralcd.cpp:4256 ../../Firmware/ultralcd.cpp:4288
-#: ../../Firmware/ultralcd.cpp:4311 ../../Firmware/ultralcd.cpp:4349
-#: ../../Firmware/ultralcd.cpp:4819 ../../Firmware/ultralcd.cpp:4838
-#: ../../Firmware/ultralcd.cpp:4842 ../../Firmware/ultralcd.cpp:5753
-#: ../../Firmware/ultralcd.cpp:5764 ../../Firmware/ultralcd.cpp:5773
-#: ../../Firmware/ultralcd.cpp:5844 ../../Firmware/ultralcd.cpp:7852
-#: ../../Firmware/ultralcd.cpp:7856
+#: ../../Firmware/SpoolJoin.cpp:38 ../../Firmware/messages.cpp:127
+#: ../../Firmware/ultralcd.cpp:4225 ../../Firmware/ultralcd.cpp:4236
+#: ../../Firmware/ultralcd.cpp:4237 ../../Firmware/ultralcd.cpp:4239
+#: ../../Firmware/ultralcd.cpp:4264 ../../Firmware/ultralcd.cpp:4282
+#: ../../Firmware/ultralcd.cpp:4339 ../../Firmware/ultralcd.cpp:4775
+#: ../../Firmware/ultralcd.cpp:4782 ../../Firmware/ultralcd.cpp:4801
+#: ../../Firmware/ultralcd.cpp:4805 ../../Firmware/ultralcd.cpp:5754
+#: ../../Firmware/ultralcd.cpp:5763 ../../Firmware/ultralcd.cpp:5834
+#: ../../Firmware/ultralcd.cpp:7829 ../../Firmware/ultralcd.cpp:7833
 msgid "On"
 msgstr ""
 
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgstr ""
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
-#: ../../Firmware/Marlin_main.cpp:9715 ../../Firmware/messages.cpp:164
+#: ../../Firmware/Marlin_main.cpp:9677 ../../Firmware/messages.cpp:168
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgstr ""
 
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgstr ""
 
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgstr ""
 
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION c=13
-#: ../../Firmware/Marlin_main.cpp:4929 ../../Firmware/Marlin_main.cpp:5032
-#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:657
-#: ../../Firmware/ultralcd.cpp:4838 ../../Firmware/ultralcd.cpp:4928
+#: ../../Firmware/Marlin_main.cpp:4957 ../../Firmware/Marlin_main.cpp:5060
+#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:663
+#: ../../Firmware/ultralcd.cpp:4801 ../../Firmware/ultralcd.cpp:4891
 msgid "PINDA cal."
 msgstr ""
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgstr ""
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:5109 ../../Firmware/messages.cpp:110
-#: ../../Firmware/ultralcd.cpp:3363
+#: ../../Firmware/Marlin_main.cpp:5137 ../../Firmware/messages.cpp:114
+#: ../../Firmware/ultralcd.cpp:3378
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 msgstr ""
 
+#. MSG_TITLE_PULLEY_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:122 ../../Firmware/mmu2/errors_list.h:160
+msgid "PULLEY CANNOT MOVE"
+msgstr ""
+
+#. MSG_PROGRESS_PARK_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:26
+#: ../../Firmware/mmu2_progress_converter.cpp:57
+msgid "Parking selector"
+msgstr ""
+
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgstr ""
 
 #. MSG_PAUSE_PRINT c=18
-#: ../../Firmware/messages.cpp:69 ../../Firmware/ultralcd.cpp:5515
-#: ../../Firmware/ultralcd.cpp:5517
+#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:5516
+#: ../../Firmware/ultralcd.cpp:5518
 msgid "Pause print"
 msgstr ""
 
+#. MSG_PROGRESS_PERFORM_CUT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:24
+#: ../../Firmware/mmu2_progress_converter.cpp:55
+msgid "Performing cut"
+msgstr ""
+
 #. MSG_PAPER c=20 r=10
-#: ../../Firmware/Marlin_main.cpp:3312 ../../Firmware/messages.cpp:68
+#: ../../Firmware/Marlin_main.cpp:3306 ../../Firmware/messages.cpp:72
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:114 ../../Firmware/ultralcd.cpp:4184
+#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4138
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
@@ -1219,78 +1446,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgstr ""
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4156
+#: ../../Firmware/ultralcd.cpp:4110
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:3288 ../../Firmware/messages.cpp:24
+#: ../../Firmware/Marlin_main.cpp:3280 ../../Firmware/messages.cpp:24
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 msgstr ""
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgstr ""
 
 #. MSG_CHECK_IDLER c=20 r=5
-#: ../../Firmware/Marlin_main.cpp:3548
+#: ../../Firmware/Marlin_main.cpp:3581
 msgid "Please open idler and remove filament manually."
 msgstr ""
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
-#: ../../Firmware/mesh_bed_calibration.cpp:2799 ../../Firmware/messages.cpp:70
-#: ../../Firmware/ultralcd.cpp:4093
+#: ../../Firmware/mesh_bed_calibration.cpp:2795 ../../Firmware/messages.cpp:74
+#: ../../Firmware/ultralcd.cpp:4052
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11577 ../../Firmware/Marlin_main.cpp:11630
-#: ../../Firmware/messages.cpp:74
+#: ../../Firmware/Marlin_main.cpp:11532 ../../Firmware/Marlin_main.cpp:11585
+#: ../../Firmware/messages.cpp:78
 msgid "Please press the knob to unload filament"
 msgstr ""
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
-#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:5221
+#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:5221
 msgid "Please pull out filament immediately"
 msgstr ""
 
-#. MSG_EJECT_REMOVE c=20 r=4
-#: ../../Firmware/mmu.cpp:1082
-msgid "Please remove filament and then press the knob."
-msgstr ""
-
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgstr ""
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3310 ../../Firmware/Marlin_main.cpp:4893
-#: ../../Firmware/messages.cpp:79
+#: ../../Firmware/Marlin_main.cpp:3303 ../../Firmware/Marlin_main.cpp:4921
+#: ../../Firmware/messages.cpp:83
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgstr ""
 
@@ -1299,289 +1521,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 
-#. MSG_UPDATE_MMU2_FW c=20 r=4
-#: ../../Firmware/mmu.cpp:1002
-msgid "Please update firmware in your MMU2. Waiting for reset."
-msgstr ""
-
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgstr ""
 
 #. MSG_PLEASE_WAIT c=20
-#: ../../Firmware/Marlin_main.cpp:3544 ../../Firmware/Marlin_main.cpp:3560
-#: ../../Firmware/Marlin_main.cpp:7928 ../../Firmware/messages.cpp:71
-#: ../../Firmware/ultralcd.cpp:2194 ../../Firmware/ultralcd.cpp:2205
+#: ../../Firmware/Marlin_main.cpp:3577 ../../Firmware/Marlin_main.cpp:3595
+#: ../../Firmware/Marlin_main.cpp:7957 ../../Firmware/messages.cpp:75
+#: ../../Firmware/ultralcd.cpp:2202 ../../Firmware/ultralcd.cpp:2213
 msgid "Please wait"
 msgstr ""
 
 #. MSG_POWER_FAILURES c=15
-#: ../../Firmware/messages.cpp:72 ../../Firmware/ultralcd.cpp:1227
-#: ../../Firmware/ultralcd.cpp:1268 ../../Firmware/ultralcd.cpp:1278
+#: ../../Firmware/messages.cpp:76 ../../Firmware/ultralcd.cpp:1245
+#: ../../Firmware/ultralcd.cpp:1274
 msgid "Power failures"
 msgstr ""
 
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgstr ""
 
 #. MSG_PREHEAT_NOZZLE c=20
-#: ../../Firmware/messages.cpp:73 ../../Firmware/ultralcd.cpp:2288
+#: ../../Firmware/messages.cpp:77 ../../Firmware/ultralcd.cpp:2283
 msgid "Preheat the nozzle!"
 msgstr ""
 
 #. MSG_WIZARD_HEATING c=20 r=3
-#: ../../Firmware/messages.cpp:116 ../../Firmware/ultralcd.cpp:2908
-#: ../../Firmware/ultralcd.cpp:3932 ../../Firmware/ultralcd.cpp:3934
+#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2898
+#: ../../Firmware/ultralcd.cpp:3897 ../../Firmware/ultralcd.cpp:3899
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgstr ""
 
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgstr ""
 
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgstr ""
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgstr ""
 
+#. MSG_PROGRESS_PREPARE_BLADE c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:22
+#: ../../Firmware/mmu2_progress_converter.cpp:53
+msgid "Preparing blade"
+msgstr ""
+
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgstr ""
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:11608
+#: ../../Firmware/Marlin_main.cpp:11563
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 
-#. MSG_RESUME_NOZZLE_TEMP c=20 r=4
-#: ../../Firmware/mmu.cpp:727
-msgid "Press the knob to resume nozzle temperature."
-msgstr ""
-
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgstr ""
 
 #. MSG_PRINT_FAN_SPEED c=16
-#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1134
-#: ../../Firmware/ultralcd.cpp:7332
+#: ../../Firmware/messages.cpp:36 ../../Firmware/ultralcd.cpp:1144
+#: ../../Firmware/ultralcd.cpp:7322
 msgid "Print fan:"
 msgstr ""
 
 #. MSG_CARD_MENU c=18
-#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5543
+#: ../../Firmware/messages.cpp:20 ../../Firmware/ultralcd.cpp:5544
 msgid "Print from SD"
 msgstr ""
 
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgstr ""
 
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgstr ""
 
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgstr ""
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1545 ../../Firmware/messages.cpp:42
+#: ../../Firmware/Marlin_main.cpp:1526 ../../Firmware/messages.cpp:42
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
-#: ../../Firmware/util.cpp:299
+#: ../../Firmware/util.cpp:289
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 msgstr ""
 
+#. MSG_DESC_PULLEY_STALLED c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:200 ../../Firmware/mmu2/errors_list.h:240
+msgid "Pulley motor stalled. Ensure the pulley can move and check the wiring."
+msgstr ""
+
+#. MSG_PROGRESS_PUSH_FILAMENT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:23
+#: ../../Firmware/mmu2_progress_converter.cpp:54
+msgid "Pushing filament"
+msgstr ""
+
+#. MSG_TITLE_QUEUE_FULL c=20
+#: ../../Firmware/mmu2/errors_list.h:150 ../../Firmware/mmu2/errors_list.h:188
+msgid "QUEUE FULL"
+msgstr ""
+
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgstr ""
 
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgstr ""
 
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgstr ""
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
-#: ../../Firmware/mmu.cpp:831
+#: ../../Firmware/Marlin_main.cpp:3461
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgstr ""
 
+#. MSG_DESC_INVALID_TOOL c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:229 ../../Firmware/mmu2/errors_list.h:267
+msgid ""
+"Requested filament tool is not available on this hardware. Check the G-code "
+"for tool index out of range (T0-T4)."
+msgstr ""
+
 #. MSG_RESET c=14
-#: ../../Firmware/messages.cpp:80 ../../Firmware/ultralcd.cpp:2764
-#: ../../Firmware/ultralcd.cpp:5435
+#: ../../Firmware/messages.cpp:84 ../../Firmware/ultralcd.cpp:2754
+#: ../../Firmware/ultralcd.cpp:5436
 msgid "Reset"
 msgstr ""
 
+#. MSG_BTN_RESTART_MMU c=9
+#: ../../Firmware/mmu2/errors_list.h:283 ../../Firmware/mmu2/errors_list.h:293
+msgid "Reset MMU"
+msgstr ""
+
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgstr ""
 
 #. MSG_RESUME_PRINT c=18
-#: ../../Firmware/Marlin_main.cpp:655 ../../Firmware/messages.cpp:81
-#: ../../Firmware/ultralcd.cpp:5529 ../../Firmware/ultralcd.cpp:5531
+#: ../../Firmware/Marlin_main.cpp:644 ../../Firmware/messages.cpp:85
+#: ../../Firmware/ultralcd.cpp:5530 ../../Firmware/ultralcd.cpp:5532
 msgid "Resume print"
 msgstr ""
 
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgstr ""
 
+#. MSG_PROGRESS_RETRACT_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:28
+#: ../../Firmware/mmu2_progress_converter.cpp:59
+msgid "Retract from FINDA"
+msgstr ""
+
+#. MSG_BTN_RETRY c=5
+#: ../../Firmware/mmu2/errors_list.h:281 ../../Firmware/mmu2/errors_list.h:291
+msgid "Retry"
+msgstr ""
+
+#. MSG_PROGRESS_RETURN_SELECTOR c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:25
+#: ../../Firmware/mmu2_progress_converter.cpp:56
+msgid "Returning selector"
+msgstr ""
+
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgstr ""
 
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgstr ""
 
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 msgstr ""
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
-#: ../../Firmware/messages.cpp:135 ../../Firmware/ultralcd.cpp:4403
-#: ../../Firmware/ultralcd.cpp:4405 ../../Firmware/ultralcd.cpp:4422
-#: ../../Firmware/ultralcd.cpp:4424
+#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4393
+#: ../../Firmware/ultralcd.cpp:4395 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/ultralcd.cpp:4414
 msgid "SD card"
 msgstr ""
 
+#. MSG_TITLE_SELECTOR_CANNOT_HOME c=20
+#: ../../Firmware/mmu2/errors_list.h:125 ../../Firmware/mmu2/errors_list.h:162
+msgid "SELECTOR CANNOT HOME"
+msgstr ""
+
+#. MSG_TITLE_SELECTOR_CANNOT_MOVE c=20
+#: ../../Firmware/mmu2/errors_list.h:124 ../../Firmware/mmu2/errors_list.h:163
+msgid "SELECTOR CANNOT MOVE"
+msgstr ""
+
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgstr ""
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
-#: ../../Firmware/Marlin_main.cpp:3294 ../../Firmware/Marlin_main.cpp:3314
-#: ../../Firmware/mesh_bed_calibration.cpp:2234 ../../Firmware/messages.cpp:40
+#: ../../Firmware/Marlin_main.cpp:3286 ../../Firmware/Marlin_main.cpp:3308
+#: ../../Firmware/mesh_bed_calibration.cpp:2233 ../../Firmware/messages.cpp:40
 msgid "Searching bed calibration point"
 msgstr ""
 
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgstr ""
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 msgstr ""
 
 #. MSG_SELECT_EXTRUDER c=20
-#: ../../Firmware/Marlin_main.cpp:8605 ../../Firmware/messages.cpp:50
+#: ../../Firmware/Marlin_main.cpp:3519 ../../Firmware/Tcodes.cpp:35
+#: ../../Firmware/Tcodes.cpp:51 ../../Firmware/messages.cpp:52
 msgid "Select extruder:"
 msgstr ""
 
 #. MSG_SELECT_FILAMENT c=20
-#: ../../Firmware/Marlin_main.cpp:8574 ../../Firmware/Marlin_main.cpp:8601
-#: ../../Firmware/messages.cpp:51 ../../Firmware/ultralcd.cpp:3842
+#: ../../Firmware/Tcodes.cpp:33 ../../Firmware/messages.cpp:53
+#: ../../Firmware/ultralcd.cpp:3805
 msgid "Select filament:"
 msgstr ""
 
 #. MSG_SELECT_LANGUAGE c=18
-#: ../../Firmware/messages.cpp:95 ../../Firmware/ultralcd.cpp:3687
-#: ../../Firmware/ultralcd.cpp:4849
+#: ../../Firmware/messages.cpp:99 ../../Firmware/ultralcd.cpp:3650
+#: ../../Firmware/ultralcd.cpp:4812
 msgid "Select language"
 msgstr ""
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
-#: ../../Firmware/ultralcd.cpp:4130
+#: ../../Firmware/ultralcd.cpp:4084
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgstr ""
 
+#. MSG_PROGRESS_SELECT_SLOT c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:21
+#: ../../Firmware/mmu2_progress_converter.cpp:52
+msgid "Selecting fil. slot"
+msgstr ""
+
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgstr ""
 
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgstr ""
 
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgstr ""
 
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgstr ""
 
 #. MSG_SELFTEST_FAILED c=20
-#: ../../Firmware/messages.cpp:85 ../../Firmware/ultralcd.cpp:6534
-#: ../../Firmware/ultralcd.cpp:7057 ../../Firmware/ultralcd.cpp:7322
+#: ../../Firmware/messages.cpp:89 ../../Firmware/ultralcd.cpp:6526
+#: ../../Firmware/ultralcd.cpp:7048 ../../Firmware/ultralcd.cpp:7312
 msgid "Selftest failed"
 msgstr ""
 
 #. MSG_FORCE_SELFTEST c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:1564
+#: ../../Firmware/Marlin_main.cpp:1545
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgstr ""
 
@@ -1591,31 +1866,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgstr ""
 
 #. MSG_SETTINGS c=18
-#: ../../Firmware/messages.cpp:94 ../../Firmware/ultralcd.cpp:3499
-#: ../../Firmware/ultralcd.cpp:3704 ../../Firmware/ultralcd.cpp:4214
-#: ../../Firmware/ultralcd.cpp:5588 ../../Firmware/ultralcd.cpp:5835
-#: ../../Firmware/ultralcd.cpp:5888
+#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:3508
+#: ../../Firmware/ultralcd.cpp:3667 ../../Firmware/ultralcd.cpp:4168
+#: ../../Firmware/ultralcd.cpp:5593 ../../Firmware/ultralcd.cpp:5825
+#: ../../Firmware/ultralcd.cpp:5878
 msgid "Settings"
 msgstr ""
 
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgstr ""
 
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgstr ""
 
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
@@ -1624,18 +1899,18 @@ msgid ""
 msgstr ""
 
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgstr ""
 
 #. MSG_SILENT c=7
-#: ../../Firmware/messages.cpp:103 ../../Firmware/ultralcd.cpp:4369
-#: ../../Firmware/ultralcd.cpp:4464 ../../Firmware/ultralcd.cpp:5786
+#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:4359
+#: ../../Firmware/ultralcd.cpp:4454 ../../Firmware/ultralcd.cpp:5776
 msgid "Silent"
 msgstr ""
 
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgstr ""
 
@@ -1647,112 +1922,171 @@ msgid ""
 msgstr ""
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 
 #. MSG_SORT c=7
-#: ../../Firmware/messages.cpp:136 ../../Firmware/ultralcd.cpp:4411
-#: ../../Firmware/ultralcd.cpp:4412 ../../Firmware/ultralcd.cpp:4413
+#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4401
+#: ../../Firmware/ultralcd.cpp:4402 ../../Firmware/ultralcd.cpp:4403
 msgid "Sort"
 msgstr ""
 
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgstr ""
 
 #. MSG_SOUND c=9
-#: ../../Firmware/messages.cpp:140 ../../Firmware/ultralcd.cpp:4458
-#: ../../Firmware/ultralcd.cpp:4461 ../../Firmware/ultralcd.cpp:4464
-#: ../../Firmware/ultralcd.cpp:4467 ../../Firmware/ultralcd.cpp:4470
+#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:4448
+#: ../../Firmware/ultralcd.cpp:4451 ../../Firmware/ultralcd.cpp:4454
+#: ../../Firmware/ultralcd.cpp:4457 ../../Firmware/ultralcd.cpp:4460
 msgid "Sound"
 msgstr ""
 
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgstr ""
 
 #. MSG_SELFTEST_FAN_YES c=19
-#: ../../Firmware/messages.cpp:88 ../../Firmware/ultralcd.cpp:7174
-#: ../../Firmware/ultralcd.cpp:7189 ../../Firmware/ultralcd.cpp:7197
+#: ../../Firmware/messages.cpp:92 ../../Firmware/ultralcd.cpp:7164
+#: ../../Firmware/ultralcd.cpp:7179 ../../Firmware/ultralcd.cpp:7187
 msgid "Spinning"
 msgstr ""
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4882
+#: ../../Firmware/Marlin_main.cpp:4910
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgstr ""
 
 #. MSG_STEALTH c=7
-#: ../../Firmware/messages.cpp:105 ../../Firmware/ultralcd.cpp:4346
-#: ../../Firmware/ultralcd.cpp:4390 ../../Firmware/ultralcd.cpp:5778
+#: ../../Firmware/messages.cpp:109 ../../Firmware/ultralcd.cpp:4336
+#: ../../Firmware/ultralcd.cpp:4380 ../../Firmware/ultralcd.cpp:5768
 msgid "Stealth"
 msgstr ""
 
 #. MSG_STEEL_SHEETS c=18
-#: ../../Firmware/messages.cpp:61 ../../Firmware/ultralcd.cpp:4771
-#: ../../Firmware/ultralcd.cpp:5424
+#: ../../Firmware/messages.cpp:65 ../../Firmware/ultralcd.cpp:4726
+#: ../../Firmware/ultralcd.cpp:5425
 msgid "Steel sheets"
 msgstr ""
 
+#. MSG_BTN_STOP c=5
+#: ../../Firmware/mmu2/errors_list.h:285 ../../Firmware/mmu2/errors_list.h:295
+msgid "Stop"
+msgstr ""
+
 #. MSG_STOP_PRINT c=18
-#: ../../Firmware/messages.cpp:107 ../../Firmware/ultralcd.cpp:5536
-#: ../../Firmware/ultralcd.cpp:5995
+#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5537
+#: ../../Firmware/ultralcd.cpp:5996
 msgid "Stop print"
 msgstr ""
 
 #. MSG_STRICT c=8
-#: ../../Firmware/messages.cpp:128 ../../Firmware/ultralcd.cpp:4507
-#: ../../Firmware/ultralcd.cpp:4589 ../../Firmware/ultralcd.cpp:4628
-#: ../../Firmware/ultralcd.cpp:4669
+#: ../../Firmware/messages.cpp:132 ../../Firmware/ultralcd.cpp:4497
+#: ../../Firmware/ultralcd.cpp:4579 ../../Firmware/ultralcd.cpp:4618
+#: ../../Firmware/ultralcd.cpp:4659
 msgid "Strict"
 msgstr ""
 
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgstr ""
 
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgstr ""
 
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgstr ""
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgstr ""
 
+#. MSG_TITLE_TMC_DRIVER_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:134 ../../Firmware/mmu2/errors_list.h:172
+#: ../../Firmware/mmu2/errors_list.h:173 ../../Firmware/mmu2/errors_list.h:174
+msgid "TMC DRIVER ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_RESET c=20
+#: ../../Firmware/mmu2/errors_list.h:137 ../../Firmware/mmu2/errors_list.h:175
+#: ../../Firmware/mmu2/errors_list.h:176 ../../Firmware/mmu2/errors_list.h:177
+msgid "TMC DRIVER RESET"
+msgstr ""
+
+#. MSG_TITLE_TMC_DRIVER_SHORTED c=20
+#: ../../Firmware/mmu2/errors_list.h:143 ../../Firmware/mmu2/errors_list.h:181
+#: ../../Firmware/mmu2/errors_list.h:182 ../../Firmware/mmu2/errors_list.h:183
+msgid "TMC DRIVER SHORTED"
+msgstr ""
+
+#. MSG_TITLE_TMC_OVERHEAT_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:131 ../../Firmware/mmu2/errors_list.h:169
+#: ../../Firmware/mmu2/errors_list.h:170 ../../Firmware/mmu2/errors_list.h:171
+msgid "TMC OVERHEAT ERROR"
+msgstr ""
+
+#. MSG_TITLE_TMC_UNDERVOLTAGE_ERROR c=20
+#: ../../Firmware/mmu2/errors_list.h:140 ../../Firmware/mmu2/errors_list.h:178
+#: ../../Firmware/mmu2/errors_list.h:179 ../../Firmware/mmu2/errors_list.h:180
+msgid "TMC UNDERVOLTAGE ERR"
+msgstr ""
+
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgstr ""
 
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgstr ""
 
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgstr ""
 
+#. MSG_TESTING_FILAMENT c=20
+#: ../../Firmware/messages.cpp:59 ../../Firmware/mmu2.cpp:426
+msgid "Testing filament"
+msgstr ""
+
+#. MSG_DESC_IDLER_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:205 ../../Firmware/mmu2/errors_list.h:244
+msgid ""
+"The Idler cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
+#. MSG_DESC_FW_UPDATE_NEEDED c=20 r=9
+#: ../../Firmware/mmu2/errors_list.h:231 ../../Firmware/mmu2/errors_list.h:269
+msgid ""
+"The MMU unit reports its FW version incompatible with the printer's "
+"firmware. Make sure the MMU firmware is up to date."
+msgstr ""
+
+#. MSG_DESC_SELECTOR_CANNOT_HOME c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:202 ../../Firmware/mmu2/errors_list.h:242
+msgid ""
+"The Selector cannot home properly. Check for anything blocking its movement."
+msgstr ""
+
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1760,73 +2094,109 @@ msgid ""
 msgstr ""
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
-#: ../../Firmware/Marlin_main.cpp:1558 ../../Firmware/messages.cpp:43
+#: ../../Firmware/Marlin_main.cpp:1539 ../../Firmware/messages.cpp:43
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 msgstr ""
 
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgstr ""
 
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgstr ""
 
 #. MSG_TOTAL c=6
-#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:1157
-#: ../../Firmware/ultralcd.cpp:1305
+#: ../../Firmware/messages.cpp:101 ../../Firmware/ultralcd.cpp:1167
+#: ../../Firmware/ultralcd.cpp:1300
 msgid "Total"
 msgstr ""
 
 #. MSG_TOTAL_FAILURES c=20
-#: ../../Firmware/messages.cpp:98 ../../Firmware/ultralcd.cpp:1200
-#: ../../Firmware/ultralcd.cpp:1226 ../../Firmware/ultralcd.cpp:1336
+#: ../../Firmware/messages.cpp:102 ../../Firmware/ultralcd.cpp:1214
+#: ../../Firmware/ultralcd.cpp:1244 ../../Firmware/ultralcd.cpp:1330
 msgid "Total failures"
 msgstr ""
 
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgstr ""
 
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgstr ""
 
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgstr ""
 
-#. MSG_UNLOAD_FILAMENT c=18
-#: ../../Firmware/messages.cpp:111 ../../Firmware/ultralcd.cpp:5572
-#: ../../Firmware/ultralcd.cpp:5586
+#. MSG_TITLE_UNLOAD_MANUALLY c=20
+#: ../../Firmware/mmu2/errors_list.h:153 ../../Firmware/mmu2/errors_list.h:191
+msgid "UNLOAD MANUALLY"
+msgstr ""
+
+#. MSG_DESC_UNLOAD_MANUALLY c=20 r=8
+#: ../../Firmware/mmu2/errors_list.h:233 ../../Firmware/mmu2/errors_list.h:271
+msgid ""
+"Unexpected FINDA reading. Ensure no filament is under FINDA and the selector "
+"is free. Check FINDA connection."
+msgstr ""
+
+#. MSG_BTN_UNLOAD c=6
+#: ../../Firmware/mmu2/errors_list.h:284 ../../Firmware/mmu2/errors_list.h:294
+msgid "Unload"
+msgstr ""
+
+#. MSG_UNLOAD_FILAMENT c=16
+#: ../../Firmware/messages.cpp:115 ../../Firmware/ultralcd.cpp:5574
+#: ../../Firmware/ultralcd.cpp:5591
 msgid "Unload filament"
 msgstr ""
 
 #. MSG_UNLOADING_FILAMENT c=20
-#: ../../Firmware/messages.cpp:112 ../../Firmware/mmu.cpp:957
-#: ../../Firmware/ultralcd.cpp:5205
+#: ../../Firmware/Marlin_main.cpp:3502 ../../Firmware/messages.cpp:116
+#: ../../Firmware/mmu2_progress_converter.cpp:50
+#: ../../Firmware/ultralcd.cpp:5193
 msgid "Unloading filament"
 msgstr ""
 
+#. MSG_PROGRESS_UNLOAD_FINDA c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:11
+#: ../../Firmware/mmu2_progress_converter.cpp:37
+msgid "Unloading to FINDA"
+msgstr ""
+
+#. MSG_PROGRESS_UNLOAD_PULLEY c=20
+#: ../../Firmware/mmu2_progress_converter.cpp:12
+#: ../../Firmware/mmu2_progress_converter.cpp:38
+msgid "Unloading to pulley"
+msgstr ""
+
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgstr ""
 
+#. MSG_TITLE_TMC_WARNING_TMC_TOO_HOT c=20
+#: ../../Firmware/mmu2/errors_list.h:128 ../../Firmware/mmu2/errors_list.h:166
+#: ../../Firmware/mmu2/errors_list.h:167 ../../Firmware/mmu2/errors_list.h:168
+msgid "WARNING TMC TOO HOT"
+msgstr ""
+
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 "WARNING:\n"
 "Crash detection\n"
@@ -1835,210 +2205,210 @@ msgid ""
 msgstr ""
 
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgstr ""
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 
 #. MSG_WARN c=8
-#: ../../Firmware/messages.cpp:127 ../../Firmware/ultralcd.cpp:4504
-#: ../../Firmware/ultralcd.cpp:4586 ../../Firmware/ultralcd.cpp:4625
-#: ../../Firmware/ultralcd.cpp:4666
+#: ../../Firmware/messages.cpp:131 ../../Firmware/ultralcd.cpp:4494
+#: ../../Firmware/ultralcd.cpp:4576 ../../Firmware/ultralcd.cpp:4615
+#: ../../Firmware/ultralcd.cpp:4656
 msgid "Warn"
 msgstr ""
 
 #. MSG_CHANGED_BOTH c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1524
+#: ../../Firmware/Marlin_main.cpp:1505
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgstr ""
 
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgstr ""
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgstr ""
 
 #. MSG_SELFTEST_WIRINGERROR c=18
-#: ../../Firmware/messages.cpp:93 ../../Firmware/ultralcd.cpp:6981
-#: ../../Firmware/ultralcd.cpp:6985 ../../Firmware/ultralcd.cpp:7005
-#: ../../Firmware/ultralcd.cpp:7011 ../../Firmware/ultralcd.cpp:7035
+#: ../../Firmware/messages.cpp:97 ../../Firmware/ultralcd.cpp:6972
+#: ../../Firmware/ultralcd.cpp:6976 ../../Firmware/ultralcd.cpp:6996
+#: ../../Firmware/ultralcd.cpp:7002 ../../Firmware/ultralcd.cpp:7026
 msgid "Wiring error"
 msgstr ""
 
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgstr ""
 
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgstr ""
 
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgstr ""
 
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3341
+#: ../../Firmware/ultralcd.cpp:3356
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3338
+#: ../../Firmware/ultralcd.cpp:3353
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3334
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3301
+#: ../../Firmware/ultralcd.cpp:3316
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3307
+#: ../../Firmware/ultralcd.cpp:3322
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3313
+#: ../../Firmware/ultralcd.cpp:3328
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
-#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3304
-#: ../../Firmware/ultralcd.cpp:3332
+#: ../../Firmware/messages.cpp:16 ../../Firmware/ultralcd.cpp:3319
+#: ../../Firmware/ultralcd.cpp:3347
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3310
+#: ../../Firmware/ultralcd.cpp:3325
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3335
+#: ../../Firmware/ultralcd.cpp:3350
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgstr ""
 
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgstr ""
 
 #. MSG_YES c=4
-#: ../../Firmware/messages.cpp:120 ../../Firmware/ultralcd.cpp:2224
-#: ../../Firmware/ultralcd.cpp:2808 ../../Firmware/ultralcd.cpp:3188
-#: ../../Firmware/ultralcd.cpp:4793 ../../Firmware/ultralcd.cpp:5997
+#: ../../Firmware/messages.cpp:124 ../../Firmware/ultralcd.cpp:2228
+#: ../../Firmware/ultralcd.cpp:2798 ../../Firmware/ultralcd.cpp:3170
+#: ../../Firmware/ultralcd.cpp:4747 ../../Firmware/ultralcd.cpp:5998
 msgid "Yes"
 msgstr ""
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 msgstr ""
 
 #. MSG_WIZARD_QUIT c=20 r=8
-#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:4195
+#: ../../Firmware/messages.cpp:121 ../../Firmware/ultralcd.cpp:4149
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgstr ""
 
 #. MSG_Z_PROBE_NR c=14
-#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:5843
+#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:5833
 msgid "Z-probe nr."
 msgstr ""
 
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgstr ""
 
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgstr ""
 
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgstr ""
 
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgstr ""
 
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgstr ""
 
 #. MSG_IR_UNKNOWN c=18
-#: ../../Firmware/fsensor.cpp:182 ../../Firmware/messages.cpp:162
+#: ../../Firmware/Filament_sensor.cpp:291 ../../Firmware/messages.cpp:166
 msgid "unknown state"
 msgstr ""
 
 #. MSG_REFRESH c=18
-#: ../../Firmware/messages.cpp:78 ../../Firmware/ultralcd.cpp:6085
-#: ../../Firmware/ultralcd.cpp:6088
+#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:6086
+#: ../../Firmware/ultralcd.cpp:6089
 msgid "🔃Refresh"
 msgstr ""

+ 0 - 0
lang/po/Firmware_nl.po


Some files were not shown because too many files changed in this diff