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/AutoDeplete_test.cpp
 	Tests/PrusaStatistics_test.cpp
 	Tests/PrusaStatistics_test.cpp
 	Firmware/Timer.cpp
 	Firmware/Timer.cpp
-	Firmware/AutoDeplete.cpp
 )
 )
 add_executable(tests ${TEST_SOURCES})
 add_executable(tests ${TEST_SOURCES})
 target_include_directories(tests PRIVATE Tests)
 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.
 // 2nd and 3rd byte (LSB first) contains a 16bit length of a command including its preceding comments.
 #define CMDHDRSIZE 3
 #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
 // Firmware based and LCD controlled retract
 // M207 and M208 can be used to define parameters for the retraction.
 // 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
 #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>
     ### D9125 - PAT9125 filament sensor <a href="https://reprap.org/wiki/G-code#D9:_Read.2FWrite_ADC">D9125: PAT9125 filament sensor</a>
     #### Usage
     #### Usage
@@ -878,7 +878,6 @@ void dcode_2130()
     - `R` - Resolution. Not active in code
     - `R` - Resolution. Not active in code
     - `X` - X values
     - `X` - X values
     - `Y` - Y values
     - `Y` - Y values
-    - `L` - Activate filament sensor log
     */
     */
 void dcode_9125()
 void dcode_9125()
 {
 {
@@ -912,15 +911,8 @@ void dcode_9125()
 		pat9125_y = (int)code_value();
 		pat9125_y = (int)code_value();
 		LOG("pat9125_y=%d\n", pat9125_y);
 		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
 #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
 	extern void dcode_2130(); //D2130 - TMC2130
 #endif //TMC2130
 #endif //TMC2130
 
 
-#ifdef PAT9125
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 	extern void dcode_9125(); //D9125 - PAT9125
 	extern void dcode_9125(); //D9125 - PAT9125
-#endif //PAT9125
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 
 
 
 #endif //DCODES_H
 #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 "Configuration.h"
 #include "pins.h"
 #include "pins.h"
 #include "Timer.h"
 #include "Timer.h"
+#include "mmu2.h"
 extern uint8_t mbl_z_probe_nr;
 extern uint8_t mbl_z_probe_nr;
 
 
 #ifndef AT90USB
 #ifndef AT90USB
@@ -280,7 +281,6 @@ extern float max_pos[3];
 extern bool axis_known_position[3];
 extern bool axis_known_position[3];
 extern int fanSpeed;
 extern int fanSpeed;
 extern uint8_t newFanSpeed;
 extern uint8_t newFanSpeed;
-extern int8_t lcd_change_fil_state;
 extern float default_retraction;
 extern float default_retraction;
 
 
 void get_coordinates();
 void get_coordinates();
@@ -315,8 +315,9 @@ extern bool fan_state[2];
 extern int fan_edge_counter[2];
 extern int fan_edge_counter[2];
 extern int fan_speed[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
 //Long pause
 extern unsigned long pause_time;
 extern unsigned long pause_time;
@@ -413,6 +414,7 @@ extern void print_physical_coordinates();
 extern void print_mesh_bed_leveling_table();
 extern void print_mesh_bed_leveling_table();
 
 
 extern void stop_and_save_print_to_ram(float z_move, float e_move);
 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 restore_print_from_ram_and_continue(float e_move);
 extern void cancel_saved_printing();
 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)))))
 #if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
 void gcode_M123();
 void gcode_M123();
 #endif //FANCHECK and TACH_0 and TACH_1
 #endif //FANCHECK and TACH_0 and TACH_1
-void gcode_M701();
+void gcode_M701(float fastLoadLength, uint8_t mmuSlotIndex);
 
 
 #define UVLO !(PINE & (1<<4))
 #define UVLO !(PINE & (1<<4))
 
 
@@ -472,7 +474,8 @@ void M600_wait_for_user(float HotendTempBckp);
 void M600_check_state(float nozzle_temp);
 void M600_check_state(float nozzle_temp);
 void load_filament_final_feed();
 void load_filament_final_feed();
 void marlin_wait_for_click();
 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();
 extern "C" void softReset();
 void stack_error();
 void stack_error();

+ 582 - 652
Firmware/Marlin_main.cpp

@@ -86,8 +86,9 @@
 #include <avr/wdt.h>
 #include <avr/wdt.h>
 #include <avr/pgmspace.h>
 #include <avr/pgmspace.h>
 
 
+#include "Tcodes.h"
 #include "Dcodes.h"
 #include "Dcodes.h"
-#include "AutoDeplete.h"
+#include "SpoolJoin.h"
 
 
 #ifndef LA_NOCOMPAT
 #ifndef LA_NOCOMPAT
 #include "la10compat.h"
 #include "la10compat.h"
@@ -95,12 +96,7 @@
 
 
 #include "spi.h"
 #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
 #ifdef TMC2130
 #include "tmc2130.h"
 #include "tmc2130.h"
@@ -130,7 +126,7 @@
 #include <SPI.h>
 #include <SPI.h>
 #endif
 #endif
 
 
-#include "mmu.h"
+#include "mmu2.h"
 
 
 #define VERSION_STRING  "1.0.2"
 #define VERSION_STRING  "1.0.2"
 
 
@@ -193,8 +189,6 @@ int extruder_multiply[EXTRUDERS] = {100
 
 
 bool homing_flag = false;
 bool homing_flag = false;
 
 
-int8_t lcd_change_fil_state = 0;
-
 unsigned long pause_time = 0;
 unsigned long pause_time = 0;
 unsigned long start_pause_print = _millis();
 unsigned long start_pause_print = _millis();
 unsigned long t_fan_rising_edge = _millis();
 unsigned long t_fan_rising_edge = _millis();
@@ -248,7 +242,6 @@ float extruder_offset[NUM_EXTRUDER_OFFSETS][EXTRUDERS] = {
 };
 };
 #endif
 #endif
 
 
-uint8_t active_extruder = 0;
 int fanSpeed=0;
 int fanSpeed=0;
 uint8_t newFanSpeed = 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;
 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
 // 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_normal = PRINT_PERCENT_DONE_INIT;
 uint8_t print_percent_done_silent = 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 float saved_pos[4] = { X_COORD_INVALID, 0, 0, 0 };
 static uint16_t saved_feedrate2 = 0; //!< Default feedrate (truncated from float)
 static uint16_t saved_feedrate2 = 0; //!< Default feedrate (truncated from float)
 static int saved_feedmultiply2 = 0;
 static int saved_feedmultiply2 = 0;
-static uint8_t saved_active_extruder = 0;
 float saved_extruder_temperature = 0.0; //!< Active extruder temperature
 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;
 static bool saved_extruder_relative_mode = false;
 int saved_fan_speed = 0; //!< Print fan speed
 int saved_fan_speed = 0; //!< Print fan speed
 //! @}
 //! @}
@@ -569,7 +558,7 @@ bool __attribute__((noinline)) printer_active() {
         || (custom_message_type == CustomMsg::TempCal)
         || (custom_message_type == CustomMsg::TempCal)
         || saved_printing
         || saved_printing
         || (lcd_commands_type == LcdCommands::Layer1Cal)
         || (lcd_commands_type == LcdCommands::Layer1Cal)
-        || mmu_print_saved
+        || MMU2::mmu2.MMU_PRINT_SAVED()
         || homing_flag
         || homing_flag
         || mesh_bed_leveling_flag;
         || mesh_bed_leveling_flag;
 }
 }
@@ -654,13 +643,12 @@ void crashdet_detected(uint8_t mask)
         lcd_set_cursor(0, 1);
         lcd_set_cursor(0, 1);
         lcd_puts_P(_T(MSG_RESUME_PRINT));
         lcd_puts_P(_T(MSG_RESUME_PRINT));
         lcd_putc('?');
         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"));
 			enquecommand_P(PSTR("CRASH_RECOVER"));
 		}
 		}
-		else
+		else // LCD_MIDDLE_BUTTON_CHOICE
 		{
 		{
 			enquecommand_P(PSTR("CRASH_CANCEL"));
 			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_POWER_COUNT, 0);
 	eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);
 	eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);
 	eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);
 	eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-    fsensor_softfail = 0;
-#endif
 }
 }
 
 
 void softReset()
 void softReset()
@@ -764,8 +749,12 @@ static void factory_reset(char level)
 		farm_disable();
 		farm_disable();
 
 
 #ifdef FILAMENT_SENSOR
 #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
 #endif //FILAMENT_SENSOR
 		break;
 		break;
 
 
@@ -864,24 +853,14 @@ void show_fw_version_warnings() {
 	lcd_update_enable(true);
 	lcd_update_enable(true);
 }
 }
 
 
+#if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
 //! @brief try to check if firmware is on right type of printer
 //! @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()
 uint8_t check_printer_version()
 {
 {
@@ -1061,7 +1040,6 @@ void setup()
 {
 {
 	timer2_init(); // enables functional millis
 	timer2_init(); // enables functional millis
 
 
-	mmu_init();
 
 
 	ultralcd_init();
 	ultralcd_init();
 
 
@@ -1134,6 +1112,11 @@ void setup()
 	SERIAL_ECHO_START;
 	SERIAL_ECHO_START;
 	puts_P(PSTR(" " FW_VERSION_FULL));
 	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))));
 	//SERIAL_ECHOPAIR("Active sheet before:", static_cast<unsigned long int>(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))));
 
 
 #ifdef DEBUG_SEC_LANG
 #ifdef DEBUG_SEC_LANG
@@ -1365,7 +1348,7 @@ void setup()
         xflash_err_msg();
         xflash_err_msg();
 
 
 #ifdef FILAMENT_SENSOR
 #ifdef FILAMENT_SENSOR
-	fsensor_init();
+    fsensor.init();
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
 
 
 
 
@@ -1497,15 +1480,13 @@ void setup()
 	setup_fan_interrupt();
 	setup_fan_interrupt();
 #endif //DEBUG_DISABLE_FANCHECK
 #endif //DEBUG_DISABLE_FANCHECK
 
 
-#ifdef PAT9125
-	fsensor_setup_interrupt();
-#endif //PAT9125
-
 #ifndef DEBUG_DISABLE_STARTMSGS
 #ifndef DEBUG_DISABLE_STARTMSGS
   KEEPALIVE_STATE(PAUSED_FOR_USER);
   KEEPALIVE_STATE(PAUSED_FOR_USER);
 
 
   if (!farm_mode) {
   if (!farm_mode) {
+#if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
     check_if_fw_is_on_right_printer();
     check_if_fw_is_on_right_printer();
+#endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
     show_fw_version_warnings();    
     show_fw_version_warnings();    
   }
   }
 
 
@@ -1601,7 +1582,7 @@ void setup()
 #ifdef UVLO_SUPPORT
 #ifdef UVLO_SUPPORT
   if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != 0) { //previous print was terminated by UVLO
   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 {
 	  else {
 		  eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0);
 		  eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0);
 		  lcd_update_enable(true);
 		  lcd_update_enable(true);
@@ -1623,8 +1604,9 @@ void setup()
           #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
           #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER 
         puts_P(_N("Normal recovery!")); 
         puts_P(_N("Normal recovery!")); 
           #endif 
           #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); 
               eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0); 
               lcd_update_enable(true); 
               lcd_update_enable(true); 
               lcd_update(2); 
               lcd_update(2); 
@@ -1639,7 +1621,6 @@ void setup()
 #endif //UVLO_SUPPORT
 #endif //UVLO_SUPPORT
 
 
   fCheckModeInit();
   fCheckModeInit();
-  fSetMmuMode(mmu_enabled);
   KEEPALIVE_STATE(NOT_BUSY);
   KEEPALIVE_STATE(NOT_BUSY);
 #ifdef WATCHDOG
 #ifdef WATCHDOG
   wdt_enable(WDTO_4S);
   wdt_enable(WDTO_4S);
@@ -1810,7 +1791,7 @@ void loop()
       // The first character in the block is the block type.      
       // The first character in the block is the block type.      
       char *ptr = cmdbuffer + bufindr;
       char *ptr = cmdbuffer + bufindr;
       if (*ptr == CMDBUFFER_CURRENT_TYPE_SDCARD) {
       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 {
         union {
           struct {
           struct {
               char lo;
               char lo;
@@ -1872,7 +1853,7 @@ void loop()
 		}
 		}
 	}
 	}
 #endif //TMC2130
 #endif //TMC2130
-	mmu_loop();
+	MMU2::mmu2.mmu_loop();
 }
 }
 
 
 #define DEFINE_PGM_READ_ANY(type, reader)       \
 #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)
 #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);
     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)
     if (axis_known_position[Z_AXIS] || z_min_endstop)
     {
     {
         // current position is known or very low, it's safe to raise Z
         // 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
 #ifdef TMC2130
-    tmc2130_home_enter(Z_AXIS_MASK);
+        tmc2130_home_enter(Z_AXIS_MASK);
 #endif //TMC2130
 #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
 #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
 #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;
 	//	current_position[axis] = 0;
 	//	plan_set_position_curposXYZE();
 	//	plan_set_position_curposXYZE();
 	tmc2130_home_exit();
 	tmc2130_home_exit();
-	enable_endstops(false);
 	current_position[Z_AXIS] = 0;
 	current_position[Z_AXIS] = 0;
 	plan_set_position_curposXYZE();
 	plan_set_position_curposXYZE();
 	set_destination_to_current();
 	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 we are homing all axes, first move z higher to protect heatbed/steel sheet
 	if (home_all_axes) {
 	if (home_all_axes) {
         raise_z_above(MESH_HOME_Z_SEARCH);
         raise_z_above(MESH_HOME_Z_SEARCH);
-		st_synchronize();
 	}
 	}
 #ifdef ENABLE_AUTO_BED_LEVELING
 #ifdef ENABLE_AUTO_BED_LEVELING
       plan_bed_level_matrix.set_to_identity();  //Reset the plane ("erase" all leveling data)
       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(home_z) {
             #if defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
             #if defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
               raise_z_above(Z_RAISE_BEFORE_HOMING);
               raise_z_above(Z_RAISE_BEFORE_HOMING);
-              st_synchronize();
             #endif // defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0)
             #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
             #ifdef MESH_BED_LEVELING  // If Mesh bed leveling, move X&Y to safe position for home
               raise_z_above(MESH_HOME_Z_SEARCH);
               raise_z_above(MESH_HOME_Z_SEARCH);
-              st_synchronize();
               if (!axis_known_position[X_AXIS]) homeaxis(X_AXIS);
               if (!axis_known_position[X_AXIS]) homeaxis(X_AXIS);
               if (!axis_known_position[Y_AXIS]) homeaxis(Y_AXIS);
               if (!axis_known_position[Y_AXIS]) homeaxis(Y_AXIS);
               // 1st mesh bed leveling measurement point, corrected.
               // 1st mesh bed leveling measurement point, corrected.
@@ -3064,9 +3059,7 @@ static void gcode_G80()
 #endif // TMC2130
 #endif // TMC2130
             // ~ Z-homing (can not be used "G28", because X & Y-homing would have been done before (Z-homing))
             // ~ Z-homing (can not be used "G28", because X & Y-homing would have been done before (Z-homing))
             bState=enable_z_endstop(false);
             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);
             enable_z_endstop(true);
 #ifdef TMC2130
 #ifdef TMC2130
             tmc2130_home_enter(Z_AXIS_MASK);
             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();
 	int l_feedmultiply = setup_for_endstop_move();
 	lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME));
 	lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME));
   raise_z_above(MESH_HOME_Z_SEARCH);
   raise_z_above(MESH_HOME_Z_SEARCH);
-  st_synchronize();
 	home_xy();
 	home_xy();
 
 
 	enable_endstops(false);
 	enable_endstops(false);
@@ -3306,19 +3298,19 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level)
 		{
 		{
 			KEEPALIVE_STATE(PAUSED_FOR_USER);
 			KEEPALIVE_STATE(PAUSED_FOR_USER);
 			#ifdef STEEL_SHEET
 			#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
 			#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);
 			KEEPALIVE_STATE(IN_HANDLER);
 			lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
 			lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
 			lcd_puts_at_P(0,3,_n("1/4"));
 			lcd_puts_at_P(0,3,_n("1/4"));
 		}
 		}
 			
 			
 		bool endstops_enabled  = enable_endstops(false);
 		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.
 		// Move the print head close to the bed.
 		current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
 		current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
@@ -3461,218 +3453,254 @@ void gcode_M123()
 }
 }
 #endif //FANCHECK and TACH_0 or TACH_1
 #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();
     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
     //First backup current position and settings
     int feedmultiplyBckp = feedmultiply;
     int feedmultiplyBckp = feedmultiply;
     float HotendTempBckp = degTargetHotend(active_extruder);
     float HotendTempBckp = degTargetHotend(active_extruder);
     int fanSpeedBckp = fanSpeed;
     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;
     current_position[E_AXIS] += e_shift;
     plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED);
     plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED);
     st_synchronize();
     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[X_AXIS] = x_position;
     current_position[Y_AXIS] = y_position;
     current_position[Y_AXIS] = y_position;
     plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
     plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
     st_synchronize();
     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
     // 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_clear();
                 lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT));
                 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);
     lcd_setstatuspgm(MSG_WELCOME);
     custom_message_type = CustomMsg::Status;
     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);
     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
  * @brief Get serial number from 32U2 processor
  *
  *
@@ -4260,7 +4288,7 @@ void process_commands()
         }
         }
 		else if (code_seen_P(PSTR("MMURES"))) // PRUSA MMURES
 		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
 		else if (code_seen_P(PSTR("RESET"))) { // PRUSA RESET
 #ifdef WATCHDOG
 #ifdef WATCHDOG
@@ -4880,9 +4908,9 @@ eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,0xFFFF);
             break;
             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
         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;
             current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
             plan_buffer_line_curposXYZE(3000 / 60);
             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>
 	### 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:
     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
               // A new print has started from scratch, reset stats
               failstats_reset_print();
               failstats_reset_print();
               sdpos_atomic = 0;
               sdpos_atomic = 0;
 #ifndef LA_NOCOMPAT
 #ifndef LA_NOCOMPAT
-              la10c_reset();
+        la10c_reset();
 #endif
 #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>
 	### 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;
               axis_steps_per_sqr_second[i] *= factor;
             }
             }
             cs.axis_steps_per_unit[i] = value;
             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 {
           else {
             cs.axis_steps_per_unit[i] = code_value();
             cs.axis_steps_per_unit[i] = code_value();
@@ -7611,14 +7647,13 @@ Sigma_Exit:
 	{
 	{
 		// currently three different materials are needed (default, flex and PVA)
 		// currently three different materials are needed (default, flex and PVA)
 		// add storing this information for different load/unload profiles etc. in the future
 		// 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 extruder = 255;
 			uint8_t filament = FILAMENT_UNDEFINED;
 			uint8_t filament = FILAMENT_UNDEFINED;
 			if(code_seen('E')) extruder = code_value_uint8();
 			if(code_seen('E')) extruder = code_value_uint8();
 			if(code_seen('F')) filament = 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;
 	break;
@@ -7785,7 +7820,7 @@ Sigma_Exit:
       
       
     - `X`    - X position, default 211
     - `X`    - X position, default 211
     - `Y`    - Y position, default 0
     - `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
     - `E`    - initial retract, default -2
     - `L`    - later retract distance for removal, default -80
     - `L`    - later retract distance for removal, default -80
     - `AUTO` - Automatically (only with MMU)
     - `AUTO` - Automatically (only with MMU)
@@ -7796,7 +7831,7 @@ Sigma_Exit:
 
 
 		float x_position = current_position[X_AXIS];
 		float x_position = current_position[X_AXIS];
 		float y_position = current_position[Y_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_init = 0;
 		float e_shift_late = 0;
 		float e_shift_late = 0;
 		bool automatic = false;
 		bool automatic = false;
@@ -7825,16 +7860,10 @@ Sigma_Exit:
 		  #endif	
 		  #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'))
         if(code_seen('X'))
         {
         {
           x_position = code_value();
           x_position = code_value();
@@ -7856,7 +7885,7 @@ Sigma_Exit:
           #endif
           #endif
         }
         }
 
 
-		if (mmu_enabled && code_seen_P(PSTR("AUTO")))
+		if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO")))
 			automatic = true;
 			automatic = true;
 
 
 		gcode_M600(automatic, x_position, y_position, z_shift, e_shift_init, e_shift_late);
 		gcode_M600(automatic, x_position, y_position, z_shift, e_shift_init, e_shift_late);
@@ -8103,6 +8132,8 @@ Sigma_Exit:
                          {
                          {
                          uint16_t nPrinterModel;
                          uint16_t nPrinterModel;
                          nPrinterModel=(uint16_t)code_value_long();
                          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);
                          printer_model_check(nPrinterModel);
                          }
                          }
                     else if(code_seen('Q'))
                     else if(code_seen('Q'))
@@ -8110,7 +8141,10 @@ Sigma_Exit:
                     break;
                     break;
                case ClPrintChecking::_Smodel:     // ~ .3
                case ClPrintChecking::_Smodel:     // ~ .3
                     if(code_seen('P'))
                     if(code_seen('P'))
-                         printer_smodel_check(strchr_pointer);
+                    {
+                        fSetMmuMode(MMU2::mmu2.Enabled());
+                        printer_smodel_check(strchr_pointer);
+                    }
                     else if(code_seen('Q'))
                     else if(code_seen('Q'))
                          SERIAL_PROTOCOLLNRPGM(sPrinterName);
                          SERIAL_PROTOCOLLNRPGM(sPrinterName);
                     break;
                     break;
@@ -8441,10 +8475,10 @@ Sigma_Exit:
 						cs.axis_steps_per_unit[i] /= fac;
 						cs.axis_steps_per_unit[i] /= fac;
 						position[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;
     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
     #### Usage
 
 
-        M701 [ E | T ]
+        M701 [ P | T | L | Z ]
 
 
     #### Parameters
     #### 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>
     ### M702 - Unload filament <a href="https://reprap.org/wiki/G-code#M702:_Unload_filament">G32: Undock Z Probe sled</a>
     #### Usage
     #### Usage
     
     
-        M702 [ C ]
+        M702 [ U | Z ]
     
     
     #### Parameters
     #### 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
 	#### 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 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.
   @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 if(code_seen('T')) (end of T codes)
   /*!
   /*!
   #### End of T-Codes
   #### End of T-Codes
@@ -9075,7 +9157,7 @@ Sigma_Exit:
 		dcode_2130(); break;
 		dcode_2130(); break;
 #endif //TMC2130
 #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>
     ### 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:
 	case 9125:
 		dcode_9125(); break;
 		dcode_9125(); break;
-#endif //FILAMENT_SENSOR
+#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 
 #endif //DEBUG_DCODES
 #endif //DEBUG_DCODES
 
 
@@ -9397,133 +9479,13 @@ static void handleSafetyTimer()
 }
 }
 #endif //SAFETYTIMER
 #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
 void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h
 {
 {
 #ifdef FILAMENT_SENSOR
 #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
 #ifdef SAFETYTIMER
 	handleSafetyTimer();
 	handleSafetyTimer();
@@ -9608,7 +9570,7 @@ if(0)
     }
     }
   #endif
   #endif
   check_axes_activity();
   check_axes_activity();
-  mmu_loop();
+  MMU2::mmu2.mmu_loop();
 
 
   // handle longpress
   // handle longpress
   if(lcd_longpress_trigger)
   if(lcd_longpress_trigger)
@@ -9864,23 +9826,9 @@ bool setTargetedHotend(int code, uint8_t &extruder)
       extruder = code_value_uint8();
       extruder = code_value_uint8();
     if(extruder >= EXTRUDERS) {
     if(extruder >= EXTRUDERS) {
       SERIAL_ECHO_START;
       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);
       SERIAL_PROTOCOLLN((int)extruder);
       return true;
       return true;
     }
     }
@@ -10588,7 +10536,7 @@ void long_pause() //long pause print
     setAllTargetHotends(0);
     setAllTargetHotends(0);
 
 
     // Lift z
     // Lift z
-    raise_z_above(current_position[Z_AXIS] + Z_PAUSE_LIFT, true);
+    raise_z(Z_PAUSE_LIFT);
 
 
     // Move XY to side
     // Move XY to side
     if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
     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;
     if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID;
 
 
     saved_feedmultiply2 = feedmultiply; //save feedmultiply
     saved_feedmultiply2 = feedmultiply; //save feedmultiply
-	saved_active_extruder = active_extruder; //save active_extruder
 	saved_extruder_temperature = degTargetHotend(active_extruder);
 	saved_extruder_temperature = degTargetHotend(active_extruder);
 	saved_bed_temperature = degTargetBed();
 	saved_bed_temperature = degTargetBed();
 	saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
 	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
 //! @brief Restore print from ram
 //!
 //!
 //! Restore print saved by stop_and_save_print_to_ram(). Is blocking, restores
 //! 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)
     // restore bed temperature (bed can be disabled during a thermal warning)
     if (degBed() != saved_bed_temperature)
     if (degBed() != saved_bed_temperature)
         setTargetBed(saved_bed_temperature);
         setTargetBed(saved_bed_temperature);
-
-	// restore active_extruder
-	active_extruder = saved_active_extruder;
 	fanSpeed = saved_fan_speed;
 	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;
 	axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK;
 	float e = saved_pos[E_AXIS] - e_move;
 	float e = saved_pos[E_AXIS] - e_move;
 	plan_set_e_position(e);
 	plan_set_e_position(e);
@@ -11528,21 +11476,28 @@ void load_filament_final_feed()
 //! @par nozzle_temp nozzle temperature to load filament
 //! @par nozzle_temp nozzle temperature to load filament
 void M600_check_state(float nozzle_temp)
 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);
         KEEPALIVE_STATE(PAUSED_FOR_USER);
-        lcd_alright();
+        lcd_change_filament_state = lcd_alright();
         KEEPALIVE_STATE(IN_HANDLER);
         KEEPALIVE_STATE(IN_HANDLER);
-        switch(lcd_change_fil_state)
+        switch(lcd_change_filament_state)
         {
         {
         // Filament failed to load so load it again
         // Filament failed to load so load it again
         case 2:
         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();
                 M600_load_filament_movements();
+            }
             break;
             break;
 
 
         // Filament loaded properly but color is not clear
         // Filament loaded properly but color is not clear
@@ -11660,46 +11615,23 @@ void M600_load_filament() {
 	//load_filament_time = _millis();
 	//load_filament_time = _millis();
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
 
 
-#ifdef PAT9125
-	fsensor_autoload_check_start();
-#endif //PAT9125
 	while(!lcd_clicked())
 	while(!lcd_clicked())
 	{
 	{
 		manage_heater();
 		manage_heater();
 		manage_inactivity(true);
 		manage_inactivity(true);
 #ifdef FILAMENT_SENSOR
 #ifdef FILAMENT_SENSOR
-		if (fsensor_check_autoload())
-		{
-      Sound_MakeCustom(50,1000,false);
+		if (fsensor.getFilamentLoadEvent()) {
+			Sound_MakeCustom(50,1000,false);
 			break;
 			break;
 		}
 		}
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
 	}
 	}
-#ifdef PAT9125
-	fsensor_autoload_check_stop();
-#endif //PAT9125
 	KEEPALIVE_STATE(IN_HANDLER);
 	KEEPALIVE_STATE(IN_HANDLER);
 
 
-#ifdef FSENSOR_QUALITY
-	fsensor_oq_meassure_start(70);
-#endif //FSENSOR_QUALITY
-
 	M600_load_filament_movements();
 	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);
 	lcd_update_enable(false);
 }
 }
 
 
@@ -11721,8 +11653,6 @@ void marlin_wait_for_click()
     KEEPALIVE_STATE(busy_state_backup);
     KEEPALIVE_STATE(busy_state_backup);
 }
 }
 
 
-#define FIL_LOAD_LENGTH 60
-
 #ifdef PSU_Delta
 #ifdef PSU_Delta
 bool bEnableForce_z;
 bool bEnableForce_z;
 
 

+ 2 - 2
Firmware/Prusa_farm.cpp

@@ -7,7 +7,7 @@
 #include "conv2str.h"
 #include "conv2str.h"
 #include "util.h"
 #include "util.h"
 #include "ultralcd.h"
 #include "ultralcd.h"
-#include "fsensor.h" //to be converted to Filament_sensor.h...
+#include "Filament_sensor.h"
 
 
 #ifdef PRUSA_FARM
 #ifdef PRUSA_FARM
 uint8_t farm_mode = 0;
 uint8_t farm_mode = 0;
@@ -405,7 +405,7 @@ void farm_mode_init() {
 #ifdef FILAMENT_SENSOR
 #ifdef FILAMENT_SENSOR
         //to be converted to Filament_sensor.h...
         //to be converted to Filament_sensor.h...
         //disabled filament autoload (PFW360)
         //disabled filament autoload (PFW360)
-        fsensor_autoload_set(false);
+        fsensor.setAutoLoadEnabled(false);
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
         // ~ FanCheck -> on
         // ~ FanCheck -> on
         eeprom_update_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED, true);
         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_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 NC_BUTTON_LONG_PRESS 15 //time in s
 
 
+//#define FARM_CONNECT_MESSAGE
+
 #ifdef PRUSA_FARM
 #ifdef PRUSA_FARM
 extern uint8_t farm_mode;
 extern uint8_t farm_mode;
 #else
 #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"
 # error "ADC_CHAN_MSK oes not match ADC_CHAN_CNT"
 #endif
 #endif
 
 
+#define VOLT_DIV_REF 5 //[V]
+
 extern volatile uint8_t adc_channel;
 extern volatile uint8_t adc_channel;
 extern volatile uint16_t adc_values[ADC_CHAN_CNT];
 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 "cmdqueue.h"
 #include "cardreader.h"
 #include "cardreader.h"
 #include "ultralcd.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.
 // 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
 // This function may update bufindw, therefore for the power panic to work, this function must be called
 // with the interrupts disabled!
 // 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.
     // MAX_CMD_SIZE has to accommodate the zero terminator.
     if (len_asked >= MAX_CMD_SIZE)
     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.
         // Full buffer.
         return false;
         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;
     return false;
 }
 }
@@ -368,7 +337,7 @@ void repeatcommand_front()
 void get_command()
 void get_command()
 {
 {
     // Test and reserve space for the new command string.
     // 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;
       return;
 
 
 	if (MYSERIAL.available() == RX_BUFFER_SIZE - 1) { //compare number of chars buffered in rx buffer with rx buffer size
 	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
       serial_count = 0; //clear buffer
       // Don't call cmdqueue_could_enqueue_back if there are no characters waiting
       // Don't call cmdqueue_could_enqueue_back if there are no characters waiting
       // in the queue, as this function will reserve the memory.
       // 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;
           return;
     } // end of "end of line" processing
     } // end of "end of line" processing
     else {
     else {
@@ -571,7 +540,7 @@ void get_command()
         // This is either an empty line, or a line with just a comment.
         // 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
         // Continue to the following line, and continue accumulating the number of bytes
         // read from the sdcard into sd_count, 
         // 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. 
         // to the following non-empty line. 
         return; // prevent cycling indefinitely - let manage_heaters do their job
         return; // prevent cycling indefinitely - let manage_heaters do their job
       }
       }
@@ -613,7 +582,7 @@ void get_command()
       if(card.eof()) break;
       if(card.eof()) break;
 
 
       // The following line will reserve buffer space if available.
       // 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;
           return;
     }
     }
     else
     else

+ 7 - 2
Firmware/config.h

@@ -43,7 +43,12 @@
 //#define PAT9125_I2C_ADDR  0x73  //ID=NC
 //#define PAT9125_I2C_ADDR  0x73  //ID=NC
 #define PAT9125_XRES      0
 #define PAT9125_XRES      0
 #define PAT9125_YRES      240                   // maximum resolution (5*X cpi)
 #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
 //SM4 configuration
 #define SM4_DEFDELAY      500       //default step delay [us]
 #define SM4_DEFDELAY      500       //default step delay [us]
@@ -59,7 +64,7 @@
 //#define LANG_MODE              0 // primary language only
 //#define LANG_MODE              0 // primary language only
 #define LANG_MODE              1 // sec. language support
 #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
                                       // 0x3D00 Maximum 15616 bytes as it depends on xflash_layout.h
                                       // 16 Languages max. per group including stock 
                                       // 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_TOTALTIME, 0);
         eeprom_update_dword((uint32_t *)EEPROM_FILAMENTUSED, 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
 //! @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__								| ^				| ^
 | ^					| ^			| ^										| 01h 1			| ^						| Sound mode: __once__								| ^				| ^
 | ^					| ^			| ^										| 02h 1			| ^						| Sound mode: __silent__							| ^				| ^
 | ^					| ^			| ^										| 02h 1			| ^						| Sound mode: __silent__							| ^				| ^
 | ^					| ^			| ^										| 03h 1			| ^						| Sound mode: __assist__							| ^				| ^
 | ^					| ^			| ^										| 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__						| ^				| ^
 | ^					| ^			| ^										| 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
 | 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
 | 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
 | 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											| ^				| ^
 | ^					| ^			| ^										| 03h 3			| ^						| bad_isr											| ^				| ^
 | ^					| ^			| ^										| 04h 4			| ^						| bad_pullup_temp_isr								| ^				| ^
 | ^					| ^			| ^										| 04h 4			| ^						| bad_pullup_temp_isr								| ^				| ^
 | ^					| ^			| ^										| 05h 5			| ^						| bad_pullup_step_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
 | 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
 // Sound Mode
 #define EEPROM_SOUND_MODE (EEPROM_UVLO_TARGET_HOTEND-1) // uint8
 #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_FAIL (EEPROM_MMU_FAIL_TOT - 1) //uint8_t
 
 
 #define EEPROM_MMU_LOAD_FAIL_TOT (EEPROM_MMU_FAIL - 2) //uint16_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_W (EEPROM_TEMP_MODEL_Ta_corr-4) // float
 #define EEPROM_TEMP_MODEL_E (EEPROM_TEMP_MODEL_W-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.
 //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 !!!!!
 // !!!!! 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 "language.h"
 #include "Marlin.h"
 #include "Marlin.h"
 #include "cmdqueue.h"
 #include "cmdqueue.h"
-#include "mmu.h"
+#include "mmu2.h"
 #include <avr/pgmspace.h>
 #include <avr/pgmspace.h>
 
 
 //! @brief Wait for preheat
 //! @brief Wait for preheat
@@ -34,7 +34,7 @@ void lay1cal_wait_preheat()
 //! @param filament filament to use (applies for MMU only)
 //! @param filament filament to use (applies for MMU only)
 void lay1cal_load_filament(char *cmd_buffer, uint8_t filament)
 void lay1cal_load_filament(char *cmd_buffer, uint8_t filament)
 {
 {
-    if (mmu_enabled)
+    if (MMU2::mmu2.Enabled())
     {
     {
         enquecommand_P(PSTR("M83"));
         enquecommand_P(PSTR("M83"));
         enquecommand_P(PSTR("G1 Y-3.0 F1000.0"));
         enquecommand_P(PSTR("G1 Y-3.0 F1000.0"));
@@ -73,7 +73,7 @@ void lay1cal_intro_line()
         cmd_intro_mmu_12,
         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)
         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
 //Custom characters defined in the first 8 characters of the LCD
 #define LCD_STR_BEDTEMP      "\x00"
 #define LCD_STR_BEDTEMP      "\x00"
 #define LCD_STR_DEGREE       "\x01"
 #define LCD_STR_DEGREE       "\x01"
-#define LCD_STR_ARROW_2_DOWN "\x01"
 #define LCD_STR_THERMOMETER  "\x02"
 #define LCD_STR_THERMOMETER  "\x02"
-#define LCD_STR_CONFIRM      "\x02"
 #define LCD_STR_UPLEVEL      "\x03"
 #define LCD_STR_UPLEVEL      "\x03"
 #define LCD_STR_REFRESH      "\x04"
 #define LCD_STR_REFRESH      "\x04"
 #define LCD_STR_FOLDER       "\x05"
 #define LCD_STR_FOLDER       "\x05"
 #define LCD_STR_FEEDRATE     "\x06"
 #define LCD_STR_FEEDRATE     "\x06"
+#define LCD_STR_ARROW_2_DOWN "\x06"
 #define LCD_STR_CLOCK        "\x07"
 #define LCD_STR_CLOCK        "\x07"
+#define LCD_STR_CONFIRM      "\x07"
 #define LCD_STR_ARROW_RIGHT  "\x7E" //from the default character set
 #define LCD_STR_ARROW_RIGHT  "\x7E" //from the default character set
 #define LCD_STR_SOLID_BLOCK  "\xFF"  //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]));
 		//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) {
 		if (fabs(current_position[Z_AXIS] - z_bckp) < 0.025) {
 			//printf_P(PSTR("PINDA triggered immediately, move Z higher and repeat measurement\n")); 
 			//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;
 			current_position[Z_AXIS] = minimum_z;
             go_to_current(homing_feedrate[Z_AXIS]/(4*60));
             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.
             // 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 sample_z() {
 	bool sampled = true;
 	bool sampled = true;
 	//make space
 	//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));
 	lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET));
 
 
 	// Sample Z heights for the mesh bed leveling.
 	// 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_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_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_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_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_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[] PROGMEM_I1 = ISTR("Heating"); ////MSG_HEATING c=20
 const char MSG_HEATING_COMPLETE[] PROGMEM_I1 = ISTR("Heating done."); ////MSG_HEATING_COMPLETE 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[] 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_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_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_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_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_CUT_FILAMENT[] PROGMEM_I1 = ISTR("Cut filament"); ////MSG_CUT_FILAMENT c=17
 const char MSG_MAIN[] PROGMEM_I1 = ISTR("Main"); ////MSG_MAIN c=18
 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_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[] 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_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_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_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
 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_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_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[] 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_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_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
 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_BRIGHT[] PROGMEM_I1 = ISTR("Bright"); ////MSG_BRIGHT c=6
 const char MSG_DIM[] PROGMEM_I1 = ISTR("Dim"); ////MSG_DIM 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
 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
 // 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_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
 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
 #ifdef TEMP_MODEL
 extern const char MSG_THERMAL_ANOMALY[] PROGMEM_I1 = ISTR("THERMAL ANOMALY");////MSG_THERMAL_ANOMALY c=20
 extern const char MSG_THERMAL_ANOMALY[] PROGMEM_I1 = ISTR("THERMAL ANOMALY");////MSG_THERMAL_ANOMALY c=20
 #endif
 #endif
+extern const char MSG_LOAD_ALL[] PROGMEM_I1 = ISTR("Load All"); ////MSG_LOAD_ALL c=18
 
 
 //not internationalized messages
 //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_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_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
 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_FINISHING_MOVEMENTS[];
 extern const char MSG_FOLLOW_CALIBRATION_FLOW[];
 extern const char MSG_FOLLOW_CALIBRATION_FLOW[];
 extern const char MSG_FOLLOW_Z_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_AUTOLOAD[];
+extern const char MSG_FSENSOR_JAM_DETECTION[];
 extern const char MSG_FSENSOR[];
 extern const char MSG_FSENSOR[];
 extern const char MSG_HEATING[];
 extern const char MSG_HEATING[];
 extern const char MSG_HEATING_COMPLETE[];
 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[];
 extern const char MSG_LAST_PRINT_FAILURES[];
 extern const char MSG_LAST_PRINT_FAILURES[];
 extern const char MSG_LOAD_FILAMENT[];
 extern const char MSG_LOAD_FILAMENT[];
+extern const char MSG_LOAD_TO_EXTRUDER[];
 extern const char MSG_LOADING_FILAMENT[];
 extern const char MSG_LOADING_FILAMENT[];
+extern const char MSG_TESTING_FILAMENT[];
 extern const char MSG_M117_V2_CALIBRATION[];
 extern const char MSG_M117_V2_CALIBRATION[];
 extern const char MSG_MAIN[];
 extern const char MSG_MAIN[];
 extern const char MSG_BACK[];
 extern const char MSG_BACK[];
@@ -130,7 +134,7 @@ extern const char MSG_WELCOME[];
 extern const char MSG_OFF[];
 extern const char MSG_OFF[];
 extern const char MSG_ON[];
 extern const char MSG_ON[];
 extern const char MSG_NA[];
 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_CUTTER[];
 extern const char MSG_NONE[];
 extern const char MSG_NONE[];
 extern const char MSG_WARN[];
 extern const char MSG_WARN[];
@@ -166,7 +170,7 @@ extern const char MSG_TIMEOUT[];
 extern const char MSG_BRIGHT[];
 extern const char MSG_BRIGHT[];
 extern const char MSG_DIM[];
 extern const char MSG_DIM[];
 extern const char MSG_AUTO[];
 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_04_OR_NEWER[];
 extern const char MSG_IR_03_OR_OLDER[];
 extern const char MSG_IR_03_OR_OLDER[];
 extern const char MSG_IR_UNKNOWN[];
 extern const char MSG_IR_UNKNOWN[];
@@ -175,6 +179,7 @@ extern const char MSG_PAUSED_THERMAL_ERROR[];
 #ifdef TEMP_MODEL
 #ifdef TEMP_MODEL
 extern const char MSG_THERMAL_ANOMALY[];
 extern const char MSG_THERMAL_ANOMALY[];
 #endif
 #endif
+extern const char MSG_LOAD_ALL[];
 
 
 //not internationalized messages
 //not internationalized messages
 extern const char MSG_BROWNOUT_RESET[];
 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 <avr/pgmspace.h>
 #include "config.h"
 #include "config.h"
 #include <stdio.h>
 #include <stdio.h>
+#include "Configuration_prusa.h"
 
 
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
 
 
 //PAT9125 registers
 //PAT9125 registers
 #define PAT9125_PID1			0x00
 #define PAT9125_PID1			0x00
@@ -46,27 +48,26 @@ uint8_t pat9125_s = 0;
 
 
 
 
 // Init sequence, address & value.
 // Init sequence, address & value.
-const PROGMEM uint8_t pat9125_init_seq1[] = {
+const PROGMEM uint8_t pat9125_init_bank0[] = {
 	// Disable write protect.
 	// Disable write protect.
 	PAT9125_WP, 0x5a,
 	PAT9125_WP, 0x5a,
 	// Set the X resolution to zero to let the sensor know that it could safely ignore movement in the X axis.
 	// 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.
 // 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.
 	// Magic sequence to enforce full frame rate of the sensor.
 	0x06, 0x028,
 	0x06, 0x028,
 	0x33, 0x0d0,
 	0x33, 0x0d0,
@@ -93,14 +94,14 @@ const PROGMEM uint8_t pat9125_init_seq2[] = {
 	0x6e, 0x022,
 	0x6e, 0x022,
 	0x71, 0x007,
 	0x71, 0x007,
 	0x72, 0x008,
 	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;
 extern FILE _uartout;
 #define uartout (&_uartout)
 #define uartout (&_uartout)
@@ -113,26 +114,23 @@ uint8_t pat9125_probe()
   #error not implemented
   #error not implemented
 #elif defined(PAT9125_SWI2C)
 #elif defined(PAT9125_SWI2C)
     swi2c_init();
     swi2c_init();
-    return swi2c_readByte_A8(PAT9125_I2C_ADDR,0x00,NULL);
+    return swi2c_check(PAT9125_I2C_ADDR) == 0;
 #elif defined(PAT9125_I2C)
 #elif defined(PAT9125_I2C)
     twi_init();
     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
 #endif
 }
 }
 
 
 uint8_t pat9125_init(void)
 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);
 	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
 	if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
 	if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
 	{
 	{
@@ -142,54 +140,49 @@ uint8_t pat9125_init(void)
 			return 0;
 			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.
 	// 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);
 	pat9125_wr_reg(PAT9125_CONFIG, 0x97);
 	// Wait until the sensor reboots.
 	// 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);
 	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);
 	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x00);
+	
 	// Enable write protect.
 	// 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_PID1 = pat9125_rd_reg(PAT9125_PID1);
 	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
 	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_X, PAT9125_XRES);
 	pat9125_wr_reg(PAT9125_RES_Y, PAT9125_YRES);
 	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;
 	return 1;
 }
 }
 
 
@@ -212,7 +205,7 @@ uint8_t pat9125_update(void)
 			if (iDX & 0x800) iDX -= 4096;
 			if (iDX & 0x800) iDX -= 4096;
 			if (iDY & 0x800) iDY -= 4096;
 			if (iDY & 0x800) iDY -= 4096;
 			pat9125_x += iDX;
 			pat9125_x += iDX;
-			pat9125_y -= iDY; //negative number, because direction switching does not work
+			pat9125_y += iDY;
 		}
 		}
 		return 1;
 		return 1;
 	}
 	}
@@ -232,7 +225,7 @@ uint8_t pat9125_update_y(void)
 			if (pat9125_PID1 == 0xff) return 0;
 			if (pat9125_PID1 == 0xff) return 0;
 			int16_t iDY = ucYL | ((ucXYH << 8) & 0xf00);
 			int16_t iDY = ucYL | ((ucXYH << 8) & 0xf00);
 			if (iDY & 0x800) iDY -= 4096;
 			if (iDY & 0x800) iDY -= 4096;
-			pat9125_y -= iDY; //negative number, because direction switching does not work
+			pat9125_y += iDY;
 		}
 		}
 		return 1;
 		return 1;
 	}
 	}
@@ -251,7 +244,7 @@ uint8_t pat9125_update_bs(void)
 	return 0;
 	return 0;
 }
 }
 
 
-uint8_t pat9125_rd_reg(uint8_t addr)
+static uint8_t pat9125_rd_reg(uint8_t addr)
 {
 {
 	uint8_t data = 0;
 	uint8_t data = 0;
 #if defined(PAT9125_SWSPI)
 #if defined(PAT9125_SWSPI)
@@ -274,7 +267,7 @@ uint8_t pat9125_rd_reg(uint8_t addr)
     return 0;
     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)
 #if defined(PAT9125_SWSPI)
 	swspi_start();
 	swspi_start();
@@ -296,8 +289,23 @@ void pat9125_wr_reg(uint8_t addr, uint8_t data)
     return;
     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);
 	pat9125_wr_reg(addr, data);
 	return pat9125_rd_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>
 #include <inttypes.h>
 
 
-extern uint8_t pat9125_PID1;
-extern uint8_t pat9125_PID2;
-
 extern int16_t pat9125_x;
 extern int16_t pat9125_x;
 extern int16_t pat9125_y;
 extern int16_t pat9125_y;
 extern uint8_t pat9125_b;
 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(void);    // update all sensor data
 extern uint8_t pat9125_update_y(void);  // update _y only
 extern uint8_t pat9125_update_y(void);  // update _y only
 extern uint8_t pat9125_update_bs(void); // update _b/_s 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->direction_bits |= (1<<E_AXIS); 
   }
   }
 
 
-  block->active_extruder = extruder;
-
   //enable active axes
   //enable active axes
   #ifdef COREXY
   #ifdef COREXY
   if((block->steps_x.wide != 0) || (block->steps_y.wide != 0))
   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
   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
   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 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.
   // 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 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
   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>
 #include <stdint.h>
-#ifndef SOUND_H
-#define SOUND_H
-
 
 
 #define e_SOUND_MODE_NULL 0xFF
 #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;
 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_Echo(void);
 //static void Sound_DoSound_Prompt(void);
 //static void Sound_DoSound_Prompt(void);
-
-#endif // SOUND_H

+ 11 - 47
Firmware/stepper.cpp

@@ -36,12 +36,9 @@
 #include "tmc2130.h"
 #include "tmc2130.h"
 #endif //TMC2130
 #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 "ConfigurationStore.h"
 
 
 #include "Prusa_farm.h"
 #include "Prusa_farm.h"
@@ -457,9 +454,6 @@ FORCE_INLINE void stepper_next_block()
 #endif /* LIN_ADVANCE */
 #endif /* LIN_ADVANCE */
       count_direction[E_AXIS] = 1;
       count_direction[E_AXIS] = 1;
     }
     }
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-    fsensor_st_block_begin(count_direction[E_AXIS] < 0);
-#endif //FILAMENT_SENSOR
   }
   }
   else {
   else {
       _NEXT_ISR(2000); // 1kHz.
       _NEXT_ISR(2000); // 1kHz.
@@ -704,9 +698,9 @@ FORCE_INLINE void stepper_tick_lowres()
 #ifdef LIN_ADVANCE
 #ifdef LIN_ADVANCE
       e_steps += count_direction[E_AXIS];
       e_steps += count_direction[E_AXIS];
 #else
 #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);
       STEP_NC_LO(E_AXIS);
 #endif
 #endif
     }
     }
@@ -766,9 +760,9 @@ FORCE_INLINE void stepper_tick_highres()
 #ifdef LIN_ADVANCE
 #ifdef LIN_ADVANCE
       e_steps += count_direction[E_AXIS];
       e_steps += count_direction[E_AXIS];
 #else
 #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);
       STEP_NC_LO(E_AXIS);
 #endif
 #endif
     }
     }
@@ -963,21 +957,9 @@ FORCE_INLINE void isr() {
 
 
     // If current block is finished, reset pointer
     // If current block is finished, reset pointer
     if (step_events_completed.wide >= current_block->step_event_count.wide) {
     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;
       current_block = NULL;
       plan_discard_current_block();
       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
 #ifdef TMC2130
@@ -1073,19 +1055,11 @@ FORCE_INLINE void advance_isr_scheduler() {
             STEP_NC_HI(E_AXIS);
             STEP_NC_HI(E_AXIS);
             e_steps += (rev? 1: -1);
             e_steps += (rev? 1: -1);
             STEP_NC_LO(E_AXIS);
             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);
         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
     // Schedule the next closest tick, ignoring advance if scheduled too
@@ -1668,13 +1642,3 @@ void microstep_readings()
       #endif
       #endif
 }
 }
 #endif //TMC2130
 #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
   void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention
 #endif
 #endif
 
 
-#if defined(FILAMENT_SENSOR) && defined(PAT9125)
-// reset the internal filament sensor state
-void st_reset_fsensor();
-#endif
-
 #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_ASHF   0x01 //address shift (<< 1)
 #define SWI2C_DMSK   0x7f //device address mask
 #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)
 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();
 		__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);
 	WRITE(SWI2C_SDA, 0);
 	__delay();
 	__delay();
@@ -39,7 +65,7 @@ void swi2c_start(void)
 	__delay();
 	__delay();
 }
 }
 
 
-void swi2c_stop(void)
+static void swi2c_stop(void)
 {
 {
 	WRITE(SWI2C_SCL, 1);
 	WRITE(SWI2C_SCL, 1);
 	__delay();
 	__delay();
@@ -47,7 +73,8 @@ void swi2c_stop(void)
 	__delay();
 	__delay();
 }
 }
 
 
-void swi2c_ack(void)
+/*
+static void swi2c_ack(void)
 {
 {
 	WRITE(SWI2C_SDA, 0);
 	WRITE(SWI2C_SDA, 0);
 	__delay();
 	__delay();
@@ -56,8 +83,19 @@ void swi2c_ack(void)
 	WRITE(SWI2C_SCL, 0);
 	WRITE(SWI2C_SCL, 0);
 	__delay();
 	__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);
 	SET_INPUT(SWI2C_SDA);
 	__delay();
 	__delay();
@@ -77,13 +115,13 @@ uint8_t swi2c_wait_ack()
 	return ack;
 	return ack;
 }
 }
 
 
-uint8_t swi2c_read(void)
+static uint8_t swi2c_read(void)
 {
 {
 	WRITE(SWI2C_SDA, 1);
 	WRITE(SWI2C_SDA, 1);
 	__delay();
 	__delay();
 	SET_INPUT(SWI2C_SDA);
 	SET_INPUT(SWI2C_SDA);
 	uint8_t data = 0;
 	uint8_t data = 0;
-	int8_t bit; for (bit = 7; bit >= 0; bit--)
+	for (uint8_t bit = 8; bit-- > 0;)
 	{
 	{
 		WRITE(SWI2C_SCL, 1);
 		WRITE(SWI2C_SCL, 1);
 		__delay();
 		__delay();
@@ -95,9 +133,9 @@ uint8_t swi2c_read(void)
 	return data;
 	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));
 		WRITE(SWI2C_SDA, data & _BV(bit));
 		__delay();
 		__delay();
@@ -112,9 +150,9 @@ uint8_t swi2c_check(uint8_t dev_addr)
 {
 {
 	swi2c_start();
 	swi2c_start();
 	swi2c_write((dev_addr & SWI2C_DMSK) << SWI2C_ASHF);
 	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();
 	swi2c_stop();
-	return 1;
+	return 0;
 }
 }
 
 
 #ifdef SWI2C_A8 //8bit address
 #ifdef SWI2C_A8 //8bit address

+ 3 - 0
Firmware/swi2c.h

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

+ 1 - 1
Firmware/temp_model.h

@@ -5,7 +5,7 @@
 
 
 #include "planner.h"
 #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 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_fS = 0.065;       // simulation filter (1st-order IIR factor)
 constexpr float TEMP_MODEL_fE = 0.05;        // error 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"
 #include "temp_model.h"
 #endif
 #endif
 
 
+#include "Filament_sensor.h"
+
 //===========================================================================
 //===========================================================================
 //=============================public variables============================
 //=============================public variables============================
 //===========================================================================
 //===========================================================================
@@ -123,10 +125,6 @@ int current_voltage_raw_pwr = 0;
 int current_voltage_raw_bed = 0;
 int current_voltage_raw_bed = 0;
 #endif
 #endif
 
 
-#ifdef IR_SENSOR_ANALOG
-uint16_t current_voltage_raw_IR = 0;
-#endif //IR_SENSOR_ANALOG
-
 int current_temperature_bed_raw = 0;
 int current_temperature_bed_raw = 0;
 float current_temperature_bed = 0.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
     int curTodo=babystepsTodo[axis]; //get rid of volatile for performance
 
 
     if(curTodo>0)
     if(curTodo>0)
-    {
+{
       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
         babystep(axis,/*fwd*/true);
         babystep(axis,/*fwd*/true);
         babystepsTodo[axis]--; //less to do next time
         babystepsTodo[axis]--; //less to do next time

+ 37 - 1
Firmware/twi.cpp

@@ -21,6 +21,7 @@
 
 
 
 
 #include <math.h>
 #include <math.h>
+#include <util/delay.h>
 #include "config.h"
 #include "config.h"
 #include "fastio.h"
 #include "fastio.h"
 #include "twi.h"
 #include "twi.h"
@@ -29,8 +30,24 @@
 
 
 void twi_init(void)
 void twi_init(void)
 {
 {
-  // activate internal pullups for twi.
+  // activate internal pullups for SDA
+  SET_INPUT(SDA_PIN);
   WRITE(SDA_PIN, 1);
   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);
   WRITE(SCL_PIN, 1);
 
 
   // initialize twi prescaler and bit rate
   // 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)
 uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data)
 {
 {
   if(twi_start(address, reg))
   if(twi_start(address, reg))

+ 9 - 1
Firmware/twi.h

@@ -26,7 +26,7 @@
 #define TWI_FREQ 400000L
 #define TWI_FREQ 400000L
 #endif
 #endif
 
 
-#define TWI_TIMEOUT_MS 100
+#define TWI_TIMEOUT_MS 10
 
 
 /*
 /*
  * Function twi_init
  * Function twi_init
@@ -44,6 +44,14 @@ void twi_init(void);
  */
  */
 void twi_disable(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
  * Function twi_r8
  * Desc     read a single byte from a device
  * 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_txcomplete (UCSR2A & (1 << TXC2))
 #define uart2_txready    (UCSR2A & (1 << UDRE2))
 #define uart2_txready    (UCSR2A & (1 << UDRE2))
 
 
-uint8_t uart2_ibuf[14] = {0, 0};
+uint8_t uart2_ibuf[20] = {0, 0};
 
 
 FILE _uart2io = {0};
 FILE _uart2io = {0};
 
 
@@ -33,13 +33,13 @@ int uart2_getchar(_UNUSED FILE *stream)
 }
 }
 
 
 //uart init (io + FILE stream)
 //uart init (io + FILE stream)
-void uart2_init(void)
+void uart2_init(uint32_t baudRate)
 {
 {
 	DDRH &=	~0x01;
 	DDRH &=	~0x01;
 	PORTH |= 0x01;
 	PORTH |= 0x01;
 	rbuf_ini(uart2_ibuf, sizeof(uart2_ibuf) - 4);
 	rbuf_ini(uart2_ibuf, sizeof(uart2_ibuf) - 4);
 	UCSR2A |= (1 << U2X2); // baudrate multiplier
 	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 << RXEN2) | (1 << TXEN2); // enable receiver and transmitter
 	UCSR2B |= (1 << RXCIE2); // enable rx interrupt
 	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
 	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)
 #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);
 extern int8_t uart2_rx_str_P(const char* str);
 
 

+ 626 - 649
Firmware/ultralcd.cpp

@@ -6,7 +6,6 @@
 #include "temperature.h"
 #include "temperature.h"
 #include "ultralcd.h"
 #include "ultralcd.h"
 #include "conv2str.h"
 #include "conv2str.h"
-#include "fsensor.h"
 #include "Marlin.h"
 #include "Marlin.h"
 #include "language.h"
 #include "language.h"
 #include "cardreader.h"
 #include "cardreader.h"
@@ -29,10 +28,7 @@
 //#include "Configuration.h"
 //#include "Configuration.h"
 #include "cmdqueue.h"
 #include "cmdqueue.h"
 
 
-#ifdef FILAMENT_SENSOR
-#include "pat9125.h"
-#include "fsensor.h"
-#endif //FILAMENT_SENSOR
+#include "Filament_sensor.h"
 
 
 #ifdef TMC2130
 #ifdef TMC2130
 #include "tmc2130.h"
 #include "tmc2130.h"
@@ -40,12 +36,12 @@
 
 
 #include "sound.h"
 #include "sound.h"
 
 
-#include "mmu.h"
+#include "mmu2.h"
+#include "SpoolJoin.h"
 
 
 #include "static_assert.h"
 #include "static_assert.h"
 #include "first_lay_cal.h"
 #include "first_lay_cal.h"
 
 
-#include "fsensor.h"
 #include "adc.h"
 #include "adc.h"
 #include "config.h"
 #include "config.h"
 
 
@@ -70,10 +66,6 @@ uint8_t SilentModeMenu_MMU = 1; //activate mmu unit stealth mode
 
 
 int8_t FSensorStateMenu = 1;
 int8_t FSensorStateMenu = 1;
 
 
-#ifdef IR_SENSOR_ANALOG
-bool bMenuFSDetect=false;
-#endif //IR_SENSOR_ANALOG
-
 LcdCommands lcd_commands_type = LcdCommands::Idle;
 LcdCommands lcd_commands_type = LcdCommands::Idle;
 static uint8_t lcd_commands_step = 0;
 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 ShortTimer display_time; //just timer for showing pid finished message on lcd;
 static uint16_t pid_temp = DEFAULT_PID_TEMP;
 static uint16_t pid_temp = DEFAULT_PID_TEMP;
 
 
-static bool forceMenuExpire = false;
-static bool lcd_autoDeplete;
-
-
 static float manual_feedrate[] = MANUAL_FEEDRATE;
 static float manual_feedrate[] = MANUAL_FEEDRATE;
 
 
 /* LCD message status */
 /* LCD message status */
@@ -104,7 +92,7 @@ static const char separator[] PROGMEM = "--------------------";
 
 
 /** forward declarations **/
 /** 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_i();
 // void copy_and_scalePID_d();
 // void copy_and_scalePID_d();
 
 
@@ -134,6 +122,7 @@ static void lcd_v2_calibration();
 
 
 static void mmu_fil_eject_menu();
 static void mmu_fil_eject_menu();
 static void mmu_load_to_nozzle_menu();
 static void mmu_load_to_nozzle_menu();
+static void mmu_load_to_extruder_menu();
 static void preheat_or_continue();
 static void preheat_or_continue();
 
 
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
@@ -221,14 +210,18 @@ enum class FanCheck : uint_least8_t {
 static FanCheck lcd_selftest_fan_auto(uint8_t _fan);
 static FanCheck lcd_selftest_fan_auto(uint8_t _fan);
 #endif //FANCHECK
 #endif //FANCHECK
 
 
-#ifdef PAT9125
+#ifdef FILAMENT_SENSOR
+#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 static bool lcd_selftest_fsensor();
 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();
 static bool selftest_irsensor();
-#ifdef IR_SENSOR_ANALOG
 static bool lcd_selftest_IRsensor(bool bStandalone=false);
 static bool lcd_selftest_IRsensor(bool bStandalone=false);
 static void lcd_detect_IRsensor();
 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_selftest_error(TestError error, const char *_error_1, const char *_error_2);
 static void lcd_colorprint_change();
 static void lcd_colorprint_change();
 
 
@@ -452,19 +445,34 @@ void lcdui_print_percent_done(void)
 }
 }
 
 
 // Print extruder status (5 chars total)
 // 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)
 // Print farm number (5 chars total)
@@ -549,8 +557,7 @@ void lcdui_print_time(void)
 }
 }
 
 
 //! @Brief Print status line on status screen
 //! @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
     if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating
         heating_status_counter++;
         heating_status_counter++;
         if (heating_status_counter > 13) {
         if (heating_status_counter > 13) {
@@ -622,17 +629,16 @@ void lcdui_print_status_line(void)
                 lcd_space(LCD_WIDTH);
                 lcd_space(LCD_WIDTH);
                 lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO));
                 lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO));
                 lcd_puts_P(PSTR(" : "));
                 lcd_puts_P(PSTR(" : "));
-                lcd_print(custom_message_state-10);
+                lcd_print(custom_message_state - 10);
             } else {
             } else {
-                if (custom_message_state == 3)
-                {
+                if (custom_message_state == 3) {
                     lcd_setstatuspgm(MSG_WELCOME);
                     lcd_setstatuspgm(MSG_WELCOME);
                     custom_message_type = CustomMsg::Status;
                     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_set_cursor(0, 3);
                     lcd_space(19);
                     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--;
                     custom_message_state--;
                 }
                 }
             }
             }
@@ -653,17 +659,21 @@ void lcdui_print_status_line(void)
             lcd_set_cursor(0, 3);
             lcd_set_cursor(0, 3);
             lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state);
             lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state);
             break;
             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) {
             if (custom_message_state <= PINDA_HEAT_T) {
                 lcd_puts_P(PSTR(": "));
                 lcd_puts_P(PSTR(": "));
-                lcd_print(custom_message_state); //seconds
+                lcd_print(custom_message_state); // seconds
                 lcd_print(' ');
                 lcd_print(' ');
             }
             }
             break;
             break;
-        case CustomMsg::Resuming: //Resuming
+        case CustomMsg::Resuming: // Resuming
             lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
             lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
             break;
             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)
 	//Print SD status (7 chars)
 	lcdui_print_percent_done();
 	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
 #ifdef CMD_DIAGNOSTICS
     //Print cmd queue diagnostics (8chars)
     //Print cmd queue diagnostics (8chars)
@@ -942,9 +953,9 @@ void lcd_commands()
                 enquecommand_P(PSTR("M140 S0")); // turn off heatbed
                 enquecommand_P(PSTR("M140 S0")); // turn off heatbed
                 enquecommand_P(PSTR("G1 Z10 F1300.000")); //lift Z
                 enquecommand_P(PSTR("G1 Z10 F1300.000")); //lift Z
                 enquecommand_P(PSTR("G1 X10 Y180 F4000")); //Go to parking position
                 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
                 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;
                 lcd_commands_step = 1;
                 break;
                 break;
             case 1:
             case 1:
@@ -1117,7 +1128,6 @@ static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize
 //! |                    |
 //! |                    |
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @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()")
 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
 //! @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()
 static void lcd_menu_fails_stats_mmu_print()
 {
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	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.
 //! @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()
 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_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_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)
 #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
 //! | Crash   X:000 Y:000|	MSG_CRASH c=7
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @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()
 static void lcd_menu_fails_stats_total()
 {
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	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
 //! | Crash   X 000 Y 000|	MSG_CRASH c=7
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @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()
 static void lcd_menu_fails_stats_print()
 {
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	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 crashX = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_X);
     uint8_t crashY = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y);
     uint8_t crashY = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y);
     lcd_home();
     lcd_home();
-#ifndef PAT9125
     lcd_printf_P(failStatsFmt,
     lcd_printf_P(failStatsFmt,
         _T(MSG_LAST_PRINT_FAILURES),
         _T(MSG_LAST_PRINT_FAILURES),
         _T(MSG_POWER_FAILURES), power,
         _T(MSG_POWER_FAILURES), power,
         _T(MSG_FIL_RUNOUTS), filam,
         _T(MSG_FIL_RUNOUTS), filam,
         _T(MSG_CRASH), crashX, crashY);
         _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();
     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
 //! | Fil. runouts    000|	MSG_FIL_RUNOUTS c=15
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @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()
 static void lcd_menu_fails_stats()
 {
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	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
 //! D - Degree sysmbol		LCD_STR_DEGREE
 //! @endcode
 //! @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()
 static void lcd_menu_temperatures()
 {
 {
     lcd_timeoutToStatus.stop(); //infinite timeout
     lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1410,7 +1403,7 @@ static void lcd_menu_temperatures()
     menu_back_if_clicked();
     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_R1 10000
 #define VOLT_DIV_R2 2370
 #define VOLT_DIV_R2 2370
 #define VOLT_DIV_FAC ((float)VOLT_DIV_R2 / (VOLT_DIV_R2 + VOLT_DIV_R1))
 #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
 //! | IR :         00.0V |  c=12 optional
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @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()
 static void lcd_menu_voltages()
 {
 {
     lcd_timeoutToStatus.stop(); //infinite timeout
     lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1434,7 +1426,7 @@ static void lcd_menu_voltages()
     lcd_home();
     lcd_home();
     lcd_printf_P(PSTR(" PWR:      %4.1fV\n" " BED:      %4.1fV"), volt_pwr, volt_bed);
     lcd_printf_P(PSTR(" PWR:      %4.1fV\n" " BED:      %4.1fV"), volt_pwr, volt_bed);
 #ifdef IR_SENSOR_ANALOG
 #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
 #endif //IR_SENSOR_ANALOG
     menu_back_if_clicked();
     menu_back_if_clicked();
 }
 }
@@ -1451,7 +1443,6 @@ static void lcd_menu_voltages()
 //! |                    |
 //! |                    |
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @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()
 static void lcd_menu_belt_status()
 {
 {
 	lcd_home();
 	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(_i("Date:"));////MSG_DATE c=17
   MENU_ITEM_BACK_P(PSTR(__DATE__));
   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(STR_SEPARATOR);
   MENU_ITEM_BACK_P(PSTR("Fil. sensor v.:"));
   MENU_ITEM_BACK_P(PSTR("Fil. sensor v.:"));
-  MENU_ITEM_BACK_P(FsensorIRVersionText());
+  MENU_ITEM_BACK_P(fsensor.getIRVersionText());
 #endif // IR_SENSOR_ANALOG
 #endif // IR_SENSOR_ANALOG
 
 
 	MENU_ITEM_BACK_P(STR_SEPARATOR);
 	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(_i("MMU2 connected"));  ////MSG_MMU_CONNECTED c=18
 		MENU_ITEM_BACK_P(PSTR(" FW:"));  ////c=17
 		MENU_ITEM_BACK_P(PSTR(" FW:"));  ////c=17
 		if (((menu_item - 1) == menu_line) && lcd_draw_update)
 		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
 			else
 				lcd_puts_P(_i("unknown"));  ////MSG_UNKNOWN c=13
 				lcd_puts_P(_i("unknown"));  ////MSG_UNKNOWN c=13
 		}
 		}
@@ -1784,7 +1776,7 @@ void lcd_cutter_enabled()
 #endif //MMU_HAS_CUTTER
 #endif //MMU_HAS_CUTTER
 
 
 void lcd_set_filament_autoload() {
 void lcd_set_filament_autoload() {
-     fsensor_autoload_set(!fsensor_autoload_enabled);
+     fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled());
 }
 }
 
 
 #if defined(FILAMENT_SENSOR) && defined(PAT9125)
 #if defined(FILAMENT_SENSOR) && defined(PAT9125)
@@ -1813,6 +1805,7 @@ switch(eFilamentAction)
      case FilamentAction::Load:
      case FilamentAction::Load:
      case FilamentAction::AutoLoad:
      case FilamentAction::AutoLoad:
      case FilamentAction::MmuLoad:
      case FilamentAction::MmuLoad:
+     case FilamentAction::MmuLoadExtruder:
           lcd_puts_P(_i("to load filament"));     ////MSG_TO_LOAD_FIL c=20
           lcd_puts_P(_i("to load filament"));     ////MSG_TO_LOAD_FIL c=20
           break;
           break;
      case FilamentAction::UnLoad:
      case FilamentAction::UnLoad:
@@ -1826,8 +1819,12 @@ switch(eFilamentAction)
      case FilamentAction::Lay1Cal:
      case FilamentAction::Lay1Cal:
           break;
           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;
      nLevel=2;
      if(!bFilamentPreheatState)
      if(!bFilamentPreheatState)
           {
           {
@@ -1848,6 +1845,7 @@ if(lcd_clicked())
                enquecommand_P(PSTR("M702"));      // unload filament
                enquecommand_P(PSTR("M702"));      // unload filament
                break;
                break;
           case FilamentAction::MmuLoad:
           case FilamentAction::MmuLoad:
+          case FilamentAction::MmuLoadExtruder:
           case FilamentAction::MmuUnLoad:
           case FilamentAction::MmuUnLoad:
           case FilamentAction::MmuEject:
           case FilamentAction::MmuEject:
           case FilamentAction::MmuCut:
           case FilamentAction::MmuCut:
@@ -1919,11 +1917,17 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed)
             menu_back(nLevel);
             menu_back(nLevel);
             menu_submenu(mmu_load_to_nozzle_menu);
             menu_submenu(mmu_load_to_nozzle_menu);
             break;
             break;
+        case FilamentAction::MmuLoadExtruder:
+            nLevel = bFilamentPreheatState ? 1 : 2;
+            bFilamentAction = true;
+            menu_back(nLevel);
+            menu_submenu(mmu_load_to_extruder_menu);
+            break;
         case FilamentAction::MmuUnLoad:
         case FilamentAction::MmuUnLoad:
             nLevel = bFilamentPreheatState ? 1 : 2;
             nLevel = bFilamentPreheatState ? 1 : 2;
             bFilamentAction = true;
             bFilamentAction = true;
             menu_back(nLevel);
             menu_back(nLevel);
-            extr_unload();
+            MMU2::mmu2.unload();
             break;
             break;
         case FilamentAction::MmuEject:
         case FilamentAction::MmuEject:
             nLevel = bFilamentPreheatState ? 1 : 2;
             nLevel = bFilamentPreheatState ? 1 : 2;
@@ -1973,6 +1977,7 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed)
             case FilamentAction::Load:
             case FilamentAction::Load:
             case FilamentAction::AutoLoad:
             case FilamentAction::AutoLoad:
             case FilamentAction::MmuLoad:
             case FilamentAction::MmuLoad:
+            case FilamentAction::MmuLoadExtruder:
                 lcd_puts_P(_i("Preheating to load")); ////MSG_PREHEATING_TO_LOAD c=20
                 lcd_puts_P(_i("Preheating to load")); ////MSG_PREHEATING_TO_LOAD c=20
                 if (once) raise_z_above(MIN_Z_FOR_LOAD);
                 if (once) raise_z_above(MIN_Z_FOR_LOAD);
                 break;
                 break;
@@ -2150,8 +2155,11 @@ void lcd_wait_interact() {
   lcd_clear();
   lcd_clear();
 
 
   lcd_puts_at_P(0, 1, _i("Insert filament"));////MSG_INSERT_FILAMENT c=20
   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()
 void show_preheat_nozzle_warning()
@@ -2284,33 +2279,29 @@ void show_preheat_nozzle_warning()
 
 
 void lcd_load_filament_color_check()
 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();
 		load_filament_final_feed();
 		st_synchronize();
 		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
 #ifdef FILAMENT_SENSOR
 static void lcd_menu_AutoLoadFilament()
 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
 #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;
         bFilamentPreheatState = true;
         mFilamentItem(target_temperature[0], target_temperature_bed);
         mFilamentItem(target_temperature[0], target_temperature_bed);
+    } else {
+        lcd_generic_preheat_menu();
     }
     }
-    else lcd_generic_preheat_menu();
 }
 }
 
 
 static void lcd_LoadFilament()
 static void lcd_LoadFilament()
@@ -2343,7 +2334,6 @@ static void lcd_LoadFilament()
 //! |        00d 00h 00m |
 //! |        00d 00h 00m |
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @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()
 void lcd_menu_statistics()
 {
 {
     lcd_timeoutToStatus.stop(); //infinite timeout
     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.
         // 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;
             goto canceled;
-        else if (result == 1)
+        else if (result == LCD_MIDDLE_BUTTON_CHOICE)
             goto calibrated;
             goto calibrated;
         // otherwise perform another round of the Z up dialog.
         // 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
  * This function is non-blocking
  * @param msg message to be displayed from PROGMEM
  * @param msg message to be displayed from PROGMEM
- * @param nlines
  * @return rest of the text (to be displayed on next page)
  * @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);
     lcd_set_cursor(0, 0);
     const char *msgend = msg;
     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]);
         lcd_print(LCD_STR_ARROW_2_DOWN[0]);
     }
     }
 
 
-    nlines = row;
     return multi_screen ? msgend : NULL;
     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.
     // Disable update of the screen by the usual lcd_update(0) routine.
     lcd_update_enable(false);
     lcd_update_enable(false);
     lcd_clear();
     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
 //! @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 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 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
 //! @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 first_choice text caption of first possible choice
 //! @param second_choice text caption of second 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_set_cursor(0, 3);
-    lcd_print(first_selected? '>': ' ');
+    lcd_print(selected == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
     lcd_puts_P(first_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
 //! @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 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 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
     // 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
 //! @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 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
 //! @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 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 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
 //! @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)
 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;
 	uint8_t idler_state = STATE_NA;
 
 
 	pinda_state = READ(Z_MIN_PIN);
 	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_puts_at_P(0, 0, MSG_PINDA);
 	lcd_set_cursor(LCD_WIDTH - 14, 0);
 	lcd_set_cursor(LCD_WIDTH - 14, 0);
 	lcd_print_state(pinda_state);
 	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_puts_at_P(10, 0, _n("FINDA"));////MSG_FINDA c=5
 		lcd_set_cursor(LCD_WIDTH - 3, 0);
 		lcd_set_cursor(LCD_WIDTH - 3, 0);
 		lcd_print_state(finda_state);
 		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
     // Display Light intensity from Filament sensor
     //  Frame_Avg register represents the average brightness of all pixels within a frame (324 pixels). This
     //  Frame_Avg register represents the average brightness of all pixels within a frame (324 pixels). This
     //  value ranges from 0(darkest) to 255(brightest).
     //  value ranges from 0(darkest) to 255(brightest).
     // Display LASER shutter time from Filament sensor
     // 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
     //  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()")
 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
 #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)
 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);
 	else menu_goto(lcd_settings_menu, 9, true, true);
 }
 }
 #endif //TMC2130
 #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)
 #if (LANG_MODE != 0)
 
 
@@ -3660,7 +3623,7 @@ void menu_setlang(unsigned char lang)
 {
 {
 	if (!lang_select(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);
 			lang_boot_update_start(lang);
 		lcd_update_enable(true);
 		lcd_update_enable(true);
 		lcd_clear();
 		lcd_clear();
@@ -3828,7 +3791,7 @@ void lcd_first_layer_calibration_reset()
 
 
 void lcd_v2_calibration()
 void lcd_v2_calibration()
 {
 {
-	if (mmu_enabled)
+	if (MMU2::mmu2.Enabled())
 	{
 	{
 	    const uint8_t filament = choose_menu_P(
 	    const uint8_t filament = choose_menu_P(
             _T(MSG_SELECT_FILAMENT),
             _T(MSG_SELECT_FILAMENT),
@@ -3843,16 +3806,17 @@ void lcd_v2_calibration()
 	        return;
 	        return;
 	    }
 	    }
 	}
 	}
+#ifdef FILAMENT_SENSOR
 	else if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
 	else if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
 	{
 	{
 	    bool loaded = false;
 	    bool loaded = false;
-	    if (fsensor_enabled && ir_sensor_detected)
+	    if (fsensor.isReady())
 	    {
 	    {
-	        loaded = !READ(IR_SENSOR_PIN);
+	        loaded = fsensor.getFilamentPresent();
 	    }
 	    }
 	    else
 	    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;
 	        lcd_update_enabled = true;
 
 
 	    }
 	    }
@@ -3873,6 +3837,7 @@ void lcd_v2_calibration()
 			return;
 			return;
 		}
 		}
 	}
 	}
+#endif //FILAMENT_SENSOR
 
 
 	eFilamentAction = FilamentAction::Lay1Cal;
 	eFilamentAction = FilamentAction::Lay1Cal;
 	menu_goto(lcd_generic_preheat_menu, 0, true, true);
 	menu_goto(lcd_generic_preheat_menu, 0, true, true);
@@ -3881,7 +3846,7 @@ void lcd_v2_calibration()
 void lcd_wizard() {
 void lcd_wizard() {
 	bool result = true;
 	bool result = true;
 	if (calibration_status() != CALIBRATION_STATUS_ASSEMBLED) {
 	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) {
 	if (result) {
 		calibration_status_store(CALIBRATION_STATUS_ASSEMBLED);
 		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)
 static void wizard_lay1cal_message(bool cold)
 {
 {
     lcd_show_fullscreen_message_and_wait_P(
     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
             _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(
         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
                 _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;
     using S = WizState;
 	bool end = false;
 	bool end = false;
-	int8_t wizard_event;
+	uint8_t wizard_event;
 	const char *msg = NULL;
 	const char *msg = NULL;
 	// Make sure EEPROM_WIZARD_ACTIVE is true if entering using different entry point
 	// Make sure EEPROM_WIZARD_ACTIVE is true if entering using different entry point
 	// other than WizState::Run - it is useful for debugging wizard.
 	// 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));
 				lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING));
 				state = S::Restore;
 				state = S::Restore;
 			} else {
 			} 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;
 					state = S::Restore;
 					eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);
 					eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);
-				} else {
+				} else { // MIDDLE_BUTTON_CHOICE
 					eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0);
 					eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0);
 					end = true;
 					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("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("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
 			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);
 			wizard_event = gcode_M45(true, 0);
 			if (wizard_event) {
 			if (wizard_event) {
 				//current filament needs to be unloaded and then new filament should be loaded
 				//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
 				lcd_display_message_fullscreen_P(_i("Now I will preheat nozzle for PLA.")); ////MSG_WIZARD_WILL_PREHEAT c=20 r=4
 				wait_preheat();
 				wait_preheat();
 				//unload current filament
 				//unload current filament
-				unload_filament(true);
+				unload_filament(FILAMENTCHANGE_FINALRETRACT, true);
 				//load filament
 				//load filament
 				lcd_wizard_load();
 				lcd_wizard_load();
 				setTargetHotend(0, 0); //we are finished, cooldown nozzle
 				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
 		    //start to preheat nozzle and bed to save some time later
 			setTargetHotend(PLA_PREHEAT_HOTEND_TEMP, 0);
 			setTargetHotend(PLA_PREHEAT_HOTEND_TEMP, 0);
 			setTargetBed(PLA_PREHEAT_HPB_TEMP);
 			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;
 			    else state = S::Preheat;
 			}
 			}
 			break;
 			break;
@@ -4143,7 +4097,7 @@ void lcd_wizard(WizState state)
             break;
             break;
 		case S::RepeatLay1Cal:
 		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
 			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
 				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;
 				state = S::Lay1CalCold;
@@ -4217,86 +4171,103 @@ void lcd_settings_linearity_correction_menu(void)
 #endif // TMC2130
 #endif // TMC2130
 
 
 #ifdef FILAMENT_SENSOR
 #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\
 do\
 {\
 {\
-    settingsAutoDeplete();\
+    settingsSpoolJoin();\
 }\
 }\
 while(0)\
 while(0)\
 
 
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
 static void settingsCutter()
 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))
         if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
         {
         {
@@ -4325,6 +4296,25 @@ while(0)
 #define SETTINGS_CUTTER
 #define SETTINGS_CUTTER
 #endif //MMU_HAS_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
 #ifdef TMC2130
 #define SETTINGS_SILENT_MODE \
 #define SETTINGS_SILENT_MODE \
 do\
 do\
@@ -4376,7 +4366,7 @@ while (0)
 #define SETTINGS_MMU_MODE \
 #define SETTINGS_MMU_MODE \
 do\
 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);\
 		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);\
 		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();
 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>
 template <uint8_t number>
 static void select_sheet_menu()
 static void select_sheet_menu()
 {
 {
@@ -4764,11 +4719,10 @@ void lcd_hw_setup_menu(void)                      // can not be "static"
     SETTINGS_NOZZLE;
     SETTINGS_NOZZLE;
     MENU_ITEM_SUBMENU_P(_i("Checks"), lcd_checking_menu);  ////MSG_CHECKS c=18
     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.
     //! 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
     //! @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
 #endif //IR_SENSOR_ANALOG
 
 
     if (_md->experimental_menu_visibility)
     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
 	    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;
 	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);
 	MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check);
 
 
 	SETTINGS_SILENT_MODE;
 	SETTINGS_SILENT_MODE;
@@ -4928,7 +4891,7 @@ static void lcd_calibration_menu()
 //!
 //!
 //! Create list of items with header. Header can not be selected.
 //! Create list of items with header. Header can not be selected.
 //! Each item has text description passed by function parameter and
 //! 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.
 //! 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.
 //! 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)
 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
     //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;
     const uint8_t item_len = item?strlen_P(item):0;
 	int8_t first = 0;
 	int8_t first = 0;
 	int8_t enc_dif = lcd_encoder_diff;
 	int8_t enc_dif = lcd_encoder_diff;
@@ -5100,8 +5063,8 @@ char reset_menu() {
 
 
 static void lcd_disable_farm_mode()
 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"));
 		enquecommand_P(PSTR("G99"));
 		lcd_return_to_status();
 		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_BEGIN();
     MENU_ITEM_BACK_P(_T(MSG_MAIN));
     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++)
     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();
     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_BEGIN();
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
         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();
         MENU_END();
-    }
-    else
-    {
+    } else {
         eFilamentAction = FilamentAction::MmuLoad;
         eFilamentAction = FilamentAction::MmuLoad;
         preheat_or_continue();
         preheat_or_continue();
     }
     }
 }
 }
 
 
-static void mmu_eject_filament(uint8_t filament)
-{
+static void mmu_eject_filament(uint8_t filament) {
     menu_back();
     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_BEGIN();
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
         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_ITEM_FUNCTION_NR_P(_T(MSG_EJECT_FILAMENT), i + '1', mmu_eject_filament, i); ////MSG_EJECT_FILAMENT c=16
         MENU_END();
         MENU_END();
-    }
-    else
-    {
+    } else {
         eFilamentAction = FilamentAction::MmuEject;
         eFilamentAction = FilamentAction::MmuEject;
         preheat_or_continue();
         preheat_or_continue();
     }
     }
 }
 }
 
 
 #ifdef MMU_HAS_CUTTER
 #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_BEGIN();
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
         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();
         MENU_END();
-    }
-    else
-    {
+    } else {
         eFilamentAction=FilamentAction::MmuCut;
         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
 #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)
 // unload filament for single material printer (used in M702 gcode)
 // @param automatic: If true, unload_filament is part of a unload+load sequence (M600)
 // @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;
 	custom_message_type = CustomMsg::FilamentLoading;
 	lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT));
 	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));
 	lcd_display_message_fullscreen_P(_T(MSG_PULL_OUT_FILAMENT));
 
 
@@ -5232,6 +5232,7 @@ void unload_filament(bool automatic)
 	lcd_setstatuspgm(MSG_WELCOME);
 	lcd_setstatuspgm(MSG_WELCOME);
 	custom_message_type = CustomMsg::Status;
 	custom_message_type = CustomMsg::Status;
 
 
+	eFilamentAction = FilamentAction::None;
 }
 }
 
 
 #include "xflash.h"
 #include "xflash.h"
@@ -5535,14 +5536,14 @@ static void lcd_main_menu()
                 MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu);
                 MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu);
             }
             }
 #if SDCARDDETECT < 1
 #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
 #endif //SDCARDDETECT
         }
         }
     } else {
     } else {
         bMain=true;                                   // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
         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
 #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 //SDCARDDETECT
     }
     }
 #endif //SDSUPPORT
 #endif //SDSUPPORT
@@ -5558,18 +5559,22 @@ static void lcd_main_menu()
     }
     }
 
 
     if ( ! ( IS_SD_PRINTING || usb_timer.running() || (lcd_commands_type == LcdCommands::Layer1Cal) ) ) {
     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_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(_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_UNLOAD_FILAMENT), mmu_unload_filament);
             MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FILAMENT), mmu_fil_eject_menu);
             MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FILAMENT), mmu_fil_eject_menu);
 #ifdef  MMU_HAS_CUTTER
 #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
 #endif //MMU_HAS_CUTTER
         } else {
         } else {
 #ifdef FILAMENT_SENSOR
 #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
                 MENU_ITEM_SUBMENU_P(_i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=18
+            }
             else
             else
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
             {
             {
@@ -5588,7 +5593,7 @@ static void lcd_main_menu()
 #if defined(TMC2130) || defined(FILAMENT_SENSOR)
 #if defined(TMC2130) || defined(FILAMENT_SENSOR)
     MENU_ITEM_SUBMENU_P(_i("Fail stats"), lcd_menu_fails_stats);////MSG_FAIL_STATS c=18
     MENU_ITEM_SUBMENU_P(_i("Fail stats"), lcd_menu_fails_stats);////MSG_FAIL_STATS c=18
 #endif
 #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("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
     MENU_ITEM_SUBMENU_P(_i("Support"), lcd_support_menu);////MSG_SUPPORT c=18
@@ -5731,25 +5736,10 @@ static void lcd_tune_menu()
 #endif
 #endif
 
 
 #ifdef FILAMENT_SENSOR
 #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
 #endif //FILAMENT_SENSOR
 
 
-	SETTINGS_AUTO_DEPLETE;
+	SETTINGS_SPOOLJOIN;
 
 
 	SETTINGS_CUTTER;
 	SETTINGS_CUTTER;
 
 
@@ -5933,7 +5923,7 @@ void print_stop()
     save_statistics(total_filament_used, t);
     save_statistics(total_filament_used, t);
 
 
     // lift Z
     // lift Z
-    raise_z_above(current_position[Z_AXIS] + 10, true);
+    raise_z(10);
 
 
     // if axis are homed, move to parking position.
     // if axis are homed, move to parking position.
     if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
     if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
@@ -5952,7 +5942,18 @@ void print_stop()
         fanSpeed = 0;
         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
     finishAndDisableSteppers(); //M84
     axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
     axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
 }
 }
@@ -6201,49 +6202,48 @@ void lcd_belttest()
 }
 }
 #endif //TMC2130
 #endif //TMC2130
 
 
-#ifdef IR_SENSOR_ANALOG
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 // called also from marlin_main.cpp
 // called also from marlin_main.cpp
 void printf_IRSensorAnalogBoardChange(){
 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)
 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) );
     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)
         if(!bStandalone)
             lcd_selftest_error(TestError::FsensorLevel,"HIGH","");
             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
     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));
     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)
         if(!bStandalone)
             lcd_selftest_error(TestError::FsensorLevel,"LOW","");
             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();
         printf_IRSensorAnalogBoardChange();
-        eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_PCB,(uint8_t)oFsensorPCB);
     }
     }
-    return(true);
+    return true;
 }
 }
 
 
 static void lcd_detect_IRsensor(){
 static void lcd_detect_IRsensor(){
     bool bAction;
     bool bAction;
     bool loaded;
     bool loaded;
-    bMenuFSDetect = true;                               // inhibits some code inside "manage_inactivity()"
     /// Check if filament is loaded. If it is loaded stop detection.
     /// Check if filament is loaded. If it is loaded stop detection.
     /// @todo Add autodetection with MMU2s
     /// @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
         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;
         return;
     } else {
     } else {
@@ -6252,13 +6252,10 @@ static void lcd_detect_IRsensor(){
     }
     }
     if(bAction){
     if(bAction){
         lcd_show_fullscreen_message_and_wait_P(_i("Sensor verified, remove the filament now."));////MSG_FS_VERIFIED c=20 r=3
         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 {
     } else {
         lcd_show_fullscreen_message_and_wait_P(_i("Verification failed, remove the filament and try again."));////MSG_FIL_FAILED c=20 r=5
         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
 #endif //IR_SENSOR_ANALOG
 
 
@@ -6272,19 +6269,19 @@ bool lcd_selftest()
 	uint8_t _progress = 0;
 	uint8_t _progress = 0;
 	bool _result = true;
 	bool _result = true;
 	bool _swapped_fan = false;
 	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
 	//!   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
 	//!   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
 	//! @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();
 			lcd_detect_IRsensor();
 		}
 		}
 		else {
 		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_wait_for_cool_down();
 	lcd_clear();
 	lcd_clear();
 	lcd_puts_at_P(0, 0, _i("Self test start"));////MSG_SELFTEST_START c=20
 	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[X_AXIS] += 0;
 		current_position[Y_AXIS] += 4;
 		current_position[Y_AXIS] += 4;
 #endif //TMC2130
 #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();
         set_destination_to_current();
 		_progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 1500);
 		_progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 1500);
 #ifdef TMC2130
 #ifdef TMC2130
@@ -6432,17 +6427,13 @@ bool lcd_selftest()
 #endif //TMC2130
 #endif //TMC2130
 
 
 		//raise Z to not damage the bed during and hotend testing
 		//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
 #ifdef TMC2130
 	if (_result)
 	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);
 		_progress = lcd_selftest_screen(TestScreen::Home, 0, 2, true, 0);
 		bool bres = tmc2130_home_calibrate(X_AXIS);
 		bool bres = tmc2130_home_calibrate(X_AXIS);
 		_progress = lcd_selftest_screen(TestScreen::Home, 1, 2, true, 0);
 		_progress = lcd_selftest_screen(TestScreen::Home, 1, 2, true, 0);
@@ -6472,8 +6463,8 @@ bool lcd_selftest()
 #ifdef FILAMENT_SENSOR
 #ifdef FILAMENT_SENSOR
     if (_result)
     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
 			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
             _result = selftest_irsensor();
             _result = selftest_irsensor();
@@ -6482,19 +6473,20 @@ bool lcd_selftest()
 				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 			}
 			}
         } else
         } 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
 			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
                _result = lcd_selftest_fsensor();
                _result = lcd_selftest_fsensor();
 			if (_result)
 			if (_result)
 			{
 			{
 				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 			}
 			}
-#endif //PAT9125
+#endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 #if 0
 #if 0
 	// Intentionally disabled - that's why we moved the detection to runtime by just checking the two voltages.
 	// 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.
 	// 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
 			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filament sensor
 			_result = lcd_selftest_IRsensor();
 			_result = lcd_selftest_IRsensor();
 			if (_result)
 			if (_result)
@@ -6562,7 +6554,6 @@ static bool lcd_selfcheck_axis_sg(uint8_t axis) {
 
 
 
 
 	raise_z_above(MESH_HOME_Z_SEARCH);
 	raise_z_above(MESH_HOME_Z_SEARCH);
-	st_synchronize();
 	tmc2130_home_enter(1 << axis);
 	tmc2130_home_enter(1 << axis);
 
 
 // first axis length measurement begin	
 // 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 FILAMENT_SENSOR
-#ifdef PAT9125
+#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
 static bool lcd_selftest_fsensor(void)
 static bool lcd_selftest_fsensor(void)
 {
 {
-	fsensor_init();
-	if (fsensor_not_responding)
+	fsensor.init();
+	if (fsensor.isError())
 	{
 	{
 		lcd_selftest_error(TestError::WiringFsensor, "", "");
 		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
 //! @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.
 //! 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.
 //!  * Pre-heat to PLA extrude temperature.
 //!  * Unload filament possibly present.
 //!  * Unload filament possibly present.
 //!  * Move extruder idler same way as during filament load
 //!  * 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.
 //!  * Check that pin doesn't go low.
 //!
 //!
 //! @retval true passed
 //! @retval true passed
@@ -7095,22 +7087,19 @@ static bool selftest_irsensor()
     {
     {
         TempBackup tempBackup;
         TempBackup tempBackup;
         setTargetHotend(ABS_PREHEAT_HOTEND_TEMP,active_extruder);
         setTargetHotend(ABS_PREHEAT_HOTEND_TEMP,active_extruder);
-        mmu_wait_for_heater_blocking();
         progress = lcd_selftest_screen(TestScreen::Fsensor, 0, 1, true, 0);
         progress = lcd_selftest_screen(TestScreen::Fsensor, 0, 1, true, 0);
-        mmu_filament_ramming();
     }
     }
     progress = lcd_selftest_screen(TestScreen::Fsensor, progress, 1, true, 0);
     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)
     for(uint_least8_t i = 0; i < 200; ++i)
     {
     {
         if (0 == (i % 32)) progress = lcd_selftest_screen(TestScreen::Fsensor, progress, 1, true, 0);
         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())
         while (blocks_queued())
         {
         {
-            if (READ(IR_SENSOR_PIN) == 0)
+            if (fsensor.getFilamentPresent())
             {
             {
                 lcd_selftest_error(TestError::TriggeringFsensor, "", "");
                 lcd_selftest_error(TestError::TriggeringFsensor, "", "");
                 return false;
                 return false;
@@ -7131,6 +7120,7 @@ static bool selftest_irsensor()
     }
     }
     return true;
     return true;
 }
 }
+#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
 
 
 static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
 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
   //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.
   //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)) {
   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) {
   if (result) {
 	  enquecommand(cmd);
 	  enquecommand(cmd);
@@ -7480,12 +7470,6 @@ void menu_action_sddirectory(const char* filename)
 
 
 void ultralcd_init()
 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();
     backlight_init();
 	lcd_init();
 	lcd_init();
 	lcd_refresh();
 	lcd_refresh();
@@ -7661,13 +7645,6 @@ static inline bool other_menu_expired()
             && menu_menu != lcd_babystep_z
             && menu_menu != lcd_babystep_z
             && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS));
             && 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)
 void menu_lcd_lcdupdate_func(void)
 {
 {
@@ -7735,7 +7712,7 @@ void menu_lcd_lcdupdate_func(void)
 
 
 		(*menu_menu)();
 		(*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
 		// 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.
 		// 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_adjust_z();
 void lcd_pick_babystep();
 void lcd_pick_babystep();
-void lcd_alright();
+uint8_t lcd_alright();
 void show_preheat_nozzle_warning();
 void show_preheat_nozzle_warning();
 void lcd_wait_interact();
 void lcd_wait_interact();
 void lcd_loading_filament();
 void lcd_loading_filament();
@@ -64,20 +64,27 @@ void lcd_crash_detect_enable();
 void lcd_crash_detect_disable();
 void lcd_crash_detect_disable();
 #endif
 #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 const char* lcd_display_message_fullscreen_P(const char *msg);
 
 
 extern void lcd_return_to_status();
 extern void lcd_return_to_status();
 extern void lcd_wait_for_click();
 extern void lcd_wait_for_click();
 extern bool lcd_wait_for_click_delay(uint16_t nDelay);
 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);
 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
 // Ask the user to move the Z axis up to the end stoppers and let
 // the user confirm that it has been done.
 // 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
     M0Wait,          //!< M0/M1 Wait command working even from SD
     M117,            //!< M117 Set the status line message on the LCD
     M117,            //!< M117 Set the status line message on the LCD
     Resuming,        //!< Resuming message
     Resuming,        //!< Resuming message
+    MMUProgress,     ///< MMU progress message
 };
 };
 
 
 extern CustomMsg custom_message_type;
 extern CustomMsg custom_message_type;
@@ -142,8 +150,7 @@ extern bool FarmOrUserECool();
 #define SILENT_MODE_OFF SILENT_MODE_POWER
 #define SILENT_MODE_OFF SILENT_MODE_POWER
 #endif
 #endif
 
 
-#ifdef IR_SENSOR_ANALOG
-extern bool bMenuFSDetect;
+#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
 void printf_IRSensorAnalogBoardChange();
 void printf_IRSensorAnalogBoardChange();
 #endif //IR_SENSOR_ANALOG
 #endif //IR_SENSOR_ANALOG
 
 
@@ -173,6 +180,7 @@ enum class FilamentAction : uint_least8_t
     MmuUnLoad,
     MmuUnLoad,
     MmuEject,
     MmuEject,
     MmuCut,
     MmuCut,
+    MmuLoadExtruder,
     Preheat,
     Preheat,
     Lay1Cal,
     Lay1Cal,
 };
 };
@@ -183,7 +191,7 @@ extern bool bFilamentAction;
 void mFilamentItem(uint16_t nTemp,uint16_t nTempBed);
 void mFilamentItem(uint16_t nTemp,uint16_t nTempBed);
 void mFilamentItemForce();
 void mFilamentItemForce();
 void lcd_generic_preheat_menu();
 void lcd_generic_preheat_menu();
-void unload_filament(bool automatic = false);
+void unload_filament(float unloadLength, bool automatic = false);
 
 
 
 
 void lcd_wait_for_heater();
 void lcd_wait_for_heater();
@@ -207,7 +215,6 @@ void lcd_language();
 #endif
 #endif
 
 
 void lcd_wizard();
 void lcd_wizard();
-bool lcd_autoDepleteEnabled();
 
 
 //! @brief Wizard state
 //! @brief Wizard state
 enum class WizState : uint8_t
 enum class WizState : uint8_t
@@ -234,6 +241,8 @@ void lcd_wizard(WizState state);
 extern void lcd_experimental_toggle();
 extern void lcd_experimental_toggle();
 extern void lcd_experimental_menu();
 extern void lcd_experimental_menu();
 
 
+uint8_t lcdui_print_extruder(void);
+
 #ifdef PINDA_TEMP_COMP
 #ifdef PINDA_TEMP_COMP
 extern void lcd_pinda_temp_compensation_toggle();
 extern void lcd_pinda_temp_compensation_toggle();
 #endif //PINDA_TEMP_COMP
 #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
 #define MSG_PRINT_CHECKING_FAILED_TIMEOUT 30
 
 
 ClNozzleDiameter oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
 ClNozzleDiameter oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
@@ -236,207 +235,192 @@ ClCheckModel oCheckModel=ClCheckModel::_None;
 ClCheckVersion oCheckVersion=ClCheckVersion::_None;
 ClCheckVersion oCheckVersion=ClCheckVersion::_None;
 ClCheckGcode oCheckGcode=ClCheckGcode::_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 ???
 //-// -> 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 GCODE_DELIMITER '"'
 #define ELLIPSIS "..."
 #define ELLIPSIS "..."
 
 
-char* code_string(const char* pStr,size_t* nLength)
-{
+char *code_string(const char *pStr, size_t *nLength) {
 char* pStrBegin;
 char* pStrBegin;
 char* pStrEnd;
 char* pStrEnd;
 
 
@@ -451,13 +435,12 @@ if(!pStrEnd)
 return pStrBegin;
 return pStrBegin;
 }
 }
 
 
-void printer_smodel_check(const char* pStrPos)
-{
+void printer_smodel_check(const char *pStrPos) {
 char* pResult;
 char* pResult;
 size_t nLength,nPrinterNameLength;
 size_t nLength,nPrinterNameLength;
 
 
 nPrinterNameLength = strlen_P(sPrinterName);
 nPrinterNameLength = strlen_P(sPrinterName);
-pResult = code_string(pStrPos,&nLength);
+pResult=code_string(pStrPos,&nLength);
 
 
 if(pResult != NULL && nLength == nPrinterNameLength) {
 if(pResult != NULL && nLength == nPrinterNameLength) {
      // Only compare them if the lengths match
      // 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)
 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]);
     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();
 extern const char* FW_VERSION_STR_P();
 
 
@@ -112,5 +112,3 @@ void fSetMmuMode(bool bMMu);
 
 
 #define IP4_STR_SIZE 16
 #define IP4_STR_SIZE 16
 extern void ip4_to_str(char* dest, uint8_t* IP);
 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
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25
 #define PRINTER_TYPE PRINTER_MK25
 #define PRINTER_NAME PRINTER_MK25_NAME
 #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_TYPE PRINTER_MK25_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME
 #define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25"
 #define FILAMENT_SIZE "1_75mm_MK25"
@@ -125,7 +126,7 @@
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
-#define PAT9125
+#define FILAMENT_SENSOR_TYPE FSENSOR_PAT9125
 
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
 #define DEBUG_DCODE3
@@ -135,7 +136,7 @@
 //#define _NO_ASM
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
 #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_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -158,8 +159,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
-//#define FSENSOR_QUALITY
-
 
 
 /*------------------------------------
 /*------------------------------------
  EXTRUDER SETTINGS
  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
 #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)
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 #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
 /* 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
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25
 #define PRINTER_TYPE PRINTER_MK25
 #define PRINTER_NAME PRINTER_MK25_NAME
 #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_TYPE PRINTER_MK25_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME
 #define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25"
 #define FILAMENT_SIZE "1_75mm_MK25"
@@ -126,7 +127,7 @@
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
-#define PAT9125
+#define FILAMENT_SENSOR_TYPE FSENSOR_PAT9125
 
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
 #define DEBUG_DCODE3
@@ -136,7 +137,7 @@
 //#define _NO_ASM
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
 #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_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -159,8 +160,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
-//#define FSENSOR_QUALITY
-
 
 
 /*------------------------------------
 /*------------------------------------
  EXTRUDER SETTINGS
  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
 #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 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)
 //#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
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25S
 #define PRINTER_TYPE PRINTER_MK25S
 #define PRINTER_NAME PRINTER_MK25S_NAME
 #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_TYPE PRINTER_MK25S_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME
 #define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25S"
 #define FILAMENT_SIZE "1_75mm_MK25S"
@@ -125,7 +126,7 @@
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
-#define IR_SENSOR
+#define FILAMENT_SENSOR_TYPE FSENSOR_IR
 
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
 #define DEBUG_DCODE3
@@ -135,7 +136,7 @@
 //#define _NO_ASM
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
 #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_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -158,8 +159,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
-//#define FSENSOR_QUALITY
-
 
 
 /*------------------------------------
 /*------------------------------------
  EXTRUDER SETTINGS
  EXTRUDER SETTINGS
@@ -516,6 +515,11 @@
 //#define MMU_ALWAYS_CUT
 //#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
 #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)
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 #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
 /* 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
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK25S
 #define PRINTER_TYPE PRINTER_MK25S
 #define PRINTER_NAME PRINTER_MK25S_NAME
 #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_TYPE PRINTER_MK25S_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME
 #define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK25S"
 #define FILAMENT_SIZE "1_75mm_MK25S"
@@ -126,7 +127,7 @@
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
-#define IR_SENSOR
+#define FILAMENT_SENSOR_TYPE FSENSOR_IR
 
 
 #define DEBUG_DCODE2
 #define DEBUG_DCODE2
 #define DEBUG_DCODE3
 #define DEBUG_DCODE3
@@ -136,7 +137,7 @@
 //#define _NO_ASM
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
 #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_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -159,8 +160,6 @@
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 //#define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
-//#define FSENSOR_QUALITY
-
 
 
 /*------------------------------------
 /*------------------------------------
  EXTRUDER SETTINGS
  EXTRUDER SETTINGS
@@ -517,6 +516,11 @@
 //#define MMU_ALWAYS_CUT
 //#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
 #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)
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 #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
 /* 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
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK3
 #define PRINTER_TYPE PRINTER_MK3
 #define PRINTER_NAME PRINTER_MK3_NAME
 #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_TYPE PRINTER_MK3_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK3_MMU2_NAME
 #define PRINTER_MMU_NAME PRINTER_MK3_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK3"
 #define FILAMENT_SIZE "1_75mm_MK3"
@@ -150,7 +151,8 @@
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
-#define PAT9125
+#define FILAMENT_SENSOR_TYPE FSENSOR_PAT9125
+#define FSENSOR_PROBING
 
 
 // Backlash - 
 // Backlash - 
 //#define BACKLASH_X
 //#define BACKLASH_X
@@ -177,7 +179,7 @@
 //#define _NO_ASM
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
 #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_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -202,8 +204,6 @@
 #define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
-//#define FSENSOR_QUALITY
-
 
 
 #define LINEARITY_CORRECTION
 #define LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
@@ -681,6 +681,11 @@
 #define MMU_HAS_CUTTER
 #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
 #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)
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 #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
 /* 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
 // Printer revision
 #define PRINTER_TYPE PRINTER_MK3S
 #define PRINTER_TYPE PRINTER_MK3S
 #define PRINTER_NAME PRINTER_MK3S_NAME
 #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_TYPE PRINTER_MK3S_MMU2
 #define PRINTER_MMU_NAME PRINTER_MK3S_MMU2_NAME
 #define PRINTER_MMU_NAME PRINTER_MK3S_MMU2_NAME
 #define FILAMENT_SIZE "1_75mm_MK3S"
 #define FILAMENT_SIZE "1_75mm_MK3S"
@@ -152,7 +153,8 @@
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
-#define IR_SENSOR
+#define FILAMENT_SENSOR_TYPE FSENSOR_IR_ANALOG
+#define FSENSOR_PROBING
 
 
 // Backlash - 
 // Backlash - 
 //#define BACKLASH_X
 //#define BACKLASH_X
@@ -179,7 +181,7 @@
 //#define _NO_ASM
 //#define _NO_ASM
 #define DEBUG_DCODES //D codes
 #define DEBUG_DCODES //D codes
 #define DEBUG_STACK_MONITOR        //Stack monitor in stepper ISR
 #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_RESUME_PRINT       //Resume/save print debug enable 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_UVLO_AUTOMATIC_RECOVER // Power panic automatic recovery debug output 
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
 //#define DEBUG_DISABLE_XMINLIMIT  //x min limit ignored
@@ -204,8 +206,6 @@
 #define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #define CMD_DIAGNOSTICS //Show cmd queue length on printer display
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
-//#define FSENSOR_QUALITY
-
 
 
 #define LINEARITY_CORRECTION
 #define LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
@@ -693,6 +693,11 @@
 //#define MMU_ALWAYS_CUT
 //#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
 #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)
 // Default Arc Interpolation Settings (Now configurable via M214)
 #define DEFAULT_N_ARC_CORRECTION       25 // Number of interpolated segments between corrections.
 #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
 /* 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
 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
 // temperature runaway
 #define TEMP_RUNAWAY_BED_HYSTERESIS 5
 #define TEMP_RUNAWAY_BED_HYSTERESIS 5
 #define TEMP_RUNAWAY_BED_TIMEOUT 360
 #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
 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
 // temperature runaway
 #define TEMP_RUNAWAY_BED_HYSTERESIS 5
 #define TEMP_RUNAWAY_BED_HYSTERESIS 5
 #define TEMP_RUNAWAY_BED_TIMEOUT 360
 #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"
     binfile="$TMPDIR/lang_$lang.bin"
 
 
     color 4 "compiling language \"$lang\" from $pofile" >&2
     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
     if [ "$?" != 0 ]; then
         color 1 "$pofile: NG! - translation contains warnings or errors" >&2
         color 1 "$pofile: NG! - translation contains warnings or errors" >&2
     fi
     fi
@@ -61,8 +61,9 @@ for lang in $LANGUAGES; do
     ./lang-build.py "$MAP" "$pofile" "$binfile"
     ./lang-build.py "$MAP" "$pofile" "$binfile"
 
 
     # ensure each catalog fits the reserved size
     # 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
         finish 1
     fi
     fi
 done
 done

+ 14 - 3
lang/lang-check.py

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

+ 1 - 0
lang/lib/charset.py

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

+ 951 - 579
lang/po/Firmware.pot

@@ -7,352 +7,372 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr ""
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr ""
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr ""
 msgstr ""
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -360,39 +380,46 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr ""
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr ""
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet."
 "Distance between tip of the nozzle and the bed surface has not been set yet."
@@ -401,294 +428,418 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
 msgstr ""
 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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_EJECT_FILAMENT c=17
 #. 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"
 msgid "Eject filament"
 msgstr ""
 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"
 msgid "Ejecting filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr ""
 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
 #. 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"
 msgid "Extruder"
 msgstr ""
 msgstr ""
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr ""
 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
 #. 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"
 msgid "FS Action"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_FAIL_STATS c=18
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr ""
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr ""
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr ""
 msgstr ""
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again."
 "G-code sliced for a different printer type. Please re-slice the model again."
 " Print cancelled."
 " Print cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr ""
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -696,326 +847,379 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr ""
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr ""
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
 msgstr ""
 msgstr ""
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr ""
 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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOAD_ALL c=18
 #. 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 ""
 msgstr ""
 
 
 #. MSG_LOAD_FILAMENT c=17
 #. 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"
 msgid "Load filament"
 msgstr ""
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_MODE c=8
 #. 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"
 msgid "MMU Mode"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_FAILS c=15
 #. 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"
 msgid "MMU fails"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
 #. 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"
 msgid "MMU load fails"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_CONNECTED c=18
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr ""
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr ""
 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
 #. 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"
 msgid "N/A"
 msgstr ""
 msgstr ""
 
 
@@ -1025,178 +1229,203 @@ msgid "New firmware version available:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr ""
 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
 #. 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"
 msgid "Off"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
 msgstr ""
 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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr ""
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "rebooting the printer."
@@ -1208,78 +1437,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr ""
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr ""
 msgstr ""
 
 
@@ -1288,289 +1512,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr ""
 msgstr ""
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr ""
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First"
 "Printer has not been calibrated yet. Please follow the manual, chapter First"
 " steps, section Calibration flow."
 " steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
 msgstr ""
 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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr ""
 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
 #. 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"
 msgid "Reset"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr ""
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr ""
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr ""
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr ""
 msgstr ""
 
 
@@ -1580,31 +1857,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1613,18 +1890,18 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr ""
 msgstr ""
 
 
@@ -1636,112 +1913,171 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr ""
 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
 #. 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"
 msgid "Stop print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr ""
 msgstr ""
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr ""
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1749,73 +2085,109 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr ""
 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"
 msgid "Unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr ""
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr ""
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1824,210 +2196,210 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr ""
 msgstr ""
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this"
 "You are using firmware beta version. This is development version. Using this"
 " version is not recommended and may cause printer damage."
 " version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr ""
 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr " 0.3 nebo starsi"
 msgstr " 0.3 nebo starsi"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr " 0.4 nebo novejsi"
 msgstr " 0.4 nebo novejsi"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "%s ocekavana verze"
 msgstr "%s ocekavana verze"
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ">Zrusit"
 msgstr ">Zrusit"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Doladeni Z:"
 msgstr "Doladeni Z:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr "Vse OK"
 msgstr "Vse OK"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr "Vse je hotovo. Tisku zdar!"
 msgstr "Vse je hotovo. Tisku zdar!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr "Abeceda"
 msgstr "Abeceda"
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Okoli"
 msgstr "Okoli"
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "Dojely oba Z voziky k~hornimu dorazu?"
 msgstr "Dojely oba Z voziky k~hornimu dorazu?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr "Asist."
 msgstr "Asist."
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr "Automat."
 msgstr "Automat."
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "AutoZavedeni fil."
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 msgstr ""
 "Automaticke zavadeni filamentu aktivni, stisknete tlacitko a vlozte "
 "Automaticke zavadeni filamentu aktivni, stisknete tlacitko a vlozte "
 "filament..."
 "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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr "Osa"
 msgstr "Osa"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Delka osy"
 msgstr "Delka osy"
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr "Zpet"
 msgstr "Zpet"
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr "Podlozka"
 msgstr "Podlozka"
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr "Zahrivani bedu"
 msgstr "Zahrivani bedu"
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr "Bed OK."
 msgstr "Bed OK."
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Korekce podlozky"
 msgstr "Korekce podlozky"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
@@ -170,50 +171,55 @@ msgstr ""
 "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."
 "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Podlozka/Topeni"
 msgstr "Podlozka/Topeni"
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr "Stav remenu"
 msgstr "Stav remenu"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Test remenu"
 msgstr "Test remenu"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Detekovan vypadek proudu.Obnovit tisk?"
 msgstr "Detekovan vypadek proudu.Obnovit tisk?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr "Jasny"
 msgstr "Jasny"
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr "Podsviceni"
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "Kalibrace XYZ"
 msgstr "Kalibrace XYZ"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Kalibrovat Z"
 msgstr "Kalibrovat Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -222,13 +228,13 @@ msgstr ""
 "tlacitkem."
 "tlacitkem."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr "Kalibruji Z"
 msgstr "Kalibruji Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -237,140 +243,151 @@ msgstr ""
 "tlacitkem."
 "tlacitkem."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Kalibruji vychozi p."
 msgstr "Kalibruji vychozi p."
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr "Kalibrace"
 msgstr "Kalibrace"
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Kalibrace OK"
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr "Karta vyjmuta"
 msgstr "Karta vyjmuta"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr "Vymenit filament"
 msgstr "Vymenit filament"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Zmena uspesna!"
 msgstr "Zmena uspesna!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Vymena ok?"
 msgstr "Vymena ok?"
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr "Kontrola osy X"
 msgstr "Kontrola osy X"
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr "Kontrola osy Y"
 msgstr "Kontrola osy Y"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Kontrola osy Z"
 msgstr "Kontrola osy Z"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr "Kontrola podlozky"
 msgstr "Kontrola podlozky"
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Kontrola endstopu"
 msgstr "Kontrola endstopu"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Kontroluji soubor"
 msgstr "Kontroluji soubor"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Kontrola hotend"
 msgstr "Kontrola hotend"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr "Kontrola senzoru"
 msgstr "Kontrola senzoru"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr "Kontrola"
 msgstr "Kontrola"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Barva neni cista"
 msgstr "Barva neni cista"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr "Komunitni prekl."
 msgstr "Komunitni prekl."
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr "Pokr."
 msgstr "Pokr."
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Zchladit"
 msgstr "Zchladit"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Kopirovat vybrany jazyk?"
 msgstr "Kopirovat vybrany jazyk?"
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr "Naraz"
 msgstr "Naraz"
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr "Det. narazu"
 msgstr "Det. narazu"
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr "Detekovan naraz."
 msgstr "Detekovan naraz."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -381,39 +398,46 @@ msgstr ""
 "Normal modu"
 "Normal modu"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr "Ustrihnout"
 msgstr "Ustrihnout"
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr "Strihani"
 msgstr "Strihani"
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Strihani filamentu"
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr "Datum:"
 msgstr "Datum:"
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr "Temny"
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr "Vypnout motory"
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "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."
 "podle manualu, kapitola Zaciname, odstavec Nastaveni prvni vrstvy."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
 msgstr ""
 msgstr ""
 "Chcete opakovat posledni krok a pozmenit vzdalenost mezi tryskou a podlozkou?"
 "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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "Korekce E:"
 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
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgid "ERROR:"
 msgstr "CHYBA:"
 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
 #. 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"
 msgid "Eject filament"
 msgstr "Vysunout fil."
 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"
 msgid "Ejecting filament"
 msgstr "Vysouvam filament"
 msgstr "Vysouvam filament"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr "Koncovy spinac"
 msgstr "Koncovy spinac"
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Kon. spinac nesepnut"
 msgstr "Kon. spinac nesepnut"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr "Konc. spinace"
 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
 #. 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"
 msgid "Extruder"
 msgstr ""
 msgstr ""
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr "Levy vent.:"
 msgstr "Levy vent.:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr "F. autozav."
 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
 #. 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"
 msgid "FS Action"
 msgstr "FS reakce"
 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
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Selhani"
 msgstr "Selhani"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "Selhani MMU"
 msgstr "Selhani MMU"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Falesne spusteni"
 msgstr "Falesne spusteni"
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr "Rychlost vent."
 msgstr "Rychlost vent."
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr "Test ventilatoru"
 msgstr "Test ventilatoru"
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr "Kontr. vent."
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr "Vypadky filam."
 msgstr "Vypadky filam."
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr "Fil. senzor"
 msgstr "Fil. senzor"
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr "Filament vytlacen a spravne barvy?"
 msgstr "Filament vytlacen a spravne barvy?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Filament nezaveden"
 msgstr "Filament nezaveden"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr "Senzor filamentu"
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Spotrebovano filam."
 msgstr "Spotrebovano filam."
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "Soubor nekompletni. Pokracovat?"
 msgstr "Soubor nekompletni. Pokracovat?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr "Dokoncovani pohybu"
 msgstr "Dokoncovani pohybu"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr "Kal. prvni vrstvy"
 msgstr "Kal. prvni vrstvy"
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "Nejdriv pomoci selftestu zkontoluji nejcastejsi chyby vznikajici pri "
 "Nejdriv pomoci selftestu zkontoluji nejcastejsi chyby vznikajici pri "
 "sestaveni tiskarny."
 "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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr "Prutok"
 msgstr "Prutok"
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr "Predni tiskovy vent?"
 msgstr "Predni tiskovy vent?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Vpredu [μm]"
 msgstr "Vpredu [μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Predni/levy vent."
 msgstr "Predni/levy vent."
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-code je pripraven pro jinou verzi. Pokracovat?"
 msgstr "G-code je pripraven pro jinou verzi. Pokracovat?"
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
@@ -655,14 +802,14 @@ msgstr ""
 "zrusen."
 "zrusen."
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-code je pripraven pro jiny typ tiskarny. Pokracovat?"
 msgstr "G-code je pripraven pro jiny typ tiskarny. Pokracovat?"
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
@@ -671,12 +818,12 @@ msgstr ""
 "Tisk zrusen."
 "Tisk zrusen."
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-code je pripraven pro novejsi firmware. Pokracovat?"
 msgstr "G-code je pripraven pro novejsi firmware. Pokracovat?"
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
@@ -685,42 +832,42 @@ msgstr ""
 "zrusen."
 "zrusen."
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr "HW nastaveni"
 msgstr "HW nastaveni"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Topeni/Termistor"
 msgstr "Topeni/Termistor"
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr "Zahrivani"
 msgstr "Zahrivani"
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr "Zahrivani preruseno bezpecnostnim casovacem."
 msgstr "Zahrivani preruseno bezpecnostnim casovacem."
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr "Zahrivani OK."
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "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."
 "nastaveni, ve kterem zkalibrujeme osu Z. Pak budete moct zacit tisknout."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -739,24 +886,45 @@ msgstr ""
 "kalibracnim procesem?"
 "kalibracnim procesem?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr "Vys. vykon"
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Nyni provedu xyz kalibraci. Zabere to priblizne 12 min."
 msgstr "Nyni provedu xyz kalibraci. Zabere to priblizne 12 min."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Nyni provedu z kalibraci."
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -765,295 +933,327 @@ msgstr ""
 "- Tiskove platy"
 "- Tiskove platy"
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Informace"
 msgstr "Informace"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Vlozte filament"
 msgstr "Vlozte filament"
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr "Vlozte filament (nezavadejte) do extruderu a stisknete tlacitko"
 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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr "Je filament zaveden?"
 msgstr "Je filament zaveden?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Je tiskovy plat na podlozce?"
 msgstr "Je tiskovy plat na podlozce?"
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr "Opakovani"
 msgstr "Opakovani"
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr "Posledni tisk"
 msgstr "Posledni tisk"
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr "Selhani posl. tisku"
 msgstr "Selhani posl. tisku"
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr "Vlevo"
 msgstr "Vlevo"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr "Levy vent na trysce?"
 msgstr "Levy vent na trysce?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Vlevo [μm]"
 msgstr "Vlevo [μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Normalni"
 msgstr "Normalni"
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Ztlumeny"
 msgstr "Ztlumeny"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Korekce lin."
 msgstr "Korekce lin."
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr "Doladeni osy Z"
 msgstr "Doladeni osy Z"
 
 
 #. MSG_LOAD_ALL c=18
 #. 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
 #. 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"
 msgid "Load filament"
 msgstr "Zavest 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "Zavest do trysky"
 msgstr "Zavest do trysky"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Cisteni barvy"
 msgstr "Cisteni barvy"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr "Zavadeni filamentu"
 msgstr "Zavadeni filamentu"
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Uvolnena remenicka"
 msgstr "Uvolnena remenicka"
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr "Hlasity"
 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
 #. 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"
 msgid "MMU Mode"
 msgstr "MMU mod"
 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
 #. 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"
 msgid "MMU fails"
 msgstr "Selhani MMU"
 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
 #. 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"
 msgid "MMU load fails"
 msgstr "MMU selhani zav"
 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
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 pripojeno"
 msgstr "MMU2 pripojeno"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Komp. magnetu"
 msgstr "Komp. magnetu"
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr "Hlavni nabidka"
 msgstr "Hlavni nabidka"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "Merene zkos."
 msgstr "Merene zkos."
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr "Merim referencni vysku kalibracniho bodu"
 msgstr "Merim referencni vysku kalibracniho bodu"
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr "Mod"
 msgstr "Mod"
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Probiha zmena modu..."
 msgstr "Probiha zmena modu..."
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr ""
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr "Posunout X"
 msgstr "Posunout X"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Posunout Y"
 msgstr "Posunout Y"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Posunout Z"
 msgstr "Posunout Z"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Posunout osu"
 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
 #. 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"
 msgid "N/A"
 msgstr ""
 msgstr ""
 
 
@@ -1063,153 +1263,161 @@ msgid "New firmware version available:"
 msgstr "Vysla nova verze firmware:"
 msgstr "Vysla nova verze firmware:"
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr "Ne"
 msgstr "Ne"
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr "Zadna SD karta"
 msgstr "Zadna SD karta"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr "Bez pohybu."
 msgstr "Bez pohybu."
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr "Zadne"
 msgstr "Zadne"
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr "Nezapojeno"
 msgstr "Nezapojeno"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr "Netoci se"
 msgstr "Netoci se"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr "Nyni zkalibruji vzdalenost mezi koncem trysky a povrchem podlozky."
 msgstr "Nyni zkalibruji vzdalenost mezi koncem trysky a povrchem podlozky."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Nyni predehreji trysku pro PLA."
 msgstr "Nyni predehreji trysku pro PLA."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr "Nyni odstrante testovaci vytisk z tiskoveho platu."
 msgstr "Nyni odstrante testovaci vytisk z tiskoveho platu."
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr "Tryska"
 msgstr "Tryska"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "Tryska"
 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
 #. 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"
 msgid "Off"
 msgstr "Vyp"
 msgstr "Vyp"
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr "Neplatne hodnoty nastaveni. Bude pouzito vychozi PID, Esteps atd."
 msgstr "Neplatne hodnoty nastaveni. Bude pouzito vychozi PID, Esteps atd."
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr "Zap"
 msgstr "Zap"
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr "Jednou"
 msgstr "Jednou"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr "PID kal."
 msgstr "PID kal."
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "PID kal. ukoncena"
 msgstr "PID kal. ukoncena"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "PID kalibrace"
 msgstr "PID kalibrace"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "Nahrivani PINDA"
 msgstr "Nahrivani PINDA"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr "PINDA kal."
 msgstr "PINDA kal."
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "PINDA kalibrace selhala"
 msgstr "PINDA kalibrace selhala"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
@@ -1217,19 +1425,36 @@ msgstr ""
 "PINDA kalibrace dokoncena a je nyni aktivni. Zabere je mozno deaktivovat v "
 "PINDA kalibrace dokoncena a je nyni aktivni. Zabere je mozno deaktivovat v "
 "menu Nastaveni->Tepl. kal."
 "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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr "Pauza"
 msgstr "Pauza"
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr "Pozastavit tisk"
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "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."
 "prvnich 4 bodu. Pokud tryska zachyti papir, okamzite vypnete tiskarnu."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "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"
 msgstr "Prosim zkontrolujte zapojeni IR senzoru a vyjmuty filament"
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Zkontrolujte:"
 msgstr "Zkontrolujte:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Prosim ocistete podlozku a stisknete tlacitko."
 msgstr "Prosim ocistete podlozku a stisknete tlacitko."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 msgstr ""
 "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."
 "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
 "Prosim vlozte filament do extruderu a stisknete tlacitko k jeho zavedeni"
 "Prosim vlozte filament do extruderu a stisknete tlacitko k jeho zavedeni"
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1284,50 +1509,45 @@ msgstr ""
 "zavedeni"
 "zavedeni"
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Prosim nejdriv zavedte filament"
 msgstr "Prosim nejdriv zavedte filament"
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr "Prosim otevrete idler a manualne odstrante filament."
 msgstr "Prosim otevrete idler a manualne odstrante filament."
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr "Umistete prosim tiskovy plat na podlozku"
 msgstr "Umistete prosim tiskovy plat na podlozku"
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr "Pro vysunuti filamentu stisknete prosim tlacitko"
 msgstr "Pro vysunuti filamentu stisknete prosim tlacitko"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr "Prosim vyjmete urychlene filament"
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Nejprve prosim sundejte transportni soucastky."
 msgstr "Nejprve prosim sundejte transportni soucastky."
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Odstrante prosim tiskovy plat z podlozky."
 msgstr "Odstrante prosim tiskovy plat z podlozky."
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Nejprve spustte kalibraci XYZ."
 msgstr "Nejprve spustte kalibraci XYZ."
 
 
@@ -1336,113 +1556,109 @@ msgstr "Nejprve spustte kalibraci XYZ."
 msgid "Please unload the filament first, then repeat this action."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Prosim vyjmete filament a zopakujte tuto akci"
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr "Prosim aktualizujte."
 msgstr "Prosim aktualizujte."
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr "Prosim cekejte"
 msgstr "Prosim cekejte"
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr "Vypadky proudu"
 msgstr "Vypadky proudu"
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Predehrev"
 msgstr "Predehrev"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr "Predehrejte trysku!"
 msgstr "Predehrejte trysku!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr "Predehrev trysky. Prosim cekejte."
 msgstr "Predehrev trysky. Prosim cekejte."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Predehrev ke strihu"
 msgstr "Predehrev ke strihu"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Predehrev k vysunuti"
 msgstr "Predehrev k vysunuti"
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Predehrev k zavedeni"
 msgstr "Predehrev k zavedeni"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Predehrev k vyjmuti"
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "Stisknete tlacitko"
 msgstr "Stisknete tlacitko"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Pro nahrati trysky a pokracovani stisknete tlacitko."
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Tisk prerusen"
 msgstr "Tisk prerusen"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr "Tiskovy vent.:"
 msgstr "Tiskovy vent.:"
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr "Tisk z SD"
 msgstr "Tisk z SD"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Tisk pozastaven"
 msgstr "Tisk pozastaven"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr "Cas tisku"
 msgstr "Cas tisku"
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr "IP adr. tiskarny:"
 msgstr "IP adr. tiskarny:"
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1451,12 +1667,12 @@ msgstr ""
 "kapitola Zaciname, odstavec Postup kalibrace."
 "kapitola Zaciname, odstavec Postup kalibrace."
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Prumer trysky tiskarny se lisi od G-code. Pokracovat?"
 msgstr "Prumer trysky tiskarny se lisi od G-code. Pokracovat?"
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
@@ -1464,65 +1680,110 @@ msgstr ""
 "Prumer trysky tiskarny se lisi od G-code. Prosim zkontrolujte nastaveni. "
 "Prumer trysky tiskarny se lisi od G-code. Prosim zkontrolujte nastaveni. "
 "Tisk zrusen."
 "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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Vzadu [μm]"
 msgstr "Vzadu [μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Obnovovani tisku"
 msgstr "Obnovovani tisku"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr "Vyjmete stary filament a stisknete tlacitko pro zavedeni noveho."
 msgstr "Vyjmete stary filament a stisknete tlacitko pro zavedeni noveho."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr "Prejmenovat"
 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
 #. 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"
 msgid "Reset"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr "Reset XYZ kalibr."
 msgstr "Reset XYZ kalibr."
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr "Pokracovat"
 msgstr "Pokracovat"
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Obnoveni tisku"
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr "Vpravo"
 msgstr "Vpravo"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Vpravo [μm]"
 msgstr "Vpravo [μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1530,101 +1791,113 @@ msgstr ""
 "Spusteni Pruvodce vymaze ulozene vysledky vsech kalibraci a spusti "
 "Spusteni Pruvodce vymaze ulozene vysledky vsech kalibraci a spusti "
 "kalibracni proces od zacatku. Pokracovat?"
 "kalibracni proces od zacatku. Pokracovat?"
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr "SD karta"
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "ZASTAVENO."
 msgstr "ZASTAVENO."
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr "Hledam kalibracni bod podlozky"
 msgstr "Hledam kalibracni bod podlozky"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr "Vybrat"
 msgstr "Vybrat"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
 msgstr "Zvolte filament pro kalibraci prvni vrstvy z nasledujiciho menu"
 msgstr "Zvolte filament pro kalibraci prvni vrstvy z nasledujiciho menu"
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr "Vyberte extruder:"
 msgstr "Vyberte extruder:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr "Zvolte filament:"
 msgstr "Zvolte filament:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr "Vyber jazyka"
 msgstr "Vyber jazyka"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr "Vyberte teplotu predehrati trysky ktera odpovida vasemu materialu."
 msgstr "Vyberte teplotu predehrati trysky ktera odpovida vasemu materialu."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Zvolte teplotu, ktera odpovida vasemu materialu."
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr "Chyba Selftestu!"
 msgstr "Chyba Selftestu!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr "Selftest selhal"
 msgstr "Selftest selhal"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr "Pro kalibraci presneho rehomovani bude nyni spusten selftest."
 msgstr "Pro kalibraci presneho rehomovani bude nyni spusten selftest."
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "Senzor info"
 msgstr "Senzor info"
 
 
@@ -1634,31 +1907,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Senzor overen, vyjmete filament."
 msgstr "Senzor overen, vyjmete filament."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Nastavte teplotu:"
 msgstr "Nastavte teplotu:"
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr "Nastaveni"
 msgstr "Nastaveni"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "Tezke zkos."
 msgstr "Tezke zkos."
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr "Plat"
 msgstr "Plat"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1671,18 +1944,18 @@ msgstr ""
 "%cReset"
 "%cReset"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Stav konc. spin."
 msgstr "Stav konc. spin."
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr "Tichy"
 msgstr "Tichy"
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Lehke zkos."
 msgstr "Lehke zkos."
 
 
@@ -1696,112 +1969,171 @@ msgstr ""
 "setrideni je 100."
 "setrideni je 100."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Vyskytl se problem, srovnavam osu Z ..."
 msgstr "Vyskytl se problem, srovnavam osu Z ..."
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr "Trideni"
 msgstr "Trideni"
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr "Trideni souboru"
 msgstr "Trideni souboru"
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr "Zvuk"
 msgstr "Zvuk"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr "Rychlost"
 msgstr "Rychlost"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr "Toci se"
 msgstr "Toci se"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr "Je vyzadovana stabilni pokojova teplota 21-26C a pevna podlozka."
 msgstr "Je vyzadovana stabilni pokojova teplota 21-26C a pevna podlozka."
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Statistika"
 msgstr "Statistika"
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr "Tichy"
 msgstr "Tichy"
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr "Tiskove platy"
 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
 #. 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"
 msgid "Stop print"
 msgstr "Zastavit tisk"
 msgstr "Zastavit tisk"
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr "Prisne"
 msgstr "Prisne"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr "Podpora"
 msgstr "Podpora"
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Prohozene"
 msgstr "Prohozene"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr "Teplota"
 msgstr "Teplota"
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr "Teploty"
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1811,7 +2143,7 @@ msgstr ""
 "vysku. Postupujte podle obrazku v handbooku (kapitola Kalibrace)."
 "vysku. Postupujte podle obrazku v handbooku (kapitola Kalibrace)."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -1820,66 +2152,102 @@ msgstr ""
 "Zaciname, sekce Postup kalibrace."
 "Zaciname, sekce Postup kalibrace."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr "Cas"
 msgstr "Cas"
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr "Celkem"
 msgstr "Celkem"
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr "Celkem selhani"
 msgstr "Celkem selhani"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Filament celkem"
 msgstr "Filament celkem"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Celkovy cas tisku"
 msgstr "Celkovy cas tisku"
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr "Ladit"
 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"
 msgid "Unload filament"
 msgstr "Vyjmout filament"
 msgstr "Vyjmout filament"
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr "Vysouvam 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr "Overeni selhalo, vyjmete filament a zkuste znovu."
 msgstr "Overeni selhalo, vyjmete filament a zkuste znovu."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Napeti"
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1892,218 +2260,275 @@ msgstr ""
 "Stealth modu"
 "Stealth modu"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Ceka se na uzivatele"
 msgstr "Ceka se na uzivatele"
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "Cekani na zchladnuti PINDA"
 msgstr "Cekani na zchladnuti PINDA"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Cekani na zchladnuti trysky a podlozky."
 msgstr "Cekani na zchladnuti trysky a podlozky."
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr "Varovat"
 msgstr "Varovat"
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Varovani: doslo ke zmene typu tiskarny a motherboardu."
 msgstr "Varovani: doslo ke zmene typu tiskarny a motherboardu."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Varovani: doslo ke zmene typu motherboardu."
 msgstr "Varovani: doslo ke zmene typu motherboardu."
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Varovani: doslo ke zmene typu tiskarny."
 msgstr "Varovani: doslo ke zmene typu tiskarny."
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Bylo vysunuti filamentu uspesne?"
 msgstr "Bylo vysunuti filamentu uspesne?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr "Chyba zapojeni"
 msgstr "Chyba zapojeni"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr "Pruvodce"
 msgstr "Pruvodce"
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "Korekce X:"
 msgstr "Korekce X:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "Detaily XYZ kal."
 msgstr "Detaily XYZ kal."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "Kalibrace XYZ v poradku. Zkoseni bude automaticky vyrovnano pri tisku."
 msgstr "Kalibrace XYZ v poradku. Zkoseni bude automaticky vyrovnano pri tisku."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 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!"
 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
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu."
 msgstr "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."
 msgstr "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."
 msgstr "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."
 "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Kalibrace XYZ selhala. Nahlednete do manualu."
 msgstr "Kalibrace XYZ selhala. Nahlednete do manualu."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."
 "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Kalibrace XYZ v poradku. X/Y osy jsou kolme. Gratuluji!"
 msgstr "Kalibrace XYZ v poradku. X/Y osy jsou kolme. Gratuluji!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Y vzdalenost od min"
 msgstr "Y vzdalenost od min"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Korekce Y:"
 msgstr "Korekce Y:"
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr "Ano"
 msgstr "Ano"
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "Pruvodce muzete kdykoliv znovu spustit z menu Kalibrace -> Pruvodce"
 msgstr "Pruvodce muzete kdykoliv znovu spustit z menu Kalibrace -> Pruvodce"
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Korekce Z:"
 msgstr "Korekce Z:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr "Pocet mereni Z"
 msgstr "Pocet mereni Z"
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "[0;0] odsazeni bodu"
 msgstr "[0;0] odsazeni bodu"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "a stisknete tlacitko"
 msgstr "a stisknete tlacitko"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr "k zavedeni filamentu"
 msgstr "k zavedeni filamentu"
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "k vyjmuti filamentu"
 msgstr "k vyjmuti filamentu"
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr "neznamy"
 msgstr "neznamy"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr "neznamy stav"
 msgstr "neznamy stav"
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr "🔃Obnovit"
 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?"
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Detekovan naraz. Obnovit tisk?"
 #~ 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."
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Kal. prvni vrstvy"
 #~ 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr ""
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr ""
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr ""
 msgstr ""
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -369,39 +388,46 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr ""
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr ""
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -410,294 +436,417 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
 msgstr ""
 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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_EJECT_FILAMENT c=17
 #. 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"
 msgid "Eject filament"
 msgstr ""
 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"
 msgid "Ejecting filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr ""
 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
 #. 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"
 msgid "Extruder"
 msgstr ""
 msgstr ""
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr ""
 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
 #. 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"
 msgid "FS Action"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_FAIL_STATS c=18
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr ""
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr ""
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr ""
 msgstr ""
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr ""
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -705,7 +854,7 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -714,319 +863,372 @@ msgstr ""
 "dig gennem installationsprocessen?"
 "dig gennem installationsprocessen?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr ""
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr ""
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
 msgstr ""
 msgstr ""
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr ""
 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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOAD_ALL c=18
 #. 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 ""
 msgstr ""
 
 
 #. MSG_LOAD_FILAMENT c=17
 #. 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"
 msgid "Load filament"
 msgstr ""
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_MODE c=8
 #. 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"
 msgid "MMU Mode"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_FAILS c=15
 #. 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"
 msgid "MMU fails"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
 #. 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"
 msgid "MMU load fails"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_CONNECTED c=18
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr ""
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr ""
 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
 #. 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"
 msgid "N/A"
 msgstr ""
 msgstr ""
 
 
@@ -1036,178 +1238,203 @@ msgid "New firmware version available:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr ""
 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
 #. 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"
 msgid "Off"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
 msgstr ""
 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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr ""
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "rebooting the printer."
@@ -1219,78 +1446,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr ""
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr ""
 msgstr ""
 
 
@@ -1299,289 +1521,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr ""
 msgstr ""
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr ""
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
 msgstr ""
 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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr ""
 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
 #. 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"
 msgid "Reset"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr ""
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr ""
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr ""
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr ""
 msgstr ""
 
 
@@ -1591,31 +1866,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1624,18 +1899,18 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr ""
 msgstr ""
 
 
@@ -1647,112 +1922,171 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr ""
 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
 #. 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"
 msgid "Stop print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr ""
 msgstr ""
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr ""
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1760,73 +2094,109 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr ""
 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"
 msgid "Unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr ""
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr ""
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1835,210 +2205,210 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr ""
 msgstr ""
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr ""
 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr " 0.3 oder älter"
 msgstr " 0.3 oder älter"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr " 0.4 oder neuer"
 msgstr " 0.4 oder neuer"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "%s Level erwartet"
 msgstr "%s Level erwartet"
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ">Abbruch"
 msgstr ">Abbruch"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Z Anpassen:"
 msgstr "Z Anpassen:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr "Alles richtig"
 msgstr "Alles richtig"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr "Alles abgeschlossen. Viel Spaß beim Drucken!"
 msgstr "Alles abgeschlossen. Viel Spaß beim Drucken!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr "Alphabet"
 msgstr "Alphabet"
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr "Immer"
 msgstr "Immer"
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Raumtemp."
 msgstr "Raumtemp."
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "Sind linke+rechte Z- Schlitten ganz oben?"
 msgstr "Sind linke+rechte Z- Schlitten ganz oben?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr "Assist."
 msgstr "Assist."
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr "Auto"
 msgstr "Auto"
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr "Startposition"
 msgstr "Startposition"
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr "Auto Leist"
 msgstr "Auto Leist"
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "AutoLaden 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 msgstr ""
 "Automatisches Laden Filament ist aktiv, Knopf drücken und Filament "
 "Automatisches Laden Filament ist aktiv, Knopf drücken und Filament "
 "einlegen..."
 "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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr "Achse"
 msgstr "Achse"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Achsenlänge"
 msgstr "Achsenlänge"
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr "Zurück"
 msgstr "Zurück"
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr "Bett"
 msgstr "Bett"
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr "Bett aufwärmen"
 msgstr "Bett aufwärmen"
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr "Bett OK"
 msgstr "Bett OK"
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Bett Level Korr."
 msgstr "Bett Level Korr."
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
@@ -169,50 +171,55 @@ msgstr ""
 "Z-Kal. fehlgeschlg. Sensor nicht ausgelöst. Schmutzige Düse? Warte auf Reset."
 "Z-Kal. fehlgeschlg. Sensor nicht ausgelöst. Schmutzige Düse? Warte auf Reset."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Bett/Heizung"
 msgstr "Bett/Heizung"
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr "Gurtstatus"
 msgstr "Gurtstatus"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Riementest"
 msgstr "Riementest"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Stromausfall! Druck wiederherstellen?"
 msgstr "Stromausfall! Druck wiederherstellen?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr "Hell"
 msgstr "Hell"
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr "Helligkeit"
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "Kalibrierung XYZ"
 msgstr "Kalibrierung XYZ"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Kalibrierung Z"
 msgstr "Kalibrierung Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -221,13 +228,13 @@ msgstr ""
 "Anschliessend den Knopf drücken."
 "Anschliessend den Knopf drücken."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr "Kalibriere Z"
 msgstr "Kalibriere Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -236,140 +243,153 @@ msgstr ""
 "Anschliessend den Knopf drücken."
 "Anschliessend den Knopf drücken."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Kalibriere Start"
 msgstr "Kalibriere Start"
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr "Kalibrierung"
 msgstr "Kalibrierung"
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Kalibrierung OK"
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr "SD Karte entfernt"
 msgstr "SD Karte entfernt"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr "Wechsel SD Karte"
 msgstr "Wechsel SD Karte"
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr "Filament-Wechsel"
 msgstr "Filament-Wechsel"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Wechsel erfolgr.!"
 msgstr "Wechsel erfolgr.!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Wechsel ok?"
 msgstr "Wechsel ok?"
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr "Prüfe X Achse"
 msgstr "Prüfe X Achse"
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr "Prüfe Y Achse"
 msgstr "Prüfe Y Achse"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Prüfe Z Achse"
 msgstr "Prüfe Z Achse"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr "Prüfe Bett"
 msgstr "Prüfe Bett"
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Prüfe Endschalter"
 msgstr "Prüfe Endschalter"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Überprüfe Datei"
 msgstr "Überprüfe Datei"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Prüfe Düse"
 msgstr "Prüfe Düse"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr "Prüfe Sensoren"
 msgstr "Prüfe Sensoren"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr "Kontrolle"
 msgstr "Kontrolle"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Falsche Farbe"
 msgstr "Falsche Farbe"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr "Von der Community"
 msgstr "Von der Community"
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr "Weit."
 msgstr "Weit."
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Abkühlen"
 msgstr "Abkühlen"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Gewählte Sprache kopieren?"
 msgstr "Gewählte Sprache kopieren?"
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr "Crash"
 msgstr "Crash"
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr "Crash Erk."
 msgstr "Crash Erk."
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr "Crash erkannt."
 msgstr "Crash erkannt."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -380,39 +400,46 @@ msgstr ""
 "genutzt werden"
 "genutzt werden"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr "Fil. schneiden"
 msgstr "Fil. schneiden"
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr "Messer"
 msgstr "Messer"
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Schneide filament"
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr "Datum:"
 msgstr "Datum:"
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr "Dimm"
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr "Motoren aus"
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -424,7 +451,7 @@ msgstr ""
 "Abschnitt Erste Schicht Kalibrierung."
 "Abschnitt Erste Schicht Kalibrierung."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
@@ -432,222 +459,357 @@ msgstr ""
 "Möchten Sie den letzten Schritt wiederholen, um den Abstand zwischen Düse "
 "Möchten Sie den letzten Schritt wiederholen, um den Abstand zwischen Düse "
 "und Druckbett neu einzustellen?"
 "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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "E-Korrektur:"
 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
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgid "ERROR:"
 msgstr "FEHLER:"
 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
 #. 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"
 msgid "Eject filament"
 msgstr "Filamentauswurf"
 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"
 msgid "Ejecting filament"
 msgstr "werfe Filament aus"
 msgstr "werfe Filament aus"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr "Endanschlag"
 msgstr "Endanschlag"
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Ende nicht getroffen"
 msgstr "Ende nicht getroffen"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr "Endschalter"
 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
 #. 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"
 msgid "Extruder"
 msgstr "Extruder"
 msgstr "Extruder"
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr "Extruderlüfter:"
 msgstr "Extruderlüfter:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr "Extruder Info"
 msgstr "Extruder Info"
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr "F. autoladen"
 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
 #. 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"
 msgid "FS Action"
 msgstr "FS Aktion"
 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
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Fehlerstatistik"
 msgstr "Fehlerstatistik"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "MMU-Fehler"
 msgstr "MMU-Fehler"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Falschtriggerung"
 msgstr "Falschtriggerung"
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr "Lüfter-Tempo"
 msgstr "Lüfter-Tempo"
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr "Lüftertest"
 msgstr "Lüftertest"
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr "Lüfter 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
 #. 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"
 msgid "Fil. runouts"
 msgstr "Fil. Mängel"
 msgstr "Fil. Mängel"
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr "Fil. Sensor"
 msgstr "Fil. Sensor"
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr "Filament"
 msgstr "Filament"
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr "Filament extrudiert mit richtiger Farbe?"
 msgstr "Filament extrudiert mit richtiger Farbe?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Fil. nicht geladen"
 msgstr "Fil. nicht geladen"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr "Filamentsensor"
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Filament benutzt"
 msgstr "Filament benutzt"
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "Datei unvollständig Trotzdem fortfahren?"
 msgstr "Datei unvollständig Trotzdem fortfahren?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr "Bewegung beenden"
 msgstr "Bewegung beenden"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr "Erste-Schicht Kal."
 msgstr "Erste-Schicht Kal."
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "Zunächst führe ich den Selbsttest durch, um die häufigsten Probleme beim "
 "Zunächst führe ich den Selbsttest durch, um die häufigsten Probleme beim "
 "Zusammenbau zu überprüfen."
 "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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr "Durchfluss"
 msgstr "Durchfluss"
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr "Drucklüfter?"
 msgstr "Drucklüfter?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Vorne [μm]"
 msgstr "Vorne [μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Druck/Extr. Lüfter"
 msgstr "Druck/Extr. Lüfter"
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-Code ist für einen anderen Level geslict. Fortfahren?"
 msgstr "G-Code ist für einen anderen Level geslict. Fortfahren?"
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
@@ -656,14 +818,14 @@ msgstr ""
 "erneut. Druck abgebrochen."
 "erneut. Druck abgebrochen."
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-Code ist für einen anderen Drucker geslict. Fortfahren?"
 msgstr "G-Code ist für einen anderen Drucker geslict. Fortfahren?"
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
@@ -672,12 +834,12 @@ msgstr ""
 "erneut. Druck abgebrochen."
 "erneut. Druck abgebrochen."
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-Code ist für eine neuere Firmware geslict. Fortfahren?"
 msgstr "G-Code ist für eine neuere Firmware geslict. Fortfahren?"
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
@@ -686,42 +848,42 @@ msgstr ""
 "Druck abgebrochen."
 "Druck abgebrochen."
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr "Gcode"
 msgstr "Gcode"
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr "HW Einstellungen"
 msgstr "HW Einstellungen"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Heizung/Thermistor"
 msgstr "Heizung/Thermistor"
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr "Aufwärmen"
 msgstr "Aufwärmen"
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr "Heizung durch Sicherheitstimer deaktiviert."
 msgstr "Heizung durch Sicherheitstimer deaktiviert."
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr "Aufwärmen OK."
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "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."
 "Danach sind Sie bereit für den Druck."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -741,26 +903,47 @@ msgstr ""
 "durch den Einricht- ungsablauf führe?"
 "durch den Einricht- ungsablauf führe?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr "Hohe leist"
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 msgstr ""
 "Ich werde jetzt die XYZ-Kalibrierung durchführen. Es wird ca. 12 Minuten "
 "Ich werde jetzt die XYZ-Kalibrierung durchführen. Es wird ca. 12 Minuten "
 "dauern."
 "dauern."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Ich werde jetzt die Z Kalibrierung durchführen."
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -769,27 +952,27 @@ msgstr ""
 "Voreinstellungen unter Einstellungen - HW Setup - Stahlbleche."
 "Voreinstellungen unter Einstellungen - HW Setup - Stahlbleche."
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr "Verbesserung des Bettkalibrierungspunkts"
 msgstr "Verbesserung des Bettkalibrierungspunkts"
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Infoanzeige"
 msgstr "Infoanzeige"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr "Init. SD Karte"
 msgstr "Init. SD Karte"
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Filament einlegen"
 msgstr "Filament einlegen"
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
@@ -797,269 +980,310 @@ msgstr ""
 "Stecken Sie das Filament (nicht laden) in den Extruder und drücken Sie dann "
 "Stecken Sie das Filament (nicht laden) in den Extruder und drücken Sie dann "
 "den Knopf."
 "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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr "Ist das Filament geladen?"
 msgstr "Ist das Filament geladen?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Liegt das Stahlblech auf dem Heizbett?"
 msgstr "Liegt das Stahlblech auf dem Heizbett?"
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr "Wiederholung"
 msgstr "Wiederholung"
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr "Letzter Druck"
 msgstr "Letzter Druck"
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr "Letzte Druckfehler"
 msgstr "Letzte Druckfehler"
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr "Links"
 msgstr "Links"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr "Extruderlüfter?"
 msgstr "Extruderlüfter?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Links [μm]"
 msgstr "Links [μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Hell.wert"
 msgstr "Hell.wert"
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Dimmwert"
 msgstr "Dimmwert"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Lineare Korrektur"
 msgstr "Lineare Korrektur"
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr "Z einstellen"
 msgstr "Z einstellen"
 
 
 #. MSG_LOAD_ALL c=18
 #. 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"
 msgstr "Alle laden"
 
 
 #. MSG_LOAD_FILAMENT c=17
 #. 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"
 msgid "Load filament"
 msgstr "Filament laden"
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "In Düse laden"
 msgstr "In Düse laden"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Lade Farbe"
 msgstr "Lade Farbe"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr "Filament lädt"
 msgstr "Filament lädt"
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Lose Riemenscheibe"
 msgstr "Lose Riemenscheibe"
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr "Laut"
 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
 #. 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"
 msgid "MMU Mode"
 msgstr "MMU Mod."
 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
 #. 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"
 msgid "MMU fails"
 msgstr "MMU Fehler"
 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
 #. 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"
 msgid "MMU load fails"
 msgstr "MMU Ladefehler"
 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
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 verbunden"
 msgstr "MMU2 verbunden"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Magnet Komp."
 msgstr "Magnet Komp."
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr "Hauptmenü"
 msgstr "Hauptmenü"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "Schräglauf"
 msgstr "Schräglauf"
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr "Messen der Referenzhöhe des Kalibrierpunktes"
 msgstr "Messen der Referenzhöhe des Kalibrierpunktes"
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr "Gitter"
 msgstr "Gitter"
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr "MeshBett Ausgleich"
 msgstr "MeshBett Ausgleich"
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr "Modus"
 msgstr "Modus"
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Moduswechsel erfolgt..."
 msgstr "Moduswechsel erfolgt..."
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr "Modell"
 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
 #. 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"
 msgid "Motor"
 msgstr "Motor"
 msgstr "Motor"
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr "Bewege X"
 msgstr "Bewege X"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Bewege Y"
 msgstr "Bewege Y"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Bewege Z"
 msgstr "Bewege Z"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Achse bewegen"
 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
 #. 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"
 msgid "N/A"
 msgstr "N/V"
 msgstr "N/V"
 
 
@@ -1069,155 +1293,163 @@ msgid "New firmware version available:"
 msgstr "Neue Firmware- Version verfügbar:"
 msgstr "Neue Firmware- Version verfügbar:"
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr "Nein"
 msgstr "Nein"
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr "Keine SD Karte"
 msgstr "Keine SD Karte"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr "Keine Bewegung."
 msgstr "Keine Bewegung."
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr "Ohne"
 msgstr "Ohne"
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr "Normal"
 msgstr "Normal"
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr "Nicht angeschlossen"
 msgstr "Nicht angeschlossen"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr "Dreht sich nicht"
 msgstr "Dreht sich nicht"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
 "Jetzt werde ich den Abstand zwischen Düsenspitze und Druckbett kalibrieren."
 "Jetzt werde ich den Abstand zwischen Düsenspitze und Druckbett kalibrieren."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Jetzt werde ich die Düse für PLA vorheizen."
 msgstr "Jetzt werde ich die Düse für PLA vorheizen."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr "Testdruck jetzt von Stahlblech entfernen."
 msgstr "Testdruck jetzt von Stahlblech entfernen."
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr "Düse"
 msgstr "Düse"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "Düsen Dia."
 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
 #. 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"
 msgid "Off"
 msgstr "Aus"
 msgstr "Aus"
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 "Alte Einstellungen gefunden. Standard PID, E-Steps u.s.w. werden gesetzt."
 "Alte Einstellungen gefunden. Standard PID, E-Steps u.s.w. werden gesetzt."
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr "An"
 msgstr "An"
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr "Einmal"
 msgstr "Einmal"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr "PAUSE THERM. FEHLER"
 msgstr "PAUSE THERM. FEHLER"
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr "PID Kal."
 msgstr "PID Kal."
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "PID Kalib. fertig"
 msgstr "PID Kalib. fertig"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "PID Kalibrierung"
 msgstr "PID Kalibrierung"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "PINDA erwärmen"
 msgstr "PINDA erwärmen"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr "PINDA Kal."
 msgstr "PINDA Kal."
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "PINDA-Kalibrierung fehlgeschlagen"
 msgstr "PINDA-Kalibrierung fehlgeschlagen"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
@@ -1225,19 +1457,36 @@ msgstr ""
 "PINDA Kalibrierung ist fertig + aktiv. Es kann ausgeschaltet werden im Menu "
 "PINDA Kalibrierung ist fertig + aktiv. Es kann ausgeschaltet werden im Menu "
 "Einstellungen -> PINDA kal."
 "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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr "Pause"
 msgstr "Pause"
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr "Druck pausieren"
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1247,7 +1496,7 @@ msgstr ""
 "ausschalten."
 "ausschalten."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "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."
 msgstr "Bitte IR Sensor Verbindungen über- prüfen und Filament entladen ist."
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Bitte prüfen:"
 msgstr "Bitte prüfen:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Bitte reinigen Sie das Heizbett und drücken Sie dann den Knopf."
 msgstr "Bitte reinigen Sie das Heizbett und drücken Sie dann den Knopf."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 msgstr ""
 "Bitte entfernen Sie überstehendes Filament von der Düse. Klicken wenn sauber."
 "Bitte entfernen Sie überstehendes Filament von der Düse. Klicken wenn sauber."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
@@ -1285,7 +1534,7 @@ msgstr ""
 "Knopf, um es zu laden."
 "Knopf, um es zu laden."
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1294,50 +1543,45 @@ msgstr ""
 "Sie dann den Knopf, um es zu laden."
 "Sie dann den Knopf, um es zu laden."
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Bitte laden Sie zuerst das Filament."
 msgstr "Bitte laden Sie zuerst das Filament."
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr "Bitte Spannrolle öffnen und Filament von Hand entfernen"
 msgstr "Bitte Spannrolle öffnen und Filament von Hand entfernen"
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr "Bitte legen Sie das Stahlblech auf das Heizbett."
 msgstr "Bitte legen Sie das Stahlblech auf das Heizbett."
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr "Bitte drücken Sie den Knopf um das Filament zu entladen."
 msgstr "Bitte drücken Sie den Knopf um das Filament zu entladen."
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr "Bitte ziehen Sie das Filament sofort heraus"
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Bitte zuerst Transportsicherungen entfernen."
 msgstr "Bitte zuerst Transportsicherungen entfernen."
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Bitte entfernen Sie das Stahlblech vom Heizbett."
 msgstr "Bitte entfernen Sie das Stahlblech vom Heizbett."
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Bitte zuerst XYZ Kalibrierung ausführen."
 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."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Bitte entladen Sie erst das Filament und versuchen Sie es nochmal."
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr "Bitte aktualisieren."
 msgstr "Bitte aktualisieren."
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr "Bitte warten"
 msgstr "Bitte warten"
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr "Netzfehler"
 msgstr "Netzfehler"
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Vorheizen"
 msgstr "Vorheizen"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr "Düse vorheizen!"
 msgstr "Düse vorheizen!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr "Vorheizen der Düse. Bitte warten."
 msgstr "Vorheizen der Düse. Bitte warten."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Heizen zum Schnitt"
 msgstr "Heizen zum Schnitt"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Heizen zum Auswurf"
 msgstr "Heizen zum Auswurf"
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Heizen zum Laden"
 msgstr "Heizen zum Laden"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Heizen zum Entladen"
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "Knopf drücken zum"
 msgstr "Knopf drücken zum"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Bitte drücken Sie den Knopf um die Düse vorzuheizen und fortzufahren."
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Druck abgebrochen"
 msgstr "Druck abgebrochen"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr "Drucklüfter:"
 msgstr "Drucklüfter:"
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr "Drucken von SD"
 msgstr "Drucken von SD"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Druck pausiert"
 msgstr "Druck pausiert"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr "Druckzeit"
 msgstr "Druckzeit"
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr "Drucker IP Adr.:"
 msgstr "Drucker IP Adr.:"
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1461,12 +1701,12 @@ msgstr ""
 "Erste Schritte, Abschnitt Kalibrie- rungsablauf."
 "Erste Schritte, Abschnitt Kalibrie- rungsablauf."
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Der Durchmesser der Druckerdüse weicht vom G-Code ab. Fortfahren?"
 msgstr "Der Durchmesser der Druckerdüse weicht vom G-Code ab. Fortfahren?"
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
@@ -1474,67 +1714,116 @@ msgstr ""
 "Der Durchmesser der Druckerdüse weicht vom G-Code ab. Bitte überprüfen Sie "
 "Der Durchmesser der Druckerdüse weicht vom G-Code ab. Bitte überprüfen Sie "
 "den Wert in den Einstellungen. Druck abgebrochen."
 "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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr "RPi port"
 msgstr "RPi port"
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Hinten [μm]"
 msgstr "Hinten [μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Druck wiederherst"
 msgstr "Druck wiederherst"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 "Entfernen Sie das alte Filament und drücken Sie den Knopf, um das neue zu "
 "Entfernen Sie das alte Filament und drücken Sie den Knopf, um das neue zu "
 "laden."
 "laden."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr "Umbenennen"
 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
 #. 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"
 msgid "Reset"
 msgstr "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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr "Reset XYZ Kalibr."
 msgstr "Reset XYZ Kalibr."
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr "Druck fortsetzen"
 msgstr "Druck fortsetzen"
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Druck fortgesetzt"
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr "Rechts"
 msgstr "Rechts"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Rechts [μm]"
 msgstr "Rechts [μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1542,36 +1831,41 @@ msgstr ""
 "Der Assistent wird die aktuellen Kalibrierungsdaten löschen und von vorne "
 "Der Assistent wird die aktuellen Kalibrierungsdaten löschen und von vorne "
 "beginnen. Fortfahren?"
 "beginnen. Fortfahren?"
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Mängel"
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr "SD Karte"
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "GESTOPPT."
 msgstr "GESTOPPT."
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr "Suche Bett Kalibrierpunkt"
 msgstr "Suche Bett Kalibrierpunkt"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr "Auswahl"
 msgstr "Auswahl"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
@@ -1580,65 +1874,72 @@ msgstr ""
 "im On-Screen-Menu aus."
 "im On-Screen-Menu aus."
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr "Wähle extruder:"
 msgstr "Wähle extruder:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr "Wähle filament:"
 msgstr "Wähle filament:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr "Wähle Sprache"
 msgstr "Wähle Sprache"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr "Bitte Vorheiztemperatur auswählen, die Ihrem Material entspricht."
 msgstr "Bitte Vorheiztemperatur auswählen, die Ihrem Material entspricht."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Wählen Sie die Temperatur, die zu Ihrem Material passt."
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr "Selbsttest OK"
 msgstr "Selbsttest OK"
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr "Selbsttest start"
 msgstr "Selbsttest start"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr "Selbsttest"
 msgstr "Selbsttest"
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr "Selbsttest Fehler!"
 msgstr "Selbsttest Fehler!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr "Selbsttest Error"
 msgstr "Selbsttest Error"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr "Selbsttest wird gestartet, um Startposition zu kalibrieren."
 msgstr "Selbsttest wird gestartet, um Startposition zu kalibrieren."
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "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."
 msgstr "Sensor überprüft, entladen Sie jetzt das Filament."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Temp. einstellen:"
 msgstr "Temp. einstellen:"
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr "Einstellungen"
 msgstr "Einstellungen"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "Sehr schräg"
 msgstr "Sehr schräg"
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr "Stahlblech"
 msgstr "Stahlblech"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1685,18 +1986,18 @@ msgstr ""
 "%cReset"
 "%cReset"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Endschalter Status"
 msgstr "Endschalter Status"
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr "Leise"
 msgstr "Leise"
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Leicht schräg"
 msgstr "Leicht schräg"
 
 
@@ -1709,113 +2010,179 @@ msgstr ""
 "Einige Dateien wur- den nicht sortiert. Max. Dateien pro Verzeichnis = 100."
 "Einige Dateien wur- den nicht sortiert. Max. Dateien pro Verzeichnis = 100."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Fehler aufgetreten, Z-Kalibrierung erforderlich..."
 msgstr "Fehler aufgetreten, Z-Kalibrierung erforderlich..."
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr "Sort."
 msgstr "Sort."
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr "Sortiere Dateien"
 msgstr "Sortiere Dateien"
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr "Ton"
 msgstr "Ton"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr "Geschwindigkeit"
 msgstr "Geschwindigkeit"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr "Dreht sich"
 msgstr "Dreht sich"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 "Stabile Umgebungs- temperatur 21-26C und feste Stand- fläche erforderlich"
 "Stabile Umgebungs- temperatur 21-26C und feste Stand- fläche erforderlich"
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Statistiken"
 msgstr "Statistiken"
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr "Leise"
 msgstr "Leise"
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr "Stahlbleche"
 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
 #. 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"
 msgid "Stop print"
 msgstr "Druck abbrechen"
 msgstr "Druck abbrechen"
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr "Strikt"
 msgstr "Strikt"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr "Support"
 msgstr "Support"
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Ausgetauscht"
 msgstr "Ausgetauscht"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr "THERMISCHE ANOMALIE"
 msgstr "THERMISCHE ANOMALIE"
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr "TM kal. fehlgeschlg."
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr "Temp. Model Autokal."
 msgstr "Temp. Model Autokal."
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr "Temperatur"
 msgstr "Temperatur"
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr "Temperaturen"
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1826,7 +2193,7 @@ msgstr ""
 "im Handbuch (Kapitel Kalibrierung)."
 "im Handbuch (Kapitel Kalibrierung)."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -1835,68 +2202,106 @@ msgstr ""
 "Sie das Handbuch, Kapitel Erste Schritte, Abschnitt Kalibrierablauf."
 "Sie das Handbuch, Kapitel Erste Schritte, Abschnitt Kalibrierablauf."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr "Zeit"
 msgstr "Zeit"
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr "Timeout"
 msgstr "Timeout"
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr "Gesamt"
 msgstr "Gesamt"
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr "Gesamte Fehler"
 msgstr "Gesamte Fehler"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Gesamtes Filament"
 msgstr "Gesamtes Filament"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Gesamte Druckzeit"
 msgstr "Gesamte Druckzeit"
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr "Feineinstellung"
 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"
 msgid "Unload filament"
 msgstr "Fil. entladen"
 msgstr "Fil. entladen"
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr "Filament auswerfen"
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 msgstr ""
 "Überprüfung fehl- geschlagen, entladen Sie das Filament und versuchen Sie es "
 "Überprüfung fehl- geschlagen, entladen Sie das Filament und versuchen Sie es "
 "erneut."
 "erneut."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Spannungen"
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1909,99 +2314,99 @@ msgstr ""
 "Stealth Modus"
 "Stealth Modus"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Warte auf Benutzer.."
 msgstr "Warte auf Benutzer.."
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "Warten, bis PINDA- Sonde abgekühlt ist"
 msgstr "Warten, bis PINDA- Sonde abgekühlt ist"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Warten bis Heizung und Bett abgekühlt sind"
 msgstr "Warten bis Heizung und Bett abgekühlt sind"
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr "Warnen"
 msgstr "Warnen"
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Warnung: Druckertyp und Platinentyp wurden beide geändert."
 msgstr "Warnung: Druckertyp und Platinentyp wurden beide geändert."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Warnung: Platinentyp wurde geändert."
 msgstr "Warnung: Platinentyp wurde geändert."
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Warnung: Druckertyp wurde geändert."
 msgstr "Warnung: Druckertyp wurde geändert."
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Konnten Sie das Filament entnehmen?"
 msgstr "Konnten Sie das Filament entnehmen?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr "Verdrahtungsfehler"
 msgstr "Verdrahtungsfehler"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr "Assistent"
 msgstr "Assistent"
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "X-Korrektur:"
 msgstr "X-Korrektur:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr "XFLASH init"
 msgstr "XFLASH init"
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "XYZ Kal. Details"
 msgstr "XYZ Kal. Details"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "XYZ Kalibrierung in Ordnung. Schräglauf wird automatisch korrigiert."
 msgstr "XYZ Kalibrierung in Ordnung. Schräglauf wird automatisch korrigiert."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 "XYZ Kalibrierung in Ordnung. X/Y Achsen sind etwas schräg. Gut gemacht!"
 "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
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "XYZ-Kalibrierung beeinträchtigt. Vordere Kalibrierpunkte nicht erreichbar."
 "XYZ-Kalibrierung beeinträchtigt. Vordere Kalibrierpunkte nicht erreichbar."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
@@ -2009,125 +2414,185 @@ msgstr ""
 "erreichbar."
 "erreichbar."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden."
 msgstr "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar."
 "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch."
 msgstr "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt ist nicht "
 "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt ist nicht "
 "erreichbar."
 "erreichbar."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "XYZ-Kalibrierung ok. X/Y-Achsen sind senkrecht zueinander Glückwunsch!"
 msgstr "XYZ-Kalibrierung ok. X/Y-Achsen sind senkrecht zueinander Glückwunsch!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Y Entfernung vom Min"
 msgstr "Y Entfernung vom Min"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Y-Korrektur:"
 msgstr "Y-Korrektur:"
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr "Ja"
 msgstr "Ja"
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 "Sie können den Assistenten immer im Menu neu starten: Kalibrierung -> "
 "Sie können den Assistenten immer im Menu neu starten: Kalibrierung -> "
 "Assistent"
 "Assistent"
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Z-Korrektur:"
 msgstr "Z-Korrektur:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr "Z-Test Nr."
 msgstr "Z-Test Nr."
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "[0;0] Punktversatz"
 msgstr "[0;0] Punktversatz"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "und Knopf drücken"
 msgstr "und Knopf drücken"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr "um Filament laden"
 msgstr "um Filament laden"
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "um Filament entladen"
 msgstr "um Filament entladen"
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr "unbekannt"
 msgstr "unbekannt"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr "Status unbekannt"
 msgstr "Status unbekannt"
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr "🔃Aktualisiere"
 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?"
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Crash erkannt. Druck fortführen?"
 #~ 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."
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Erste-Schicht Kal."
 #~ 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr " 0.3 o mayor"
 msgstr " 0.3 o mayor"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr " 0.4 o mas nueva"
 msgstr " 0.4 o mas nueva"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "%s nivel esperado"
 msgstr "%s nivel esperado"
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ">Cancelar"
 msgstr ">Cancelar"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Ajustar-Z:"
 msgstr "Ajustar-Z:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr "Todo bien"
 msgstr "Todo bien"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr "Terminado! Feliz impresion!"
 msgstr "Terminado! Feliz impresion!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr "Alfabet"
 msgstr "Alfabet"
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Ambiente"
 msgstr "Ambiente"
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "Carros Z izq./der. estan arriba maximo?"
 msgstr "Carros Z izq./der. estan arriba maximo?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr "Asist."
 msgstr "Asist."
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr "Llevar al origen"
 msgstr "Llevar al origen"
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr "Encendido"
 msgstr "Encendido"
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "Carga auto. filam."
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 msgstr ""
 "La carga automatica esta activada, pulse el dial e inserte el filamento..."
 "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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr "Eje"
 msgstr "Eje"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Longitud del eje"
 msgstr "Longitud del eje"
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr "atras"
 msgstr "atras"
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr "Base"
 msgstr "Base"
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr "Calentando Base"
 msgstr "Calentando Base"
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr "Base preparada"
 msgstr "Base preparada"
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Corr. de la cama"
 msgstr "Corr. de la cama"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
@@ -168,50 +170,55 @@ msgstr ""
 "Nivelacion fallada. Sensor no funciona. Restos en boquilla? Esperando reset."
 "Nivelacion fallada. Sensor no funciona. Restos en boquilla? Esperando reset."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Base/Calentador"
 msgstr "Base/Calentador"
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr "Estado de correa"
 msgstr "Estado de correa"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Test cinturon"
 msgstr "Test cinturon"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Se fue la luz. Re- anudar la impresion?"
 msgstr "Se fue la luz. Re- anudar la impresion?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr "Brill."
 msgstr "Brill."
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr "Brillo"
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "Calibrar XYZ"
 msgstr "Calibrar XYZ"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Calibrar Z"
 msgstr "Calibrar Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -220,13 +227,13 @@ msgstr ""
 "superiores. Despues haz clic."
 "superiores. Despues haz clic."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr "Calibrando Z"
 msgstr "Calibrando Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -235,140 +242,151 @@ msgstr ""
 "superiores. Despues haz clic."
 "superiores. Despues haz clic."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Calibrar pos.inicial"
 msgstr "Calibrar pos.inicial"
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr "Calibracion"
 msgstr "Calibracion"
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Calibracion OK"
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr "Tarjeta retirada"
 msgstr "Tarjeta retirada"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr "Cambiar filamento"
 msgstr "Cambiar filamento"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Cambio correcto!"
 msgstr "Cambio correcto!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Cambio correcto?"
 msgstr "Cambio correcto?"
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr "Control sensor X"
 msgstr "Control sensor X"
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr "Control sensor Y"
 msgstr "Control sensor Y"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Control sensor Z"
 msgstr "Control sensor Z"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr "Control base cal."
 msgstr "Control base cal."
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Control endstops"
 msgstr "Control endstops"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Verif. archivo"
 msgstr "Verif. archivo"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Control fusor"
 msgstr "Control fusor"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr "Comprobando sensores"
 msgstr "Comprobando sensores"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr "Comprobaciones"
 msgstr "Comprobaciones"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Color no homogeneo"
 msgstr "Color no homogeneo"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr "Desde la comunidad"
 msgstr "Desde la comunidad"
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr ""
 msgstr ""
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Enfriar"
 msgstr "Enfriar"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Copiar idioma seleccionado?"
 msgstr "Copiar idioma seleccionado?"
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr "Choque"
 msgstr "Choque"
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr "Det. choque"
 msgstr "Det. choque"
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr "Choque detectado."
 msgstr "Choque detectado."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -379,39 +397,46 @@ msgstr ""
 "Modo normal"
 "Modo normal"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr "Cortar filament"
 msgstr "Cortar filament"
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr "Cuchillo"
 msgstr "Cuchillo"
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Corte de filament"
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr "Fecha:"
 msgstr "Fecha:"
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr "Oscuro"
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr "Apagar motores"
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -423,230 +448,352 @@ msgstr ""
 "primera capa."
 "primera capa."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
 msgstr ""
 msgstr ""
 "Quieres repetir el ultimo paso para reajustar la distancia boquilla-base?"
 "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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "Corregir-E:"
 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 ""
 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 ""
 msgstr ""
-"ERROR:Sensor de fi- lamento no responde Por favor, comprue- ba la conexion."
 
 
 #. MSG_EJECT_FILAMENT c=17
 #. 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"
 msgid "Eject filament"
 msgstr "Expulsar fil."
 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"
 msgid "Ejecting filament"
 msgstr "Expulsando filamento"
 msgstr "Expulsando filamento"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Endstop no alcanzado"
 msgstr "Endstop no alcanzado"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr ""
 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
 #. 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"
 msgid "Extruder"
 msgstr "Extruir"
 msgstr "Extruir"
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr "Vent.extrusor:"
 msgstr "Vent.extrusor:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr "Info. del extrusor"
 msgstr "Info. del extrusor"
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr "Autocarg.fil."
 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
 #. 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"
 msgid "FS Action"
 msgstr "FS accion"
 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
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Estadistica Fallos"
 msgstr "Estadistica Fallos"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "Total Fallos MMU"
 msgstr "Total Fallos MMU"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Falsa activacion"
 msgstr "Falsa activacion"
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr "Velocidad Vent"
 msgstr "Velocidad Vent"
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr "Test ventiladores"
 msgstr "Test ventiladores"
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr "Comprob.vent"
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr "Fil. acabado"
 msgstr "Fil. acabado"
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr "Sensor Fil."
 msgstr "Sensor Fil."
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr "Filamento"
 msgstr "Filamento"
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr "Es nitido el color nuevo?"
 msgstr "Es nitido el color nuevo?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Fil. no introducido"
 msgstr "Fil. no introducido"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr "Sensor de fil."
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Filamento usado"
 msgstr "Filamento usado"
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "Archivo incompleto. Continuar de todos modos?"
 msgstr "Archivo incompleto. Continuar de todos modos?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr "Term. movimientos"
 msgstr "Term. movimientos"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr "Cal. primera cap."
 msgstr "Cal. primera cap."
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "Primero, hare el Selftest para comprobar los problemas de montaje mas "
 "Primero, hare el Selftest para comprobar los problemas de montaje mas "
 "comunes."
 "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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr "Flujo"
 msgstr "Flujo"
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr "Vent. frontal?"
 msgstr "Vent. frontal?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Frontal [μm]"
 msgstr "Frontal [μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Vents. front/izqui"
 msgstr "Vents. front/izqui"
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr "Codigo G laminado para un nivel diferente. Continuar?"
 msgstr "Codigo G laminado para un nivel diferente. Continuar?"
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
@@ -655,14 +802,14 @@ msgstr ""
 "nuevo. Impresion cancelada."
 "nuevo. Impresion cancelada."
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "Codigo G laminado para un tipo de impresora diferente. Continuar?"
 msgstr "Codigo G laminado para un tipo de impresora diferente. Continuar?"
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
@@ -671,12 +818,12 @@ msgstr ""
 "de nuevo. Impresion cancelada."
 "de nuevo. Impresion cancelada."
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "Codigo G laminado para nuevo firmware. Continuar?"
 msgstr "Codigo G laminado para nuevo firmware. Continuar?"
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
@@ -685,42 +832,42 @@ msgstr ""
 "Impresion cancelada."
 "Impresion cancelada."
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr "Configuracion HW"
 msgstr "Configuracion HW"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Calentador/Termistor"
 msgstr "Calentador/Termistor"
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr "Calentando..."
 msgstr "Calentando..."
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr "Calentadores desactivados por el temporizador de seguridad."
 msgstr "Calentadores desactivados por el temporizador de seguridad."
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr "Calentando acabado."
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -731,7 +878,7 @@ msgstr ""
 "listo para imprimir."
 "listo para imprimir."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -740,24 +887,45 @@ msgstr ""
 "configuracion?"
 "configuracion?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr "Rend.pleno"
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Hare la calibracion XYZ. Tardara 12 min. aproximadamente."
 msgstr "Hare la calibracion XYZ. Tardara 12 min. aproximadamente."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Voy a hacer Calibracion Z ahora."
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -766,296 +934,328 @@ msgstr ""
 "Ajustes HW - Planchas acero."
 "Ajustes HW - Planchas acero."
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Monitorizar"
 msgstr "Monitorizar"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Introducir filamento"
 msgstr "Introducir filamento"
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr ""
 msgstr ""
 "Inserte el filamento (no lo cargue) en el extrusor y luego presione el dial."
 "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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr "Esta el filamento cargado?"
 msgstr "Esta el filamento cargado?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Esta coloc.la lamina sobre la base?"
 msgstr "Esta coloc.la lamina sobre la base?"
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr "Iteracion"
 msgstr "Iteracion"
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr "Ultima impresion"
 msgstr "Ultima impresion"
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr "Ultimos imp. fallos"
 msgstr "Ultimos imp. fallos"
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr "Izquierda"
 msgstr "Izquierda"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr "Vent. izquierdo?"
 msgstr "Vent. izquierdo?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Izquierda [μm]"
 msgstr "Izquierda [μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Valor brill."
 msgstr "Valor brill."
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Valor oscuro"
 msgstr "Valor oscuro"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Correc. Linealidad"
 msgstr "Correc. Linealidad"
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr "Micropaso Eje Z"
 msgstr "Micropaso Eje Z"
 
 
 #. MSG_LOAD_ALL c=18
 #. 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
 #. 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"
 msgid "Load filament"
 msgstr "Introducir filam."
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "Cargar a boquilla"
 msgstr "Cargar a boquilla"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Cambiando color"
 msgstr "Cambiando color"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr "Introduciendo filam."
 msgstr "Introduciendo filam."
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Polea suelta"
 msgstr "Polea suelta"
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr "Alto"
 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
 #. 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"
 msgid "MMU Mode"
 msgstr "Modo MMU"
 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
 #. 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"
 msgid "MMU fails"
 msgstr "Fallos MMU"
 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
 #. 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"
 msgid "MMU load fails"
 msgstr "Carga MMU falla"
 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
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 conectado"
 msgstr "MMU2 conectado"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Comp. imanes"
 msgstr "Comp. imanes"
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr "Menu principal"
 msgstr "Menu principal"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "No a escuadra"
 msgstr "No a escuadra"
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr "Midiendo altura del punto de calibracion"
 msgstr "Midiendo altura del punto de calibracion"
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr "Malla"
 msgstr "Malla"
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr "Nivela. Mesh Level"
 msgstr "Nivela. Mesh Level"
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr "Modo"
 msgstr "Modo"
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Cambio de modo progresando ..."
 msgstr "Cambio de modo progresando ..."
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr "Modelo"
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr "Mover X"
 msgstr "Mover X"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Mover Y"
 msgstr "Mover Y"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Mover Z"
 msgstr "Mover Z"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Mover ejes"
 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
 #. 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"
 msgid "N/A"
 msgstr "N/D"
 msgstr "N/D"
 
 
@@ -1065,51 +1265,51 @@ msgid "New firmware version available:"
 msgstr "Nuevo firmware disponible:"
 msgstr "Nuevo firmware disponible:"
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr "No hay tarjeta SD"
 msgstr "No hay tarjeta SD"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr "Sin movimiento"
 msgstr "Sin movimiento"
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr "Ninguno"
 msgstr "Ninguno"
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr "No hay conexion"
 msgstr "No hay conexion"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr "Ventilador no gira"
 msgstr "Ventilador no gira"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
@@ -1117,105 +1317,113 @@ msgstr ""
 "la base."
 "la base."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Ahora precalentare la boquilla para PLA."
 msgstr "Ahora precalentare la boquilla para PLA."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr "Ahora retira la prueba de la lamina de acero."
 msgstr "Ahora retira la prueba de la lamina de acero."
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr "Boquilla"
 msgstr "Boquilla"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "D-boquilla"
 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
 #. 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"
 msgid "Off"
 msgstr "Ina"
 msgstr "Ina"
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 "Se han encontrado ajustes anteriores. Se ajustara el PID, los pasos del "
 "Se han encontrado ajustes anteriores. Se ajustara el PID, los pasos del "
 "extrusor, etc"
 "extrusor, etc"
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr "Act"
 msgstr "Act"
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr "Una vez"
 msgstr "Una vez"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr "Cal. PID"
 msgstr "Cal. PID"
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "Cal. PID terminada"
 msgstr "Cal. PID terminada"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "Calibracion PID"
 msgstr "Calibracion PID"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "Calentando PINDA"
 msgstr "Calentando PINDA"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr "Cal. PINDA"
 msgstr "Cal. PINDA"
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "Fallo de la calibracion de PINDA"
 msgstr "Fallo de la calibracion de PINDA"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
@@ -1223,19 +1431,36 @@ msgstr ""
 "La calibracion PINDA esta finalizada y activa. Se puede desactivar en el "
 "La calibracion PINDA esta finalizada y activa. Se puede desactivar en el "
 "menu Configuracion->Cal. PINDA"
 "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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr "Pausa"
 msgstr "Pausa"
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr "Pausar impresion"
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1245,7 +1470,7 @@ msgstr ""
 "impresora inmediatamente."
 "impresora inmediatamente."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "rebooting the printer."
@@ -1260,22 +1485,22 @@ msgstr ""
 "Por favor comprueba la conexion del IR sensor y filamento esta descargado."
 "Por favor comprueba la conexion del IR sensor y filamento esta descargado."
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Controla:"
 msgstr "Controla:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Limpia la superficie de la base, por favor, y luego presione el dial."
 msgstr "Limpia la superficie de la base, por favor, y luego presione el dial."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Limpia boquilla para calibracion. Click cuando acabes."
 msgstr "Limpia boquilla para calibracion. Click cuando acabes."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
@@ -1283,7 +1508,7 @@ msgstr ""
 "cargarlo."
 "cargarlo."
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1292,52 +1517,47 @@ msgstr ""
 "dial para cargarlo."
 "dial para cargarlo."
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Por favor, cargar primero el filamento."
 msgstr "Por favor, cargar primero el filamento."
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr ""
 msgstr ""
 "Por favor abate el rodillo de empuje (idler) y retira el filamento "
 "Por favor abate el rodillo de empuje (idler) y retira el filamento "
 "manualmente."
 "manualmente."
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr "Por favor coloca la chapa de acero en la base calefactable."
 msgstr "Por favor coloca la chapa de acero en la base calefactable."
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr "Por favor, pulsa el dial para descargar el filamento"
 msgstr "Por favor, pulsa el dial para descargar el filamento"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr "Por favor retire el filamento de inmediato"
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Por favor retira los soportes de envio primero."
 msgstr "Por favor retira los soportes de envio primero."
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Por favor retire la chapa de acero de la base calefactable."
 msgstr "Por favor retire la chapa de acero de la base calefactable."
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Por favor realiza la calibracion XYZ primero."
 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."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Primero descargue el filamento, luego repita esta accion."
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr "Actualize por favor"
 msgstr "Actualize por favor"
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr "Por Favor Espere"
 msgstr "Por Favor Espere"
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr "Fallas energia"
 msgstr "Fallas energia"
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Precalentar"
 msgstr "Precalentar"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr "Precalienta extrusor"
 msgstr "Precalienta extrusor"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr "Precalentando nozzle. Espera por favor."
 msgstr "Precalentando nozzle. Espera por favor."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Precalent. laminar"
 msgstr "Precalent. laminar"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Precalent. expulsar"
 msgstr "Precalent. expulsar"
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Precalent. cargar"
 msgstr "Precalent. cargar"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Precalent. descargar"
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "Pulsa el dial"
 msgstr "Pulsa el dial"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Pulsa el dial para precalentar la boquilla y 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Impresion cancelada"
 msgstr "Impresion cancelada"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr "Vent.fusor:"
 msgstr "Vent.fusor:"
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr "Menu tarjeta SD"
 msgstr "Menu tarjeta SD"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Impresion en pausa"
 msgstr "Impresion en pausa"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr "Tiempo de imp."
 msgstr "Tiempo de imp."
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr "Dir. IP impresora:"
 msgstr "Dir. IP impresora:"
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1461,12 +1677,12 @@ msgstr ""
 "Primeros pasos Calibracion flujo."
 "Primeros pasos Calibracion flujo."
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Diametro nozzle impresora difiere de cod.G. Continuar?"
 msgstr "Diametro nozzle impresora difiere de cod.G. Continuar?"
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
@@ -1474,67 +1690,112 @@ msgstr ""
 "Diametro nozzle Impresora difiere de cod.G. Comprueba los valores en "
 "Diametro nozzle Impresora difiere de cod.G. Comprueba los valores en "
 "ajustes. Impresion cancelada."
 "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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr "Puerto RPi"
 msgstr "Puerto RPi"
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Trasera [μm]"
 msgstr "Trasera [μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Recuper. impresion"
 msgstr "Recuper. impresion"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 "Retire el filamento viejo y presione el dial para comenzar a cargar el nuevo "
 "Retire el filamento viejo y presione el dial para comenzar a cargar el nuevo "
 "filamento."
 "filamento."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr "Renombrar"
 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
 #. 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"
 msgid "Reset"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr "Reanudar impres."
 msgstr "Reanudar impres."
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Continuan. impresion"
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr "Derecha"
 msgstr "Derecha"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Derecha [μm]"
 msgstr "Derecha [μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1542,36 +1803,41 @@ msgstr ""
 "Ejecutar el Wizard borrara los valores de calibracion actuales y comenzara "
 "Ejecutar el Wizard borrara los valores de calibracion actuales y comenzara "
 "de nuevo. Continuar?"
 "de nuevo. Continuar?"
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Falla"
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr "Tarj. SD"
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "PARADA"
 msgstr "PARADA"
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr "Buscando punto de calibracion base"
 msgstr "Buscando punto de calibracion base"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr "Seleccionar"
 msgstr "Seleccionar"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
@@ -1580,69 +1846,76 @@ msgstr ""
 "el menu en pantalla."
 "el menu en pantalla."
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr "Elegir extrusor:"
 msgstr "Elegir extrusor:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr "Selecciona filam.:"
 msgstr "Selecciona filam.:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr "Cambiar el idioma"
 msgstr "Cambiar el idioma"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 "Selecciona la temperatura para precalentar la boquilla que se ajuste a tu "
 "Selecciona la temperatura para precalentar la boquilla que se ajuste a tu "
 "material."
 "material."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Selecciona la temperatura adecuada a tu 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr "Iniciar Selftest"
 msgstr "Iniciar Selftest"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr "Error Selftest!"
 msgstr "Error Selftest!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr "Fallo Selftest"
 msgstr "Fallo Selftest"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 "Se realizara el auto-test para calibrar con precision la vuelta a la "
 "Se realizara el auto-test para calibrar con precision la vuelta a la "
 "posicion inicial sin sensores."
 "posicion inicial sin sensores."
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "Info sensor"
 msgstr "Info sensor"
 
 
@@ -1652,31 +1925,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Sensor verificado, retire el filamento ahora."
 msgstr "Sensor verificado, retire el filamento ahora."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Establecer temp.:"
 msgstr "Establecer temp.:"
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr "Configuracion"
 msgstr "Configuracion"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "Severo sesgar"
 msgstr "Severo sesgar"
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr "Lamina"
 msgstr "Lamina"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1689,18 +1962,18 @@ msgstr ""
 "%cReset"
 "%cReset"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Mostrar endstops"
 msgstr "Mostrar endstops"
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr "Acallar"
 msgstr "Acallar"
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Ligera sesgar"
 msgstr "Ligera sesgar"
 
 
@@ -1714,113 +1987,172 @@ msgstr ""
 "ordenar."
 "ordenar."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Problema encontrado, nivelacion Z forzosa ..."
 msgstr "Problema encontrado, nivelacion Z forzosa ..."
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr "Ordenar"
 msgstr "Ordenar"
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr "Ordenando archivos"
 msgstr "Ordenando archivos"
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr "Sonido"
 msgstr "Sonido"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr "Velocidad"
 msgstr "Velocidad"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr "Ventilador girando"
 msgstr "Ventilador girando"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 "Se necesita una temperatura ambiente ente 21 y 26C y un soporte rigido."
 "Se necesita una temperatura ambiente ente 21 y 26C y un soporte rigido."
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Estadisticas"
 msgstr "Estadisticas"
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr "Sigilo"
 msgstr "Sigilo"
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr "Lamina de acero"
 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
 #. 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"
 msgid "Stop print"
 msgstr "Detener impresion"
 msgstr "Detener impresion"
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr "Estrict"
 msgstr "Estrict"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr "Soporte"
 msgstr "Soporte"
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Intercambiado"
 msgstr "Intercambiado"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr "Temperatura"
 msgstr "Temperatura"
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr "Temperaturas"
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1831,7 +2163,7 @@ msgstr ""
 "de calibracion)."
 "de calibracion)."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -1840,66 +2172,102 @@ msgstr ""
 "capitulo Primeros pasos, seccion Calibracion del flujo."
 "capitulo Primeros pasos, seccion Calibracion del flujo."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr "Fecha"
 msgstr "Fecha"
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr "Expirar"
 msgstr "Expirar"
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr "Fallos totales"
 msgstr "Fallos totales"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Filamento total"
 msgstr "Filamento total"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Tiempo total"
 msgstr "Tiempo total"
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr "Ajustar"
 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"
 msgid "Unload filament"
 msgstr "Soltar filamento"
 msgstr "Soltar filamento"
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr "Soltando filamento"
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr "La verificacion fallo, retire el filamento e intente nuevamente."
 msgstr "La verificacion fallo, retire el filamento e intente nuevamente."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Voltajes"
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1912,220 +2280,282 @@ msgstr ""
 "Modo silencio"
 "Modo silencio"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Esperando ordenes..."
 msgstr "Esperando ordenes..."
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "Esperando a que se enfrie la sonda PINDA"
 msgstr "Esperando a que se enfrie la sonda PINDA"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Esperando enfriamiento de la base y extrusor."
 msgstr "Esperando enfriamiento de la base y extrusor."
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr "Aviso"
 msgstr "Aviso"
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 msgstr ""
 "Aviso: tanto el tipo de impresora como el tipo de la placa han cambiado."
 "Aviso: tanto el tipo de impresora como el tipo de la placa han cambiado."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Cuidado: el tipo de placa ha cambiado."
 msgstr "Cuidado: el tipo de placa ha cambiado."
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Cuidado: Ha cambiado el tipo de impresora."
 msgstr "Cuidado: Ha cambiado el tipo de impresora."
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Se descargo con exito el filamento?"
 msgstr "Se descargo con exito el filamento?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr "Error de conexion"
 msgstr "Error de conexion"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr ""
 msgstr ""
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "Corregir-X:"
 msgstr "Corregir-X:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "Detalles cal. XYZ"
 msgstr "Detalles cal. XYZ"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "Calibracion XYZ correcta. La inclinacion se corregira automaticamente."
 msgstr "Calibracion XYZ correcta. La inclinacion se corregira automaticamente."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen "
 "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen "
 "trabajo!"
 "trabajo!"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr "Calibrazion XYZ comprometida. Puntos frontales no alcanzables."
 msgstr "Calibrazion XYZ comprometida. Puntos frontales no alcanzables."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr "Calibrazion XYZ comprometida. Punto frontal derecho no alcanzable."
 msgstr "Calibrazion XYZ comprometida. Punto frontal derecho no alcanzable."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 "Calibracion XYZ fallada. Puntos de calibracion en la base no encontrados."
 "Calibracion XYZ fallada. Puntos de calibracion en la base no encontrados."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr "Calibracion XYZ fallada. Puntos frontales no alcanzables."
 msgstr "Calibracion XYZ fallada. Puntos frontales no alcanzables."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Calibracion XYZ fallada. Consulta el manual por favor."
 msgstr "Calibracion XYZ fallada. Consulta el manual por favor."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr "Calibracion XYZ fallad. Punto frontal derecho no alcanzable."
 msgstr "Calibracion XYZ fallad. Punto frontal derecho no alcanzable."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Calibracion XYZ ok. Ejes X/Y perpendiculares. Enhorabuena!"
 msgstr "Calibracion XYZ ok. Ejes X/Y perpendiculares. Enhorabuena!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Dist. en Y desde min"
 msgstr "Dist. en Y desde min"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Corregir-Y:"
 msgstr "Corregir-Y:"
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr "Si"
 msgstr "Si"
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "Siempre puedes acceder al asistente desde Calibracion -> Wizard"
 msgstr "Siempre puedes acceder al asistente desde Calibracion -> Wizard"
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Corregir-Z:"
 msgstr "Corregir-Z:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr "Z-sensor nr."
 msgstr "Z-sensor nr."
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "[0;0] punto offset"
 msgstr "[0;0] punto offset"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "y presione el dial"
 msgstr "y presione el dial"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr "para cargar el fil."
 msgstr "para cargar el fil."
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "para descargar fil."
 msgstr "para descargar fil."
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr "desconocido"
 msgstr "desconocido"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr "estado desconocido"
 msgstr "estado desconocido"
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr "🔃Actualizar"
 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?"
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Choque detectado. Continuar impresion?"
 #~ 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."
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Cal. primera cap."
 #~ 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr " 0.3 ou +ancien"
 msgstr " 0.3 ou +ancien"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr " 0.4 ou +recent"
 msgstr " 0.4 ou +recent"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "niveau %s attendu"
 msgstr "niveau %s attendu"
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ">Annuler"
 msgstr ">Annuler"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Ajuster Z:"
 msgstr "Ajuster Z:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr "Tout est correct"
 msgstr "Tout est correct"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr "Tout est pret. Bonne impression!"
 msgstr "Tout est pret. Bonne impression!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Ambiant"
 msgstr "Ambiant"
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "Z~carriages gauche + droite tout en haut?"
 msgstr "Z~carriages gauche + droite tout en haut?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr "Mise a 0 des axes"
 msgstr "Mise a 0 des axes"
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr "Puiss.auto"
 msgstr "Puiss.auto"
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "Autocharge du fil."
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 msgstr ""
 "Chargement auto. du fil. active, appuyez sur le bouton et inserez le fil."
 "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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr "Axe"
 msgstr "Axe"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Longueur de l'axe"
 msgstr "Longueur de l'axe"
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr "Retour"
 msgstr "Retour"
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr "Lit"
 msgstr "Lit"
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr "Chauffe du lit"
 msgstr "Chauffe du lit"
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr "Plateau termine"
 msgstr "Plateau termine"
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Reglage plateau"
 msgstr "Reglage plateau"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
@@ -169,50 +171,55 @@ msgstr ""
 "attente d'un reset."
 "attente d'un reset."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Lit/Chauffage"
 msgstr "Lit/Chauffage"
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr "Statut courroie"
 msgstr "Statut courroie"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Test de courroie"
 msgstr "Test de courroie"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Coupure detectee. Reprendre impres.?"
 msgstr "Coupure detectee. Reprendre impres.?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr "Brill."
 msgstr "Brill."
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr "Luminosite"
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "Calibrer XYZ"
 msgstr "Calibrer XYZ"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Calibrer Z"
 msgstr "Calibrer Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -221,13 +228,13 @@ msgstr ""
 "l'axe Z jusqu'aux butees. Cliquez une fois fait."
 "l'axe Z jusqu'aux butees. Cliquez une fois fait."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr "Calibration Z"
 msgstr "Calibration Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -236,140 +243,151 @@ msgstr ""
 "Z jusqu'aux butees. Cliquez une fois fait."
 "Z jusqu'aux butees. Cliquez une fois fait."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Calib. mise a 0"
 msgstr "Calib. mise a 0"
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Calibration terminee"
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr "Carte retiree"
 msgstr "Carte retiree"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr "Changer filament"
 msgstr "Changer filament"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Changement reussi!"
 msgstr "Changement reussi!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Change correctement?"
 msgstr "Change correctement?"
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr "Verification axe X"
 msgstr "Verification axe X"
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr "Verification axe Y"
 msgstr "Verification axe Y"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Verification axe Z"
 msgstr "Verification axe Z"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr "Verif. plateau chauf"
 msgstr "Verif. plateau chauf"
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Verification butees"
 msgstr "Verification butees"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Verific. fichier"
 msgstr "Verific. fichier"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Verif. du hotend"
 msgstr "Verif. du hotend"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr "Verif. des capteurs"
 msgstr "Verif. des capteurs"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr "Verifications"
 msgstr "Verifications"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Couleur incorrecte"
 msgstr "Couleur incorrecte"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr "Fait de community"
 msgstr "Fait de community"
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr ""
 msgstr ""
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Refroidissement"
 msgstr "Refroidissement"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Copier la langue choisie?"
 msgstr "Copier la langue choisie?"
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr "Detect.crash"
 msgstr "Detect.crash"
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr "Crash detecte."
 msgstr "Crash detecte."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -381,39 +399,46 @@ msgstr ""
 "mode Normal"
 "mode Normal"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr "Coupe filament"
 msgstr "Coupe filament"
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr "Coupeur"
 msgstr "Coupeur"
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Je coupe filament"
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr "Sombre"
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr "Desactiver moteurs"
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "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."
 "Calibration de la premiere couche."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
@@ -433,222 +458,345 @@ msgstr ""
 "Voulez-vous refaire l'etape pour reajuster la hauteur entre la buse et le "
 "Voulez-vous refaire l'etape pour reajuster la hauteur entre la buse et le "
 "plateau chauffant?"
 "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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "Correct-E:"
 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
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgid "ERROR:"
 msgstr "ERREUR:"
 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
 #. 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"
 msgid "Eject filament"
 msgstr "Remonter le fil."
 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"
 msgid "Ejecting filament"
 msgstr "Le fil. remonte"
 msgstr "Le fil. remonte"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr "Butee"
 msgstr "Butee"
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Butee non atteinte"
 msgstr "Butee non atteinte"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr "Butees"
 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
 #. 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"
 msgid "Extruder"
 msgstr "Extrudeur"
 msgstr "Extrudeur"
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr "Vent. extrudeur:"
 msgstr "Vent. extrudeur:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr "Infos extrudeur"
 msgstr "Infos extrudeur"
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr "F. autocharg."
 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
 #. 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"
 msgid "FS Action"
 msgstr ""
 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
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Stat. d'echec"
 msgstr "Stat. d'echec"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "Stat. d'echec MMU"
 msgstr "Stat. d'echec MMU"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Faux declenchement"
 msgstr "Faux declenchement"
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr "Vitesse vent."
 msgstr "Vitesse vent."
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr "Test du ventilateur"
 msgstr "Test du ventilateur"
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr "Verif vent."
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr "Fins filament"
 msgstr "Fins filament"
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr "Capteur Fil."
 msgstr "Capteur Fil."
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr "Filament extrude et avec bonne couleur?"
 msgstr "Filament extrude et avec bonne couleur?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Filament non charge"
 msgstr "Filament non charge"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr "Capteur de fil."
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Filament utilise"
 msgstr "Filament utilise"
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "Fichier incomplet. Continuer qd meme?"
 msgstr "Fichier incomplet. Continuer qd meme?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr "Mouvement final"
 msgstr "Mouvement final"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr "Cal. 1ere couche"
 msgstr "Cal. 1ere couche"
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "D'abord, je vais lancer le Auto-test pour verifier les problemes "
 "D'abord, je vais lancer le Auto-test pour verifier les problemes "
 "d'assemblage les plus communs."
 "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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr "Flux"
 msgstr "Flux"
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr "Ventilo impr avant?"
 msgstr "Ventilo impr avant?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Avant [μm]"
 msgstr "Avant [μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Ventilos avt/gauche"
 msgstr "Ventilos avt/gauche"
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr "Le G-code a ete prepare pour un niveau different. Continuer?"
 msgstr "Le G-code a ete prepare pour un niveau different. Continuer?"
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
@@ -657,15 +805,15 @@ msgstr ""
 "modele a nouveau. L'impression a ete annulee."
 "modele a nouveau. L'impression a ete annulee."
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 msgstr ""
 "Le G-code a ete prepare pour une autre version de l'imprimante. Continuer?"
 "Le G-code a ete prepare pour une autre version de l'imprimante. Continuer?"
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
@@ -674,13 +822,13 @@ msgstr ""
 "decouper le modele a nouveau. L'impression a ete annulee."
 "decouper le modele a nouveau. L'impression a ete annulee."
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 msgstr ""
 "Le G-code a ete prepare pour une version plus recente du firmware. Continuer?"
 "Le G-code a ete prepare pour une version plus recente du firmware. Continuer?"
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
@@ -689,42 +837,42 @@ msgstr ""
 "mettre a jour le firmware. L'impression annulee."
 "mettre a jour le firmware. L'impression annulee."
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr "Config HW"
 msgstr "Config HW"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Chauffage/Thermistor"
 msgstr "Chauffage/Thermistor"
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr "Chauffe"
 msgstr "Chauffe"
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr "Chauffage desactivee par le compteur de securite."
 msgstr "Chauffage desactivee par le compteur de securite."
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr "Chauffe terminee."
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "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."
 "calibrer le Z-axis. Apres cela, tout sera pret pour imprimer."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -744,25 +892,46 @@ msgstr ""
 "guide a travers le processus d'installation?"
 "guide a travers le processus d'installation?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr "Haut.puiss"
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 msgstr ""
 "Je vais maintenant lancer la calibration XYZ. Cela prendra 12 min environ."
 "Je vais maintenant lancer la calibration XYZ. Cela prendra 12 min environ."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Je vais maintenant lancer la calibration Z."
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -771,27 +940,27 @@ msgstr ""
 "Reglages - Config HW - Plaque en acier."
 "Reglages - Config HW - Plaque en acier."
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Ecran d'info"
 msgstr "Ecran d'info"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Inserez le filament"
 msgstr "Inserez le filament"
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
@@ -799,269 +968,301 @@ msgstr ""
 "Veuillez inserer le filament ( ne le chargez pas) dans l'extrudeur, puis "
 "Veuillez inserer le filament ( ne le chargez pas) dans l'extrudeur, puis "
 "appuyez sur le bouton."
 "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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr "Fil. est-il charge?"
 msgstr "Fil. est-il charge?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Est la plaque sur le plat. chauffant?"
 msgstr "Est la plaque sur le plat. chauffant?"
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr "Derniere impres."
 msgstr "Derniere impres."
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr "Echecs derniere imp."
 msgstr "Echecs derniere imp."
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr "Gauche"
 msgstr "Gauche"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr "Ventilo gauche?"
 msgstr "Ventilo gauche?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Gauche [μm]"
 msgstr "Gauche [μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Niveau brill"
 msgstr "Niveau brill"
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Niv. sombre"
 msgstr "Niv. sombre"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Correction lin."
 msgstr "Correction lin."
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr "Ajuster Z en dir."
 msgstr "Ajuster Z en dir."
 
 
 #. MSG_LOAD_ALL c=18
 #. 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
 #. 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"
 msgid "Load filament"
 msgstr "Charger 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "Charger la buse"
 msgstr "Charger la buse"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Charg. de la couleur"
 msgstr "Charg. de la couleur"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr "Chargement du fil."
 msgstr "Chargement du fil."
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Poulie lache"
 msgstr "Poulie lache"
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr "Fort"
 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
 #. 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"
 msgid "MMU Mode"
 msgstr "Mode MMU"
 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
 #. 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"
 msgid "MMU fails"
 msgstr "Echecs MMU"
 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
 #. 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"
 msgid "MMU load fails"
 msgstr "Def. charg. MMU"
 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
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 connecte"
 msgstr "MMU2 connecte"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Compens. aim."
 msgstr "Compens. aim."
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr "Menu principal"
 msgstr "Menu principal"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "Var. mesuree"
 msgstr "Var. mesuree"
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr "Je mesure la hauteur de reference du point de calibrage"
 msgstr "Je mesure la hauteur de reference du point de calibrage"
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Changement de mode en cours..."
 msgstr "Changement de mode en cours..."
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr "Modele"
 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
 #. 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"
 msgid "Motor"
 msgstr "Moteur"
 msgstr "Moteur"
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr "Deplacer X"
 msgstr "Deplacer X"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Deplacer Y"
 msgstr "Deplacer Y"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Deplacer Z"
 msgstr "Deplacer Z"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Deplacer l'axe"
 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
 #. 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"
 msgid "N/A"
 msgstr "I/D"
 msgstr "I/D"
 
 
@@ -1071,51 +1272,51 @@ msgid "New firmware version available:"
 msgstr "Nouvelle version de firmware disponible:"
 msgstr "Nouvelle version de firmware disponible:"
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr "Non"
 msgstr "Non"
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr "Pas de carte SD"
 msgstr "Pas de carte SD"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr "Pas de mouvement."
 msgstr "Pas de mouvement."
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr "Aucun"
 msgstr "Aucun"
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr "Non connecte"
 msgstr "Non connecte"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr "Ne tourne pas"
 msgstr "Ne tourne pas"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
@@ -1123,104 +1324,112 @@ msgstr ""
 "surface du plateau chauffant."
 "surface du plateau chauffant."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Maintenant je vais prechauffer la buse pour du PLA."
 msgstr "Maintenant je vais prechauffer la buse pour du PLA."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr "Retirez maintenant l'impression de test de la plaque en acier."
 msgstr "Retirez maintenant l'impression de test de la plaque en acier."
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr "Buse"
 msgstr "Buse"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "Diam. buse"
 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
 #. 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"
 msgid "Off"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 "Anciens reglages trouves. Le PID, les Esteps etc. par defaut seront regles"
 "Anciens reglages trouves. Le PID, les Esteps etc. par defaut seront regles"
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr "1 fois"
 msgstr "1 fois"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr "Calib. PID"
 msgstr "Calib. PID"
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "Calib. PID terminee"
 msgstr "Calib. PID terminee"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "Calibration PID"
 msgstr "Calibration PID"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "Chauffe de la PINDA"
 msgstr "Chauffe de la PINDA"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr "Calib. PINDA"
 msgstr "Calib. PINDA"
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "Echec de la calibration en PINDA"
 msgstr "Echec de la calibration en PINDA"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
@@ -1228,19 +1437,36 @@ msgstr ""
 "La calibration en PINDA est terminee et activee. Il peut etre desactivee "
 "La calibration en PINDA est terminee et activee. Il peut etre desactivee "
 "dans le menu Reglages-> Calib. PINDA"
 "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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr "Pause de l'impr."
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "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."
 "premiers points. Si la buse accroche le papier, eteignez vite l'imprimante."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "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."
 msgstr "SVP, verifiez la connexion du capteur IR et decharge le filament."
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Verifiez:"
 msgstr "Verifiez:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Nettoyez plateau chauffant en acier et appuyez sur le bouton."
 msgstr "Nettoyez plateau chauffant en acier et appuyez sur le bouton."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Nettoyez la buse pour la calibration. Cliquez une fois fait."
 msgstr "Nettoyez la buse pour la calibration. Cliquez une fois fait."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
@@ -1286,7 +1512,7 @@ msgstr ""
 "pour le charger."
 "pour le charger."
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1295,50 +1521,45 @@ msgstr ""
 "le bouton pour le charger."
 "le bouton pour le charger."
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Veuillez d'abord charger un filament."
 msgstr "Veuillez d'abord charger un filament."
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr "Ouvrez l'idler et retirez le filament manuellement."
 msgstr "Ouvrez l'idler et retirez le filament manuellement."
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr "Placez la plaque en acier sur le plateau chauffant."
 msgstr "Placez la plaque en acier sur le plateau chauffant."
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr "Appuyez sur le bouton pour decharger le filament"
 msgstr "Appuyez sur le bouton pour decharger le filament"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr "Retirez immediatement le filament"
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Retirez d'abord les protections de transport."
 msgstr "Retirez d'abord les protections de transport."
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Retirez la plaque en acier du plateau chauffant."
 msgstr "Retirez la plaque en acier du plateau chauffant."
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Veuillez d'abord lancer la calibration XYZ."
 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."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "SVP, dechargez le filament et reessayez."
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr "Mettez a jour le FW."
 msgstr "Mettez a jour le FW."
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr "Merci de patienter"
 msgstr "Merci de patienter"
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr "Coup.de courant"
 msgstr "Coup.de courant"
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Prechauffage"
 msgstr "Prechauffage"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr "Prechauffez la buse!"
 msgstr "Prechauffez la buse!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr "Prechauffage de la buse. Merci de patienter."
 msgstr "Prechauffage de la buse. Merci de patienter."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Chauffe pour couper"
 msgstr "Chauffe pour couper"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Chauf. pour remonter"
 msgstr "Chauf. pour remonter"
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Chauffe pour charger"
 msgstr "Chauffe pour charger"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Chauf.pour decharger"
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "App. sur sur bouton"
 msgstr "App. sur sur bouton"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Appuyez sur le bouton pour prechauffer la buse et continuer."
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Impression annulee"
 msgstr "Impression annulee"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr "Vent. impr:"
 msgstr "Vent. impr:"
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr "Impr. depuis la SD"
 msgstr "Impr. depuis la SD"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Impression en pause"
 msgstr "Impression en pause"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr "Temps d'impression"
 msgstr "Temps d'impression"
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr "Adr.IP imprimante:"
 msgstr "Adr.IP imprimante:"
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1463,14 +1679,14 @@ msgstr ""
 "Premiers pas, section Processus de calibration."
 "Premiers pas, section Processus de calibration."
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 msgstr ""
 "Diametre de la buse dans les reglages ne correspond pas a celui dans le G-"
 "Diametre de la buse dans les reglages ne correspond pas a celui dans le G-"
 "Code. Continuer?"
 "Code. Continuer?"
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
@@ -1478,66 +1694,111 @@ msgstr ""
 "Diametre de la buse dans les reglages ne correspond pas a celui dans le G-"
 "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."
 "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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr "Port RPi"
 msgstr "Port RPi"
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Arriere [μm]"
 msgstr "Arriere [μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Recup. impression"
 msgstr "Recup. impression"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 "Retirez l'ancien filament puis appuyez sur le bouton pour charger le nouveau."
 "Retirez l'ancien filament puis appuyez sur le bouton pour charger le nouveau."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr "Renommer"
 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
 #. 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"
 msgid "Reset"
 msgstr "Reinitialiser"
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr "Reinit. calib. XYZ"
 msgstr "Reinit. calib. XYZ"
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr "Reprise impression"
 msgstr "Reprise impression"
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Reprise de l'impr."
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr "Droite"
 msgstr "Droite"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Droite [μm]"
 msgstr "Droite [μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1545,36 +1806,41 @@ msgstr ""
 "Lancement de l'Assistant supprimera les resultats actuels de calibration et "
 "Lancement de l'Assistant supprimera les resultats actuels de calibration et "
 "commencera du debut. Continuer?"
 "commencera du debut. Continuer?"
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Fins"
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr "Carte SD"
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "ARRETE."
 msgstr "ARRETE."
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr "Recherche point calibration du plateau"
 msgstr "Recherche point calibration du plateau"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr "Selectionner"
 msgstr "Selectionner"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
@@ -1583,68 +1849,75 @@ msgstr ""
 "selectionnez-le depuis le menu a l'ecran."
 "selectionnez-le depuis le menu a l'ecran."
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr "Choisir extrudeur:"
 msgstr "Choisir extrudeur:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr "Choix du filament:"
 msgstr "Choix du filament:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr "Choisir langue"
 msgstr "Choisir langue"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 "Selectionnez la temperature de prechauffage de la buse qui correspond a "
 "Selectionnez la temperature de prechauffage de la buse qui correspond a "
 "votre materiau."
 "votre materiau."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Selectionnez la temperature qui correspond a votre materiau."
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr "Auto-test OK"
 msgstr "Auto-test OK"
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr "Debut auto-test"
 msgstr "Debut auto-test"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr "Auto-test"
 msgstr "Auto-test"
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr "Erreur auto-test!"
 msgstr "Erreur auto-test!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr "Echec de l'auto-test"
 msgstr "Echec de l'auto-test"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 "Le Selftest sera lance pour calibrer la remise a zero precise sans capteur"
 "Le Selftest sera lance pour calibrer la remise a zero precise sans capteur"
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "Info capteur"
 msgstr "Info capteur"
 
 
@@ -1654,31 +1927,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Capteur verifie, retirez le filament maintenant."
 msgstr "Capteur verifie, retirez le filament maintenant."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Regler temp.:"
 msgstr "Regler temp.:"
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr "Reglages"
 msgstr "Reglages"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "Deviat.sev."
 msgstr "Deviat.sev."
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr "Plaque"
 msgstr "Plaque"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1691,18 +1964,18 @@ msgstr ""
 "%cReinitialiser"
 "%cReinitialiser"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Afficher butees"
 msgstr "Afficher butees"
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr "Furtif"
 msgstr "Furtif"
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Deviat.leg."
 msgstr "Deviat.leg."
 
 
@@ -1715,113 +1988,172 @@ msgstr ""
 "Certains fichiers ne seront pas tries. Max 100 fichiers tries par dossier."
 "Certains fichiers ne seront pas tries. Max 100 fichiers tries par dossier."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Probleme rencontre, cliquez sur le bouton pour niveller l'axe Z..."
 msgstr "Probleme rencontre, cliquez sur le bouton pour niveller l'axe Z..."
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr "Tri"
 msgstr "Tri"
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr "Tri des fichiers"
 msgstr "Tri des fichiers"
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr "Son"
 msgstr "Son"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr "Vitesse"
 msgstr "Vitesse"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr "Tourne"
 msgstr "Tourne"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 "Une temperature ambiante stable de 21-26C et un support stable sont requis."
 "Une temperature ambiante stable de 21-26C et un support stable sont requis."
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Statistiques"
 msgstr "Statistiques"
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr "Furtif"
 msgstr "Furtif"
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr "Plaques en acier"
 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
 #. 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"
 msgid "Stop print"
 msgstr "Arreter impression"
 msgstr "Arreter impression"
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr "Stricte"
 msgstr "Stricte"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Echange"
 msgstr "Echange"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr ""
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1832,7 +2164,7 @@ msgstr ""
 "(chapitre Calibration)."
 "(chapitre Calibration)."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -1841,66 +2173,102 @@ msgstr ""
 "chapitre Premiers pas, section Processus de calibration."
 "chapitre Premiers pas, section Processus de calibration."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr "Heure"
 msgstr "Heure"
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr "Totale"
 msgstr "Totale"
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr "Total des echecs"
 msgstr "Total des echecs"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Filament total"
 msgstr "Filament total"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Temps total impr."
 msgstr "Temps total impr."
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr "Regler"
 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"
 msgid "Unload filament"
 msgstr "Decharger fil."
 msgstr "Decharger fil."
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr "Dechargement fil."
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr "Verification en echec, retirez le filament et reessayez."
 msgstr "Verification en echec, retirez le filament et reessayez."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Tensions"
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1913,101 +2281,101 @@ msgstr ""
 "mode furtif"
 "mode furtif"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Attente utilisateur."
 msgstr "Attente utilisateur."
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "Attente du refroidissement de la sonde PINDA"
 msgstr "Attente du refroidissement de la sonde PINDA"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Attente du refroidissement des buse et plateau chauffant"
 msgstr "Attente du refroidissement des buse et plateau chauffant"
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr "Avert"
 msgstr "Avert"
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Attention: Types d'imprimante et de carte mere modifies"
 msgstr "Attention: Types d'imprimante et de carte mere modifies"
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Attention: Type de carte mere modifie."
 msgstr "Attention: Type de carte mere modifie."
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Attention: Type d'imprimante modifie"
 msgstr "Attention: Type d'imprimante modifie"
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Dechargement du filament reussi?"
 msgstr "Dechargement du filament reussi?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr "Erreur de cablage"
 msgstr "Erreur de cablage"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr "Assistant"
 msgstr "Assistant"
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "Correct-X:"
 msgstr "Correct-X:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "Details calib. XYZ"
 msgstr "Details calib. XYZ"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "Calibration XYZ OK. L'ecart sera corrige automatiquement."
 msgstr "Calibration XYZ OK. L'ecart sera corrige automatiquement."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 "Calibration XYZ OK. Les axes X/Y sont legerement non perpendiculaires. Bon "
 "Calibration XYZ OK. Les axes X/Y sont legerement non perpendiculaires. Bon "
 "boulot!"
 "boulot!"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "Calibration XYZ compromise. Les points de calibration en avant ne sont pas "
 "Calibration XYZ compromise. Les points de calibration en avant ne sont pas "
 "atteignables."
 "atteignables."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
@@ -2015,126 +2383,188 @@ msgstr ""
 "atteignable."
 "atteignable."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 "Echec calibration XYZ. Le point de calibration du plateau n'a pas ete trouve."
 "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
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "Echec calibration XYZ. Les points de calibration en avant ne sont pas "
 "Echec calibration XYZ. Les points de calibration en avant ne sont pas "
 "atteignables."
 "atteignables."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Echec calibration XYZ. Consultez le manuel."
 msgstr "Echec calibration XYZ. Consultez le manuel."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "Echec calibration XYZ. Le point de calibration avant droit n'est pas "
 "Echec calibration XYZ. Le point de calibration avant droit n'est pas "
 "atteignable."
 "atteignable."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Calibration XYZ OK. Les axes X/Y sont perpendiculaires. Felicitations!"
 msgstr "Calibration XYZ OK. Les axes X/Y sont perpendiculaires. Felicitations!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Distance Y du min"
 msgstr "Distance Y du min"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Correct-Y:"
 msgstr "Correct-Y:"
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr "Oui"
 msgstr "Oui"
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 "Vous pouvez toujours relancer l'Assistant dans Calibration > Assistant."
 "Vous pouvez toujours relancer l'Assistant dans Calibration > Assistant."
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Correct-Z:"
 msgstr "Correct-Z:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr "Mesurer x-fois"
 msgstr "Mesurer x-fois"
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "Offset point [0;0]"
 msgstr "Offset point [0;0]"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "et appuyez sur le bouton"
 msgstr "et appuyez sur le bouton"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr "pour charger le fil."
 msgstr "pour charger le fil."
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "pour decharger fil."
 msgstr "pour decharger fil."
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr "inconnu"
 msgstr "inconnu"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr "Etat inconnu"
 msgstr "Etat inconnu"
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr "🔃Rafraichir"
 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?"
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Crash detecte. Poursuivre l'impression?"
 #~ 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."
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Cal. 1ere couche"
 #~ 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr " 0.3 ili stariji"
 msgstr " 0.3 ili stariji"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr " 0.4 ili noviji"
 msgstr " 0.4 ili noviji"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "%s level ocekivan"
 msgstr "%s level ocekivan"
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ">Otkazati"
 msgstr ">Otkazati"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Podesavanje Z:"
 msgstr "Podesavanje Z:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr "Sve je u redu"
 msgstr "Sve je u redu"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr "Sve je gotovo. Sretno printanje!"
 msgstr "Sve je gotovo. Sretno printanje!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr "Abeceda"
 msgstr "Abeceda"
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Ambijent"
 msgstr "Ambijent"
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "Jesu lijevi i desni Z~nosaci podignuti?"
 msgstr "Jesu lijevi i desni Z~nosaci podignuti?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr "Pomoc"
 msgstr "Pomoc"
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr "Pocetna tocka"
 msgstr "Pocetna tocka"
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr "Auto napaj"
 msgstr "Auto napaj"
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "Autopunj filamenta"
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr "Auto punjenje fil. je aktivno, pritisnite gumb i umetnite fil.."
 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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr "Os"
 msgstr "Os"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Duljina osi"
 msgstr "Duljina osi"
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr "Vrati"
 msgstr "Vrati"
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr "Podloga"
 msgstr "Podloga"
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr "Podloga se zagrijava"
 msgstr "Podloga se zagrijava"
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr "Podloga zagrijana"
 msgstr "Podloga zagrijana"
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Podloga ispravna"
 msgstr "Podloga ispravna"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
@@ -169,50 +170,55 @@ msgstr ""
 "mlaznici? Ceka se resetiranje."
 "mlaznici? Ceka se resetiranje."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Grijac/Podloga"
 msgstr "Grijac/Podloga"
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr "Status remena"
 msgstr "Status remena"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Testiranje remena"
 msgstr "Testiranje remena"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Doslo je do gasenja. Oporaviti print?"
 msgstr "Doslo je do gasenja. Oporaviti print?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr "Svijet"
 msgstr "Svijet"
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr "Svjetlina"
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "Kalibrirajte XYZ"
 msgstr "Kalibrirajte XYZ"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Kalibrirajte Z"
 msgstr "Kalibrirajte Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -221,13 +227,13 @@ msgstr ""
 "Kliknite kada je zavrseno."
 "Kliknite kada je zavrseno."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr "Kalibriracija Z"
 msgstr "Kalibriracija Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -236,140 +242,151 @@ msgstr ""
 "Kliknite kada je zavrseno."
 "Kliknite kada je zavrseno."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Kalibracija nultocke"
 msgstr "Kalibracija nultocke"
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr "Kalibriranje"
 msgstr "Kalibriranje"
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Kalibracija gotova"
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr "Kartica je uklonjena"
 msgstr "Kartica je uklonjena"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr "Promijeni filament"
 msgstr "Promijeni filament"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Promijena uspjesna!"
 msgstr "Promijena uspjesna!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Ispravno izmjenjeno?"
 msgstr "Ispravno izmjenjeno?"
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr "Provjera X osi"
 msgstr "Provjera X osi"
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr "Provjera Y osi"
 msgstr "Provjera Y osi"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Provjera Z osi"
 msgstr "Provjera Z osi"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr "Provjera podloge"
 msgstr "Provjera podloge"
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Provjera granicnika"
 msgstr "Provjera granicnika"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Provjera datoteke"
 msgstr "Provjera datoteke"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Provjera hotenda"
 msgstr "Provjera hotenda"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr "Provjera senzora"
 msgstr "Provjera senzora"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr "Provjere"
 msgstr "Provjere"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Boja nije ispravna"
 msgstr "Boja nije ispravna"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr "Napravilo zajedno"
 msgstr "Napravilo zajedno"
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr "Nast."
 msgstr "Nast."
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Ohladi"
 msgstr "Ohladi"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Kopirati odabrani jezik?"
 msgstr "Kopirati odabrani jezik?"
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr "Udar"
 msgstr "Udar"
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr "Udar detekti."
 msgstr "Udar detekti."
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr "Udar otkriven."
 msgstr "Udar otkriven."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -377,39 +394,46 @@ msgid ""
 msgstr "Detekcija udarca moze biti ukljuceno samo u Normalnom nacinu rada"
 msgstr "Detekcija udarca moze biti ukljuceno samo u Normalnom nacinu rada"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr "Odrezite fil."
 msgstr "Odrezite fil."
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr "Rezac"
 msgstr "Rezac"
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Rezanje filamenta"
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr "Datum:"
 msgstr "Datum:"
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr "Tamno"
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr "Onemoguci stepere"
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -421,7 +445,7 @@ msgstr ""
 "prvog sloja."
 "prvog sloja."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
@@ -429,222 +453,345 @@ msgstr ""
 "Zelite li ponoviti zadnji korak za ponovno podesavanje udaljenosti izmedu "
 "Zelite li ponoviti zadnji korak za ponovno podesavanje udaljenosti izmedu "
 "mlaznice i grijace podloge?"
 "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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "E-ispravan:"
 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
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgid "ERROR:"
 msgstr "POGRESKA:"
 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
 #. 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"
 msgid "Eject filament"
 msgstr "Izbaci 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"
 msgid "Ejecting filament"
 msgstr "Izbacivanje fil."
 msgstr "Izbacivanje fil."
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr "Granicnik"
 msgstr "Granicnik"
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Granicnik nije aktiv"
 msgstr "Granicnik nije aktiv"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr "Granicnici"
 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
 #. 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"
 msgid "Extruder"
 msgstr "Ekstruder"
 msgstr "Ekstruder"
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr "Ekstruder vent:"
 msgstr "Ekstruder vent:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr "Info o ekstruderu"
 msgstr "Info o ekstruderu"
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr "F. auto.punj"
 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
 #. 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"
 msgid "FS Action"
 msgstr "FS Akcija"
 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
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Neuspjesna stat"
 msgstr "Neuspjesna stat"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "Neuspjes. MMU stat"
 msgstr "Neuspjes. MMU stat"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Lazno aktiviranje"
 msgstr "Lazno aktiviranje"
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr "Brzina vent"
 msgstr "Brzina vent"
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr "Test ventilatora"
 msgstr "Test ventilatora"
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr "Provjera vent"
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr "Bez filmaneta"
 msgstr "Bez filmaneta"
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr "Fil. senzor"
 msgstr "Fil. senzor"
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr "Ekstrudiranje fil.s sa ispravnom bojom?"
 msgstr "Ekstrudiranje fil.s sa ispravnom bojom?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Fil. nije napunjen"
 msgstr "Fil. nije napunjen"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr "Senzor filamenta"
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Iskoristeni fil."
 msgstr "Iskoristeni fil."
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "Datoteka je nepotpuna. Svejedno nastaviti?"
 msgstr "Datoteka je nepotpuna. Svejedno nastaviti?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr "Zavrsni pokreti"
 msgstr "Zavrsni pokreti"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr "Prvi sloj kalib."
 msgstr "Prvi sloj kalib."
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "Prvo cu pokrenuti samotestiranje kako bih provjerio najcesce probleme sa "
 "Prvo cu pokrenuti samotestiranje kako bih provjerio najcesce probleme sa "
 "montazom."
 "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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr "Protok"
 msgstr "Protok"
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr "Prednji print vent?"
 msgstr "Prednji print vent?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Prednj str[μm]"
 msgstr "Prednj str[μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Prednji/lijevi vent"
 msgstr "Prednji/lijevi vent"
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-kod izrezan za drugu razinu. Nastavite?"
 msgstr "G-kod izrezan za drugu razinu. Nastavite?"
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
@@ -653,14 +800,14 @@ msgstr ""
 "otkazan."
 "otkazan."
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-kod izrezan za drugu vrstu printera. Nastavite?"
 msgstr "G-kod izrezan za drugu vrstu printera. Nastavite?"
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
@@ -669,12 +816,12 @@ msgstr ""
 "je otkazan."
 "je otkazan."
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-kod izrezan za noviji firmware. Nastavite?"
 msgstr "G-kod izrezan za noviji firmware. Nastavite?"
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
@@ -683,42 +830,42 @@ msgstr ""
 "otkazan."
 "otkazan."
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr "HW podesavanje"
 msgstr "HW podesavanje"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Grijac/Termostat"
 msgstr "Grijac/Termostat"
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr "Grijanje"
 msgstr "Grijanje"
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr "Grijanje je onemoguceno sigurnosnim mjeracem vremena."
 msgstr "Grijanje je onemoguceno sigurnosnim mjeracem vremena."
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr "Grijanje obavljeno."
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -729,7 +876,7 @@ msgstr ""
 "printanje."
 "printanje."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -738,24 +885,45 @@ msgstr ""
 "postupak postavljanja?"
 "postupak postavljanja?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr "Visoka sna"
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Sada cu pokrenuti xyz kalibraciju. Trebat ce cca. 12 min."
 msgstr "Sada cu pokrenuti xyz kalibraciju. Trebat ce cca. 12 min."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Sada cu pokrenuti z kalibraciju."
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -764,296 +932,328 @@ msgstr ""
 "postavke u Postavke - HW Podesavanje - Celicne ploce."
 "postavke u Postavke - HW Podesavanje - Celicne ploce."
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Info zaslon"
 msgstr "Info zaslon"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Umetnite filament"
 msgstr "Umetnite filament"
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr ""
 msgstr ""
 "Umetnite filament (nemojte ga puniti) u ekstruder i zatim pritisnite gumb."
 "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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr "Je li filament napunjen?"
 msgstr "Je li filament napunjen?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Je li celicna ploca na grijanoj podlozi?"
 msgstr "Je li celicna ploca na grijanoj podlozi?"
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr "Ponavljanje"
 msgstr "Ponavljanje"
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr "Zadnji print"
 msgstr "Zadnji print"
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr "Zadnji neusp. print"
 msgstr "Zadnji neusp. print"
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr "Lijevo"
 msgstr "Lijevo"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr "Lijevi hotend vent?"
 msgstr "Lijevi hotend vent?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Lijeva str[μm]"
 msgstr "Lijeva str[μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Razina svjet"
 msgstr "Razina svjet"
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Razina zatam"
 msgstr "Razina zatam"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Lin. ispravak"
 msgstr "Lin. ispravak"
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr "Live podesavanje Z"
 msgstr "Live podesavanje Z"
 
 
 #. MSG_LOAD_ALL c=18
 #. 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
 #. 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"
 msgid "Load filament"
 msgstr "Napunite 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "Punjenje u mlazn"
 msgstr "Punjenje u mlazn"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Ucitavanje boje"
 msgstr "Ucitavanje boje"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr "Punjenje filamenta"
 msgstr "Punjenje filamenta"
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Labava remenica"
 msgstr "Labava remenica"
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr "Glasno"
 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
 #. 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"
 msgid "MMU Mode"
 msgstr "MMU Mod"
 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
 #. 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"
 msgid "MMU fails"
 msgstr "MMU ne uspijeva"
 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
 #. 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"
 msgid "MMU load fails"
 msgstr "Neusp. MMU punj"
 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
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 spojen"
 msgstr "MMU2 spojen"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Magnet. komp."
 msgstr "Magnet. komp."
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr "Nazad"
 msgstr "Nazad"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "Mjereni nagib"
 msgstr "Mjereni nagib"
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr "Mjerenje referentne visine kalibracijske tocke"
 msgstr "Mjerenje referentne visine kalibracijske tocke"
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr "Mreza"
 msgstr "Mreza"
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr "Izrav. mrez. podl"
 msgstr "Izrav. mrez. podl"
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr "Mod"
 msgstr "Mod"
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Promjena moda u tijeku..."
 msgstr "Promjena moda u tijeku..."
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr ""
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr "Pomaknite X"
 msgstr "Pomaknite X"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Pomaknite Y"
 msgstr "Pomaknite Y"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Pomaknite Z"
 msgstr "Pomaknite Z"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Pomaknite os"
 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
 #. 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"
 msgid "N/A"
 msgstr ""
 msgstr ""
 
 
@@ -1063,51 +1263,51 @@ msgid "New firmware version available:"
 msgstr "Dostupna nova verzija firmwera:"
 msgstr "Dostupna nova verzija firmwera:"
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr "Ne"
 msgstr "Ne"
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr "Nema SD kartice"
 msgstr "Nema SD kartice"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr "Bez pomaka."
 msgstr "Bez pomaka."
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr "Nema"
 msgstr "Nema"
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr "Nije povezano"
 msgstr "Nije povezano"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr "Ne okrece se"
 msgstr "Ne okrece se"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
@@ -1115,103 +1315,111 @@ msgstr ""
 "podloge."
 "podloge."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Sada cu zagrijati mlaznicu za PLA."
 msgstr "Sada cu zagrijati mlaznicu za PLA."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr "Sada uklonite probni print sa celicne ploce."
 msgstr "Sada uklonite probni print sa celicne ploce."
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr "Mlaznica"
 msgstr "Mlaznica"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "Mlaznica."
 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
 #. 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"
 msgid "Off"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr "Pronadene stare postavke. Postavit ce se zadani PID, Esteps itd."
 msgstr "Pronadene stare postavke. Postavit ce se zadani PID, Esteps itd."
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr "Jednom"
 msgstr "Jednom"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr "PID kal."
 msgstr "PID kal."
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "PID kal. zavrsena"
 msgstr "PID kal. zavrsena"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "PID kalibracija"
 msgstr "PID kalibracija"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "PINDA se Zagrijava"
 msgstr "PINDA se Zagrijava"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr "PINDA kal."
 msgstr "PINDA kal."
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "Kalibracija PINDA nije uspjela"
 msgstr "Kalibracija PINDA nije uspjela"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
@@ -1219,19 +1427,36 @@ msgstr ""
 "Kalibracija PINDA je zavrsena i aktivna. Moze se onemoguciti u izborniku "
 "Kalibracija PINDA je zavrsena i aktivna. Moze se onemoguciti u izborniku "
 "Postavke->PINDA. kal."
 "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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr "Pauza"
 msgstr "Pauza"
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr "Pauzirajte 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "points. If the nozzle catches the paper, power off the printer immediately."
@@ -1240,7 +1465,7 @@ msgstr ""
 "mlaznica uhvati papir, odmah iskljucite printer."
 "mlaznica uhvati papir, odmah iskljucite printer."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "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."
 msgstr "Provjerite IR prikljucak senzora, izvadite filament ako postoji."
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Molimo provjerite:"
 msgstr "Molimo provjerite:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Ocistite grijacu podlogu, a zatim pritisnite gumb."
 msgstr "Ocistite grijacu podlogu, a zatim pritisnite gumb."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Molimo ocistite mlaznicu radi kalibracije. Kliknite kada ste gotovi."
 msgstr "Molimo ocistite mlaznicu radi kalibracije. Kliknite kada ste gotovi."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr "Umetnite filament u ekstruder, a zatim pritisnite gumb za punjenje."
 msgstr "Umetnite filament u ekstruder, a zatim pritisnite gumb za punjenje."
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1283,50 +1508,45 @@ msgstr ""
 "Umetnite filament u prvu cijev MMU-a, a zatim pritisnite gumb za punjenje."
 "Umetnite filament u prvu cijev MMU-a, a zatim pritisnite gumb za punjenje."
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Molimo prvo ubacite filament."
 msgstr "Molimo prvo ubacite filament."
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr "Molimo otvorite klizac i rucno uklonite filament."
 msgstr "Molimo otvorite klizac i rucno uklonite filament."
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr "Stavite celicnu plocu na grijacu podlogu."
 msgstr "Stavite celicnu plocu na grijacu podlogu."
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr "Pritisnite gumb za praznjenje filamenta"
 msgstr "Pritisnite gumb za praznjenje filamenta"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr "Molimo odmah izvucite filament"
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Najprije uklonite prijevozne osloce."
 msgstr "Najprije uklonite prijevozne osloce."
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Molimo uklonite celicnu plocu sa grijace podloge."
 msgstr "Molimo uklonite celicnu plocu sa grijace podloge."
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Prvo pokrenite XYZ kalibraciju."
 msgstr "Prvo pokrenite XYZ kalibraciju."
 
 
@@ -1335,113 +1555,109 @@ msgstr "Prvo pokrenite XYZ kalibraciju."
 msgid "Please unload the filament first, then repeat this action."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Prvo izvadite filament, a zatim ponovite ovu radnju."
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr "Molimo nadogradite."
 msgstr "Molimo nadogradite."
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr "Molimo pricekajte"
 msgstr "Molimo pricekajte"
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr "Prekidi struje"
 msgstr "Prekidi struje"
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Predgrijavanje"
 msgstr "Predgrijavanje"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr "Predgr. mlaznicu!"
 msgstr "Predgr. mlaznicu!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr "Predgrijavanje mlaznice. Molim vas pricekajte."
 msgstr "Predgrijavanje mlaznice. Molim vas pricekajte."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Predgr. za rezanje"
 msgstr "Predgr. za rezanje"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Predgr. za izbaci."
 msgstr "Predgr. za izbaci."
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Predgr. za punjenje"
 msgstr "Predgr. za punjenje"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Predgr. za praznj."
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "Pritisnite gumb"
 msgstr "Pritisnite gumb"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Pritisnite gumb za predgrijavanje mlaznice i nastavite."
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Print je prekinut"
 msgstr "Print je prekinut"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr "Vent printa:"
 msgstr "Vent printa:"
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr "Printaj sa SD"
 msgstr "Printaj sa SD"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Print pauziran"
 msgstr "Print pauziran"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr "Vrijeme printanja"
 msgstr "Vrijeme printanja"
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1450,12 +1666,12 @@ msgstr ""
 "koraci, odjeljak Tijek kalibracije."
 "koraci, odjeljak Tijek kalibracije."
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Promjer mlaznice printera razlikuje se od G-koda. Nastavite?"
 msgstr "Promjer mlaznice printera razlikuje se od G-koda. Nastavite?"
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
@@ -1463,67 +1679,112 @@ msgstr ""
 "Promjer mlaznice printera razlikuje se od G-koda. Molimo provjerite "
 "Promjer mlaznice printera razlikuje se od G-koda. Molimo provjerite "
 "vrijednost u postavkama. Print je otkazan."
 "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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr "RPi utor"
 msgstr "RPi utor"
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Zad. str.[μm]"
 msgstr "Zad. str.[μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Oporavak printa"
 msgstr "Oporavak printa"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 "Uklonite stari filament i pritisnite gumb za pocetak stavljanja novog "
 "Uklonite stari filament i pritisnite gumb za pocetak stavljanja novog "
 "filamenta."
 "filamenta."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr "Preimenuj"
 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
 #. 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"
 msgid "Reset"
 msgstr "Resetiraj"
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr "Reset XYZ kalibr."
 msgstr "Reset XYZ kalibr."
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr "Nastavite print"
 msgstr "Nastavite print"
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Nastavak printa"
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr "Tocno"
 msgstr "Tocno"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Desna str.[μm]"
 msgstr "Desna str.[μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1531,36 +1792,41 @@ msgstr ""
 "Pokrenuti carobnjak ce izbrisati trenutne rezultate kalibracije i poceti "
 "Pokrenuti carobnjak ce izbrisati trenutne rezultate kalibracije i poceti "
 "ispocetka. Nastavite?"
 "ispocetka. Nastavite?"
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Nestalo"
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr "SD karti"
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "ZAUSTAVLJENO."
 msgstr "ZAUSTAVLJENO."
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr "Trazenje tocke kalibracije podloge"
 msgstr "Trazenje tocke kalibracije podloge"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr "Odaberi"
 msgstr "Odaberi"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
@@ -1569,68 +1835,75 @@ msgstr ""
 "zaslonu."
 "zaslonu."
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr "Odaberite ekstruder:"
 msgstr "Odaberite ekstruder:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr "Odaberi filament:"
 msgstr "Odaberi filament:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr "Izaberi jezik"
 msgstr "Izaberi jezik"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 "Odaberite temperaturu predgrijavanja mlaznice koja odgovara vasem materijalu."
 "Odaberite temperaturu predgrijavanja mlaznice koja odgovara vasem materijalu."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Odaberite temperaturu koja odgovara vasem materijalu."
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr "Samotestiranje OK"
 msgstr "Samotestiranje OK"
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr "Pocetak selftesta"
 msgstr "Pocetak selftesta"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr "Selftest nije uspio"
 msgstr "Selftest nije uspio"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 "Provest ce se selftest radi kalibracije preciznog ponovnog postavljanja bez "
 "Provest ce se selftest radi kalibracije preciznog ponovnog postavljanja bez "
 "senzora."
 "senzora."
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "Info senzora"
 msgstr "Info senzora"
 
 
@@ -1640,31 +1913,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Senzor je provjeren, odmah uklonite filament."
 msgstr "Senzor je provjeren, odmah uklonite filament."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Postavi temperaturu:"
 msgstr "Postavi temperaturu:"
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr "Postavke"
 msgstr "Postavke"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "Veliki nagib"
 msgstr "Veliki nagib"
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr "Ploca"
 msgstr "Ploca"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1677,18 +1950,18 @@ msgstr ""
 "%cResetiraj"
 "%cResetiraj"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Pokazi granicnike"
 msgstr "Pokazi granicnike"
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr "Tih"
 msgstr "Tih"
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Lagani nagib"
 msgstr "Lagani nagib"
 
 
@@ -1702,113 +1975,172 @@ msgstr ""
 "je 100."
 "je 100."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Naisao je neki problem, nametnuto Z-niveliranje..."
 msgstr "Naisao je neki problem, nametnuto Z-niveliranje..."
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr "Vrsta"
 msgstr "Vrsta"
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr "Sortiranje datoteka"
 msgstr "Sortiranje datoteka"
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr "Zvuk"
 msgstr "Zvuk"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr "Brzina"
 msgstr "Brzina"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr "Okrece se"
 msgstr "Okrece se"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 "Potrebna je stabilna temperatura okoline 21-26C, potrebno je cvrsto postolje."
 "Potrebna je stabilna temperatura okoline 21-26C, potrebno je cvrsto postolje."
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Statistika"
 msgstr "Statistika"
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr "Tiho"
 msgstr "Tiho"
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr "Celicna ploca"
 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
 #. 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"
 msgid "Stop print"
 msgstr "Zaustavi print"
 msgstr "Zaustavi print"
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr "Strogo"
 msgstr "Strogo"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr "Podrska"
 msgstr "Podrska"
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Zamjenjeno"
 msgstr "Zamjenjeno"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr "Temperatura"
 msgstr "Temperatura"
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr "Temperature"
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1818,7 +2150,7 @@ msgstr ""
 "optimalnu visinu. Provjerite slike u prirucniku (poglavlje Kalibracija)."
 "optimalnu visinu. Provjerite slike u prirucniku (poglavlje Kalibracija)."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -1827,66 +2159,102 @@ msgstr ""
 "poglavlje Prvi koraci, odjeljak Tijek kalibracije."
 "poglavlje Prvi koraci, odjeljak Tijek kalibracije."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr "Vrijeme"
 msgstr "Vrijeme"
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr "Pauza"
 msgstr "Pauza"
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr "Ukupno"
 msgstr "Ukupno"
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr "Totalne pogreske"
 msgstr "Totalne pogreske"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Totalno filamenta"
 msgstr "Totalno filamenta"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Vrijeme printanja"
 msgstr "Vrijeme printanja"
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr "Ugodi"
 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"
 msgid "Unload filament"
 msgstr "Ispraznite fil."
 msgstr "Ispraznite fil."
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr "Praznjenje filamenta"
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr "Provjera nije uspjela, uklonite filament i pokusajte ponovno."
 msgstr "Provjera nije uspjela, uklonite filament i pokusajte ponovno."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Voltaza"
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1898,221 +2266,281 @@ msgstr ""
 "u tihom modu"
 "u tihom modu"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Ceka se korisnik..."
 msgstr "Ceka se korisnik..."
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "Ceka se hladenje PINDA sonde"
 msgstr "Ceka se hladenje PINDA sonde"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "Ceka se hladjenje mlaznice i podloge"
 msgstr "Ceka se hladjenje mlaznice i podloge"
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr "Upozore"
 msgstr "Upozore"
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Upozorenje: promijenjeni su i tip printera i tip maticne ploce."
 msgstr "Upozorenje: promijenjeni su i tip printera i tip maticne ploce."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Upozorenje: tip maticne ploce je promijenjen."
 msgstr "Upozorenje: tip maticne ploce je promijenjen."
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Upozorenje: promijenjena je vrsta printera."
 msgstr "Upozorenje: promijenjena je vrsta printera."
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Je li praznjenje fil. bilo uspjesno?"
 msgstr "Je li praznjenje fil. bilo uspjesno?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr "Greska u ozicenju"
 msgstr "Greska u ozicenju"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr "Carobnjak"
 msgstr "Carobnjak"
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "X-ispravan:"
 msgstr "X-ispravan:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "XYZ detalji kal"
 msgstr "XYZ detalji kal"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr "XYZ kalibracija u redu. Iskrivljenost ce se automatski ispraviti."
 msgstr "XYZ kalibracija u redu. Iskrivljenost ce se automatski ispraviti."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 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!"
 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
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "XYZ kalibracija je ugrozena. Prednje kalibracijske tocke nisu dostupne."
 "XYZ kalibracija je ugrozena. Prednje kalibracijske tocke nisu dostupne."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "XYZ kalibracija je ugrozena. Desna prednja tocka kalibracije nije dostupna."
 "XYZ kalibracija je ugrozena. Desna prednja tocka kalibracije nije dostupna."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 "XYZ kalibracija nije uspjela. Tocka kalibracije podloga nije pronadena."
 "XYZ kalibracija nije uspjela. Tocka kalibracije podloga nije pronadena."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "XYZ kalibracija nije uspjela. Prednje kalibracijske tocke nisu dostupne."
 "XYZ kalibracija nije uspjela. Prednje kalibracijske tocke nisu dostupne."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "XYZ kalibracija nije uspjela. Molimo pogledajte prirucnik."
 msgstr "XYZ kalibracija nije uspjela. Molimo pogledajte prirucnik."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "XYZ kalibracija nije uspjela. Desna prednja tocka kalibracije nije dostupna."
 "XYZ kalibracija nije uspjela. Desna prednja tocka kalibracije nije dostupna."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "XYZ kalibracija u redu. Osi X/Y su okomite. Cestitamo!"
 msgstr "XYZ kalibracija u redu. Osi X/Y su okomite. Cestitamo!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Y distanca od min"
 msgstr "Y distanca od min"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Y-ispravan:"
 msgstr "Y-ispravan:"
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr "Da"
 msgstr "Da"
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "Carobnjak uvijek mozete nastaviti iz Kalibracija -> Carobnjak."
 msgstr "Carobnjak uvijek mozete nastaviti iz Kalibracija -> Carobnjak."
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Z-ispravan:"
 msgstr "Z-ispravan:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr "Z-sonda br."
 msgstr "Z-sonda br."
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "[0;0] razmak tocke"
 msgstr "[0;0] razmak tocke"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "i pritisnite gumb"
 msgstr "i pritisnite gumb"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr "da napuni filament"
 msgstr "da napuni filament"
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "da isprazni filament"
 msgstr "da isprazni filament"
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr "nepoznato"
 msgstr "nepoznato"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr "nepoznato stanje"
 msgstr "nepoznato stanje"
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr "🔃Osvjeziti"
 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?"
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Otkriven je udar. Nastaviti 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."
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Prvi sloj kal."
 #~ 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr " 0.3 vagy regebbi"
 msgstr " 0.3 vagy regebbi"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr " 0.4 v. ujabb"
 msgstr " 0.4 v. ujabb"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "Vart szint: %s"
 msgstr "Vart szint: %s"
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ">Megsem"
 msgstr ">Megsem"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Z allitasa:"
 msgstr "Z allitasa:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr "Minden rendben"
 msgstr "Minden rendben"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr "Keszen vagyunk. Jo nyomtatast!"
 msgstr "Keszen vagyunk. Jo nyomtatast!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr "Abece"
 msgstr "Abece"
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Kornyezet"
 msgstr "Kornyezet"
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "A Z tengely a felso vegponton van?"
 msgstr "A Z tengely a felso vegponton van?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr "Seged"
 msgstr "Seged"
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr "Autom."
 msgstr "Autom."
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr "Auto ero"
 msgstr "Auto ero"
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "Fil. auto.betolt."
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr "Autom. betoltes be, nyomd meg a gombot es helyzed be a filamentet."
 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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr "Tengely"
 msgstr "Tengely"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Tengely hossz"
 msgstr "Tengely hossz"
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr "Vissza"
 msgstr "Vissza"
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr "Asztal"
 msgstr "Asztal"
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr "Asztal futes"
 msgstr "Asztal futes"
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr "Asztal kesz"
 msgstr "Asztal kesz"
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Szint. korrekcio"
 msgstr "Szint. korrekcio"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
@@ -167,50 +170,55 @@ msgstr ""
 "az ujrainditast."
 "az ujrainditast."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Asztal/Fej futes"
 msgstr "Asztal/Fej futes"
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr "Szij allapot"
 msgstr "Szij allapot"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Szij teszt"
 msgstr "Szij teszt"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Aramkieses volt, nyomt. folytatasa?"
 msgstr "Aramkieses volt, nyomt. folytatasa?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr "Fenyes"
 msgstr "Fenyes"
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr "Fenyero"
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "XYZ kalibracio"
 msgstr "XYZ kalibracio"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Z kalibracio"
 msgstr "Z kalibracio"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -219,13 +227,13 @@ msgstr ""
 "nem er, majd nyomd meg ha keszen vagy."
 "nem er, majd nyomd meg ha keszen vagy."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr "Z kalibralasa"
 msgstr "Z kalibralasa"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -234,140 +242,151 @@ msgstr ""
 "er, majd nyomd meg ha keszen vagy."
 "er, majd nyomd meg ha keszen vagy."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Home poz. kalibralas"
 msgstr "Home poz. kalibralas"
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr "Kalibracio"
 msgstr "Kalibracio"
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Kalibracio kesz"
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr "Kartya eltavolitva"
 msgstr "Kartya eltavolitva"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr "Filament csere"
 msgstr "Filament csere"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Csere sikerult!"
 msgstr "Csere sikerult!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Sikerult a csere?"
 msgstr "Sikerult a csere?"
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr "X tengely ellenorzes"
 msgstr "X tengely ellenorzes"
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr "Y tengely ellenorzes"
 msgstr "Y tengely ellenorzes"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Z tengely ellenorzes"
 msgstr "Z tengely ellenorzes"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr "Asztal ellenorzese"
 msgstr "Asztal ellenorzese"
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Vegallaskapcs. ellen"
 msgstr "Vegallaskapcs. ellen"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Fajl ellenorzese"
 msgstr "Fajl ellenorzese"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Hotend ellenorzese"
 msgstr "Hotend ellenorzese"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr "Szenz. ellenorzese"
 msgstr "Szenz. ellenorzese"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr "Ellenorzesek"
 msgstr "Ellenorzesek"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Szin nem jo"
 msgstr "Szin nem jo"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr "Kozossegi"
 msgstr "Kozossegi"
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr "Folyt"
 msgstr "Folyt"
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Lehutes"
 msgstr "Lehutes"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Kivalasztott nyelv masolasa?"
 msgstr "Kivalasztott nyelv masolasa?"
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr "Utkozes"
 msgstr "Utkozes"
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr "Utkozes erz."
 msgstr "Utkozes erz."
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr "Utkozes erzekelve."
 msgstr "Utkozes erzekelve."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -378,39 +397,46 @@ msgstr ""
 "kapcsolhato be"
 "kapcsolhato be"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr "Filament vagasa"
 msgstr "Filament vagasa"
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr "Vago"
 msgstr "Vago"
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Filament vagasa"
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr "Datum:"
 msgstr "Datum:"
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr "Sotet"
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr "Motorok kikapcsol."
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -422,7 +448,7 @@ msgstr ""
 "bekezdest."
 "bekezdest."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
@@ -430,222 +456,345 @@ msgstr ""
 "Meg szeretned ismetelni az utolso lepest, hogy finomhangold a fuvoka es az "
 "Meg szeretned ismetelni az utolso lepest, hogy finomhangold a fuvoka es az "
 "asztal kozotti tavolsagot?"
 "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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "E-korrekcio:"
 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
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgid "ERROR:"
 msgstr "HIBA:"
 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
 #. 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"
 msgid "Eject filament"
 msgstr "Filament kiadasa"
 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"
 msgid "Ejecting filament"
 msgstr "Filament kiadasa"
 msgstr "Filament kiadasa"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr "Vegallaskapcsolo"
 msgstr "Vegallaskapcsolo"
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Vegallask. nem kapcs"
 msgstr "Vegallask. nem kapcs"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr "Vegallaskapcsolok"
 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
 #. 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"
 msgid "Extruder"
 msgstr ""
 msgstr ""
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr "Extruder vent.:"
 msgstr "Extruder vent.:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr "F. autobetolt"
 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
 #. 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"
 msgid "FS Action"
 msgstr "FSz akcio"
 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
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Hiba statisztika"
 msgstr "Hiba statisztika"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "MMU hiba stat."
 msgstr "MMU hiba stat."
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Hamis kivalto ok"
 msgstr "Hamis kivalto ok"
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr "Vent. sebesseg"
 msgstr "Vent. sebesseg"
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr "Ventillator teszt"
 msgstr "Ventillator teszt"
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr "Vent.proba"
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr "Fil. kifutasok"
 msgstr "Fil. kifutasok"
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr "Fil. szenzor"
 msgstr "Fil. szenzor"
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr "Filament es a szine rendben?"
 msgstr "Filament es a szine rendben?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Fil. nincs betoltve"
 msgstr "Fil. nincs betoltve"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr "Filament szenzor"
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Felhasznalt filam."
 msgstr "Felhasznalt filam."
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "A fajl vege hianyzik. Folytatod igy is?"
 msgstr "A fajl vege hianyzik. Folytatod igy is?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr "Mozdulat befejezese"
 msgstr "Mozdulat befejezese"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr "Elso reteg kal."
 msgstr "Elso reteg kal."
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "Elsokent lefuttatom az onellenorzest, hogy megnezzem a leggyakoribb "
 "Elsokent lefuttatom az onellenorzest, hogy megnezzem a leggyakoribb "
 "osszeszerelesi problemakat."
 "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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr "Elso targyhuto vent?"
 msgstr "Elso targyhuto vent?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Elulso old[μm]"
 msgstr "Elulso old[μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Elso/bal ventillator"
 msgstr "Elso/bal ventillator"
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr "A G-kod mas szintre lett elokesztve. Folytassam?"
 msgstr "A G-kod mas szintre lett elokesztve. Folytassam?"
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
@@ -654,14 +803,14 @@ msgstr ""
 "megallitva."
 "megallitva."
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "A G-kod mas nyomtato tipusra lett elokesztve. Folytassam?"
 msgstr "A G-kod mas nyomtato tipusra lett elokesztve. Folytassam?"
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
@@ -670,12 +819,12 @@ msgstr ""
 "Nyomtatas megallitva."
 "Nyomtatas megallitva."
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "A G-kod ujabb firmverre lett elokesztve. Folytassam?"
 msgstr "A G-kod ujabb firmverre lett elokesztve. Folytassam?"
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
@@ -684,42 +833,42 @@ msgstr ""
 "Nyomtatas megallitva."
 "Nyomtatas megallitva."
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr "HW beallitas"
 msgstr "HW beallitas"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Futotest/Termisztor"
 msgstr "Futotest/Termisztor"
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr "Futes folyamatban"
 msgstr "Futes folyamatban"
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr "A bizonsagi idozito leallitotta a futest"
 msgstr "A bizonsagi idozito leallitotta a futest"
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr "Futes kesz."
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -730,7 +879,7 @@ msgstr ""
 "nyomtathatsz is."
 "nyomtathatsz is."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -739,24 +888,45 @@ msgstr ""
 "a beallitasi folyamaton?"
 "a beallitasi folyamaton?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr "Magas ero"
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Lefuttatom az XYZ kalibraciot. Ez kb. 12 percet vesz igenybe."
 msgstr "Lefuttatom az XYZ kalibraciot. Ez kb. 12 percet vesz igenybe."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Lefuttatom a Z kalibraciot."
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -765,27 +935,27 @@ msgstr ""
 "Acellapok menupont alatt."
 "Acellapok menupont alatt."
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Info kepernyo"
 msgstr "Info kepernyo"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Helyezd be a filam."
 msgstr "Helyezd be a filam."
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
@@ -793,269 +963,301 @@ msgstr ""
 "Helyezd be a filamentet az extruderbe (ne toltsd be), majd nyomtd meg a "
 "Helyezd be a filamentet az extruderbe (ne toltsd be), majd nyomtd meg a "
 "gombot."
 "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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr "Filament behelyezve?"
 msgstr "Filament behelyezve?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Rajta van az acellap a targyasztalon?"
 msgstr "Rajta van az acellap a targyasztalon?"
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr "Iteracio"
 msgstr "Iteracio"
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr "Utolso nyomtatas"
 msgstr "Utolso nyomtatas"
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr "Utolso nyomt. hibak"
 msgstr "Utolso nyomt. hibak"
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr "Bal"
 msgstr "Bal"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr "Bal hotend vent.?"
 msgstr "Bal hotend vent.?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Bal [μm]"
 msgstr "Bal [μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Fenyes szint"
 msgstr "Fenyes szint"
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Sotet szint"
 msgstr "Sotet szint"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Lin. korrekcio"
 msgstr "Lin. korrekcio"
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr "Z magassag beall."
 msgstr "Z magassag beall."
 
 
 #. MSG_LOAD_ALL c=18
 #. 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
 #. 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"
 msgid "Load filament"
 msgstr "Filament betolt."
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "Betolt. fuvokahoz"
 msgstr "Betolt. fuvokahoz"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Szin tisztitasa"
 msgstr "Szin tisztitasa"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr "Filament betoltese"
 msgstr "Filament betoltese"
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Laza szijtarcsa"
 msgstr "Laza szijtarcsa"
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr "Hangos"
 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
 #. 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"
 msgid "MMU Mode"
 msgstr "MMU Mod"
 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
 #. 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"
 msgid "MMU fails"
 msgstr "MMU hibak"
 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
 #. 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"
 msgid "MMU load fails"
 msgstr "MMU bet. hibak"
 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
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 csatlakozott"
 msgstr "MMU2 csatlakozott"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Magnes komp."
 msgstr "Magnes komp."
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr "Fomenu"
 msgstr "Fomenu"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "Meroleg. hiba"
 msgstr "Meroleg. hiba"
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr "Kalibracios pont magassaganak merese"
 msgstr "Kalibracios pont magassaganak merese"
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr "Halo"
 msgstr "Halo"
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr "Asztal szintezes"
 msgstr "Asztal szintezes"
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr "Mod"
 msgstr "Mod"
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Modvaltas folyamatban..."
 msgstr "Modvaltas folyamatban..."
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr "Modell"
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr "X mozgatasa"
 msgstr "X mozgatasa"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Y mozgatasa"
 msgstr "Y mozgatasa"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Z mozgatasa"
 msgstr "Z mozgatasa"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Tengely mozgatasa"
 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
 #. 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"
 msgid "N/A"
 msgstr ""
 msgstr ""
 
 
@@ -1065,172 +1267,197 @@ msgid "New firmware version available:"
 msgstr "Uj firmver verzio erheto el:"
 msgstr "Uj firmver verzio erheto el:"
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr "Nem"
 msgstr "Nem"
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr "Nincs SD kartya"
 msgstr "Nincs SD kartya"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr "Nincs mozgas."
 msgstr "Nincs mozgas."
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr "Nincs"
 msgstr "Nincs"
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr "Nincs csatlakoztatva"
 msgstr "Nincs csatlakoztatva"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr "Nem forog"
 msgstr "Nem forog"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
 "Most beallitjuk a fuvoka hegye es a targyasztal felulete kozotti tavolsagot."
 "Most beallitjuk a fuvoka hegye es a targyasztal felulete kozotti tavolsagot."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Felfutom a fuvokat PLA-hoz."
 msgstr "Felfutom a fuvokat PLA-hoz."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr "Vedd le a tesztnyomatot az acellaprol."
 msgstr "Vedd le a tesztnyomatot az acellaprol."
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr "Fuvoka"
 msgstr "Fuvoka"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "Fuv. atm."
 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
 #. 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"
 msgid "Off"
 msgstr "Ki"
 msgstr "Ki"
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr "Regi beallitasokat talaltam. Az alap PID, Esteps, stb. lesz beallitva."
 msgstr "Regi beallitasokat talaltam. Az alap PID, Esteps, stb. lesz beallitva."
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr "Be"
 msgstr "Be"
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr "Egyszer"
 msgstr "Egyszer"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr "PID kalibracio"
 msgstr "PID kalibracio"
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "PID kal. kesz"
 msgstr "PID kal. kesz"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "PID kalibracio"
 msgstr "PID kalibracio"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "PINDA Futes"
 msgstr "PINDA Futes"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr "PINDA kal."
 msgstr "PINDA kal."
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "PINDA kalibracio sikertelen."
 msgstr "PINDA kalibracio sikertelen."
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
 msgstr "PINDA kalibracio sikeres es aktiv. A Beallitasok ->PINDA kal."
 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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr "Szun."
 msgstr "Szun."
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr "Nyomtatas szunet"
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "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."
 "fuvoka hozzaer a papirlaphoz, azonnal kapcsold ki a nyomtatot."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "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."
 msgstr "Nezd meg az IR szenzor csatlakoz., vedd ki a filam., ha bent van."
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Kerlek ellenorizd:"
 msgstr "Kerlek ellenorizd:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Kerlek, tisztisd le a targyasztalt, majd nyomd meg a gombot."
 msgstr "Kerlek, tisztisd le a targyasztalt, majd nyomd meg a gombot."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 msgstr ""
 "Kerlek, tisztisd meg a fuvokat kalibracio elott. Nyomd meg a gombot, ha "
 "Kerlek, tisztisd meg a fuvokat kalibracio elott. Nyomd meg a gombot, ha "
 "keszen vagy."
 "keszen vagy."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
@@ -1278,7 +1505,7 @@ msgstr ""
 "betolteshez."
 "betolteshez."
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1287,51 +1514,46 @@ msgstr ""
 "a betolteshez."
 "a betolteshez."
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Kerlek eloszor toltsd be a filamentet."
 msgstr "Kerlek eloszor toltsd be a filamentet."
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr ""
 msgstr ""
 "Kerlek, nyisd ki a nyomogorgo ajtajat, es tavolitsd el a filamentet kezzel."
 "Kerlek, nyisd ki a nyomogorgo ajtajat, es tavolitsd el a filamentet kezzel."
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr "Kerlek, helyzed az acellapot a targyasztalra."
 msgstr "Kerlek, helyzed az acellapot a targyasztalra."
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr "Kerlek, nyomd meg a gombot a filament kiadasahoz"
 msgstr "Kerlek, nyomd meg a gombot a filament kiadasahoz"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr "Kerlek, huzd ki a filamentet most"
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Tavolitsd el a szallitasi segedanyagokat."
 msgstr "Tavolitsd el a szallitasi segedanyagokat."
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Kerlek, tavolisd el az acellapot az asztalrol."
 msgstr "Kerlek, tavolisd el az acellapot az asztalrol."
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Kerlek, elobb futtasd le az XYZ kalibraciot."
 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."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Kerlek eloszor vedd ki a filamentet, majd probalkozz ujra."
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr "Kerlek frissits."
 msgstr "Kerlek frissits."
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr "Kerlek varj"
 msgstr "Kerlek varj"
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr "Aramkimaradasok"
 msgstr "Aramkimaradasok"
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Elofutes"
 msgstr "Elofutes"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr "Futsd fel a fuvokat!"
 msgstr "Futsd fel a fuvokat!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr "Fuvoka futese folyamatban. Kerlek, varj."
 msgstr "Fuvoka futese folyamatban. Kerlek, varj."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Melegites vagashoz"
 msgstr "Melegites vagashoz"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Melegites kiadashoz"
 msgstr "Melegites kiadashoz"
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Felfutes betolteshez"
 msgstr "Felfutes betolteshez"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Felfutes kiadashoz"
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "Nyomd meg a gombot"
 msgstr "Nyomd meg a gombot"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Nyomd meg a gombot a folytatashoz es a fuvoka felfutesehez."
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Nyomt. megszakitva"
 msgstr "Nyomt. megszakitva"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr "Targyhuto:"
 msgstr "Targyhuto:"
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr "Nyomtatas SD-rol"
 msgstr "Nyomtatas SD-rol"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Nyomt. szuneteltetve"
 msgstr "Nyomt. szuneteltetve"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr "Nyomtatasi ido"
 msgstr "Nyomtatasi ido"
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr "Nyomtato IP cime:"
 msgstr "Nyomtato IP cime:"
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1455,12 +1673,12 @@ msgstr ""
 "lepesek fejezetenek Kalibracio menete bekezdeset."
 "lepesek fejezetenek Kalibracio menete bekezdeset."
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "A nyomtato fuvoka atmeroje elter a G-kodtol. Folytasasm?"
 msgstr "A nyomtato fuvoka atmeroje elter a G-kodtol. Folytasasm?"
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
@@ -1468,67 +1686,112 @@ msgstr ""
 "A nyomtato fuvoka atmeroje elter a G-kodtol. Ellenorizd az erteket a "
 "A nyomtato fuvoka atmeroje elter a G-kodtol. Ellenorizd az erteket a "
 "beallitasokban. Nyomtatas megallitva."
 "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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Hatso old.[μm]"
 msgstr "Hatso old.[μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Nyomt. visszaallit"
 msgstr "Nyomt. visszaallit"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 "Vedd ki a regi filamentet, majd nyomd meg a gombot az uj filament "
 "Vedd ki a regi filamentet, majd nyomd meg a gombot az uj filament "
 "betoltesehez."
 "betoltesehez."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr "Atnevezes"
 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
 #. 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"
 msgid "Reset"
 msgstr "Ujrainditas"
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr "XYZ kal. nullazas"
 msgstr "XYZ kal. nullazas"
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr "Nyomt. folytatasa"
 msgstr "Nyomt. folytatasa"
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Nyomtatas folytatasa"
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr "Jobb"
 msgstr "Jobb"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Jobb old.[μm]"
 msgstr "Jobb old.[μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1536,104 +1799,116 @@ msgstr ""
 "A Varazslo futtatasa nullazza a jelenlegi kalibracios ertekeket es elolrol "
 "A Varazslo futtatasa nullazza a jelenlegi kalibracios ertekeket es elolrol "
 "fog mindent kezdeni. Folytatod?"
 "fog mindent kezdeni. Folytatod?"
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Kifutas"
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr "SDkartya"
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "MEGALLITVA."
 msgstr "MEGALLITVA."
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr "Kalibracios pont keresese az asztalon"
 msgstr "Kalibracios pont keresese az asztalon"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr "Kivalasztas"
 msgstr "Kivalasztas"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
 msgstr "Valassz egy filamentet az elso reteg kalibraciojahoz a menubol."
 msgstr "Valassz egy filamentet az elso reteg kalibraciojahoz a menubol."
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr "Extruder valasztas:"
 msgstr "Extruder valasztas:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr "Valassz filamentet:"
 msgstr "Valassz filamentet:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr "Valassz nyelvet"
 msgstr "Valassz nyelvet"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 "Valaszd ki a fuvoka homersekletet, amelyik megfelel az altalad hasznalt "
 "Valaszd ki a fuvoka homersekletet, amelyik megfelel az altalad hasznalt "
 "anyaghoz ajanlott homersekletnek."
 "anyaghoz ajanlott homersekletnek."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Valassz homersekletet, ami megfelel a filamenthez."
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr "Ondiagnosztika OK"
 msgstr "Ondiagnosztika OK"
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr "Ondiagnosztika indul"
 msgstr "Ondiagnosztika indul"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr "Ondiagnosztika"
 msgstr "Ondiagnosztika"
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr "Ondiagnosztika hiba!"
 msgstr "Ondiagnosztika hiba!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr "Ondiag. sikertelen"
 msgstr "Ondiag. sikertelen"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 "A pontos szenzor nelkuli homing erdekeben lefuttatom az ondiagnosztikat."
 "A pontos szenzor nelkuli homing erdekeben lefuttatom az ondiagnosztikat."
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "Szenzor info"
 msgstr "Szenzor info"
 
 
@@ -1643,31 +1918,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Szenzor OK, vedd ki a filamentet most."
 msgstr "Szenzor OK, vedd ki a filamentet most."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Homerseklet beall.:"
 msgstr "Homerseklet beall.:"
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr "Beallitasok"
 msgstr "Beallitasok"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "NagyMerol.hiba"
 msgstr "NagyMerol.hiba"
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr "Acellap"
 msgstr "Acellap"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1680,18 +1955,18 @@ msgstr ""
 "%cUjrainditas"
 "%cUjrainditas"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Vegallaskapcsolok"
 msgstr "Vegallaskapcsolok"
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr "Halk"
 msgstr "Halk"
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Kis merol.hiba"
 msgstr "Kis merol.hiba"
 
 
@@ -1705,112 +1980,171 @@ msgstr ""
 "konyvtaron belul."
 "konyvtaron belul."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Hiba tortent, Z szintezes indul..."
 msgstr "Hiba tortent, Z szintezes indul..."
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr "Rendez"
 msgstr "Rendez"
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr "Fajlok rendezese"
 msgstr "Fajlok rendezese"
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr "Hang"
 msgstr "Hang"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr "Sebesseg"
 msgstr "Sebesseg"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr "Forog"
 msgstr "Forog"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr "Stabil 21-26C homerseklet es egy merev allvany (asztal) szukseges."
 msgstr "Stabil 21-26C homerseklet es egy merev allvany (asztal) szukseges."
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Statisztika"
 msgstr "Statisztika"
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr "Halk"
 msgstr "Halk"
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr "Acellapok"
 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
 #. 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"
 msgid "Stop print"
 msgstr "Nyomt. megallitasa"
 msgstr "Nyomt. megallitasa"
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr "Szigoru"
 msgstr "Szigoru"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr "Tamogatas"
 msgstr "Tamogatas"
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Felcserelve"
 msgstr "Felcserelve"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr "Homerseklet"
 msgstr "Homerseklet"
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr "Homersekletek"
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1821,7 +2155,7 @@ msgstr ""
 "Kalibracio fejezeteben."
 "Kalibracio fejezeteben."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -1830,66 +2164,102 @@ msgstr ""
 "fejezetenek Kalibracio menete bekezdeset."
 "fejezetenek Kalibracio menete bekezdeset."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr "Ido"
 msgstr "Ido"
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr "Idotullepes"
 msgstr "Idotullepes"
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr "Ossz."
 msgstr "Ossz."
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr "Ossz. hiba"
 msgstr "Ossz. hiba"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Osszes filament"
 msgstr "Osszes filament"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Ossz. nyomt. ido"
 msgstr "Ossz. nyomt. ido"
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr "Finomhangolas"
 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"
 msgid "Unload filament"
 msgstr "Filament kiadasa"
 msgstr "Filament kiadasa"
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr "Filament kiadasa"
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr "Ellenorzes sikertelen, vedd ki a filamentet es probald ujra."
 msgstr "Ellenorzes sikertelen, vedd ki a filamentet es probald ujra."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Feszultsegek"
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1902,224 +2272,282 @@ msgstr ""
 "Halk modban"
 "Halk modban"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Var. a felhasznalora"
 msgstr "Var. a felhasznalora"
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "A PINDA szenzor kihuleset varom."
 msgstr "A PINDA szenzor kihuleset varom."
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "A fuvoka es az asztal kihuleset varom."
 msgstr "A fuvoka es az asztal kihuleset varom."
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr "Figylem."
 msgstr "Figylem."
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Figyelem: a nyomtato es az alaplap tipusa is megvaltozott."
 msgstr "Figyelem: a nyomtato es az alaplap tipusa is megvaltozott."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Figyelem: az alaplap tipusa megvaltozott."
 msgstr "Figyelem: az alaplap tipusa megvaltozott."
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Figyelem: a nyomtato tipusa megvaltozott."
 msgstr "Figyelem: a nyomtato tipusa megvaltozott."
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Sikerult kivenni a filamentet?"
 msgstr "Sikerult kivenni a filamentet?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr "Kabelezesi hiba"
 msgstr "Kabelezesi hiba"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr "Varazslo"
 msgstr "Varazslo"
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "X-korrekcio:"
 msgstr "X-korrekcio:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "XYZ kal. reszlet"
 msgstr "XYZ kal. reszlet"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
 "XYZ kalibracio OK. Az esetleges X/Y merolegessegi hiba automatikusan "
 "XYZ kalibracio OK. Az esetleges X/Y merolegessegi hiba automatikusan "
 "korrigalva lesz."
 "korrigalva lesz."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 "XYZ kalibracio sikerult. Az X/Y tengelyeken enyhe merolegessegi hiba van."
 "XYZ kalibracio sikerult. Az X/Y tengelyeken enyhe merolegessegi hiba van."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "Az XYZ kalibracio sikertelen. Az elulso kalibracios pontok nem erhetoek el."
 "Az XYZ kalibracio sikertelen. Az elulso kalibracios pontok nem erhetoek el."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "Az XYZ kalibracio sikertelen. A jobb kalibracios pontok nem erhetoek el."
 "Az XYZ kalibracio sikertelen. A jobb kalibracios pontok nem erhetoek el."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 "Az XYZ kalibracio sikertelen. Az asztal kalibracios pontja nem erheto el."
 "Az XYZ kalibracio sikertelen. Az asztal kalibracios pontja nem erheto el."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 "Az XYZ kalibracio sikertelen. Az elulso kalibracios pontok nem erhetoek el."
 "Az XYZ kalibracio sikertelen. Az elulso kalibracios pontok nem erhetoek el."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "XYZ kalibracio sikertelen. Kerlek, nezz bele a kezikonyvbe."
 msgstr "XYZ kalibracio sikertelen. Kerlek, nezz bele a kezikonyvbe."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "Az XYZ kalibracio sikertelen. A jobb kalibracios pontok nem erhetoek el."
 "Az XYZ kalibracio sikertelen. A jobb kalibracios pontok nem erhetoek el."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "XYZ kalibracio OK. Az X/Y tengelyek merolegesek. Gratulalok!"
 msgstr "XYZ kalibracio OK. Az X/Y tengelyek merolegesek. Gratulalok!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Y-minimum tavolsag"
 msgstr "Y-minimum tavolsag"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Y-korrekcio:"
 msgstr "Y-korrekcio:"
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr "Igen"
 msgstr "Igen"
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr "A Varazsolt barmikor elered a Kalibracio -> Varazslo menubol."
 msgstr "A Varazsolt barmikor elered a Kalibracio -> Varazslo menubol."
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Z-korrekcio:"
 msgstr "Z-korrekcio:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr "Z meres szama"
 msgstr "Z meres szama"
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "[0;0] pont offszet"
 msgstr "[0;0] pont offszet"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "es nyomd meg a gombot"
 msgstr "es nyomd meg a gombot"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr "filam. betoltesehez"
 msgstr "filam. betoltesehez"
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "filament kiadasahoz"
 msgstr "filament kiadasahoz"
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr "ismeretlen"
 msgstr "ismeretlen"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr "ismeretlen allapot"
 msgstr "ismeretlen allapot"
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr "🔃Frissites"
 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?"
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Utkozes erzekelve. Folytassam a nyomtatast?"
 #~ 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."
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117. Elso reteg kalibr."
 #~ 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr " 0.3 o inferiore"
 msgstr " 0.3 o inferiore"
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr " 0.4 o superiore"
 msgstr " 0.4 o superiore"
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr "atteso livello %s"
 msgstr "atteso livello %s"
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ">Annulla"
 msgstr ">Annulla"
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr "Compensaz. Z:"
 msgstr "Compensaz. Z:"
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr "Nessun errore"
 msgstr "Nessun errore"
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr "Tutto fatto. Buona stampa!"
 msgstr "Tutto fatto. Buona stampa!"
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr "Alfabeti"
 msgstr "Alfabeti"
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr "Ambiente"
 msgstr "Ambiente"
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr "I carrelli Z sin/des sono altezza max?"
 msgstr "I carrelli Z sin/des sono altezza max?"
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr "Assist."
 msgstr "Assist."
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr "Auto"
 msgstr "Auto"
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr "Trova origine"
 msgstr "Trova origine"
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr "Automatico"
 msgstr "Automatico"
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr "Autocaric. filam."
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr "Caricamento automatico attivo, premi la manopola e inserisci il filam."
 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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr "Assi"
 msgstr "Assi"
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr "Lunghezza dell'asse"
 msgstr "Lunghezza dell'asse"
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr "Indietro"
 msgstr "Indietro"
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr "Piano"
 msgstr "Piano"
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr "Riscald. piano"
 msgstr "Riscald. piano"
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr "Piano fatto."
 msgstr "Piano fatto."
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr "Correz. liv.piano"
 msgstr "Correz. liv.piano"
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
@@ -168,50 +170,55 @@ msgstr ""
 "reset."
 "reset."
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr "Piano/Riscald."
 msgstr "Piano/Riscald."
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr "Stato cinghie"
 msgstr "Stato cinghie"
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr "Test cinghie"
 msgstr "Test cinghie"
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr "Blackout rilevato. Recuperare stampa?"
 msgstr "Blackout rilevato. Recuperare stampa?"
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr "Chiaro"
 msgstr "Chiaro"
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr "Luminosita'"
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr "Calibra XYZ"
 msgstr "Calibra XYZ"
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr "Calibra Z"
 msgstr "Calibra Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -220,13 +227,13 @@ msgstr ""
 "all'altezza massima. Click per terminare."
 "all'altezza massima. Click per terminare."
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr "Calibrando Z"
 msgstr "Calibrando Z"
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
@@ -235,140 +242,151 @@ msgstr ""
 "all'altezza massima. Click per terminare."
 "all'altezza massima. Click per terminare."
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr "Calibrazione Home"
 msgstr "Calibrazione Home"
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr "Calibrazione"
 msgstr "Calibrazione"
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr "Calibr. completa"
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr "SD rimossa"
 msgstr "SD rimossa"
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr "Cambia filamento"
 msgstr "Cambia filamento"
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr "Cambio riuscito!"
 msgstr "Cambio riuscito!"
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr "Cambio corretto?"
 msgstr "Cambio corretto?"
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr "Verifica asse X"
 msgstr "Verifica asse X"
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr "Verifica asse Y"
 msgstr "Verifica asse Y"
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr "Verifica asse Z"
 msgstr "Verifica asse Z"
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr "Verifica piano"
 msgstr "Verifica piano"
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr "Verifica finecorsa"
 msgstr "Verifica finecorsa"
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr "Verifica file"
 msgstr "Verifica file"
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr "Verifica ugello"
 msgstr "Verifica ugello"
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr "Controllo sensori"
 msgstr "Controllo sensori"
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr "Controlli"
 msgstr "Controlli"
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr "Colore non puro"
 msgstr "Colore non puro"
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr "Contribuiti"
 msgstr "Contribuiti"
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr "Cont."
 msgstr "Cont."
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr "Raffredda"
 msgstr "Raffredda"
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr "Copiare la lingua selezionata?"
 msgstr "Copiare la lingua selezionata?"
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr "Impatto"
 msgstr "Impatto"
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr "Rileva.crash"
 msgstr "Rileva.crash"
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr "Rilevato impatto."
 msgstr "Rilevato impatto."
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -379,39 +397,46 @@ msgstr ""
 "in Modalita normale"
 "in Modalita normale"
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr "Taglia filamento"
 msgstr "Taglia filamento"
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr "Tagliatr."
 msgstr "Tagliatr."
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr "Tagliando filam."
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr "Data:"
 msgstr "Data:"
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr "Scuro"
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr "Disabilita motori"
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -423,7 +448,7 @@ msgstr ""
 "Calibrazione primo strato."
 "Calibrazione primo strato."
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
@@ -431,222 +456,345 @@ msgstr ""
 "Desideri ripetere l'ultimo passaggio per migliorare la distanza fra ugello e "
 "Desideri ripetere l'ultimo passaggio per migliorare la distanza fra ugello e "
 "piatto?"
 "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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr "Correzione-E:"
 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
 #. MSG_ERROR c=10
-#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2287
+#: ../../Firmware/messages.cpp:29 ../../Firmware/ultralcd.cpp:2282
 msgid "ERROR:"
 msgid "ERROR:"
 msgstr "ERRORE:"
 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
 #. 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"
 msgid "Eject filament"
 msgstr "Espelli fil."
 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"
 msgid "Ejecting filament"
 msgstr "Espellendo filamento"
 msgstr "Espellendo filamento"
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr "Finecorsa"
 msgstr "Finecorsa"
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr "Finec. fuori portata"
 msgstr "Finec. fuori portata"
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr "Finecorsa"
 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
 #. 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"
 msgid "Extruder"
 msgstr "Estrusore"
 msgstr "Estrusore"
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr "Vent. estrusore:"
 msgstr "Vent. estrusore:"
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr "Info estrusore"
 msgstr "Info estrusore"
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr "Autocar.fil."
 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
 #. 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"
 msgid "FS Action"
 msgstr "Azione FS"
 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
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr "Stat. fallimenti"
 msgstr "Stat. fallimenti"
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr "Stat.fall. MMU"
 msgstr "Stat.fall. MMU"
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr "Falso innesco"
 msgstr "Falso innesco"
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr "Velocita vent."
 msgstr "Velocita vent."
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr "Test ventola"
 msgstr "Test ventola"
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr "Control.vent"
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr "Fil. esauriti"
 msgstr "Fil. esauriti"
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr "Sensore fil."
 msgstr "Sensore fil."
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr "Filamento"
 msgstr "Filamento"
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr "Filamento estruso e con colore corretto?"
 msgstr "Filamento estruso e con colore corretto?"
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr "Fil. non caricato"
 msgstr "Fil. non caricato"
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr "Sensore filam."
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr "Fil. utilizzato"
 msgstr "Fil. utilizzato"
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr "File incompleto. Continuare comunque?"
 msgstr "File incompleto. Continuare comunque?"
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr "Finaliz. spostamenti"
 msgstr "Finaliz. spostamenti"
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr "Cal. primo strato"
 msgstr "Cal. primo strato"
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 msgstr ""
 "Per primo avviero l'autotest per controllare gli errori di assemblaggio piu "
 "Per primo avviero l'autotest per controllare gli errori di assemblaggio piu "
 "comuni."
 "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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr "Flusso"
 msgstr "Flusso"
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr "Ventola frontale?"
 msgstr "Ventola frontale?"
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr "Fronte [μm]"
 msgstr "Fronte [μm]"
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr "Ventola frontale/sin"
 msgstr "Ventola frontale/sin"
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr "G-code processato per un livello diverso. Continuare?"
 msgstr "G-code processato per un livello diverso. Continuare?"
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
@@ -655,14 +803,14 @@ msgstr ""
 "slice del modello. Stampa annullata."
 "slice del modello. Stampa annullata."
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr "G-code processato per una stampante diversa. Continuare?"
 msgstr "G-code processato per una stampante diversa. Continuare?"
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
@@ -671,12 +819,12 @@ msgstr ""
 "slice del modello. Stampa annullata."
 "slice del modello. Stampa annullata."
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr "G-code processato per un firmware piu recente. Continuare?"
 msgstr "G-code processato per un firmware piu recente. Continuare?"
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
@@ -685,42 +833,42 @@ msgstr ""
 "firmware. Stampa annullata."
 "firmware. Stampa annullata."
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr "Impostazioni HW"
 msgstr "Impostazioni HW"
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr "Riscald./Termist."
 msgstr "Riscald./Termist."
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr "Riscaldamento..."
 msgstr "Riscaldamento..."
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr "Riscaldamento fermato dal timer di sicurezza."
 msgstr "Riscaldamento fermato dal timer di sicurezza."
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr "Riscald. completo"
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -731,7 +879,7 @@ msgstr ""
 "stampare."
 "stampare."
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -740,24 +888,45 @@ msgstr ""
 "processo di configurazione?"
 "processo di configurazione?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr "Forte"
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr "Adesso avviero una Calibrazione XYZ. Puo durare circa 12 min."
 msgstr "Adesso avviero una Calibrazione XYZ. Puo durare circa 12 min."
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr "Adesso avviero la Calibrazione Z."
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
@@ -766,296 +935,328 @@ msgstr ""
 "Setup HW - Piastre in Acciaio."
 "Setup HW - Piastre in Acciaio."
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr "Schermata info"
 msgstr "Schermata info"
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr "Inserire filamento"
 msgstr "Inserire filamento"
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr ""
 msgstr ""
 "Inserire filamento (senza caricarlo) nell'estrusore e premere la manopola."
 "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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr "Il filamento e' stato caricato?"
 msgstr "Il filamento e' stato caricato?"
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr "Piastra d'acciaio su piano riscaldato?"
 msgstr "Piastra d'acciaio su piano riscaldato?"
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr "Iterazione"
 msgstr "Iterazione"
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr "Ultima stampa"
 msgstr "Ultima stampa"
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr "Errori ultima stampa"
 msgstr "Errori ultima stampa"
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr "Sinistra"
 msgstr "Sinistra"
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr "Vent SX hotend?"
 msgstr "Vent SX hotend?"
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr "Sinistra [μm]"
 msgstr "Sinistra [μm]"
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr "Liv. Chiaro"
 msgstr "Liv. Chiaro"
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr "Liv. Scuro"
 msgstr "Liv. Scuro"
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr "Correzione lineare"
 msgstr "Correzione lineare"
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr "Compensazione Z"
 msgstr "Compensazione Z"
 
 
 #. MSG_LOAD_ALL c=18
 #. 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
 #. 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"
 msgid "Load filament"
 msgstr "Carica filamento"
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr "Carica ugello"
 msgstr "Carica ugello"
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr "Caricando colore"
 msgstr "Caricando colore"
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr "Caricando filamento"
 msgstr "Caricando filamento"
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr "Puleggia lenta"
 msgstr "Puleggia lenta"
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr "Forte"
 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
 #. 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"
 msgid "MMU Mode"
 msgstr "Mod. MMU"
 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
 #. 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"
 msgid "MMU fails"
 msgstr "Fallimenti MMU"
 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
 #. 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"
 msgid "MMU load fails"
 msgstr "Car MMU falliti"
 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
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr "MMU2 connessa"
 msgstr "MMU2 connessa"
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr "Comp. Magneti"
 msgstr "Comp. Magneti"
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr "Menu principale"
 msgstr "Menu principale"
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr "Dev. misurata"
 msgstr "Dev. misurata"
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr "Misura altezza di rif. del punto di calib."
 msgstr "Misura altezza di rif. del punto di calib."
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr "Griglia"
 msgstr "Griglia"
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr "Liv. griglia piano"
 msgstr "Liv. griglia piano"
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr "Mod."
 msgstr "Mod."
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr "Cambio modalita in corso..."
 msgstr "Cambio modalita in corso..."
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr "Modello"
 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
 #. 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"
 msgid "Motor"
 msgstr "Motore"
 msgstr "Motore"
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr "Sposta X"
 msgstr "Sposta X"
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr "Sposta Y"
 msgstr "Sposta Y"
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr "Sposta Z"
 msgstr "Sposta Z"
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr "Muovi asse"
 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
 #. 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"
 msgid "N/A"
 msgstr "N/D"
 msgstr "N/D"
 
 
@@ -1065,155 +1266,163 @@ msgid "New firmware version available:"
 msgstr "Nuova vers. firmware disponibile:"
 msgstr "Nuova vers. firmware disponibile:"
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr "No"
 msgstr "No"
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr "Nessuna SD"
 msgstr "Nessuna SD"
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr "Nessun movimento."
 msgstr "Nessun movimento."
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr "Nessuno"
 msgstr "Nessuno"
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr "Normale"
 msgstr "Normale"
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr "Non connesso"
 msgstr "Non connesso"
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr "Non gira"
 msgstr "Non gira"
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr "Adesso calibro la distanza fra ugello e superfice del piatto."
 msgstr "Adesso calibro la distanza fra ugello e superfice del piatto."
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr "Adesso preriscaldero l'ugello per PLA."
 msgstr "Adesso preriscaldero l'ugello per PLA."
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr "Ora rimuovete la stampa di prova dalla piastra in acciaio."
 msgstr "Ora rimuovete la stampa di prova dalla piastra in acciaio."
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr "Ugello"
 msgstr "Ugello"
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr "Dia.Ugello"
 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
 #. 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"
 msgid "Off"
 msgstr "Off"
 msgstr "Off"
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 "Sono state trovate impostazioni vecchie. Verranno impostati i valori "
 "Sono state trovate impostazioni vecchie. Verranno impostati i valori "
 "predefiniti di PID, Esteps etc."
 "predefiniti di PID, Esteps etc."
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr "On"
 msgstr "On"
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr "Singolo"
 msgstr "Singolo"
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr "Calibrazione PID"
 msgstr "Calibrazione PID"
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr "Calib. PID completa"
 msgstr "Calib. PID completa"
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr "Calibrazione PID"
 msgstr "Calibrazione PID"
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr "Riscaldamento PINDA"
 msgstr "Riscaldamento PINDA"
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr "Calib. PINDA"
 msgstr "Calib. PINDA"
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr "Calibrazione temperatura fallita"
 msgstr "Calibrazione temperatura fallita"
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
@@ -1221,19 +1430,36 @@ msgstr ""
 "Calibrazione PINDA completata e attiva. Puo essere disattivata dal menu "
 "Calibrazione PINDA completata e attiva. Puo essere disattivata dal menu "
 "Impostazioni ->Calib. PINDA"
 "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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr "Pausa"
 msgstr "Pausa"
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr "Metti in pausa"
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "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."
 "punti. In caso l'ugello muova il foglio spegnere subito la stampante."
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "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."
 msgstr "Controllare il collegamento al sensore e rimuovere il filamento."
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr "Verifica:"
 msgstr "Verifica:"
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr "Per favore pulisci il piatto, poi premi la manopola."
 msgstr "Per favore pulisci il piatto, poi premi la manopola."
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr "Pulire l'ugello per la calibrazione, poi fare click."
 msgstr "Pulire l'ugello per la calibrazione, poi fare click."
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
 "Inserisci il filamento nell'estrusore, poi premi la manopola per caricarlo."
 "Inserisci il filamento nell'estrusore, poi premi la manopola per caricarlo."
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
@@ -1287,50 +1513,45 @@ msgstr ""
 "manopola per caricarlo."
 "manopola per caricarlo."
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr "Per favore prima carica il filamento."
 msgstr "Per favore prima carica il filamento."
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr "Aprire la guida filam. e rimuovere il filam. a mano"
 msgstr "Aprire la guida filam. e rimuovere il filam. a mano"
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr "Per favore posizionate la piastra d'acciaio sul piano riscaldato."
 msgstr "Per favore posizionate la piastra d'acciaio sul piano riscaldato."
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr "Premete la manopola per scaricare il filamento"
 msgstr "Premete la manopola per scaricare il filamento"
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr "Estrarre il filamento immediatamente"
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr "Per favore rimuovete i materiali da spedizione"
 msgstr "Per favore rimuovete i materiali da spedizione"
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr "Rimuovete la piastra di acciaio dal piano riscaldato"
 msgstr "Rimuovete la piastra di acciaio dal piano riscaldato"
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr "Esegui la calibrazione XYZ prima."
 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."
 msgid "Please unload the filament first, then repeat this action."
 msgstr "Scaricare prima il filamento, poi ripetere l'operazione."
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr "Prego aggiornare."
 msgstr "Prego aggiornare."
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr "Attendere"
 msgstr "Attendere"
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr "Interr. corr."
 msgstr "Interr. corr."
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr "Preriscalda"
 msgstr "Preriscalda"
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr "Prerisc. ugello!"
 msgstr "Prerisc. ugello!"
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr "Preriscaldando l'ugello. Attendere prego."
 msgstr "Preriscaldando l'ugello. Attendere prego."
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr "Preriscalda. taglio"
 msgstr "Preriscalda. taglio"
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr "Preriscalda. espuls."
 msgstr "Preriscalda. espuls."
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr "Preriscald. carico"
 msgstr "Preriscald. carico"
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr "Preriscald. scarico"
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr "Premere la manopola"
 msgstr "Premere la manopola"
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr "Premete la manopola per preriscaldare l'ugello e continuare."
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr "Stampa interrotta"
 msgstr "Stampa interrotta"
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr "Vent.stam:"
 msgstr "Vent.stam:"
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr "Stampa da SD"
 msgstr "Stampa da SD"
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr "Stampa in pausa"
 msgstr "Stampa in pausa"
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr "Tempo di stampa"
 msgstr "Tempo di stampa"
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr "Ind. IP stampante:"
 msgstr "Ind. IP stampante:"
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
@@ -1454,12 +1671,12 @@ msgstr ""
 "Primi Passi, sezione Sequenza di Calibrazione."
 "Primi Passi, sezione Sequenza di Calibrazione."
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr "Diametro ugello diverso da G-Code. Continuare?"
 msgstr "Diametro ugello diverso da G-Code. Continuare?"
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
@@ -1467,67 +1684,112 @@ msgstr ""
 "Diametro ugello diverso dal G-Code. Controlla il valore nelle impostazioni. "
 "Diametro ugello diverso dal G-Code. Controlla il valore nelle impostazioni. "
 "Stampa annullata."
 "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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr "Porta RPi"
 msgstr "Porta RPi"
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr "Retro [μm]"
 msgstr "Retro [μm]"
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr "Recupero stampa"
 msgstr "Recupero stampa"
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 "Rimuovi il filamento precedente e premi la manopola per caricare il nuovo "
 "Rimuovi il filamento precedente e premi la manopola per caricare il nuovo "
 "filamento."
 "filamento."
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr "Rinomina"
 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
 #. 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"
 msgid "Reset"
 msgstr "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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr "Reset calibr. XYZ."
 msgstr "Reset calibr. XYZ."
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr "Riprendi stampa"
 msgstr "Riprendi stampa"
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr "Riprendi stampa"
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr "Destra"
 msgstr "Destra"
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr "Destra [μm]"
 msgstr "Destra [μm]"
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
@@ -1535,36 +1797,41 @@ msgstr ""
 "Se avvi il Wizard perderai la calibrazione preesistente e dovrai "
 "Se avvi il Wizard perderai la calibrazione preesistente e dovrai "
 "ricominciare dall'inizio. Continuare?"
 "ricominciare dall'inizio. Continuare?"
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr "Esaurim"
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr "Mem. SD"
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr "ARRESTATO."
 msgstr "ARRESTATO."
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr "Ricerca punti calibrazione piano"
 msgstr "Ricerca punti calibrazione piano"
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr "Seleziona"
 msgstr "Seleziona"
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
@@ -1573,67 +1840,74 @@ msgstr ""
 "menu sullo schermo."
 "menu sullo schermo."
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr "Seleziona estrusore:"
 msgstr "Seleziona estrusore:"
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr "Seleziona il filam.:"
 msgstr "Seleziona il filam.:"
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr "Seleziona lingua"
 msgstr "Seleziona lingua"
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 "Selezionate la temperatura per il preriscaldamento dell'ugello adatta al "
 "Selezionate la temperatura per il preriscaldamento dell'ugello adatta al "
 "vostro materiale."
 "vostro materiale."
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr "Seleziona la temperatura appropriata per il tuo materiale."
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr "Autotest OK"
 msgstr "Autotest OK"
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr "Avvia autotest"
 msgstr "Avvia autotest"
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr "Autotest"
 msgstr "Autotest"
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr "Errore Autotest!"
 msgstr "Errore Autotest!"
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr "Autotest fallito"
 msgstr "Autotest fallito"
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr "Verra effettuato un self test per calibrare l'homing senza sensori"
 msgstr "Verra effettuato un self test per calibrare l'homing senza sensori"
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr "Info Sensore"
 msgstr "Info Sensore"
 
 
@@ -1643,31 +1917,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr "Sensore verificato, rimuovere il filamento."
 msgstr "Sensore verificato, rimuovere il filamento."
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr "Imposta temperatura:"
 msgstr "Imposta temperatura:"
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr "Impostazioni"
 msgstr "Impostazioni"
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr "Deviaz. forte"
 msgstr "Deviaz. forte"
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr "Piano"
 msgstr "Piano"
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1680,18 +1954,18 @@ msgstr ""
 "%cReset"
 "%cReset"
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr "Stato finecorsa"
 msgstr "Stato finecorsa"
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr "Silenz."
 msgstr "Silenz."
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr "Deviaz. lieve"
 msgstr "Deviaz. lieve"
 
 
@@ -1705,113 +1979,172 @@ msgstr ""
 "e 100 perche siano ordinati."
 "e 100 perche siano ordinati."
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr "Sono stati rilevati problemi, avviato livellamento Z ..."
 msgstr "Sono stati rilevati problemi, avviato livellamento Z ..."
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr "Ordina"
 msgstr "Ordina"
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr "Ordinando i file"
 msgstr "Ordinando i file"
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr "Suono"
 msgstr "Suono"
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr "Velocita"
 msgstr "Velocita"
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr "Gira"
 msgstr "Gira"
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 "Sono necessari una temperatura ambiente di 21-26C e una superficie rigida."
 "Sono necessari una temperatura ambiente di 21-26C e una superficie rigida."
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr "Statistiche"
 msgstr "Statistiche"
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr "Silenz."
 msgstr "Silenz."
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr "Piani d'acciaio"
 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
 #. 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"
 msgid "Stop print"
 msgstr "Arresta stampa"
 msgstr "Arresta stampa"
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr "Esatto"
 msgstr "Esatto"
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr "Supporto"
 msgstr "Supporto"
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr "Scambiato"
 msgstr "Scambiato"
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr "Temperatura"
 msgstr "Temperatura"
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr "Temperature"
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1822,7 +2155,7 @@ msgstr ""
 "manuale (capitolo sulla calibrazione)."
 "manuale (capitolo sulla calibrazione)."
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
@@ -1831,66 +2164,102 @@ msgstr ""
 "Primi Passi, sezione Sequenza di Calibrazione."
 "Primi Passi, sezione Sequenza di Calibrazione."
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr "Cron."
 msgstr "Cron."
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr "Timeout"
 msgstr "Timeout"
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr "Totale"
 msgstr "Totale"
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr "Totale fallimenti"
 msgstr "Totale fallimenti"
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr "Filamento totale"
 msgstr "Filamento totale"
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr "Tempo stampa totale"
 msgstr "Tempo stampa totale"
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr "Regola"
 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"
 msgid "Unload filament"
 msgstr "Scarica filam."
 msgstr "Scarica filam."
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr "Scaricando filamento"
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr "Verifica fallita, rimuovere il filamento e riprovare."
 msgstr "Verifica fallita, rimuovere il filamento e riprovare."
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr "Voltaggi"
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1903,222 +2272,281 @@ msgstr ""
 "Modalita silenziosa"
 "Modalita silenziosa"
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr "Attendendo utente..."
 msgstr "Attendendo utente..."
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr "In attesa del raffreddamento della sonda PINDA"
 msgstr "In attesa del raffreddamento della sonda PINDA"
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr "In attesa del raffreddamento dell'ugello e del piano"
 msgstr "In attesa del raffreddamento dell'ugello e del piano"
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr "Avviso"
 msgstr "Avviso"
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr "Attenzione: tipo di stampante e di scheda madre cambiati."
 msgstr "Attenzione: tipo di stampante e di scheda madre cambiati."
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr "Avviso: tipo di scheda madre cambiato"
 msgstr "Avviso: tipo di scheda madre cambiato"
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr "Avviso: tipo di stampante cambiato."
 msgstr "Avviso: tipo di stampante cambiato."
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr "Filamento scaricato con successo?"
 msgstr "Filamento scaricato con successo?"
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr "Errore cablaggio"
 msgstr "Errore cablaggio"
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr "Wizard"
 msgstr "Wizard"
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr "Correzione-X:"
 msgstr "Correzione-X:"
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr "XYZ Cal. dettagli"
 msgstr "XYZ Cal. dettagli"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
 "Calibrazione XYZ corretta. La distorsione verra compensata automaticamente."
 "Calibrazione XYZ corretta. La distorsione verra compensata automaticamente."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"
 msgstr "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr "Calibrazione XYZ compromessa. Punti anteriori non raggiungibili."
 msgstr "Calibrazione XYZ compromessa. Punti anteriori non raggiungibili."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."
 "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 "Calibrazione XYZ fallita. Il punto di calibrazione sul piano non e' stato "
 "Calibrazione XYZ fallita. Il punto di calibrazione sul piano non e' stato "
 "trovato."
 "trovato."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."
 msgstr "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr "Calibrazione XYZ fallita. Si prega di consultare il manuale."
 msgstr "Calibrazione XYZ fallita. Si prega di consultare il manuale."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."
 msgstr "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr "Calibrazione XYZ OK. Gli assi X/Y sono perpendicolari. Complimenti!"
 msgstr "Calibrazione XYZ OK. Gli assi X/Y sono perpendicolari. Complimenti!"
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr "Distanza Y dal min"
 msgstr "Distanza Y dal min"
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr "Correzione-Y:"
 msgstr "Correzione-Y:"
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr "Si"
 msgstr "Si"
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 "E possibile riprendere il Wizard in qualsiasi momento attraverso "
 "E possibile riprendere il Wizard in qualsiasi momento attraverso "
 "Calibrazione -> Wizard."
 "Calibrazione -> Wizard."
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr "Correzione-Z:"
 msgstr "Correzione-Z:"
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr "Nr. Z-test"
 msgstr "Nr. Z-test"
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr "[0;0] punto offset"
 msgstr "[0;0] punto offset"
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr "e cliccare manopola"
 msgstr "e cliccare manopola"
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr "per caricare il fil."
 msgstr "per caricare il fil."
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr "per scaricare fil."
 msgstr "per scaricare fil."
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr "sconosciuto"
 msgstr "sconosciuto"
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr "stato sconosciuto"
 msgstr "stato sconosciuto"
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr "🔃Ricaricare"
 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?"
 #~ msgid "Crash detected. Resume print?"
 #~ msgstr "Scontro rilevato. Riprendere la stampa?"
 #~ 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."
 #~ msgid "M117 First layer cal."
 #~ msgstr "M117 Calibr. primo strato"
 #~ 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr ""
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr ""
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr ""
 msgstr ""
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -369,39 +388,46 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr ""
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr ""
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -410,294 +436,417 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
 msgstr ""
 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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_EJECT_FILAMENT c=17
 #. 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"
 msgid "Eject filament"
 msgstr ""
 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"
 msgid "Ejecting filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr ""
 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
 #. 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"
 msgid "Extruder"
 msgstr ""
 msgstr ""
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr ""
 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
 #. 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"
 msgid "FS Action"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_FAIL_STATS c=18
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr ""
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr ""
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr ""
 msgstr ""
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr ""
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -705,7 +854,7 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -714,319 +863,372 @@ msgstr ""
 "duerch de Setupprozess guideieren?"
 "duerch de Setupprozess guideieren?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr ""
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr ""
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
 msgstr ""
 msgstr ""
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr ""
 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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOAD_ALL c=18
 #. 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 ""
 msgstr ""
 
 
 #. MSG_LOAD_FILAMENT c=17
 #. 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"
 msgid "Load filament"
 msgstr ""
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_MODE c=8
 #. 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"
 msgid "MMU Mode"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_FAILS c=15
 #. 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"
 msgid "MMU fails"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
 #. 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"
 msgid "MMU load fails"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_CONNECTED c=18
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr ""
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr ""
 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
 #. 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"
 msgid "N/A"
 msgstr ""
 msgstr ""
 
 
@@ -1036,178 +1238,203 @@ msgid "New firmware version available:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr ""
 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
 #. 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"
 msgid "Off"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
 msgstr ""
 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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr ""
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "rebooting the printer."
@@ -1219,78 +1446,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr ""
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr ""
 msgstr ""
 
 
@@ -1299,289 +1521,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr ""
 msgstr ""
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr ""
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
 msgstr ""
 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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr ""
 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
 #. 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"
 msgid "Reset"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr ""
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr ""
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr ""
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr ""
 msgstr ""
 
 
@@ -1591,31 +1866,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1624,18 +1899,18 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr ""
 msgstr ""
 
 
@@ -1647,112 +1922,171 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr ""
 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
 #. 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"
 msgid "Stop print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr ""
 msgstr ""
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr ""
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1760,73 +2094,109 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr ""
 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"
 msgid "Unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr ""
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr ""
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1835,210 +2205,210 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr ""
 msgstr ""
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr ""
 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"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 
 #. MSG_IR_03_OR_OLDER c=18
 #. 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"
 msgid " 0.3 or older"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_04_OR_NEWER c=18
 #. 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"
 msgid " 0.4 or newer"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FS_LEVEL c=20
 #. MSG_SELFTEST_FS_LEVEL c=20
-#: ../../Firmware/ultralcd.cpp:7044
+#: ../../Firmware/ultralcd.cpp:7035
 msgid "%s level expected"
 msgid "%s level expected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CANCEL c=10
 #. 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"
 msgid ">Cancel"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEPPING_Z c=15
 #. MSG_BABYSTEPPING_Z c=15
 #. Beware: must include the ':' as its last character
 #. Beware: must include the ':' as its last character
-#: ../../Firmware/ultralcd.cpp:2678
+#: ../../Firmware/ultralcd.cpp:2668
 msgid "Adjusting Z:"
 msgid "Adjusting Z:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #. MSG_SELFTEST_CHECK_ALLCORRECT c=20
-#: ../../Firmware/ultralcd.cpp:7321
+#: ../../Firmware/ultralcd.cpp:7311
 msgid "All correct"
 msgid "All correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_DONE c=20 r=3
 #. 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!"
 msgid "All is done. Happy printing!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_ALPHA c=8
 #. MSG_SORT_ALPHA c=8
-#: ../../Firmware/messages.cpp:138 ../../Firmware/ultralcd.cpp:4412
+#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4402
 msgid "Alphabet"
 msgid "Alphabet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ALWAYS c=6
 #. MSG_ALWAYS c=6
-#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4316
+#: ../../Firmware/messages.cpp:8 ../../Firmware/ultralcd.cpp:4287
 msgid "Always"
 msgid "Always"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AMBIENT c=14
 #. MSG_AMBIENT c=14
-#: ../../Firmware/ultralcd.cpp:1413
+#: ../../Firmware/ultralcd.cpp:1406
 msgid "Ambient"
 msgid "Ambient"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #. 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?"
 msgid "Are left and right Z~carriages all up?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_BLIND c=7
 #. MSG_SOUND_BLIND c=7
-#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4467
+#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:4457
 msgid "Assist"
 msgid "Assist"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO c=6
 #. MSG_AUTO c=6
-#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:161 ../../Firmware/ultralcd.cpp:5862
 msgid "Auto"
 msgid "Auto"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_HOME c=18
 #. 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"
 msgid "Auto home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTO_POWER c=10
 #. 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"
 msgid "Auto power"
 msgstr ""
 msgstr ""
 
 
 #. MSG_AUTOLOAD_FILAMENT c=18
 #. MSG_AUTOLOAD_FILAMENT c=18
-#: ../../Firmware/ultralcd.cpp:5580
+#: ../../Firmware/ultralcd.cpp:5584
 msgid "AutoLoad filament"
 msgid "AutoLoad filament"
 msgstr ""
 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
 #. MSG_AUTOLOADING_ENABLED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2309
+#: ../../Firmware/ultralcd.cpp:2301
 msgid ""
 msgid ""
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 msgstr ""
 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
 #. MSG_SELFTEST_AXIS c=16
-#: ../../Firmware/ultralcd.cpp:7023
+#: ../../Firmware/ultralcd.cpp:7014
 msgid "Axis"
 msgid "Axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_AXIS_LENGTH c=20
 #. MSG_SELFTEST_AXIS_LENGTH c=20
-#: ../../Firmware/ultralcd.cpp:7022
+#: ../../Firmware/ultralcd.cpp:7013
 msgid "Axis length"
 msgid "Axis length"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BACK c=18
 #. 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"
 msgid "Back"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED c=13
 #. 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"
 msgid "Bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING c=20
 #. 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"
 msgid "Bed Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_DONE c=20
 #. 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"
 msgid "Bed done"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_MENU c=18
 #. MSG_BED_CORRECTION_MENU c=18
-#: ../../Firmware/ultralcd.cpp:4920
+#: ../../Firmware/ultralcd.cpp:4883
 msgid "Bed level correct"
 msgid "Bed level correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=6
 #. 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 ""
 msgid ""
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "Bed leveling failed. Sensor didn't trigger. Debris on nozzle? Waiting for "
 "reset."
 "reset."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_BEDHEATER c=20
 #. MSG_SELFTEST_BEDHEATER c=20
-#: ../../Firmware/ultralcd.cpp:6980
+#: ../../Firmware/ultralcd.cpp:6971
 msgid "Bed/Heater"
 msgid "Bed/Heater"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELT_STATUS c=18
 #. 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"
 msgid "Belt status"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BELTTEST c=18
 #. MSG_BELTTEST c=18
-#: ../../Firmware/ultralcd.cpp:4910
+#: ../../Firmware/ultralcd.cpp:4873
 msgid "Belt test"
 msgid "Belt test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVER_PRINT c=20 r=2
 #. 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?"
 msgid "Blackout occurred. Recover print?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHT c=6
 #. MSG_BRIGHT c=6
-#: ../../Firmware/messages.cpp:155 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:159 ../../Firmware/ultralcd.cpp:5862
 msgid "Bright"
 msgid "Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BRIGHTNESS c=18
 #. 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"
 msgid "Brightness"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED c=18
-#: ../../Firmware/ultralcd.cpp:4914
+#: ../../Firmware/ultralcd.cpp:4877
 msgid "Calibrate XYZ"
 msgid "Calibrate XYZ"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ c=18
 #. MSG_HOMEYZ c=18
-#: ../../Firmware/messages.cpp:48 ../../Firmware/ultralcd.cpp:4916
+#: ../../Firmware/messages.cpp:50 ../../Firmware/ultralcd.cpp:4879
 msgid "Calibrate Z"
 msgid "Calibrate Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2954
+#: ../../Firmware/ultralcd.cpp:2944
 msgid ""
 msgid ""
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATE_Z_AUTO c=20 r=2
 #. 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"
 msgid "Calibrating Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #. MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
-#: ../../Firmware/ultralcd.cpp:2953
+#: ../../Firmware/ultralcd.cpp:2943
 msgid ""
 msgid ""
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end "
 "stoppers. Click when done."
 "stoppers. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATING_HOME c=20
 #. MSG_CALIBRATING_HOME c=20
-#: ../../Firmware/ultralcd.cpp:7323
+#: ../../Firmware/ultralcd.cpp:7313
 msgid "Calibrating home"
 msgid "Calibrating home"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CALIBRATION c=18
 #. MSG_CALIBRATION c=18
-#: ../../Firmware/messages.cpp:63 ../../Firmware/ultralcd.cpp:5589
+#: ../../Firmware/messages.cpp:67 ../../Firmware/ultralcd.cpp:5594
 msgid "Calibration"
 msgid "Calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HOMEYZ_DONE c=20
 #. MSG_HOMEYZ_DONE c=20
-#: ../../Firmware/ultralcd.cpp:638
+#: ../../Firmware/ultralcd.cpp:644
 msgid "Calibration done"
 msgid "Calibration done"
 msgstr ""
 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
 #. MSG_SD_REMOVED c=20
-#: ../../Firmware/ultralcd.cpp:7723
+#: ../../Firmware/ultralcd.cpp:7700
 msgid "Card removed"
 msgid "Card removed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CNG_SDCARD c=18
 #. MSG_CNG_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5546
+#: ../../Firmware/ultralcd.cpp:5547
 msgid "Change SD card"
 msgid "Change SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENTCHANGE c=18
 #. 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"
 msgid "Change filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGE_SUCCESS c=20
 #. MSG_CHANGE_SUCCESS c=20
-#: ../../Firmware/ultralcd.cpp:2171
+#: ../../Firmware/ultralcd.cpp:2179
 msgid "Change success!"
 msgid "Change success!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CORRECTLY c=20
 #. MSG_CORRECTLY c=20
-#: ../../Firmware/ultralcd.cpp:2223
+#: ../../Firmware/ultralcd.cpp:2227
 msgid "Changed correctly?"
 msgid "Changed correctly?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_X c=20
 #. 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"
 msgid "Checking X axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_Y c=20
 #. 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"
 msgid "Checking Y axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_Z c=20
 #. MSG_SELFTEST_CHECK_Z c=20
-#: ../../Firmware/ultralcd.cpp:7315
+#: ../../Firmware/ultralcd.cpp:7305
 msgid "Checking Z axis"
 msgid "Checking Z axis"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_BED c=20
 #. 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"
 msgid "Checking bed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #. MSG_SELFTEST_CHECK_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:7312
+#: ../../Firmware/ultralcd.cpp:7302
 msgid "Checking endstops"
 msgid "Checking endstops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKING_FILE c=17
 #. MSG_CHECKING_FILE c=17
-#: ../../Firmware/ultralcd.cpp:7411
+#: ../../Firmware/ultralcd.cpp:7401
 msgid "Checking file"
 msgid "Checking file"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_HOTEND c=20
 #. MSG_SELFTEST_CHECK_HOTEND c=20
-#: ../../Firmware/ultralcd.cpp:7318
+#: ../../Firmware/ultralcd.cpp:7308
 msgid "Checking hotend"
 msgid "Checking hotend"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_CHECK_FSENSOR c=20
 #. 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"
 msgid "Checking sensors"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECKS c=18
 #. MSG_CHECKS c=18
-#: ../../Firmware/ultralcd.cpp:4773
+#: ../../Firmware/ultralcd.cpp:4728
 msgid "Checks"
 msgid "Checks"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_COLOR c=19
 #. MSG_NOT_COLOR c=19
-#: ../../Firmware/ultralcd.cpp:2226
+#: ../../Firmware/ultralcd.cpp:2230
 msgid "Color not correct"
 msgid "Color not correct"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COMMUNITY_MADE c=18
 #. MSG_COMMUNITY_MADE c=18
-#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3733
+#: ../../Firmware/messages.cpp:23 ../../Firmware/ultralcd.cpp:3696
 msgid "Community made"
 msgid "Community made"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONTINUE_SHORT c=5
 #. MSG_CONTINUE_SHORT c=5
-#: ../../Firmware/messages.cpp:149 ../../Firmware/ultralcd.cpp:4712
+#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:4245
 msgid "Cont."
 msgid "Cont."
 msgstr ""
 msgstr ""
 
 
 #. MSG_COOLDOWN c=18
 #. MSG_COOLDOWN c=18
-#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2133
+#: ../../Firmware/messages.cpp:25 ../../Firmware/ultralcd.cpp:2138
 msgid "Cooldown"
 msgid "Cooldown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_COPY_SEL_LANG c=20 r=3
 #. MSG_COPY_SEL_LANG c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3671
+#: ../../Firmware/ultralcd.cpp:3634
 msgid "Copy selected language?"
 msgid "Copy selected language?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH c=7
 #. 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"
 msgid "Crash"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASHDETECT c=13
 #. 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."
 msgid "Crash det."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DETECTED c=20
 #. 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."
 msgid "Crash detected."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #. MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3529
+#: ../../Firmware/ultralcd.cpp:3538
 msgid ""
 msgid ""
 "Crash detection can\n"
 "Crash detection can\n"
 "be turned on only in\n"
 "be turned on only in\n"
@@ -369,39 +388,46 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUT_FILAMENT c=17
 #. 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"
 msgid "Cut filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CUTTER c=9
 #. 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"
 msgid "Cutter"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_CUTTING_FIL c=18
-#: ../../Firmware/mmu.cpp:1048
-msgid "Cutting filament"
-msgstr ""
-
 #. MSG_DATE c=17
 #. MSG_DATE c=17
-#: ../../Firmware/ultralcd.cpp:1676
+#: ../../Firmware/ultralcd.cpp:1667
 msgid "Date:"
 msgid "Date:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DIM c=6
 #. MSG_DIM c=6
-#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5872
+#: ../../Firmware/messages.cpp:160 ../../Firmware/ultralcd.cpp:5862
 msgid "Dim"
 msgid "Dim"
 msgstr ""
 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
 #. MSG_DISABLE_STEPPERS c=18
-#: ../../Firmware/ultralcd.cpp:4810
+#: ../../Firmware/ultralcd.cpp:4764
 msgid "Disable steppers"
 msgid "Disable steppers"
 msgstr ""
 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
 #. 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
 #: ../../Firmware/messages.cpp:11
 msgid ""
 msgid ""
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
 "Distance between tip of the nozzle and the bed surface has not been set yet. "
@@ -410,294 +436,417 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #. MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:4153
+#: ../../Firmware/ultralcd.cpp:4107
 msgid ""
 msgid ""
 "Do you want to repeat last step to readjust distance between nozzle and "
 "Do you want to repeat last step to readjust distance between nozzle and "
 "heatbed?"
 "heatbed?"
 msgstr ""
 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
 #. MSG_EXTRUDER_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4222
+#: ../../Firmware/ultralcd.cpp:4176
 msgid "E-correct:"
 msgid "E-correct:"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_EJECT_FILAMENT c=17
 #. 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"
 msgid "Eject filament"
 msgstr ""
 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"
 msgid "Ejecting filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP c=16
 #. MSG_SELFTEST_ENDSTOP c=16
-#: ../../Firmware/ultralcd.cpp:6993
+#: ../../Firmware/ultralcd.cpp:6984
 msgid "Endstop"
 msgid "Endstop"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
 #. MSG_SELFTEST_ENDSTOP_NOTHIT c=20
-#: ../../Firmware/ultralcd.cpp:6998
+#: ../../Firmware/ultralcd.cpp:6989
 msgid "Endstop not hit"
 msgid "Endstop not hit"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ENDSTOPS c=20
 #. MSG_SELFTEST_ENDSTOPS c=20
-#: ../../Firmware/ultralcd.cpp:6984
+#: ../../Firmware/ultralcd.cpp:6975
 msgid "Endstops"
 msgid "Endstops"
 msgstr ""
 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
 #. 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"
 msgid "Extruder"
 msgstr ""
 msgstr ""
 
 
 #. MSG_EXTRUDER_FAN_SPEED c=16
 #. 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:"
 msgid "Extruder fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_EXTRUDER c=18
 #. MSG_INFO_EXTRUDER c=18
-#: ../../Firmware/ultralcd.cpp:1730
+#: ../../Firmware/ultralcd.cpp:1722
 msgid "Extruder info"
 msgid "Extruder info"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR_AUTOLOAD c=13
 #. 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"
 msgid "F. autoload"
 msgstr ""
 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
 #. 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"
 msgid "FS Action"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_FAIL_STATS c=18
 #. MSG_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5597
+#: ../../Firmware/ultralcd.cpp:5602
 msgid "Fail stats"
 msgid "Fail stats"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_FAIL_STATS c=18
 #. MSG_MMU_FAIL_STATS c=18
-#: ../../Firmware/ultralcd.cpp:5600
+#: ../../Firmware/ultralcd.cpp:5605
 msgid "Fail stats MMU"
 msgid "Fail stats MMU"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FALSE_TRIGGERING c=20
 #. MSG_FALSE_TRIGGERING c=20
-#: ../../Firmware/ultralcd.cpp:7039
+#: ../../Firmware/ultralcd.cpp:7030
 msgid "False triggering"
 msgid "False triggering"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FAN_SPEED c=14
 #. 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"
 msgid "Fan speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN c=20
 #. 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"
 msgid "Fan test"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FANS_CHECK c=13
 #. 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"
 msgid "Fans check"
 msgstr ""
 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
 #. 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"
 msgid "Fil. runouts"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FSENSOR c=12
 #. 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"
 msgid "Fil. sensor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT c=17
 #. 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"
 msgid "Filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILAMENT_CLEAN c=20 r=2
 #. 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?"
 msgid "Filament extruding & with correct color?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOT_LOADED c=19
 #. MSG_NOT_LOADED c=19
-#: ../../Firmware/ultralcd.cpp:2225
+#: ../../Firmware/ultralcd.cpp:2229
 msgid "Filament not loaded"
 msgid "Filament not loaded"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FILAMENT_SENSOR c=17
 #. 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"
 msgid "Filament sensor"
 msgstr ""
 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
 #. MSG_FILAMENT_USED c=19
-#: ../../Firmware/ultralcd.cpp:2373
+#: ../../Firmware/ultralcd.cpp:2363
 msgid "Filament used"
 msgid "Filament used"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FILE_INCOMPLETE c=20 r=3
 #. MSG_FILE_INCOMPLETE c=20 r=3
-#: ../../Firmware/ultralcd.cpp:7470
+#: ../../Firmware/ultralcd.cpp:7460
 msgid "File incomplete. Continue anyway?"
 msgid "File incomplete. Continue anyway?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FINISHING_MOVEMENTS c=20
 #. 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"
 msgid "Finishing movements"
 msgstr ""
 msgstr ""
 
 
 #. MSG_V2_CALIBRATION c=18
 #. 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."
 msgid "First layer cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_SELFTEST c=20 r=8
 #. 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."
 msgid "First, I will run the selftest to check most common assembly problems."
 msgstr ""
 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
 #. MSG_FLOW c=15
-#: ../../Firmware/ultralcd.cpp:5732
+#: ../../Firmware/ultralcd.cpp:5737
 msgid "Flow"
 msgid "Flow"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PART_FAN c=20
 #. 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?"
 msgid "Front print fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_FRONT c=14
 #. MSG_BED_CORRECTION_FRONT c=14
-#: ../../Firmware/ultralcd.cpp:2762
+#: ../../Firmware/ultralcd.cpp:2752
 msgid "Front side[μm]"
 msgid "Front side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FANS c=20
 #. MSG_SELFTEST_FANS c=20
-#: ../../Firmware/ultralcd.cpp:7028
+#: ../../Firmware/ultralcd.cpp:7019
 msgid "Front/left fans"
 msgid "Front/left fans"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CONTINUE c=20 r=4
 #. 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?"
 msgid "G-code sliced for a different level. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
 #. MSG_GCODE_DIFF_CANCELLED c=20 r=7
-#: ../../Firmware/util.cpp:424
+#: ../../Firmware/util.cpp:409
 msgid ""
 msgid ""
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "G-code sliced for a different level. Please re-slice the model again. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a different printer type. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=8
 #. 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 ""
 msgid ""
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "G-code sliced for a different printer type. Please re-slice the model again. "
 "Print cancelled."
 "Print cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CONTINUE c=20 r=5
 #. 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?"
 msgid "G-code sliced for a newer firmware. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
 #. MSG_GCODE_NEWER_FIRMWARE_CANCELLED c=20 r=8
-#: ../../Firmware/util.cpp:391
+#: ../../Firmware/util.cpp:377
 msgid ""
 msgid ""
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "G-code sliced for a newer firmware. Please update the firmware. Print "
 "cancelled."
 "cancelled."
 msgstr ""
 msgstr ""
 
 
 #. MSG_GCODE c=8
 #. 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"
 msgid "Gcode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HW_SETUP c=18
 #. 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"
 msgid "HW Setup"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
 #. MSG_SELFTEST_HEATERTHERMISTOR c=20
-#: ../../Firmware/ultralcd.cpp:6976
+#: ../../Firmware/ultralcd.cpp:6967
 msgid "Heater/Thermistor"
 msgid "Heater/Thermistor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING c=20
 #. 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"
 msgid "Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_HEATING_SAFETY_DISABLED c=20 r=4
 #. 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."
 msgid "Heating disabled by safety timer."
 msgstr ""
 msgstr ""
 
 
 #. MSG_HEATING_COMPLETE c=20
 #. 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."
 msgid "Heating done."
 msgstr ""
 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 ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. I will guide you through a short "
 "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 "
 "setup process, in which the Z-axis will be calibrated. Then, you will be "
@@ -705,7 +854,7 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WELCOME c=20 r=7
 #. MSG_WIZARD_WELCOME c=20 r=7
-#: ../../Firmware/messages.cpp:118 ../../Firmware/ultralcd.cpp:4053
+#: ../../Firmware/messages.cpp:122 ../../Firmware/ultralcd.cpp:4011
 msgid ""
 msgid ""
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you "
 "through the setup process?"
 "through the setup process?"
@@ -714,319 +863,372 @@ msgstr ""
 "padetu jums atlikti sarankos procesa?"
 "padetu jums atlikti sarankos procesa?"
 
 
 #. MSG_HIGH_POWER c=10
 #. 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"
 msgid "High power"
 msgstr ""
 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
 #. 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."
 msgid "I will run xyz calibration now. It will take approx. 12 mins."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_Z_CAL c=20 r=8
 #. MSG_WIZARD_Z_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:4091
+#: ../../Firmware/ultralcd.cpp:4049
 msgid "I will run z calibration now."
 msgid "I will run z calibration now."
 msgstr ""
 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
 #. MSG_ADDITIONAL_SHEETS c=20 r=9
-#: ../../Firmware/ultralcd.cpp:4161
+#: ../../Firmware/ultralcd.cpp:4115
 msgid ""
 msgid ""
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "If you have additional steel sheets, calibrate their presets in Settings - "
 "HW Setup - Steel sheets."
 "HW Setup - Steel sheets."
 msgstr ""
 msgstr ""
 
 
 #. MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=20 r=4
 #. 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"
 msgid "Improving bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SCREEN c=18
 #. MSG_INFO_SCREEN c=18
-#: ../../Firmware/messages.cpp:113 ../../Firmware/ultralcd.cpp:5486
+#: ../../Firmware/messages.cpp:117 ../../Firmware/ultralcd.cpp:5487
 msgid "Info screen"
 msgid "Info screen"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INIT_SDCARD c=18
 #. MSG_INIT_SDCARD c=18
-#: ../../Firmware/ultralcd.cpp:5553
+#: ../../Firmware/ultralcd.cpp:5554
 msgid "Init. SD card"
 msgid "Init. SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FILAMENT c=20
 #. MSG_INSERT_FILAMENT c=20
-#: ../../Firmware/ultralcd.cpp:2160
+#: ../../Firmware/ultralcd.cpp:2165
 msgid "Insert filament"
 msgid "Insert filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_INSERT_FIL c=20 r=6
 #. MSG_INSERT_FIL c=20 r=6
-#: ../../Firmware/ultralcd.cpp:6231
+#: ../../Firmware/ultralcd.cpp:6233
 msgid ""
 msgid ""
 "Insert the filament (do not load it) into the extruder and then press the "
 "Insert the filament (do not load it) into the extruder and then press the "
 "knob."
 "knob."
 msgstr ""
 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
 #. 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?"
 msgid "Is filament loaded?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEET_CHECK c=20 r=2
 #. 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?"
 msgid "Is steel sheet on heatbed?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_ITERATION c=12
 #. 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"
 msgid "Iteration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT c=18
 #. 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"
 msgid "Last print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LAST_PRINT_FAILURES c=20
 #. 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"
 msgid "Last print failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LEFT c=10
 #. MSG_LEFT c=10
-#: ../../Firmware/ultralcd.cpp:2504
+#: ../../Firmware/ultralcd.cpp:2494
 msgid "Left"
 msgid "Left"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_EXTRUDER_FAN c=20
 #. 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?"
 msgid "Left hotend fan?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_LEFT c=14
 #. MSG_BED_CORRECTION_LEFT c=14
-#: ../../Firmware/ultralcd.cpp:2760
+#: ../../Firmware/ultralcd.cpp:2750
 msgid "Left side [μm]"
 msgid "Left side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_HIGH c=12
 #. MSG_BL_HIGH c=12
-#: ../../Firmware/messages.cpp:152 ../../Firmware/ultralcd.cpp:5870
+#: ../../Firmware/messages.cpp:156 ../../Firmware/ultralcd.cpp:5860
 msgid "Level Bright"
 msgid "Level Bright"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BL_LOW c=12
 #. MSG_BL_LOW c=12
-#: ../../Firmware/messages.cpp:153 ../../Firmware/ultralcd.cpp:5871
+#: ../../Firmware/messages.cpp:157 ../../Firmware/ultralcd.cpp:5861
 msgid "Level Dimmed"
 msgid "Level Dimmed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LIN_CORRECTION c=18
 #. MSG_LIN_CORRECTION c=18
-#: ../../Firmware/ultralcd.cpp:4834
+#: ../../Firmware/ultralcd.cpp:4797
 msgid "Lin. correction"
 msgid "Lin. correction"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BABYSTEP_Z c=18
 #. 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"
 msgid "Live adjust Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOAD_ALL c=18
 #. 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 ""
 msgstr ""
 
 
 #. MSG_LOAD_FILAMENT c=17
 #. 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"
 msgid "Load filament"
 msgstr ""
 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
 #. MSG_LOAD_TO_NOZZLE c=18
-#: ../../Firmware/ultralcd.cpp:5571
+#: ../../Firmware/ultralcd.cpp:5573
 msgid "Load to nozzle"
 msgid "Load to nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_COLOR c=20
 #. MSG_LOADING_COLOR c=20
-#: ../../Firmware/ultralcd.cpp:2193
+#: ../../Firmware/ultralcd.cpp:2201
 msgid "Loading color"
 msgid "Loading color"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOADING_FILAMENT c=20
 #. 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"
 msgid "Loading filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_LOOSE_PULLEY c=20
 #. MSG_LOOSE_PULLEY c=20
-#: ../../Firmware/ultralcd.cpp:7016
+#: ../../Firmware/ultralcd.cpp:7007
 msgid "Loose pulley"
 msgid "Loose pulley"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_LOUD c=7
 #. 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"
 msgid "Loud"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_MODE c=8
 #. 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"
 msgid "MMU Mode"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_FAILS c=15
 #. 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"
 msgid "MMU fails"
 msgstr ""
 msgstr ""
 
 
-#. MSG_MMU_LOAD_FAILED c=20
-#: ../../Firmware/mmu.cpp:1248
-msgid "MMU load failed"
-msgstr ""
-
 #. MSG_MMU_LOAD_FAILS c=15
 #. 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"
 msgid "MMU load fails"
 msgstr ""
 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 ""
 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 ""
 msgstr ""
 
 
 #. MSG_MMU_CONNECTED c=18
 #. MSG_MMU_CONNECTED c=18
-#: ../../Firmware/ultralcd.cpp:1688
+#: ../../Firmware/ultralcd.cpp:1679
 msgid "MMU2 connected"
 msgid "MMU2 connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAGNETS_COMP c=13
 #. MSG_MAGNETS_COMP c=13
-#: ../../Firmware/messages.cpp:147 ../../Firmware/ultralcd.cpp:5844
+#: ../../Firmware/messages.cpp:151 ../../Firmware/ultralcd.cpp:5834
 msgid "Magnets comp."
 msgid "Magnets comp."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MAIN c=18
 #. 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"
 msgid "Main"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_SKEW c=14
 #. MSG_MEASURED_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2545
+#: ../../Firmware/ultralcd.cpp:2535
 msgid "Measured skew"
 msgid "Measured skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=20 r=3
 #. 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"
 msgid "Measuring reference height of calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH c=12
 #. MSG_MESH c=12
-#: ../../Firmware/messages.cpp:144 ../../Firmware/ultralcd.cpp:5840
+#: ../../Firmware/messages.cpp:148 ../../Firmware/ultralcd.cpp:5830
 msgid "Mesh"
 msgid "Mesh"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MESH_BED_LEVELING c=18
 #. 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"
 msgid "Mesh Bed Leveling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE c=6
 #. 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"
 msgid "Mode"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
 #. MSG_MODE_CHANGE_IN_PROGRESS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:3606
+#: ../../Firmware/ultralcd.cpp:3587
 msgid "Mode change in progress..."
 msgid "Mode change in progress..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MODEL c=8
 #. 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"
 msgid "Model"
 msgstr ""
 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
 #. 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"
 msgid "Motor"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_X c=18
 #. MSG_MOVE_X c=18
-#: ../../Firmware/ultralcd.cpp:3500
+#: ../../Firmware/ultralcd.cpp:3509
 msgid "Move X"
 msgid "Move X"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Y c=18
 #. MSG_MOVE_Y c=18
-#: ../../Firmware/ultralcd.cpp:3501
+#: ../../Firmware/ultralcd.cpp:3510
 msgid "Move Y"
 msgid "Move Y"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_Z c=18
 #. MSG_MOVE_Z c=18
-#: ../../Firmware/ultralcd.cpp:3502
+#: ../../Firmware/ultralcd.cpp:3511
 msgid "Move Z"
 msgid "Move Z"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MOVE_AXIS c=18
 #. MSG_MOVE_AXIS c=18
-#: ../../Firmware/ultralcd.cpp:4809
+#: ../../Firmware/ultralcd.cpp:4763
 msgid "Move axis"
 msgid "Move axis"
 msgstr ""
 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
 #. 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"
 msgid "N/A"
 msgstr ""
 msgstr ""
 
 
@@ -1036,178 +1238,203 @@ msgid "New firmware version available:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO c=4
 #. 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"
 msgid "No"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_CARD c=18
 #. MSG_NO_CARD c=18
-#: ../../Firmware/ultralcd.cpp:5551
+#: ../../Firmware/ultralcd.cpp:5552
 msgid "No SD card"
 msgid "No SD card"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NO_MOVE c=20
 #. MSG_NO_MOVE c=20
-#: ../../Firmware/Marlin_main.cpp:5374
+#: ../../Firmware/Marlin_main.cpp:5402
 msgid "No move."
 msgid "No move."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NONE c=8
 #. 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"
 msgid "None"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NORMAL c=7
 #. 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"
 msgid "Normal"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_NOTCONNECTED c=20
 #. MSG_SELFTEST_NOTCONNECTED c=20
-#: ../../Firmware/ultralcd.cpp:6977
+#: ../../Firmware/ultralcd.cpp:6968
 msgid "Not connected"
 msgid "Not connected"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_NO c=19
 #. 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"
 msgid "Not spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_V2_CAL c=20 r=8
 #. MSG_WIZARD_V2_CAL c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3970
+#: ../../Firmware/ultralcd.cpp:3928
 msgid ""
 msgid ""
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 "Now I will calibrate distance between tip of the nozzle and heatbed surface."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #. MSG_WIZARD_WILL_PREHEAT c=20 r=4
-#: ../../Firmware/ultralcd.cpp:4099
+#: ../../Firmware/ultralcd.cpp:4059
 msgid "Now I will preheat nozzle for PLA."
 msgid "Now I will preheat nozzle for PLA."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_TEST_PRINT c=20 r=4
 #. 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."
 msgid "Now remove the test print from steel sheet."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE c=10
 #. 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"
 msgid "Nozzle"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIAMETER c=10
 #. MSG_NOZZLE_DIAMETER c=10
-#: ../../Firmware/messages.cpp:133 ../../Firmware/ultralcd.cpp:4554
+#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4544
 msgid "Nozzle d."
 msgid "Nozzle d."
 msgstr ""
 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
 #. 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"
 msgid "Off"
 msgstr ""
 msgstr ""
 
 
 #. MSG_DEFAULT_SETTINGS_LOADED c=20 r=6
 #. 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."
 msgid "Old settings found. Default PID, Esteps etc. will be set."
 msgstr ""
 msgstr ""
 
 
 #. MSG_ON c=3
 #. 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"
 msgid "On"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND_ONCE c=7
 #. MSG_SOUND_ONCE c=7
-#: ../../Firmware/messages.cpp:142 ../../Firmware/ultralcd.cpp:4461
+#: ../../Firmware/messages.cpp:146 ../../Firmware/ultralcd.cpp:4451
 msgid "Once"
 msgid "Once"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSED_THERMAL_ERROR c=20
 #. 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"
 msgid "PAUSED THERMAL ERROR"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_RUNNING c=20
 #. MSG_PID_RUNNING c=20
-#: ../../Firmware/ultralcd.cpp:1025
+#: ../../Firmware/ultralcd.cpp:1036
 msgid "PID cal."
 msgid "PID cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_FINISHED c=20
 #. MSG_PID_FINISHED c=20
-#: ../../Firmware/ultralcd.cpp:1030
+#: ../../Firmware/ultralcd.cpp:1041
 msgid "PID cal. finished"
 msgid "PID cal. finished"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PID_EXTRUDER c=17
 #. MSG_PID_EXTRUDER c=17
-#: ../../Firmware/ultralcd.cpp:4921
+#: ../../Firmware/ultralcd.cpp:4884
 msgid "PID calibration"
 msgid "PID calibration"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_PREHEAT c=20
 #. MSG_PINDA_PREHEAT c=20
-#: ../../Firmware/ultralcd.cpp:660
+#: ../../Firmware/ultralcd.cpp:666
 msgid "PINDA Heating"
 msgid "PINDA Heating"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION c=13
 #. 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."
 msgid "PINDA cal."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CAL_FAILED c=20 r=4
 #. MSG_PINDA_CAL_FAILED c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3369
+#: ../../Firmware/ultralcd.cpp:3384
 msgid "PINDA calibration failed"
 msgid "PINDA calibration failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PINDA_CALIBRATION_DONE c=20 r=8
 #. 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 ""
 msgid ""
 "PINDA calibration is finished and active. It can be disabled in menu "
 "PINDA calibration is finished and active. It can be disabled in menu "
 "Settings->PINDA cal."
 "Settings->PINDA cal."
 msgstr ""
 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
 #. MSG_PAUSE c=5
-#: ../../Firmware/messages.cpp:150 ../../Firmware/ultralcd.cpp:4715
+#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:4248
 msgid "Pause"
 msgid "Pause"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PAUSE_PRINT c=18
 #. 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"
 msgid "Pause print"
 msgstr ""
 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
 #. 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 ""
 msgid ""
 "Place a sheet of paper under the nozzle during the calibration of first 4 "
 "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."
 "points. If the nozzle catches the paper, power off the printer immediately."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #. 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 ""
 msgid ""
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "Please check our handbook and fix the problem. Then resume the Wizard by "
 "rebooting the printer."
 "rebooting the printer."
@@ -1219,78 +1446,73 @@ msgid "Please check the IR sensor connection, unload filament if present."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_PLEASECHECK c=20
 #. MSG_SELFTEST_PLEASECHECK c=20
-#: ../../Firmware/ultralcd.cpp:6971
+#: ../../Firmware/ultralcd.cpp:6962
 msgid "Please check:"
 msgid "Please check:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #. 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."
 msgid "Please clean heatbed and then press the knob."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #. 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."
 msgid "Please clean the nozzle for calibration. Click when done."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
 #. MSG_WIZARD_LOAD_FILAMENT c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3953
+#: ../../Firmware/ultralcd.cpp:3915
 msgid ""
 msgid ""
 "Please insert filament into the extruder, then press the knob to load it."
 "Please insert filament into the extruder, then press the knob to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
 #. MSG_MMU_INSERT_FILAMENT_FIRST_TUBE c=20 r=6
-#: ../../Firmware/ultralcd.cpp:3948
+#: ../../Firmware/ultralcd.cpp:3912
 msgid ""
 msgid ""
 "Please insert filament into the first tube of the MMU, then press the knob "
 "Please insert filament into the first tube of the MMU, then press the knob "
 "to load it."
 "to load it."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
 #. MSG_PLEASE_LOAD_PLA c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3871
+#: ../../Firmware/ultralcd.cpp:3835
 msgid "Please load filament first."
 msgid "Please load filament first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHECK_IDLER c=20 r=5
 #. 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."
 msgid "Please open idler and remove filament manually."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLACE_STEEL_SHEET c=20 r=5
 #. 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."
 msgid "Please place steel sheet on heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_UNLOAD c=20 r=4
 #. 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"
 msgid "Please press the knob to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PULL_OUT_FILAMENT c=20 r=4
 #. 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"
 msgid "Please pull out filament immediately"
 msgstr ""
 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
 #. MSG_REMOVE_SHIPPING_HELPERS c=20 r=3
-#: ../../Firmware/ultralcd.cpp:4089
+#: ../../Firmware/ultralcd.cpp:4047
 msgid "Please remove shipping helpers first."
 msgid "Please remove shipping helpers first."
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_STEEL_SHEET c=20 r=4
 #. 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."
 msgid "Please remove steel sheet from heatbed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RUN_XYZ c=20 r=4
 #. MSG_RUN_XYZ c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:4869
+#: ../../Firmware/Marlin_main.cpp:4897
 msgid "Please run XYZ calibration first."
 msgid "Please run XYZ calibration first."
 msgstr ""
 msgstr ""
 
 
@@ -1299,289 +1521,342 @@ msgstr ""
 msgid "Please unload the filament first, then repeat this action."
 msgid "Please unload the filament first, then repeat this action."
 msgstr ""
 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
 #. MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20
 #: ../../Firmware/util.cpp:203
 #: ../../Firmware/util.cpp:203
 msgid "Please upgrade."
 msgid "Please upgrade."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PLEASE_WAIT c=20
 #. 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"
 msgid "Please wait"
 msgstr ""
 msgstr ""
 
 
 #. MSG_POWER_FAILURES c=15
 #. 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"
 msgid "Power failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT c=18
 #. MSG_PREHEAT c=18
-#: ../../Firmware/ultralcd.cpp:5510
+#: ../../Firmware/ultralcd.cpp:5511
 msgid "Preheat"
 msgid "Preheat"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEAT_NOZZLE c=20
 #. 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!"
 msgid "Preheat the nozzle!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_HEATING c=20 r=3
 #. 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."
 msgid "Preheating nozzle. Please wait."
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_CUT c=20
 #. MSG_PREHEATING_TO_CUT c=20
-#: ../../Firmware/ultralcd.cpp:1996
+#: ../../Firmware/ultralcd.cpp:2001
 msgid "Preheating to cut"
 msgid "Preheating to cut"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_EJECT c=20
 #. MSG_PREHEATING_TO_EJECT c=20
-#: ../../Firmware/ultralcd.cpp:1993
+#: ../../Firmware/ultralcd.cpp:1998
 msgid "Preheating to eject"
 msgid "Preheating to eject"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_LOAD c=20
 #. MSG_PREHEATING_TO_LOAD c=20
-#: ../../Firmware/ultralcd.cpp:1984
+#: ../../Firmware/ultralcd.cpp:1989
 msgid "Preheating to load"
 msgid "Preheating to load"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PREHEATING_TO_UNLOAD c=20
 #. MSG_PREHEATING_TO_UNLOAD c=20
-#: ../../Firmware/ultralcd.cpp:1989
+#: ../../Firmware/ultralcd.cpp:1994
 msgid "Preheating to unload"
 msgid "Preheating to unload"
 msgstr ""
 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
 #. MSG_PRESS_KNOB c=20
-#: ../../Firmware/ultralcd.cpp:1817
+#: ../../Firmware/ultralcd.cpp:1809
 msgid "Press the knob"
 msgid "Press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS_TO_PREHEAT c=20 r=4
 #. 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."
 msgid "Press the knob to preheat nozzle and continue."
 msgstr ""
 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
 #. MSG_PRINT_ABORTED c=20
-#: ../../Firmware/messages.cpp:75 ../../Firmware/ultralcd.cpp:860
+#: ../../Firmware/messages.cpp:79 ../../Firmware/ultralcd.cpp:871
 msgid "Print aborted"
 msgid "Print aborted"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_FAN_SPEED c=16
 #. 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:"
 msgid "Print fan:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CARD_MENU c=18
 #. 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"
 msgid "Print from SD"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_PAUSED c=20
 #. MSG_PRINT_PAUSED c=20
-#: ../../Firmware/ultralcd.cpp:874
+#: ../../Firmware/ultralcd.cpp:885
 msgid "Print paused"
 msgid "Print paused"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINT_TIME c=19
 #. MSG_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2374
+#: ../../Firmware/ultralcd.cpp:2364
 msgid "Print time"
 msgid "Print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRINTER_IP c=18
 #. MSG_PRINTER_IP c=18
-#: ../../Firmware/ultralcd.cpp:1719
+#: ../../Firmware/ultralcd.cpp:1711
 msgid "Printer IP Addr:"
 msgid "Printer IP Addr:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #. 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 ""
 msgid ""
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "Printer has not been calibrated yet. Please follow the manual, chapter First "
 "steps, section Calibration flow."
 "steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CONTINUE c=20 r=5
 #. 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?"
 msgid "Printer nozzle diameter differs from the G-code. Continue?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
 #. MSG_NOZZLE_DIFFERS_CANCELLED c=20 r=9
-#: ../../Firmware/util.cpp:305
+#: ../../Firmware/util.cpp:295
 msgid ""
 msgid ""
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "Printer nozzle diameter differs from the G-code. Please check the value in "
 "settings. Print cancelled."
 "settings. Print cancelled."
 msgstr ""
 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
 #. MSG_RPI_PORT c=13
-#: ../../Firmware/messages.cpp:139 ../../Firmware/ultralcd.cpp:4842
+#: ../../Firmware/messages.cpp:143 ../../Firmware/ultralcd.cpp:4805
 msgid "RPi port"
 msgid "RPi port"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_REAR c=14
 #. MSG_BED_CORRECTION_REAR c=14
-#: ../../Firmware/ultralcd.cpp:2763
+#: ../../Firmware/ultralcd.cpp:2753
 msgid "Rear side [μm]"
 msgid "Rear side [μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RECOVERING_PRINT c=20
 #. MSG_RECOVERING_PRINT c=20
-#: ../../Firmware/Marlin_main.cpp:10951
+#: ../../Firmware/Marlin_main.cpp:10899
 msgid "Recovering print"
 msgid "Recovering print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REMOVE_OLD_FILAMENT c=20 r=5
 #. 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."
 msgid "Remove old filament and press the knob to start loading new filament."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RENAME c=18
 #. MSG_RENAME c=18
-#: ../../Firmware/ultralcd.cpp:5434
+#: ../../Firmware/ultralcd.cpp:5435
 msgid "Rename"
 msgid "Rename"
 msgstr ""
 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
 #. 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"
 msgid "Reset"
 msgstr ""
 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
 #. MSG_CALIBRATE_BED_RESET c=18
-#: ../../Firmware/ultralcd.cpp:4925
+#: ../../Firmware/ultralcd.cpp:4888
 msgid "Reset XYZ calibr."
 msgid "Reset XYZ calibr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUME_PRINT c=18
 #. 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"
 msgid "Resume print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_RESUMING_PRINT c=20
 #. MSG_RESUMING_PRINT c=20
-#: ../../Firmware/messages.cpp:82 ../../Firmware/ultralcd.cpp:668
+#: ../../Firmware/messages.cpp:86 ../../Firmware/ultralcd.cpp:674
 msgid "Resuming print"
 msgid "Resuming print"
 msgstr ""
 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
 #. MSG_RIGHT c=10
-#: ../../Firmware/ultralcd.cpp:2505
+#: ../../Firmware/ultralcd.cpp:2495
 msgid "Right"
 msgid "Right"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_CORRECTION_RIGHT c=14
 #. MSG_BED_CORRECTION_RIGHT c=14
-#: ../../Firmware/ultralcd.cpp:2761
+#: ../../Firmware/ultralcd.cpp:2751
 msgid "Right side[μm]"
 msgid "Right side[μm]"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_RERUN c=20 r=7
 #. MSG_WIZARD_RERUN c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3892
+#: ../../Firmware/ultralcd.cpp:3857
 msgid ""
 msgid ""
 "Running Wizard will delete current calibration results and start from the "
 "Running Wizard will delete current calibration results and start from the "
 "beginning. Continue?"
 "beginning. Continue?"
 msgstr ""
 msgstr ""
 
 
-#. MSG_RUNOUTS c=7
-#: ../../Firmware/ultralcd.cpp:1279
-msgid "Runouts"
-msgstr ""
-
 #. MSG_SD_CARD c=8
 #. 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"
 msgid "SD card"
 msgstr ""
 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
 #. MSG_STOPPED c=20
-#: ../../Firmware/Marlin_main.cpp:9744 ../../Firmware/messages.cpp:108
+#: ../../Firmware/Marlin_main.cpp:9706 ../../Firmware/messages.cpp:112
 msgid "STOPPED."
 msgid "STOPPED."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=20 r=3
 #. 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"
 msgid "Searching bed calibration point"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT c=18
 #. MSG_SELECT c=18
-#: ../../Firmware/ultralcd.cpp:5427
+#: ../../Firmware/ultralcd.cpp:5428
 msgid "Select"
 msgid "Select"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
 #. MSG_SELECT_FIL_1ST_LAYERCAL c=20 r=7
-#: ../../Firmware/ultralcd.cpp:3974
+#: ../../Firmware/ultralcd.cpp:3932
 msgid ""
 msgid ""
 "Select a filament for the First Layer Calibration and select it in the on-"
 "Select a filament for the First Layer Calibration and select it in the on-"
 "screen menu."
 "screen menu."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_EXTRUDER c=20
 #. 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:"
 msgid "Select extruder:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_FILAMENT c=20
 #. 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:"
 msgid "Select filament:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_LANGUAGE c=18
 #. 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"
 msgid "Select language"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEL_PREHEAT_TEMP c=20 r=6
 #. 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."
 msgid "Select nozzle preheat temperature which matches your material."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
 #. MSG_SELECT_TEMP_MATCHES_MATERIAL c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3979
+#: ../../Firmware/ultralcd.cpp:3937
 msgid "Select temperature which matches your material."
 msgid "Select temperature which matches your material."
 msgstr ""
 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
 #. MSG_SELFTEST_OK c=20
-#: ../../Firmware/ultralcd.cpp:6530
+#: ../../Firmware/ultralcd.cpp:6522
 msgid "Self test OK"
 msgid "Self test OK"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_START c=20
 #. MSG_SELFTEST_START c=20
-#: ../../Firmware/ultralcd.cpp:6298
+#: ../../Firmware/ultralcd.cpp:6295
 msgid "Self test start"
 msgid "Self test start"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST c=18
 #. MSG_SELFTEST c=18
-#: ../../Firmware/ultralcd.cpp:4912
+#: ../../Firmware/ultralcd.cpp:4875
 msgid "Selftest"
 msgid "Selftest"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_ERROR c=20
 #. MSG_SELFTEST_ERROR c=20
-#: ../../Firmware/ultralcd.cpp:6970
+#: ../../Firmware/ultralcd.cpp:6961
 msgid "Selftest error!"
 msgid "Selftest error!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAILED c=20
 #. 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"
 msgid "Selftest failed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FORCE_SELFTEST c=20 r=8
 #. 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."
 msgid "Selftest will be run to calibrate accurate sensorless rehoming."
 msgstr ""
 msgstr ""
 
 
 #. MSG_INFO_SENSORS c=18
 #. MSG_INFO_SENSORS c=18
-#: ../../Firmware/ultralcd.cpp:1731
+#: ../../Firmware/ultralcd.cpp:1723
 msgid "Sensor info"
 msgid "Sensor info"
 msgstr ""
 msgstr ""
 
 
@@ -1591,31 +1866,31 @@ msgid "Sensor verified, remove the filament now."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SET_TEMPERATURE c=20
 #. MSG_SET_TEMPERATURE c=20
-#: ../../Firmware/ultralcd.cpp:2781
+#: ../../Firmware/ultralcd.cpp:2771
 msgid "Set temperature:"
 msgid "Set temperature:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SETTINGS c=18
 #. 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"
 msgid "Settings"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SEVERE_SKEW c=14
 #. MSG_SEVERE_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2548
+#: ../../Firmware/ultralcd.cpp:2538
 msgid "Severe skew"
 msgid "Severe skew"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET c=10
 #. MSG_SHEET c=10
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
 #: ../../Firmware/menu.cpp:209 ../../Firmware/menu.cpp:221
-#: ../../Firmware/messages.cpp:60
+#: ../../Firmware/messages.cpp:64
 msgid "Sheet"
 msgid "Sheet"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHEET_OFFSET c=20 r=4
 #. MSG_SHEET_OFFSET c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3832
+#: ../../Firmware/ultralcd.cpp:3795
 msgid ""
 msgid ""
 "Sheet %.7s\n"
 "Sheet %.7s\n"
 "Z offset: %+1.3fmm\n"
 "Z offset: %+1.3fmm\n"
@@ -1624,18 +1899,18 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_SHOW_END_STOPS c=18
 #. MSG_SHOW_END_STOPS c=18
-#: ../../Firmware/ultralcd.cpp:4923
+#: ../../Firmware/ultralcd.cpp:4886
 msgid "Show end stops"
 msgid "Show end stops"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SILENT c=7
 #. 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"
 msgid "Silent"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SLIGHT_SKEW c=14
 #. MSG_SLIGHT_SKEW c=14
-#: ../../Firmware/ultralcd.cpp:2547
+#: ../../Firmware/ultralcd.cpp:2537
 msgid "Slight skew"
 msgid "Slight skew"
 msgstr ""
 msgstr ""
 
 
@@ -1647,112 +1922,171 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
 #. MSG_ZLEVELING_ENFORCED c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:3057
+#: ../../Firmware/Marlin_main.cpp:3052
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgid "Some problem encountered, Z-leveling enforced ..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT c=7
 #. 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"
 msgid "Sort"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORTING_FILES c=20
 #. MSG_SORTING_FILES c=20
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
 #: ../../Firmware/cardreader.cpp:862 ../../Firmware/cardreader.cpp:929
-#: ../../Firmware/messages.cpp:96
+#: ../../Firmware/messages.cpp:100
 msgid "Sorting files"
 msgid "Sorting files"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SOUND c=9
 #. 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"
 msgid "Sound"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SPEED c=15
 #. MSG_SPEED c=15
-#: ../../Firmware/ultralcd.cpp:5726
+#: ../../Firmware/ultralcd.cpp:5731
 msgid "Speed"
 msgid "Speed"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_FAN_YES c=19
 #. 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"
 msgid "Spinning"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMP_CAL_WARNING c=20 r=4
 #. 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."
 msgid "Stable ambient temperature 21-26C is needed a rigid stand is required."
 msgstr ""
 msgstr ""
 
 
 #. MSG_STATISTICS c=18
 #. MSG_STATISTICS c=18
-#: ../../Firmware/ultralcd.cpp:5593
+#: ../../Firmware/ultralcd.cpp:5598
 msgid "Statistics"
 msgid "Statistics"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEALTH c=7
 #. 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"
 msgid "Stealth"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STEEL_SHEETS c=18
 #. 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"
 msgid "Steel sheets"
 msgstr ""
 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
 #. 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"
 msgid "Stop print"
 msgstr ""
 msgstr ""
 
 
 #. MSG_STRICT c=8
 #. 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"
 msgid "Strict"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SUPPORT c=18
 #. MSG_SUPPORT c=18
-#: ../../Firmware/ultralcd.cpp:5602
+#: ../../Firmware/ultralcd.cpp:5607
 msgid "Support"
 msgid "Support"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_SWAPPED c=16
 #. MSG_SELFTEST_SWAPPED c=16
-#: ../../Firmware/ultralcd.cpp:7029
+#: ../../Firmware/ultralcd.cpp:7020
 msgid "Swapped"
 msgid "Swapped"
 msgstr ""
 msgstr ""
 
 
 #. MSG_THERMAL_ANOMALY c=20
 #. MSG_THERMAL_ANOMALY c=20
-#: ../../Firmware/messages.cpp:166 ../../Firmware/temperature.cpp:2442
+#: ../../Firmware/messages.cpp:170 ../../Firmware/temperature.cpp:2440
 msgid "THERMAL ANOMALY"
 msgid "THERMAL ANOMALY"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TM_AUTOTUNE_FAILED c=20
 #. MSG_TM_AUTOTUNE_FAILED c=20
-#: ../../Firmware/temperature.cpp:2899
+#: ../../Firmware/temperature.cpp:2897
 msgid "TM autotune failed"
 msgid "TM autotune failed"
 msgstr ""
 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
 #. MSG_TEMP_MODEL_AUTOTUNE c=20
-#: ../../Firmware/temperature.cpp:2884
+#: ../../Firmware/temperature.cpp:2882
 msgid "Temp. model autotune"
 msgid "Temp. model autotune"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TEMPERATURE c=18
 #. MSG_TEMPERATURE c=18
-#: ../../Firmware/ultralcd.cpp:4805
+#: ../../Firmware/ultralcd.cpp:4759
 msgid "Temperature"
 msgid "Temperature"
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_TEMPERATURES c=18
 #. MSG_MENU_TEMPERATURES c=18
-#: ../../Firmware/ultralcd.cpp:1737
+#: ../../Firmware/ultralcd.cpp:1729
 msgid "Temperatures"
 msgid "Temperatures"
 msgstr ""
 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
 #. MSG_WIZARD_V2_CAL_2 c=20 r=12
-#: ../../Firmware/ultralcd.cpp:3982
+#: ../../Firmware/ultralcd.cpp:3940
 msgid ""
 msgid ""
 "The printer will start printing a zig-zag line. Rotate the knob until you "
 "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 "
 "reach the optimal height. Check the pictures in the handbook (Calibration "
@@ -1760,73 +2094,109 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=9
 #. 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 ""
 msgid ""
 "There is still a need to make Z calibration. Please follow the manual, "
 "There is still a need to make Z calibration. Please follow the manual, "
 "chapter First steps, section Calibration flow."
 "chapter First steps, section Calibration flow."
 msgstr ""
 msgstr ""
 
 
 #. MSG_SORT_TIME c=8
 #. MSG_SORT_TIME c=8
-#: ../../Firmware/messages.cpp:137 ../../Firmware/ultralcd.cpp:4411
+#: ../../Firmware/messages.cpp:141 ../../Firmware/ultralcd.cpp:4401
 msgid "Time"
 msgid "Time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TIMEOUT c=12
 #. MSG_TIMEOUT c=12
-#: ../../Firmware/messages.cpp:154 ../../Firmware/ultralcd.cpp:5873
+#: ../../Firmware/messages.cpp:158 ../../Firmware/ultralcd.cpp:5863
 msgid "Timeout"
 msgid "Timeout"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL c=6
 #. 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"
 msgid "Total"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FAILURES c=20
 #. 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"
 msgid "Total failures"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_FILAMENT c=19
 #. MSG_TOTAL_FILAMENT c=19
-#: ../../Firmware/ultralcd.cpp:2395
+#: ../../Firmware/ultralcd.cpp:2385
 msgid "Total filament"
 msgid "Total filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TOTAL_PRINT_TIME c=19
 #. MSG_TOTAL_PRINT_TIME c=19
-#: ../../Firmware/ultralcd.cpp:2396
+#: ../../Firmware/ultralcd.cpp:2386
 msgid "Total print time"
 msgid "Total print time"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TUNE c=18
 #. MSG_TUNE c=18
-#: ../../Firmware/ultralcd.cpp:5508
+#: ../../Firmware/ultralcd.cpp:5509
 msgid "Tune"
 msgid "Tune"
 msgstr ""
 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"
 msgid "Unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOADING_FILAMENT c=20
 #. 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"
 msgid "Unloading filament"
 msgstr ""
 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
 #. MSG_FIL_FAILED c=20 r=5
-#: ../../Firmware/ultralcd.cpp:6266
+#: ../../Firmware/ultralcd.cpp:6265
 msgid "Verification failed, remove the filament and try again."
 msgid "Verification failed, remove the filament and try again."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MENU_VOLTAGES c=18
 #. MSG_MENU_VOLTAGES c=18
-#: ../../Firmware/ultralcd.cpp:1740
+#: ../../Firmware/ultralcd.cpp:1732
 msgid "Voltages"
 msgid "Voltages"
 msgstr ""
 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
 #. MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-#: ../../Firmware/ultralcd.cpp:3542
+#: ../../Firmware/ultralcd.cpp:3551
 msgid ""
 msgid ""
 "WARNING:\n"
 "WARNING:\n"
 "Crash detection\n"
 "Crash detection\n"
@@ -1835,210 +2205,210 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #. MSG_USERWAIT c=20
 #. MSG_USERWAIT c=20
-#: ../../Firmware/Marlin_main.cpp:4087
+#: ../../Firmware/Marlin_main.cpp:4115
 msgid "Wait for user..."
 msgid "Wait for user..."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
 #. MSG_WAITING_TEMP_PINDA c=20 r=3
-#: ../../Firmware/ultralcd.cpp:2889
+#: ../../Firmware/ultralcd.cpp:2879
 msgid "Waiting for PINDA probe cooling"
 msgid "Waiting for PINDA probe cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WAITING_TEMP c=20 r=4
 #. MSG_WAITING_TEMP c=20 r=4
-#: ../../Firmware/ultralcd.cpp:2921
+#: ../../Firmware/ultralcd.cpp:2911
 msgid "Waiting for nozzle and bed cooling"
 msgid "Waiting for nozzle and bed cooling"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WARN c=8
 #. 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"
 msgid "Warn"
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_BOTH c=20 r=4
 #. 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."
 msgid "Warning: both printer type and motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
 #. MSG_CHANGED_MOTHERBOARD c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1516
+#: ../../Firmware/Marlin_main.cpp:1497
 msgid "Warning: motherboard type changed."
 msgid "Warning: motherboard type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_CHANGED_PRINTER c=20 r=4
 #. MSG_CHANGED_PRINTER c=20 r=4
-#: ../../Firmware/Marlin_main.cpp:1520
+#: ../../Firmware/Marlin_main.cpp:1501
 msgid "Warning: printer type changed."
 msgid "Warning: printer type changed."
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #. MSG_UNLOAD_SUCCESSFUL c=20 r=2
-#: ../../Firmware/Marlin_main.cpp:3539
+#: ../../Firmware/Marlin_main.cpp:3574
 msgid "Was filament unload successful?"
 msgid "Was filament unload successful?"
 msgstr ""
 msgstr ""
 
 
 #. MSG_SELFTEST_WIRINGERROR c=18
 #. 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"
 msgid "Wiring error"
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD c=17
 #. MSG_WIZARD c=17
-#: ../../Firmware/ultralcd.cpp:4903
+#: ../../Firmware/ultralcd.cpp:4866
 msgid "Wizard"
 msgid "Wizard"
 msgstr ""
 msgstr ""
 
 
 #. MSG_X_CORRECTION c=13
 #. MSG_X_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4218
+#: ../../Firmware/ultralcd.cpp:4172
 msgid "X-correct:"
 msgid "X-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XFLASH c=18
 #. MSG_XFLASH c=18
-#: ../../Firmware/ultralcd.cpp:5604
+#: ../../Firmware/ultralcd.cpp:5609
 msgid "XFLASH init"
 msgid "XFLASH init"
 msgstr ""
 msgstr ""
 
 
 #. MSG_XYZ_DETAILS c=18
 #. MSG_XYZ_DETAILS c=18
-#: ../../Firmware/ultralcd.cpp:1729
+#: ../../Firmware/ultralcd.cpp:1721
 msgid "XYZ cal. details"
 msgid "XYZ cal. details"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #. 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."
 msgid "XYZ calibration all right. Skew will be corrected automatically."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #. 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!"
 msgid "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration compromised. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3325
+#: ../../Firmware/ultralcd.cpp:3340
 msgid ""
 msgid ""
 "XYZ calibration compromised. Left front calibration point not reachable."
 "XYZ calibration compromised. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #. MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
-#: ../../Firmware/ultralcd.cpp:3322
+#: ../../Firmware/ultralcd.cpp:3337
 msgid ""
 msgid ""
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Bed calibration point was not found."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Front calibration points not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Left front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #. 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."
 msgid "XYZ calibration failed. Please consult the manual."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=6
 #. 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."
 msgid "XYZ calibration failed. Right front calibration point not reachable."
 msgstr ""
 msgstr ""
 
 
 #. MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #. 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!"
 msgid "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_DIST_FROM_MIN c=20
 #. MSG_Y_DIST_FROM_MIN c=20
-#: ../../Firmware/ultralcd.cpp:2502
+#: ../../Firmware/ultralcd.cpp:2492
 msgid "Y distance from min"
 msgid "Y distance from min"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Y_CORRECTION c=13
 #. MSG_Y_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4219
+#: ../../Firmware/ultralcd.cpp:4173
 msgid "Y-correct:"
 msgid "Y-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_YES c=4
 #. 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"
 msgid "Yes"
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_ALPHA c=20 r=8
 #. MSG_FW_VERSION_ALPHA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:846
+#: ../../Firmware/Marlin_main.cpp:835
 msgid ""
 msgid ""
 "You are using firmware alpha version. This is development version. Using "
 "You are using firmware alpha version. This is development version. Using "
 "this version is not recommended and may cause printer damage."
 "this version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_FW_VERSION_BETA c=20 r=8
 #. MSG_FW_VERSION_BETA c=20 r=8
-#: ../../Firmware/Marlin_main.cpp:847
+#: ../../Firmware/Marlin_main.cpp:836
 msgid ""
 msgid ""
 "You are using firmware beta version. This is development version. Using this "
 "You are using firmware beta version. This is development version. Using this "
 "version is not recommended and may cause printer damage."
 "version is not recommended and may cause printer damage."
 msgstr ""
 msgstr ""
 
 
 #. MSG_WIZARD_QUIT c=20 r=8
 #. 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."
 msgid "You can always resume the Wizard from Calibration -> Wizard."
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_CORRECTION c=13
 #. MSG_Z_CORRECTION c=13
-#: ../../Firmware/ultralcd.cpp:4220
+#: ../../Firmware/ultralcd.cpp:4174
 msgid "Z-correct:"
 msgid "Z-correct:"
 msgstr ""
 msgstr ""
 
 
 #. MSG_Z_PROBE_NR c=14
 #. 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."
 msgid "Z-probe nr."
 msgstr ""
 msgstr ""
 
 
 #. MSG_MEASURED_OFFSET c=20
 #. MSG_MEASURED_OFFSET c=20
-#: ../../Firmware/ultralcd.cpp:2573
+#: ../../Firmware/ultralcd.cpp:2563
 msgid "[0;0] point offset"
 msgid "[0;0] point offset"
 msgstr ""
 msgstr ""
 
 
 #. MSG_PRESS c=20 r=2
 #. MSG_PRESS c=20 r=2
-#: ../../Firmware/ultralcd.cpp:2162
+#: ../../Firmware/ultralcd.cpp:2170
 msgid "and press the knob"
 msgid "and press the knob"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_LOAD_FIL c=20
 #. MSG_TO_LOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1824
+#: ../../Firmware/ultralcd.cpp:1817
 msgid "to load filament"
 msgid "to load filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_TO_UNLOAD_FIL c=20
 #. MSG_TO_UNLOAD_FIL c=20
-#: ../../Firmware/ultralcd.cpp:1828
+#: ../../Firmware/ultralcd.cpp:1821
 msgid "to unload filament"
 msgid "to unload filament"
 msgstr ""
 msgstr ""
 
 
 #. MSG_UNKNOWN c=13
 #. MSG_UNKNOWN c=13
-#: ../../Firmware/ultralcd.cpp:1696
+#: ../../Firmware/ultralcd.cpp:1688
 msgid "unknown"
 msgid "unknown"
 msgstr ""
 msgstr ""
 
 
 #. MSG_IR_UNKNOWN c=18
 #. 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"
 msgid "unknown state"
 msgstr ""
 msgstr ""
 
 
 #. MSG_REFRESH c=18
 #. 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"
 msgid "🔃Refresh"
 msgstr ""
 msgstr ""

+ 0 - 0
lang/po/Firmware_nl.po


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