diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 5c0502772a14cebf1ab852b1780191a4fd9e83f7..0e79f56fef4b85c9aa110696fdde310acbdf699e 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -525,6 +525,10 @@ void GcodeSuite::process_next_command() {
         case 280: M280(); break;  // M280: Set servo position absolute
       #endif
 
+      #if ENABLED(BABYSTEPPING)
+        case 290: M290(); break;  // M290: Babystepping
+      #endif
+
       #if HAS_BUZZER
         case 300: M300(); break;  // M300: Play beep tone
       #endif
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 61415b07615efed0ab5532692754c3b85e6d5328..90d4c7f6ef189955f6f859247663b68ed1a772f9 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -169,6 +169,7 @@
  * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS)
  * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS)
  * M280 - Set servo position absolute: "M280 P<index> S<angle|µs>". (Requires servos)
+ * M290 - Babystepping (Requires BABYSTEPPING)
  * M300 - Play beep sound S<frequency Hz> P<duration ms>
  * M301 - Set PID parameters P I and D. (Requires PIDTEMP)
  * M302 - Allow cold extrudes, or set the minimum extrude S<temperature>. (Requires PREVENT_COLD_EXTRUSION)
@@ -585,6 +586,10 @@ private:
     static void M280();
   #endif
 
+  #if ENABLED(BABYSTEPPING)
+    static void M290();
+  #endif
+
   #if HAS_BUZZER
     static void M300();
   #endif
diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..45817f59f5c96eab4482d3672805003b035e369f
--- /dev/null
+++ b/Marlin/src/gcode/motion/M290.cpp
@@ -0,0 +1,61 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if ENABLED(BABYSTEPPING)
+
+#include "../gcode.h"
+#include "../../module/probe.h"
+#include "../../module/temperature.h"
+#include "../../module/planner.h"
+
+/**
+ * M290: Babystepping
+ */
+void GcodeSuite::M290() {
+  #if ENABLED(BABYSTEP_XY)
+    for (uint8_t a = X_AXIS; a <= Z_AXIS; a++)
+      if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) {
+        float offs = constrain(parser.value_axis_units(a), -2, 2);
+        #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+          if (a == Z_AXIS) {
+            zprobe_zoffset += offs;
+            refresh_zprobe_zoffset(true); // 'true' to not babystep
+          }
+        #endif
+        thermalManager.babystep_axis(a, offs * planner.axis_steps_per_mm[a]);
+      }
+  #else
+    if (parser.seenval('Z') || parser.seenval('S')) {
+      float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2);
+      #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+        zprobe_zoffset += offs;
+        refresh_zprobe_zoffset(); // This will babystep the axis
+      #else
+        thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]);
+      #endif
+    }
+  #endif
+}
+
+#endif // BABYSTEPPING
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index d83e8d3b614321a44dffde49da0872e40797e8c3..0da0f42684017979bcb59e60134c01c79939d798 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -353,9 +353,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
  * Babystepping
  */
 #if ENABLED(BABYSTEPPING)
-  #if DISABLED(ULTRA_LCD) && DISABLED(I2C_POSITION_ENCODERS)
-    #error "BABYSTEPPING requires an LCD controller."
-  #elif ENABLED(SCARA)
+  #if ENABLED(SCARA)
     #error "BABYSTEPPING is not implemented for SCARA yet."
   #elif ENABLED(DELTA) && ENABLED(BABYSTEP_XY)
     #error "BABYSTEPPING only implemented for Z axis on deltabots."