diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index e2fded4ad54df3f86706e67196ebcdefdda7ff24..195a8700c5355b4aabc924eabfdfd7e57fa89324 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -357,11 +357,8 @@ void suicide() {
  ***************** GCode Handlers *****************
  **************************************************/
 
-#if HAS_BED_PROBE
-  #include "gcode/probe/G30.h"
-  #if ENABLED(Z_PROBE_SLED)
-    #include "gcode/probe/G31_G32.h"
-  #endif
+#if ENABLED(Z_PROBE_SLED)
+  #include "gcode/probe/G31_G32.h"
 #endif
 
 #if ENABLED(G38_PROBE_TARGET)
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 43776191bf490a01dee3dd877f9ab700f90c0272..ab94884ccb634b003984eead65888cc4dd9e821e 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -116,7 +116,6 @@ void GcodeSuite::dwell(millis_t time) {
 //
 // Placeholders for non-migrated codes
 //
-extern void gcode_G30();
 extern void gcode_G31();
 extern void gcode_G32();
 extern void gcode_G38(bool is_38_2);
@@ -362,7 +361,7 @@ void GcodeSuite::process_next_command() {
       #if HAS_BED_PROBE
 
         case 30: // G30 Single Z probe
-          gcode_G30();
+          G30();
           break;
 
         #if ENABLED(Z_PROBE_SLED)
diff --git a/Marlin/src/gcode/probe/G30.h b/Marlin/src/gcode/probe/G30.cpp
similarity index 88%
rename from Marlin/src/gcode/probe/G30.h
rename to Marlin/src/gcode/probe/G30.cpp
index 80cab18153964c93a6d7dd33bbebe16e49ca480b..e84b52015892e5b20fe594c1f7f67945a02979df 100644
--- a/Marlin/src/gcode/probe/G30.h
+++ b/Marlin/src/gcode/probe/G30.cpp
@@ -20,6 +20,15 @@
  *
  */
 
+#include "../../inc/MarlinConfig.h"
+
+#if HAS_BED_PROBE
+
+#include "../gcode.h"
+#include "../../module/motion.h"
+#include "../../module/probe.h"
+#include "../../feature/bedlevel/bedlevel.h"
+
 /**
  * G30: Do a single Z probe at the current XY
  *
@@ -29,7 +38,7 @@
  *   Y   Probe Y position (default current Y)
  *   S0  Leave the probe deployed
  */
-void gcode_G30() {
+void GcodeSuite::G30() {
   const float xpos = parser.linearval('X', current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER),
               ypos = parser.linearval('Y', current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER);
 
@@ -54,3 +63,5 @@ void gcode_G30() {
 
   report_current_position();
 }
+
+#endif // HAS_BED_PROBE