diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index 67015c3226..616f8e17cf 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -108,7 +108,6 @@ uint16_t max_display_update_time = 0;
     extern bool powersupply_on;
   #endif
 
-
   ////////////////////////////////////////////
   ///////////////// Menu Tree ////////////////
   ////////////////////////////////////////////
@@ -2163,97 +2162,6 @@ void kill_screen(const char* lcd_msg) {
       enqueue_and_echo_command(ubl_lcd_gcode);
     }
 
-  #if ENABLED(DOGLCD)
-
-    /**
-     * UBL LCD "radar" map data
-     */
-    #define MAP_UPPER_LEFT_CORNER_X 35  // These probably should be moved to the .h file  But for now,
-    #define MAP_UPPER_LEFT_CORNER_Y 8   // it is easier to play with things having them here
-    #define MAP_MAX_PIXELS_X        53
-    #define MAP_MAX_PIXELS_Y        49
-
-    void _lcd_ubl_plot_drawing_prep() {
-      uint8_t i, j, x_offset, y_offset, x_map_pixels, y_map_pixels,
-              pixels_per_X_mesh_pnt, pixels_per_Y_mesh_pnt, inverted_y;
-
-      /*********************************************************/
-      /************ Scale the box pixels appropriately *********/
-      /*********************************************************/
-      x_map_pixels = ((MAP_MAX_PIXELS_X - 4) / (GRID_MAX_POINTS_X)) * (GRID_MAX_POINTS_X);
-      y_map_pixels = ((MAP_MAX_PIXELS_Y - 4) / (GRID_MAX_POINTS_Y)) * (GRID_MAX_POINTS_Y);
-
-      pixels_per_X_mesh_pnt = x_map_pixels / (GRID_MAX_POINTS_X);
-      pixels_per_Y_mesh_pnt = y_map_pixels / (GRID_MAX_POINTS_Y);
-
-      x_offset = MAP_UPPER_LEFT_CORNER_X + 1 + (MAP_MAX_PIXELS_X - x_map_pixels - 2) / 2;
-      y_offset = MAP_UPPER_LEFT_CORNER_Y + 1 + (MAP_MAX_PIXELS_Y - y_map_pixels - 2) / 2;
-
-      /*********************************************************/
-      /************ Clear the Mesh Map Box**********************/
-      /*********************************************************/
-
-      u8g.setColorIndex(1);  // First draw the bigger box in White so we have a border around the mesh map box
-      u8g.drawBox(x_offset - 2, y_offset - 2, x_map_pixels + 4, y_map_pixels + 4);
-
-      u8g.setColorIndex(0);  // Now actually clear the mesh map box
-      u8g.drawBox(x_offset, y_offset, x_map_pixels, y_map_pixels);
-
-      /*********************************************************/
-      /************ Display Mesh Point Locations ***************/
-      /*********************************************************/
-
-      u8g.setColorIndex(1);
-      for (i = 0; i < GRID_MAX_POINTS_X; i++) {
-        for (j = 0; j < GRID_MAX_POINTS_Y; j++) {
-          u8g.drawBox(x_offset + i * pixels_per_X_mesh_pnt + pixels_per_X_mesh_pnt / 2,
-                      y_offset + j * pixels_per_Y_mesh_pnt + pixels_per_Y_mesh_pnt / 2, 1, 1);
-        }
-      }
-
-      /*********************************************************/
-      /************ Fill in the Specified Mesh Point ***********/
-      /*********************************************************/
-
-      inverted_y = GRID_MAX_POINTS_Y - y_plot - 1;    // The origin is typically in the lower right corner.  We need to
-                                                      // invert the Y to get it to plot in the right location.
-      u8g.drawBox(x_offset + x_plot * pixels_per_X_mesh_pnt, y_offset + inverted_y * pixels_per_Y_mesh_pnt,
-                    pixels_per_X_mesh_pnt, pixels_per_Y_mesh_pnt);
-
-      /*********************************************************/
-      /************** Put Relevent Text on Display *************/
-      /*********************************************************/
-
-      // Show X and Y positions at top of screen
-      u8g.setColorIndex(1);
-      u8g.setPrintPos(5, 7);
-      lcd_print("X:");
-      lcd_print(ftostr32(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]))));
-      u8g.setPrintPos(74, 7);
-      lcd_print("Y:");
-      lcd_print(ftostr32(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]))));
-
-      // Print plot position
-      u8g.setPrintPos(5, 64);
-      lcd_print('(');
-      u8g.print(x_plot);
-      lcd_print(',');
-      u8g.print(y_plot);
-      lcd_print(')');
-
-      // Show the location value
-      u8g.setPrintPos(74, 64);
-      lcd_print("Z:");
-      if (!isnan(ubl.z_values[x_plot][y_plot])) {
-        lcd_print(ftostr43sign(ubl.z_values[x_plot][y_plot]));
-      }
-      else {
-        lcd_print(" -----");
-      }
-    }
-
-  #endif // DOGLCD
-
     /**
      * UBL LCD Map Movement
      */
@@ -2318,9 +2226,9 @@ void kill_screen(const char* lcd_msg) {
 
         if (lcdDrawUpdate) {
           #if ENABLED(DOGLCD)
-            _lcd_ubl_plot_drawing_prep();
+            _lcd_ubl_plot_DOGLCD(x_plot, y_plot);
           #else
-            _lcd_ubl_output_char_lcd();
+            _lcd_ubl_plot_HD44780(x_plot, y_plot);
           #endif
 
           ubl_map_move_to_xy(); // Move to current location
diff --git a/Marlin/ultralcd_impl_DOGM.h b/Marlin/ultralcd_impl_DOGM.h
index 406f1c3176..3a1ab1a701 100644
--- a/Marlin/ultralcd_impl_DOGM.h
+++ b/Marlin/ultralcd_impl_DOGM.h
@@ -939,6 +939,96 @@ static void lcd_implementation_status_screen() {
 
   #endif // SDSUPPORT
 
+  #if ENABLED(AUTO_BED_LEVELING_UBL)
+
+    /**
+     * UBL LCD "radar" map data
+     */
+  #define MAP_UPPER_LEFT_CORNER_X 35  // These probably should be moved to the .h file  But for now,
+  #define MAP_UPPER_LEFT_CORNER_Y 8  // it is easier to play with things having them here
+  #define MAP_MAX_PIXELS_X        53
+  #define MAP_MAX_PIXELS_Y        49
+
+    void _lcd_ubl_plot_DOGLCD(uint8_t x_plot, uint8_t y_plot) {
+      uint8_t i, j, x_offset, y_offset, x_map_pixels, y_map_pixels;
+      uint8_t pixels_per_X_mesh_pnt, pixels_per_Y_mesh_pnt, inverted_y;
+
+      /*********************************************************/
+      /************ Scale the box pixels appropriately *********/
+      /*********************************************************/
+      x_map_pixels = ((MAP_MAX_PIXELS_X - 4) / GRID_MAX_POINTS_X) * GRID_MAX_POINTS_X;
+      y_map_pixels = ((MAP_MAX_PIXELS_Y - 4) / GRID_MAX_POINTS_Y) * GRID_MAX_POINTS_Y;
+
+      pixels_per_X_mesh_pnt = x_map_pixels / GRID_MAX_POINTS_X;
+      pixels_per_Y_mesh_pnt = y_map_pixels / GRID_MAX_POINTS_Y;
+
+      x_offset = MAP_UPPER_LEFT_CORNER_X + 1 + (MAP_MAX_PIXELS_X-x_map_pixels-2)/2;
+      y_offset = MAP_UPPER_LEFT_CORNER_Y + 1 + (MAP_MAX_PIXELS_Y-y_map_pixels-2)/2;
+
+      /*********************************************************/
+      /************ Clear the Mesh Map Box**********************/
+      /*********************************************************/
+
+      u8g.setColorIndex(1);  // First draw the bigger box in White so we have a border around the mesh map box
+      u8g.drawBox(x_offset-2, y_offset-2, x_map_pixels+4, y_map_pixels+4);
+
+      u8g.setColorIndex(0);  // Now actually clear the mesh map box
+      u8g.drawBox(x_offset, y_offset, x_map_pixels, y_map_pixels);
+
+      /*********************************************************/
+      /************ Display Mesh Point Locations ***************/
+      /*********************************************************/
+
+      u8g.setColorIndex(1);
+      for (i = 0; i < GRID_MAX_POINTS_X; i++) {
+        for (j = 0; j < GRID_MAX_POINTS_Y; j++) {
+          u8g.drawBox(x_offset+i*pixels_per_X_mesh_pnt+pixels_per_X_mesh_pnt/2,  
+                      y_offset+j*pixels_per_Y_mesh_pnt+pixels_per_Y_mesh_pnt/2, 1, 1);
+        }
+      }
+
+      /*********************************************************/
+      /************ Fill in the Specified Mesh Point ***********/
+      /*********************************************************/
+
+      inverted_y = GRID_MAX_POINTS_Y - y_plot - 1;    // The origin is typically in the lower right corner.  We need to
+                                                      // invert the Y to get it to plot in the right location.
+      u8g.drawBox(x_offset+x_plot*pixels_per_X_mesh_pnt, y_offset+inverted_y*pixels_per_Y_mesh_pnt, 
+                    pixels_per_X_mesh_pnt, pixels_per_Y_mesh_pnt);
+
+      /*********************************************************/
+      /************** Put Relevent Text on Display *************/
+      /*********************************************************/
+
+      // Show X and Y positions at top of screen
+      u8g.setColorIndex(1);
+      u8g.setPrintPos(5, 7);
+      lcd_print("X:");
+      lcd_print(ftostr32(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]))));
+      u8g.setPrintPos(74, 7);
+      lcd_print("Y:");
+      lcd_print(ftostr32(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]))));
+
+      // Print plot position
+      u8g.setPrintPos(5, 64);
+      lcd_print("(");
+      u8g.print(x_plot);
+      lcd_print(",");
+      u8g.print(y_plot);
+      lcd_print(")");
+
+      // Show the location value
+      u8g.setPrintPos(74, 64);
+      lcd_print("Z:");
+      if (!isnan(ubl.z_values[x_plot][y_plot])) {
+        lcd_print(ftostr43sign(ubl.z_values[x_plot][y_plot]));
+      }
+      else {
+        lcd_print(" -----");
+      }
+    }
+  #endif // AUTO_BED_LEVELING_UBL
+
 #endif // ULTIPANEL
 
 #endif // __ULTRALCD_IMPL_DOGM_H
diff --git a/Marlin/ultralcd_impl_HD44780.h b/Marlin/ultralcd_impl_HD44780.h
index 71496ae75c..afebbfd4d0 100644
--- a/Marlin/ultralcd_impl_HD44780.h
+++ b/Marlin/ultralcd_impl_HD44780.h
@@ -31,6 +31,10 @@
 #include "utility.h"
 #include "duration_t.h"
 
+#if ENABLED(AUTO_BED_LEVELING_UBL)
+  #include "ubl.h"
+#endif
+
 extern volatile uint8_t buttons;  //an extended version of the last checked buttons in a bit array.
 
 ////////////////////////////////////
@@ -1080,9 +1084,65 @@ static void lcd_implementation_status_screen() {
 #endif // LCD_HAS_STATUS_INDICATORS
 
 #ifdef AUTO_BED_LEVELING_UBL
-    void lcd_return_to_status();       // These are just place holders for the 20x4 LCD work that
-    void _lcd_ubl_output_char_lcd() {  // is coming up very soon.   Soon this will morph into the
-      lcd_return_to_status();          // real code.
+
+    // These are just basic data for the 20x4 LCD work that
+    // is coming up very soon.
+    // Soon this will morph into a map code.
+
+    void _lcd_ubl_plot_HD44780(uint8_t x_plot, uint8_t y_plot) {
+
+      uint8_t lcd_w_pos = 8, lcd_h_pos = 1;
+
+      #if LCD_WIDTH < 20
+        lcd_w_pos = 8;
+      #else
+        lcd_w_pos = 12;
+      #endif
+      #if LCD_HEIGHT > 3
+        lcd_h_pos = 3;
+      #elif LCD_HEIGHT > 2
+        lcd_h_pos = 2;
+      #else
+        lcd_h_pos = 1;
+      #endif
+
+      // Show X and Y positions at top of screen
+      lcd.setCursor(0, 0);
+      #if LCD_WIDTH < 20
+        lcd.print("X");
+      #else
+        lcd.print("X:");
+      #endif
+      lcd.print(ftostr32(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]))));
+      lcd.setCursor(lcd_w_pos, 0);
+      #if LCD_WIDTH < 20
+        lcd.print("Y");
+      #else
+        lcd.print("Y:");
+      #endif
+      lcd.print(ftostr32(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]))));
+
+      // Print plot position
+      lcd.setCursor(0, lcd_h_pos);
+      lcd.print("(");
+      lcd.print(x_plot);
+      lcd.print(",");
+      lcd.print(y_plot);
+      lcd.print(")");
+
+      // Show the location value
+      lcd.setCursor(lcd_w_pos, lcd_h_pos);
+      #if LCD_WIDTH < 20
+        lcd.print("Z");
+      #else
+        lcd.print("Z:");
+      #endif
+      if (!isnan(ubl.z_values[x_plot][y_plot])) {
+        lcd.print(ftostr43sign(ubl.z_values[x_plot][y_plot]));
+      }
+      else {
+        lcd.print(" -----");
+      }
     }
 
 #endif // AUTO_BED_LEVELING_UBL