If you've ever started a print on your MK4 only to find your first layer is being printed too high off the bed, you're not alone. This frustrating issue has been widely reported in the community, and we encountered it ourselves while developing automated part removal for the MK4. After extensive testing and experimentation, we've not only identified the root cause but developed a reliable solution that doesn't require constant manual intervention.
The MK4's bed levelling system relies on the nozzle physically tapping the bed to create an accurate mesh. While this is generally an excellent approach for precise first layers, there's a catch: any material on the nozzle tip can throw off these measurements.
As we attempted to pinpoint the issue, we observed that printers which consistently produced high first layers typically had residual filament buildup from previous prints. As the nozzle moves around taking measurements, more material leaks out, so the nozzle essentially gets "taller" with each measurement, progressively throwing off the calibration. It's like trying to measure with a ruler that keeps getting longer!
This becomes particularly problematic when:
Printing with larger nozzle sizes
Using materials that tend to ooze (like PETG)
Running back-to-back prints
The printer heats up for the next print
We first noticed something was wrong when some printers would repeatedly trigger their automatic nozzle cleaning routine - a feature designed to handle small amounts of residue. However, with larger buildups of material, this built-in cleaning system would often fail, leaving us back at square one.
Our Journey to a Solution
Prusa's recommended approaches include:
Sticking to smaller nozzle sizes (0.4mm or 0.6mm)
Manually cleaning the nozzle before each print
Using a silicone sock on the nozzle
While these work, they either limit your printing capabilities or require constant attention. When you're running hundreds of prints, stopping to clean the nozzle before each one isn't just inconvenient—it's a significant time sink.
A New Approach
We noticed that Bambu Lab printers, which use a similar bed-tapping system, handle this issue with a built-in nozzle cleaning mechanism. While the MK4 doesn't have this hardware, it gave us an idea: what if we could create our own cleaning mechanism using the printer itself?
Our solution is elegant in its simplicity. Here's exactly how it works:
1. Before each print starts, we print a thin block of material that serves two purposes:
It properly primes the nozzle for the upcoming print
More importantly, it creates a disposable "cleaning area" for the nozzle
2. Instead of wiping the nozzle directly on the bed (which is standard practice), we wipe it against this freshly printed material. This seemingly small change offers several significant benefits:
Fresh plastic naturally wants to stick to other fresh plastic, so any material on your nozzle preferentially sticks to the purge line
Wiping against plastic instead of the hard bed surface significantly reduces nozzle wear over time, helping maintain print quality
Every print gets its own fresh cleaning surface - no worn-out brushes to replace
3. During the cleaning process, we cool down the nozzle. This critical step:
Makes excess material stick more readily to the purge line
Allows any remaining material in the nozzle to solidify, preventing further leakage during homing
4. After cleaning, we:
Home again to get an accurate bed reading (now with a clean nozzle)
Keep the nozzle firmly pressed against the print surface during cooling
This prevents any additional material from leaking out and interfering with bed levelling
The Result
This solution has transformed our MK4 printing experience:
No more manual cleaning between prints
Reliable first layers regardless of nozzle size
Compatible with "oozy" materials like PETG
Reduced nozzle wear over time
While you'll still need to do occasional hotend maintenance every few days with particularly sticky materials, it's far better than cleaning between every print.
Make It Work For You
Want to implement this solution on your own MK4? We've built this into our AutoFarm3D software, but we believe in sharing solutions with the community. You can use our tested start gcode sequence, which we've made freely available here:
M73 P0 ; Set progress to 0
M17 ; enable steppers
M906 X900 Y900
M914 Y-6
M862.1 P[nozzle_diameter] ; nozzle diameter check
M862.3 P "MK4" ; printer model check
M862.5 P2 ; g-code level check
M862.6 P"Input shaper" ; FW feature check
M115 U5.1.2+13478
M555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}
G90 ; use absolute coordinates
M83 ; extruder relative mode
M140 S[first_layer_bed_temperature] ; Start warming bed
G1 Z1 ; Move nozzle down to prevent filament tightness before first home
G1 Y20 F6000
G1 X0 F12000 ; Get X ready for home and pull tension
G92 E0 ; Reset extruder coord
G28 X
G28 Y
G1 X250 F12000 ; Fast swipe to pull tension
G1 X40 ; Where nozzle will touch bed
G1 Y-4 ; Where nozzle will touch bed
M106 S255 ; Try to prevent oozing
M109 S190 ; Wait to Warm Extruder and soften filament without oozing
M107
M84 E ; Turn off E motor
G1 Z0 ; Smoosh nozzle into bed while warm
M106 S255 ; Blast fan
M109 R170 ; Wait to cool to 150
M302 S140 ; lower cold extrusion limit to 140C
M107 ; Fan off
G1 E-20 F1200 ; Retract to create slack for homing
M84 E ; turn off E motor
G28 C ; home Z without mesh bed level
G1 X0 Y-3.5 Z1.5 F4800 ; Prepare for purge
; Huge purge
M190 S[first_layer_bed_temperature] ; Wait bed temp
;M109 S[first_layer_temperature] ; Wait extruder temp (should be 240)
M109 S240
G92 E0
G1 X95 Y2 Z4.5 F4800; Go to front of bed to begin purge line
G1 E30 F1600 ; Un-Retract homing slack plus 10mm retraction from previous print
G92 E0
M104 T0 S150 ; Drop hotend temp
M302 S110 ; lower cold extrusion limit to 110C
M106 S255 ; Blast fan
G4 S3 ; Wait a sec
G1 Y-4 Z2.5 E6 F800
G1 X120 Z0.8 E20 F1000 ; Fast first layer
G1 X145 E20 F900; Draw purge line
G1 Y-2 E1 F800; Move back for second line
G1 X110 E26 F800; Draw second purge line
G1 Y0 E1 F800; Move back for third line
G1 X145 E26 F800; Draw third purge line
G1 Z1.6; Lift nozzle for second layer
G1 X110 E28 F500; Draw first second layer
G1 Y-2 E1 F500; Move forward
G1 X145 E28 F500; Draw second second layer
G1 Y-4 E1 F500; Move back for third line
G1 X110 E28 F500; Draw third second layer
G1 Y-1; Move back over second/third purge line
G1 X125 E-10 F1200 ; retraction and wipe nozzle
G0 X200 F4800; Move quickly away
G0 Z5
; Use purge as wipe area
M109 R140 ; Wait cool nozzle to 150 and ooze to come out
M107 ; Disable fan
G0 Z1.25 ; Rub purge at -0.35 height deficit
G0 X112 F4800; Rub nozzle over purge 1 (fast)
G0 X138 ; Rub nozzle over purge 2
G0 X112 ; Rub nozzle over purge 3
G0 Z2 F4800; Move nozzle up
M106 S255 ; Blast fan to prevent ooze
G1 E-50 F1600; Retract 50mm more to produce filament slack (60mm total)
M104 T0 R120 ; Start cooling nozzle
; Clear stuck purge lines
G0 Z0.3 Y14 X250 F12000
G0 Z0.1 X0 F12000
G0 Y12 F6000
G0 X250 F12000
G0 Y10 F6000
G0 X0 F12000
G0 Y8 F6000
G0 X250 F12000
G0 Y6 F6000
G0 X0 F12000
G0 Y4 F6000
M109 T0 R120 ; Wait for 120 prevent any ooze before / while homing
M84 E ; turn off E motor
G28 ; home all without mesh bed level
M302 S160 ; Raise cold extrusion limit to 160C
M107 ; Turn off fan so any residue can squish during auto level
G29 P9 X10 Y-4 W32 H4
{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif}
G0 Z40 F10000
M107
;
; MBL
;
M84 E ; turn off E motor
G29 P1 ; invalidate mbl & probe print area
G29 P1 X0 Y2 W50 H20 C ; probe near purge place
G29 P3.2 ; interpolate mbl probes
G29 P3.13 ; extrapolate mbl outside probe area
G29 A ; activate mbl
; prepare for nozzle prime
M104 S{first_layer_temperature[0]}
G0 X0 Y20 Z2 F4800 ; move away and ready for the purge
G0 Z0 ; Get near bed
M109 S{first_layer_temperature[0]}
M84 S0 ; Disable stepper idle timeout
; Re-extrude material
G92 E0
G1 E60 F1200 ; re-extrude to pull slack back in
G1 Z4 F4800
G1 E2 F1200 ; Prime with 2mm of filament
G92 E0
M569 S0 E ; set spreadcycle mode for extruder
G0 X40 F12000
G92 E0
M221 S100 ; set flow to 100%
M104 S{first_layer_temperature[0]}
M906 X900 Y900
Important Note: The provided gcode includes temperature and extrusion settings that work well with standard configurations. However, you may need to adjust these based on your setup:
Larger nozzle sizes may require more material for the purge line
Different materials may need adjusted cooling temperatures
The heating and cooling durations might need tweaking based on your specific filament
Join the Conversation
Have you experienced first layer issues with your MK4? We'd love to hear about your experiences or answer any questions about implementing this fix.
Looking for more MK4 solutions? Check out our previous post on fixing mid-air printing issues, and stay tuned for more proven fixes for common MK4 challenges.