diff --git a/Marlin/G26_Mesh_Validation_Tool.cpp b/Marlin/G26_Mesh_Validation_Tool.cpp
index f7402667c1b9f9fcea7f0effe824462af7cd44ea..41950189780301b65ec4c0ca4348d90bfe191217 100644
--- a/Marlin/G26_Mesh_Validation_Tool.cpp
+++ b/Marlin/G26_Mesh_Validation_Tool.cpp
@@ -199,6 +199,7 @@
       set_current_to_destination();
     }
 
+    ubl_has_control_of_lcd_panel = true; // Take control of the LCD Panel!
     if (turn_on_heaters())     // Turn on the heaters, leave the command if anything
       goto LEAVE;              // has gone wrong.
 
@@ -233,19 +234,30 @@
     move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], 0.0);
     move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], ooze_amount);
 
-    ubl_has_control_of_lcd_panel++; // Take control of the LCD Panel!
+    ubl_has_control_of_lcd_panel = true; // Take control of the LCD Panel!
     debug_current_and_destination((char*)"Starting G26 Mesh Validation Pattern.");
 
-    wait_for_user = true;
+    /**
+     * Declare and generate a sin() & cos() table to be used during the circle drawing.  This will lighten
+     * the CPU load and make the arc drawing faster and more smooth
+     */
+    float sin_table[360 / 30 + 1], cos_table[360 / 30 + 1];
+    for (i = 0; i <= 360 / 30; i++) {
+      cos_table[i] = SIZE_OF_INTERSECTION_CIRCLES * cos(RADIANS(valid_trig_angle(i * 30.0)));
+      sin_table[i] = SIZE_OF_INTERSECTION_CIRCLES * sin(RADIANS(valid_trig_angle(i * 30.0)));
+    }
 
     do {
 
-      if (!wait_for_user) {                                     // Check if the user wants to stop the Mesh Validation
+      if (ubl_lcd_clicked()) {                                  // Check if the user wants to stop the Mesh Validation
         strcpy(lcd_status_message, "Mesh Validation Stopped."); // We can't do lcd_setstatus() without having it continue;
         #if ENABLED(ULTRA_LCD)
           lcd_setstatus("Mesh Validation Stopped.", true);
           lcd_quick_feedback();
         #endif
+        while (ubl_lcd_clicked()) {         // Wait until the user is done pressing the
+          idle();                           // Encoder Wheel if that is why we are leaving
+        }
         goto LEAVE;
       }
 
@@ -309,16 +321,6 @@
           end_angle   = 360.0;
         }
 
-        /**
-         * Declare and generate a sin() & cos() table to be used during the circle drawing.  This will lighten
-         * the CPU load and make the arc drawing faster and more smooth
-         */
-        float sin_table[360 / 30 + 1], cos_table[360 / 30 + 1];
-        for (i = 0; i <= 360 / 30; i++) {
-          cos_table[i] = SIZE_OF_INTERSECTION_CIRCLES * cos(RADIANS(valid_trig_angle(i * 30.0)));
-          sin_table[i] = SIZE_OF_INTERSECTION_CIRCLES * sin(RADIANS(valid_trig_angle(i * 30.0)));
-        }
-
         for (tmp = start_angle; tmp < end_angle - 0.1; tmp += 30.0) {
           int tmp_div_30 = tmp / 30.0;
           if (tmp_div_30 < 0) tmp_div_30 += 360 / 30;
@@ -351,13 +353,16 @@
           }
 
           print_line_from_here_to_there(x, y, layer_height, xe, ye, layer_height);
+
         }
-        lcd_init_counter++;
-        if (lcd_init_counter > 10) {
-          lcd_init_counter = 0;
-          lcd_init(); // Some people's LCD Displays are locking up.  This might help them
-        }
+//      lcd_init_counter++;
+//      if (lcd_init_counter > 10) {
+//        lcd_init_counter = 0;
+//        lcd_init(); // Some people's LCD Displays are locking up.  This might help them
+//        ubl_has_control_of_lcd_panel = true;     // Make sure UBL still is controlling the LCD Panel
+//      }
 
+    // If the end point of the line is closer to the nozzle, we are going to
         debug_current_and_destination((char*)"Looking for lines to connect.");
         look_for_lines_to_connect();
         debug_current_and_destination((char*)"Done with line connect.");
@@ -365,21 +370,24 @@
 
       debug_current_and_destination((char*)"Done with current circle.");
 
+    // If the end point of the line is closer to the nozzle, we are going to
+
     }
     while (location.x_index >= 0 && location.y_index >= 0);
 
     LEAVE:
 
-    wait_for_user = false;
-
+    while (ubl_lcd_clicked()) {         // Wait until the user is done pressing the
+      idle();                           // Encoder Wheel if that is why we are leaving
+    }
     retract_filament();
     destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES;                             // Raise the nozzle
 
     debug_current_and_destination((char*)"ready to do Z-Raise.");
-    move_to( destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], 0); // Raise the nozzle
+    move_to( destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], 0);   // Raise the nozzle
     debug_current_and_destination((char*)"done doing Z-Raise.");
 
-    destination[X_AXIS] = x_pos;                                                // Move back to the starting position
+    destination[X_AXIS] = x_pos;                                                  // Move back to the starting position
     destination[Y_AXIS] = y_pos;
     destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES;                             // Keep the nozzle where it is
 
@@ -538,6 +546,8 @@
     float feed_value;
     static float last_z = -999.99;
 
+
+
     bool has_xy_component = (x != current_position[X_AXIS] || y != current_position[Y_AXIS]); // Check if X or Y is involved in the movement.
 
     if (g26_debug_flag) {
@@ -591,6 +601,7 @@
 
     stepper.synchronize();
     set_destination_to_current();
+
   }
 
   void retract_filament() {
@@ -658,16 +669,23 @@
       if (g26_debug_flag)
         SERIAL_ECHOLNPGM("  filament retracted.");
     }
+    // If the end point of the line is closer to the nozzle, we are going to
     move_to(sx, sy, sz, 0.0); // Get to the starting point with no extrusion
 
+    // If the end point of the line is closer to the nozzle, we are going to
+
     float e_pos_delta = Line_Length * g26_e_axis_feedrate * extrusion_multiplier;
 
     un_retract_filament();
+
+    // If the end point of the line is closer to the nozzle, we are going to
     if (g26_debug_flag) {
       SERIAL_ECHOLNPGM("  doing printing move.");
       debug_current_and_destination((char*)"doing final move_to() inside print_line_from_here_to_there()");
     }
     move_to(ex, ey, ez, e_pos_delta);  // Get to the ending point with an appropriate amount of extrusion
+
+    // If the end point of the line is closer to the nozzle, we are going to
   }
 
   /**
@@ -815,18 +833,18 @@
           lcd_setstatus("G26 Heating Bed.", true);
           lcd_quick_feedback();
       #endif
-          ubl_has_control_of_lcd_panel++;
+          ubl_has_control_of_lcd_panel = true;
           thermalManager.setTargetBed(bed_temp);
-          wait_for_user = true;
           while (abs(thermalManager.degBed() - bed_temp) > 3) {
-            if (!wait_for_user) {
+            if (ubl_lcd_clicked()) {
               strcpy(lcd_status_message, "Leaving G26"); // We can't do lcd_setstatus() without having it continue;
               lcd_setstatus("Leaving G26", true);        // Now we do it right.
+              while (ubl_lcd_clicked())                  // Debounce Encoder Wheel 
+                idle();
               return UBL_ERR;
             }
             idle();
           }
-          wait_for_user = false;
       #if ENABLED(ULTRA_LCD)
         }
         lcd_setstatus("G26 Heating Nozzle.", true);
@@ -836,16 +854,16 @@
 
     // Start heating the nozzle and wait for it to reach temperature.
     thermalManager.setTargetHotend(hotend_temp, 0);
-    wait_for_user = true;
     while (abs(thermalManager.degHotend(0) - hotend_temp) > 3) {
-      if (!wait_for_user) {
+      if (ubl_lcd_clicked()) {
         strcpy(lcd_status_message, "Leaving G26"); // We can't do lcd_setstatus() without having it continue;
         lcd_setstatus("Leaving G26", true);        // Now we do it right.
+        while (ubl_lcd_clicked())                  // Debounce Encoder Wheel 
+          idle();
         return UBL_ERR;
       }
       idle();
     }
-    wait_for_user = false;
 
     #if ENABLED(ULTRA_LCD)
       lcd_setstatus("", true);
@@ -869,9 +887,7 @@
       un_retract_filament();    // Lets make sure the G26 command doesn't think the filament is
                                 // retracted().  We are here because we want to prime the nozzle.
                                 // So let's just unretract just to be sure.
-
-      wait_for_user = true;
-      while (wait_for_user) {
+      while (!ubl_lcd_clicked()) {
         chirp_at_user();
         destination[E_AXIS] += 0.25;
         #ifdef PREVENT_LENGTHY_EXTRUDE
@@ -894,9 +910,10 @@
 
       strcpy(lcd_status_message, "Done Priming"); // We can't do lcd_setstatus() without having it continue;
                                                   // So...  We cheat to get a message up.
+      while (ubl_lcd_clicked())                   // Debounce Encoder Wheel 
+        idle();
 
       #if ENABLED(ULTRA_LCD)
-        ubl_has_control_of_lcd_panel = false;
         lcd_setstatus("Done Priming", true);      // Now we do it right.
         lcd_quick_feedback();
       #endif
@@ -917,6 +934,7 @@
       set_destination_to_current();
       retract_filament();
     }
+
     return UBL_OK;
   }
 
diff --git a/Marlin/UBL_Bed_Leveling.cpp b/Marlin/UBL_Bed_Leveling.cpp
index cc4875a44395ac7a0d082ba11527f47a7f8c0528..55f7a6d43bf86b37ae62e0988c70d722a5815061 100644
--- a/Marlin/UBL_Bed_Leveling.cpp
+++ b/Marlin/UBL_Bed_Leveling.cpp
@@ -175,8 +175,13 @@
     current_xi = ubl.get_cell_index_x(current_position[X_AXIS] + (MESH_X_DIST) / 2.0);
     current_yi = ubl.get_cell_index_y(current_position[Y_AXIS] + (MESH_Y_DIST) / 2.0);
 
-    for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
-      SERIAL_ECHOPGM("                 ");
+    for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++) {
+      SERIAL_ECHOPGM("            ");
+      #if TX_BUFFER_SIZE>0
+        MYSERIAL.flushTX();
+      #endif
+      delay(15);
+    }
 
     SERIAL_ECHOPAIR("(", UBL_MESH_NUM_X_POINTS - 1);
     SERIAL_ECHOPAIR(",", UBL_MESH_NUM_Y_POINTS - 1);
@@ -188,8 +193,13 @@
       SERIAL_ECHOPAIR(",", UBL_MESH_MAX_Y);
       SERIAL_CHAR(')');
 
-      for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
-        SERIAL_ECHOPGM("                 ");
+      for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++) {
+        SERIAL_ECHOPGM("            ");
+        #if TX_BUFFER_SIZE>0
+          MYSERIAL.flushTX();
+        #endif
+        delay(15);
+      }
 
       SERIAL_ECHOPAIR("(", UBL_MESH_MAX_X);
       SERIAL_ECHOPAIR(",", UBL_MESH_MAX_Y);
@@ -205,13 +215,17 @@
         SERIAL_CHAR(i == current_xi && j == current_yi ? '[' : ' ');
 
         if (isnan(f))
-          SERIAL_PROTOCOLPGM("      .       ");
+          SERIAL_PROTOCOLPGM("    .    ");
         else {
           // if we don't do this, the columns won't line up nicely
           if (f >= 0.0) SERIAL_CHAR(' ');
-          SERIAL_PROTOCOL_F(f, 5);
+          SERIAL_PROTOCOL_F(f, 3);
           idle();
         }
+        #if TX_BUFFER_SIZE>0
+          MYSERIAL.flushTX();
+        #endif
+        delay(15);
         if (i == current_xi && j == current_yi) // is the nozzle here? if so, finish marking the number
           SERIAL_CHAR(']');
         else
@@ -231,27 +245,34 @@
     SERIAL_ECHOPAIR(",", int(UBL_MESH_MIN_Y));
     SERIAL_ECHOPGM(")    ");
 
-    for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
-      SERIAL_ECHOPGM("                 ");
+    for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)  {
+      SERIAL_ECHOPGM("            ");
+      #if TX_BUFFER_SIZE>0
+        MYSERIAL.flushTX();
+      #endif
+      delay(15);
+    }
 
     SERIAL_ECHOPAIR("(", int(UBL_MESH_MAX_X));
     SERIAL_ECHOPAIR(",", int(UBL_MESH_MIN_Y));
     SERIAL_CHAR(')');
-    //  }
+    SERIAL_EOL;
 
     SERIAL_ECHOPAIR("(", 0);
     SERIAL_ECHOPAIR(",", 0);
     SERIAL_ECHOPGM(")       ");
 
-    for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
-      SERIAL_ECHOPGM("                 ");
+    for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++) {
+      SERIAL_ECHOPGM("            ");
+      #if TX_BUFFER_SIZE>0
+        MYSERIAL.flushTX();
+      #endif
+      delay(15);
+    }
 
     SERIAL_ECHOPAIR("(", UBL_MESH_NUM_X_POINTS-1);
     SERIAL_ECHOPAIR(",", 0);
-    SERIAL_CHAR(')');
-
-    SERIAL_CHAR(' ');
-    SERIAL_EOL;
+    SERIAL_ECHOLNPGM(")");
   }
 
   bool unified_bed_leveling::sanity_check() {
diff --git a/Marlin/UBL_G29.cpp b/Marlin/UBL_G29.cpp
index 0c74f677731ccb233ba911aa5bd46d79549f1794..026045a7bc260052331b57aaec3c2fbf54296e6e 100644
--- a/Marlin/UBL_G29.cpp
+++ b/Marlin/UBL_G29.cpp
@@ -594,18 +594,18 @@
         save_ubl_active_state_and_disable();
         //measured_z = probe_pt(x_pos + X_PROBE_OFFSET_FROM_EXTRUDER, y_pos + Y_PROBE_OFFSET_FROM_EXTRUDER, ProbeDeployAndStow, g29_verbose_level);
 
+        ubl_has_control_of_lcd_panel = true;// Grab the LCD Hardware
         measured_z = 1.5;
         do_blocking_move_to_z(measured_z);  // Get close to the bed, but leave some space so we don't damage anything
                                             // The user is not going to be locking in a new Z-Offset very often so
                                             // it won't be that painful to spin the Encoder Wheel for 1.5mm
         lcd_implementation_clear();
         lcd_z_offset_edit_setup(measured_z);
-        wait_for_user = true;
         do {
           measured_z = lcd_z_offset_edit();
           idle();
           do_blocking_move_to_z(measured_z);
-        } while (wait_for_user);
+        } while (!ubl_lcd_clicked());
 
         ubl_has_control_of_lcd_panel++;   // There is a race condition for the Encoder Wheel getting clicked.
                                           // It could get detected in lcd_mesh_edit (actually _lcd_mesh_fine_tune)
@@ -707,14 +707,17 @@
     save_ubl_active_state_and_disable();   // we don't do bed level correction because we want the raw data when we probe
     DEPLOY_PROBE();
 
-    wait_for_user = true;
     do {
-      if (!wait_for_user) {
-        SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.");
+      if (ubl_lcd_clicked()) {
+        SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.\n");
         lcd_quick_feedback();
-        ubl_has_control_of_lcd_panel = false;
         STOW_PROBE();
+        while (ubl_lcd_clicked() ) {
+          idle();
+        }
+        ubl_has_control_of_lcd_panel = false;
         restore_ubl_active_state_and_leave();
+        delay(50);  // Debounce the Encoder wheel
         return;
       }
 
@@ -737,7 +740,6 @@
 
     LEAVE:
 
-    wait_for_user = false;
     STOW_PROBE();
     restore_ubl_active_state_and_leave();
 
@@ -813,8 +815,7 @@
   }
 
   float use_encoder_wheel_to_measure_point() {
-    wait_for_user = true;
-    while (wait_for_user) {     // we need the loop to move the nozzle based on the encoder wheel here!
+    while (!ubl_lcd_clicked()) {     // we need the loop to move the nozzle based on the encoder wheel here!
       idle();
       if (ubl_encoderDiff) {
         do_blocking_move_to_z(current_position[Z_AXIS] + 0.01 * float(ubl_encoderDiff));
@@ -891,8 +892,8 @@
       last_x = xProbe;
       last_y = yProbe;
 
-      wait_for_user = true;
-      while (wait_for_user) {     // we need the loop to move the nozzle based on the encoder wheel here!
+      ubl_has_control_of_lcd_panel = true;
+      while (!ubl_lcd_clicked) {     // we need the loop to move the nozzle based on the encoder wheel here!
         idle();
         if (ubl_encoderDiff) {
           do_blocking_move_to_z(current_position[Z_AXIS] + float(ubl_encoderDiff) / 100.0);