diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index d62447071e4334b93f28aeefb40f915d80ccc558..20ee9ae7a6b30a2c006623ce6697cac86f5e09b8 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -1627,6 +1627,8 @@ void process_commands()
           lcd_update();
         }
       }else{
+          if (!lcd_detected())
+            break;
         while(!lcd_clicked()){
           manage_heater();
           manage_inactivity();
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index 3262f2d245f0d3de3ed69c3eac7f0f8011dec52f..607b49eeb5300aa462ad91df17866625b8714a9d 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -1148,6 +1148,11 @@ void lcd_setstatus(const char* message)
     if (lcd_status_message_level > 0)
         return;
     strncpy(lcd_status_message, message, LCD_WIDTH);
+
+    size_t i = strlen(lcd_status_message);
+    memset(lcd_status_message + i, ' ', LCD_WIDTH - i);
+    lcd_status_message[LCD_WIDTH] = '\0';
+
     lcdDrawUpdate = 2;
 }
 void lcd_setstatuspgm(const char* message)
@@ -1155,6 +1160,11 @@ void lcd_setstatuspgm(const char* message)
     if (lcd_status_message_level > 0)
         return;
     strncpy_P(lcd_status_message, message, LCD_WIDTH);
+
+    size_t i = strlen(lcd_status_message);
+    memset(lcd_status_message + i, ' ', LCD_WIDTH - i);
+    lcd_status_message[LCD_WIDTH] = '\0';
+
     lcdDrawUpdate = 2;
 }
 void lcd_setalertstatuspgm(const char* message)
@@ -1263,6 +1273,15 @@ void lcd_buttons_update()
     lastEncoderBits = enc;
 }
 
+bool lcd_detected(void)
+{
+#if (defined(LCD_I2C_TYPE_MCP23017) || defined(LCD_I2C_TYPE_MCP23008)) && defined(DETECT_DEVICE)
+  return lcd.LcdDetected() == 1;
+#else
+  return true;
+#endif
+}
+
 void lcd_buzz(long duration, uint16_t freq)
 {
 #ifdef LCD_USE_I2C_BUZZER
diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h
index f4570f6a587a7e69f8bf35567756697e07dd240d..fce23bab03f5c00c967c4bda678ca15b2349e0ab 100644
--- a/Marlin/ultralcd.h
+++ b/Marlin/ultralcd.h
@@ -11,6 +11,7 @@
   void lcd_setstatuspgm(const char* message);
   void lcd_setalertstatuspgm(const char* message);
   void lcd_reset_alert_level();
+  bool lcd_detected(void);
 
 #ifdef DOGLCD
   extern int lcd_contrast;
@@ -92,6 +93,7 @@
   FORCE_INLINE void lcd_buttons_update() {}
   FORCE_INLINE void lcd_reset_alert_level() {}
   FORCE_INLINE void lcd_buzz(long duration,uint16_t freq) {}
+  FORCE_INLINE bool lcd_detected(void) { return true; }
 
   #define LCD_MESSAGEPGM(x) 
   #define LCD_ALERTMESSAGEPGM(x) 
diff --git a/Marlin/ultralcd_implementation_hitachi_HD44780.h b/Marlin/ultralcd_implementation_hitachi_HD44780.h
index 932895b9bbd5df137ea0e827a7e489c7e2c9e25f..fd3374454db3522d07a631928358edb65d202dcc 100644
--- a/Marlin/ultralcd_implementation_hitachi_HD44780.h
+++ b/Marlin/ultralcd_implementation_hitachi_HD44780.h
@@ -166,13 +166,21 @@ extern volatile uint16_t buttons;  //an extended version of the last checked but
   #include <Wire.h>
   #include <LiquidTWI2.h>
   #define LCD_CLASS LiquidTWI2
-  LCD_CLASS lcd(LCD_I2C_ADDRESS);
+  #if defined(DETECT_DEVICE)
+     LCD_CLASS lcd(LCD_I2C_ADDRESS, 1);
+  #else
+     LCD_CLASS lcd(LCD_I2C_ADDRESS);
+  #endif
   
 #elif defined(LCD_I2C_TYPE_MCP23008)
   #include <Wire.h>
   #include <LiquidTWI2.h>
   #define LCD_CLASS LiquidTWI2
-  LCD_CLASS lcd(LCD_I2C_ADDRESS);  
+  #if defined(DETECT_DEVICE)
+     LCD_CLASS lcd(LCD_I2C_ADDRESS, 1);
+  #else
+     LCD_CLASS lcd(LCD_I2C_ADDRESS);
+  #endif
 
 #elif defined(LCD_I2C_TYPE_PCA8574)
     #include <LiquidCrystal_I2C.h>