diff --git a/config/CreatBot_D1000/base.cfg b/config/CreatBot_D1000/base.cfg
index b530e4895..cad5bc0eb 100644
--- a/config/CreatBot_D1000/base.cfg
+++ b/config/CreatBot_D1000/base.cfg
@@ -352,11 +352,11 @@ speed:100
 z_hop:5
 z_hop_speed: 10
 
-[gcode_macro ENABLE_FORCE_MOVE]
+[gcode_macro ENABLE_MOTOR]
 gcode:
     SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1
     SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1
-    SET_KINEMATIC_POSITION X=500 Y=500 Z=500
+    SET_KINEMATIC_POSITION X=500 Y=500 Z=0
 
 [gcode_macro T0]
 gcode:
@@ -418,7 +418,7 @@ gcode:
         M141 S{CHAMBER_TEMP}
     {% endif %}
     G28
-    #BED_MESH_CALIBRATE
+    _START_PRINT_BED_MESH
     {% if BED_TEMP != 0 %}
         M190 S{BED_TEMP}
     {% endif %}
@@ -453,7 +453,7 @@ variable_load_distance: 120
 variable_purge_distance: 25
 gcode:
     {% set speed = params.SPEED|default(200) %}
-    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 20 %}
+    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 10 %}
     SAVE_GCODE_STATE NAME=load_state
     G91
     G92 E0
@@ -462,15 +462,18 @@ gcode:
     RESTORE_GCODE_STATE NAME=load_state
 
 [gcode_macro UNLOAD_FILAMENT]
-variable_unload_distance: 140
-variable_purge_distance: 25
+variable_unload_distance: 50
+variable_advance_unload_distance: 80
+variable_purge_distance: 10
 gcode:
     {% set speed = params.SPEED|default(200) %}
-    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 20 %}
+    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 10 %}
     SAVE_GCODE_STATE NAME=unload_state
     G91
     G92 E0
     G1 E{purge_distance} F{speed} # purge
+    G1 E-{advance_unload_distance} F{max_velocity}
+    G1 E-{4} F60
     G1 E-{unload_distance} F{max_velocity} # fast-unload
     RESTORE_GCODE_STATE NAME=unload_state
 
@@ -788,7 +791,8 @@ gcode:
 initial_duration: 3.5
 gcode:
     {% set was_interrupted = printer.save_variables.variables.was_interrupted | string %}
-    {% if was_interrupted == "True"%}
+    {% set enable_recovery = printer.save_variables.variables.power_loss_recovery | default(Ture) | string %}
+    {% if enable_recovery != "False" and was_interrupted == "True" %}
         RESPOND TYPE=command MSG="action:prompt_begin "
         RESPOND TYPE=command MSG="action:prompt_text The last print job was not completed continue printing?"
         RESPOND TYPE=command MSG="action:prompt_footer_button Continue|_RESUME_INTERRUPTED"
@@ -834,3 +838,154 @@ gcode:
 gcode:
     RESPOND TYPE=command MSG="action:prompt_end"
     _CLEAR_LAST_FILE
+
+########################################
+# Adaptive mesh
+########################################
+
+[gcode_macro Adaptive_Mesh]
+description: This macro contains all adjustable settings for KAMP
+variable_verbose_enable: True               # Set to True to enable KAMP information output when running. This is useful for debugging.
+variable_mesh_margin: 5                     # Expands the mesh size in millimeters if desired. Leave at 0 to disable.
+variable_fuzz_amount: 0                     # Slightly randomizes mesh points to spread out wear from nozzle-based probes. Leave at 0 to disable.
+
+gcode: # Gcode section left intentionally blank. Do not disturb.
+#   Noting
+
+[gcode_macro _START_PRINT_BED_MESH]
+gcode:
+    {% set idex_mode = False %}
+    {% set profiles =  printer["bed_mesh"].profiles %}
+    {% set svv = printer.save_variables.variables %}
+    {% set adaptive_mesh = svv.adaptive_meshing|default(false)|lower %}
+    {% if printer["dual_carriage"] is defined %}
+        {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
+        {% if current_idex_mode == "copy"  or idex_mode == "mirror" %}
+            {% set idex_mode = True %}
+        {% endif %}
+    {% endif %}
+
+    {% if adaptive_mesh|lower == 'true' %}
+        {% if printer.exclude_object.objects != [] %}
+            {% if idex_mode %}
+                BED_MESH_CLEAR
+            {% else %}
+                BED_MESH_CALIBRATE PROFILE=adaptive
+            {% endif %}
+        {% else %}
+            {% if idex_mode %}
+                BED_MESH_CLEAR
+            {% else %}
+                {% if 'default' in profiles %}
+                    BED_MESH_PROFILE LOAD=default
+                {% else %}
+                    BED_MESH_CALIBRATE PROFILE=default
+                    BED_MESH_PROFILE SAVE=default
+                {% endif %}
+            {% endif %}
+        {% endif %}
+    {% endif %}
+
+[gcode_macro BED_MESH_CALIBRATE]
+rename_existing: _BED_MESH_CALIBRATE
+gcode:
+    {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %}                                # Gather all object points
+    {% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %}                                                          # Get bed mesh min from printer.cfg
+    {% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %}                                                          # Get bed mesh max from printer.cfg
+    {% set probe_count = printer.configfile.settings.bed_mesh.probe_count %}                                                        # Get probe count from printer.cfg
+    {% set kamp_settings = printer["gcode_macro Adaptive_Mesh"] %}                                                                  # Pull variables from _KAMP_Settings
+    {% set verbose_enable = kamp_settings.verbose_enable | abs %}                                                                   # Pull verbose setting from _KAMP_Settings
+    {% set mesh_margin = kamp_settings.mesh_margin | float %}                                                                       # Pull mesh margin setting from _KAMP_Settings
+    {% set fuzz_amount = kamp_settings.fuzz_amount | float %}                                                                       # Pull fuzz amount setting from _KAMP_Settings
+	{% set default_profile = params.PROFILE %}                                                                                      # get default mesh profile
+    {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2  %}                                             # If probe count is only a single number, convert it to 2. E.g. probe_count:7 = 7,7
+    {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1)  %}                            # Determine max probe point distance
+    {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1)  %}                            # Determine max probe point distance
+    {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %}                                                # Set x_min from smallest object x point
+    {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %}                                                # Set y_min from smallest object y point
+    {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %}                                                # Set x_max from largest object x point
+    {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %}                                                # Set y_max from largest object y point
+
+    {% set fuzz_range = range((0) | int, (fuzz_amount * 100) | int + 1) %}                                                          # Set fuzz_range between 0 and fuzz_amount
+    {% set adapted_x_min = x_min - mesh_margin - (fuzz_range | random / 100.0) %}                                                   # Adapt x_min to margin and fuzz constraints
+    {% set adapted_y_min = y_min - mesh_margin - (fuzz_range | random / 100.0) %}                                                   # Adapt y_min to margin and fuzz constraints
+    {% set adapted_x_max = x_max + mesh_margin + (fuzz_range | random / 100.0) %}                                                   # Adapt x_max to margin and fuzz constraints
+    {% set adapted_y_max = y_max + mesh_margin + (fuzz_range | random / 100.0) %}                                                   # Adapt y_max to margin and fuzz constraints
+
+    {% set adapted_x_min = [adapted_x_min , bed_mesh_min[0]] | max %}                                                               # Compare adjustments to defaults and choose max
+    {% set adapted_y_min = [adapted_y_min , bed_mesh_min[1]] | max %}                                                               # Compare adjustments to defaults and choose max
+    {% set adapted_x_max = [adapted_x_max , bed_mesh_max[0]] | min %}                                                               # Compare adjustments to defaults and choose min
+    {% set adapted_y_max = [adapted_y_max , bed_mesh_max[1]] | min %}                                                               # Compare adjustments to defaults and choose min
+
+    {% set points_x = (((adapted_x_max - adapted_x_min) / max_probe_point_distance_x) | round(method='ceil') | int) + 1 %}          # Define probe_count's x point count and round up
+    {% set points_y = (((adapted_y_max - adapted_y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %}          # Define probe_count's y point count and round up
+
+    {% if (([points_x, points_y]|max) > 6) %}                                                                                       #
+        {% set algorithm = "bicubic" %}                                                                                             #
+        {% set min_points = 4 %}                                                                                                    #
+    {% else %}                                                                                                                      # Calculate if algorithm should be bicubic or lagrange
+        {% set algorithm = "lagrange" %}                                                                                            #
+        {% set min_points = 3 %}                                                                                                    #
+    {% endif %}                                                                                                                     #
+
+    {% set points_x = [points_x , min_points]|max %}                                                                                # Set probe_count's x points to fit the calculated algorithm
+    {% set points_y = [points_y , min_points]|max %}                                                                                # Set probe_count's y points to fit the calculated algorithm
+    {% set points_x = [points_x , probe_count[0]]|min %}
+    {% set points_y = [points_y , probe_count[1]]|min %}
+
+    {% if verbose_enable == True %}                                                                                                 # If verbose is enabled, print information about KAMP's calculations
+        {% if printer.exclude_object.objects != [] %}
+
+            { action_respond_info( "Algorithm: {}.".format(
+                (algorithm),
+            )) }
+
+            { action_respond_info("Default probe count: {},{}.".format(
+                (probe_count[0]),
+                (probe_count[1]),
+            )) }
+
+            { action_respond_info("Adapted probe count: {},{}.".format(
+                (points_x),
+                (points_y),
+            )) }
+
+            {action_respond_info("Default mesh bounds: {}, {}.".format(
+                (bed_mesh_min[0],bed_mesh_min[1]),
+                (bed_mesh_max[0],bed_mesh_max[1]),
+            )) }
+
+            {% if mesh_margin > 0 %}
+                {action_respond_info("Mesh margin is {}, mesh bounds extended by {}mm.".format(
+                    (mesh_margin),
+                    (mesh_margin),
+                )) }
+            {% else %}
+                {action_respond_info("Mesh margin is 0, margin not increased.")}
+            {% endif %}
+
+            {% if fuzz_amount > 0 %}
+                {action_respond_info("Mesh point fuzzing enabled, points fuzzed up to {}mm.".format(
+                    (fuzz_amount),
+                )) }
+            {% else %}
+                {action_respond_info("Fuzz amount is 0, mesh points not fuzzed.")}
+            {% endif %}
+
+            { action_respond_info("Adapted mesh bounds: {}, {}.".format(
+                (adapted_x_min, adapted_y_min),
+                (adapted_x_max, adapted_y_max),
+            )) }
+
+            {action_respond_info("KAMP adjustments successful. Happy KAMPing!")}
+
+        {% else %}
+
+            {action_respond_info("No objects detected! Check your gcode and make sure that EXCLUDE_OBJECT_DEFINE is happening before BED_MESH_CALIBRATE is called. Defaulting to regular meshing.")}
+            G4 P5000             # Wait 5 seconds to make error more visible
+        {% endif %}
+
+    {% endif %}
+
+    _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y}          # End of verbose
+    BED_MESH_PROFILE LOAD={default_profile}
diff --git a/config/CreatBot_D600Pro2/base.cfg b/config/CreatBot_D600Pro2/base.cfg
index ea144caf2..1f852c76e 100644
--- a/config/CreatBot_D600Pro2/base.cfg
+++ b/config/CreatBot_D600Pro2/base.cfg
@@ -352,11 +352,11 @@ speed:100
 z_hop:5
 z_hop_speed: 10
 
-[gcode_macro ENABLE_FORCE_MOVE]
+[gcode_macro ENABLE_MOTOR]
 gcode:
     SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1
     SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1
-    SET_KINEMATIC_POSITION X=300 Y=300 Z=300
+    SET_KINEMATIC_POSITION X=300 Y=300 Z=0
 
 [gcode_macro T0]
 gcode:
@@ -418,7 +418,7 @@ gcode:
         M141 S{CHAMBER_TEMP}
     {% endif %}
     G28
-    #BED_MESH_CALIBRATE
+    _START_PRINT_BED_MESH
     {% if BED_TEMP != 0 %}
         M190 S{BED_TEMP}
     {% endif %}
@@ -453,7 +453,7 @@ variable_load_distance: 120
 variable_purge_distance: 25
 gcode:
     {% set speed = params.SPEED|default(200) %}
-    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 20 %}
+    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 10 %}
     SAVE_GCODE_STATE NAME=load_state
     G91
     G92 E0
@@ -462,15 +462,18 @@ gcode:
     RESTORE_GCODE_STATE NAME=load_state
 
 [gcode_macro UNLOAD_FILAMENT]
-variable_unload_distance: 140
-variable_purge_distance: 25
+variable_unload_distance: 50
+variable_advance_unload_distance: 80
+variable_purge_distance: 10
 gcode:
     {% set speed = params.SPEED|default(200) %}
-    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 20 %}
+    {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity  * 10 %}
     SAVE_GCODE_STATE NAME=unload_state
     G91
     G92 E0
     G1 E{purge_distance} F{speed} # purge
+    G1 E-{advance_unload_distance} F{max_velocity}
+    G1 E-{4} F60
     G1 E-{unload_distance} F{max_velocity} # fast-unload
     RESTORE_GCODE_STATE NAME=unload_state
 
@@ -781,7 +784,8 @@ gcode:
 initial_duration: 3.5
 gcode:
     {% set was_interrupted = printer.save_variables.variables.was_interrupted | string %}
-    {% if was_interrupted == "True"%}
+    {% set enable_recovery = printer.save_variables.variables.power_loss_recovery | default(Ture) | string %}
+    {% if enable_recovery != "False" and was_interrupted == "True" %}
         RESPOND TYPE=command MSG="action:prompt_begin "
         RESPOND TYPE=command MSG="action:prompt_text The last print job was not completed continue printing?"
         RESPOND TYPE=command MSG="action:prompt_footer_button Continue|_RESUME_INTERRUPTED"
@@ -827,3 +831,154 @@ gcode:
 gcode:
     RESPOND TYPE=command MSG="action:prompt_end"
     _CLEAR_LAST_FILE
+
+########################################
+# Adaptive mesh
+########################################
+
+[gcode_macro Adaptive_Mesh]
+description: This macro contains all adjustable settings for KAMP
+variable_verbose_enable: True               # Set to True to enable KAMP information output when running. This is useful for debugging.
+variable_mesh_margin: 5                     # Expands the mesh size in millimeters if desired. Leave at 0 to disable.
+variable_fuzz_amount: 0                     # Slightly randomizes mesh points to spread out wear from nozzle-based probes. Leave at 0 to disable.
+
+gcode: # Gcode section left intentionally blank. Do not disturb.
+#   Noting
+
+[gcode_macro _START_PRINT_BED_MESH]
+gcode:
+    {% set idex_mode = False %}
+    {% set profiles =  printer["bed_mesh"].profiles %}
+    {% set svv = printer.save_variables.variables %}
+    {% set adaptive_mesh = svv.adaptive_meshing|default(false)|lower %}
+    {% if printer["dual_carriage"] is defined %}
+        {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
+        {% if current_idex_mode == "copy"  or idex_mode == "mirror" %}
+            {% set idex_mode = True %}
+        {% endif %}
+    {% endif %}
+
+    {% if adaptive_mesh|lower == 'true' %}
+        {% if printer.exclude_object.objects != [] %}
+            {% if idex_mode %}
+                BED_MESH_CLEAR
+            {% else %}
+                BED_MESH_CALIBRATE PROFILE=adaptive
+            {% endif %}
+        {% else %}
+            {% if idex_mode %}
+                BED_MESH_CLEAR
+            {% else %}
+                {% if 'default' in profiles %}
+                    BED_MESH_PROFILE LOAD=default
+                {% else %}
+                    BED_MESH_CALIBRATE PROFILE=default
+                    BED_MESH_PROFILE SAVE=default
+                {% endif %}
+            {% endif %}
+        {% endif %}
+    {% endif %}
+
+[gcode_macro BED_MESH_CALIBRATE]
+rename_existing: _BED_MESH_CALIBRATE
+gcode:
+    {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %}                                # Gather all object points
+    {% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %}                                                          # Get bed mesh min from printer.cfg
+    {% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %}                                                          # Get bed mesh max from printer.cfg
+    {% set probe_count = printer.configfile.settings.bed_mesh.probe_count %}                                                        # Get probe count from printer.cfg
+    {% set kamp_settings = printer["gcode_macro Adaptive_Mesh"] %}                                                                  # Pull variables from _KAMP_Settings
+    {% set verbose_enable = kamp_settings.verbose_enable | abs %}                                                                   # Pull verbose setting from _KAMP_Settings
+    {% set mesh_margin = kamp_settings.mesh_margin | float %}                                                                       # Pull mesh margin setting from _KAMP_Settings
+    {% set fuzz_amount = kamp_settings.fuzz_amount | float %}                                                                       # Pull fuzz amount setting from _KAMP_Settings
+	{% set default_profile = params.PROFILE %}                                                                                      # get default mesh profile
+    {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2  %}                                             # If probe count is only a single number, convert it to 2. E.g. probe_count:7 = 7,7
+    {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1)  %}                            # Determine max probe point distance
+    {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1)  %}                            # Determine max probe point distance
+    {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %}                                                # Set x_min from smallest object x point
+    {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %}                                                # Set y_min from smallest object y point
+    {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %}                                                # Set x_max from largest object x point
+    {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %}                                                # Set y_max from largest object y point
+
+    {% set fuzz_range = range((0) | int, (fuzz_amount * 100) | int + 1) %}                                                          # Set fuzz_range between 0 and fuzz_amount
+    {% set adapted_x_min = x_min - mesh_margin - (fuzz_range | random / 100.0) %}                                                   # Adapt x_min to margin and fuzz constraints
+    {% set adapted_y_min = y_min - mesh_margin - (fuzz_range | random / 100.0) %}                                                   # Adapt y_min to margin and fuzz constraints
+    {% set adapted_x_max = x_max + mesh_margin + (fuzz_range | random / 100.0) %}                                                   # Adapt x_max to margin and fuzz constraints
+    {% set adapted_y_max = y_max + mesh_margin + (fuzz_range | random / 100.0) %}                                                   # Adapt y_max to margin and fuzz constraints
+
+    {% set adapted_x_min = [adapted_x_min , bed_mesh_min[0]] | max %}                                                               # Compare adjustments to defaults and choose max
+    {% set adapted_y_min = [adapted_y_min , bed_mesh_min[1]] | max %}                                                               # Compare adjustments to defaults and choose max
+    {% set adapted_x_max = [adapted_x_max , bed_mesh_max[0]] | min %}                                                               # Compare adjustments to defaults and choose min
+    {% set adapted_y_max = [adapted_y_max , bed_mesh_max[1]] | min %}                                                               # Compare adjustments to defaults and choose min
+
+    {% set points_x = (((adapted_x_max - adapted_x_min) / max_probe_point_distance_x) | round(method='ceil') | int) + 1 %}          # Define probe_count's x point count and round up
+    {% set points_y = (((adapted_y_max - adapted_y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %}          # Define probe_count's y point count and round up
+
+    {% if (([points_x, points_y]|max) > 6) %}                                                                                       #
+        {% set algorithm = "bicubic" %}                                                                                             #
+        {% set min_points = 4 %}                                                                                                    #
+    {% else %}                                                                                                                      # Calculate if algorithm should be bicubic or lagrange
+        {% set algorithm = "lagrange" %}                                                                                            #
+        {% set min_points = 3 %}                                                                                                    #
+    {% endif %}                                                                                                                     #
+
+    {% set points_x = [points_x , min_points]|max %}                                                                                # Set probe_count's x points to fit the calculated algorithm
+    {% set points_y = [points_y , min_points]|max %}                                                                                # Set probe_count's y points to fit the calculated algorithm
+    {% set points_x = [points_x , probe_count[0]]|min %}
+    {% set points_y = [points_y , probe_count[1]]|min %}
+
+    {% if verbose_enable == True %}                                                                                                 # If verbose is enabled, print information about KAMP's calculations
+        {% if printer.exclude_object.objects != [] %}
+
+            { action_respond_info( "Algorithm: {}.".format(
+                (algorithm),
+            )) }
+
+            { action_respond_info("Default probe count: {},{}.".format(
+                (probe_count[0]),
+                (probe_count[1]),
+            )) }
+
+            { action_respond_info("Adapted probe count: {},{}.".format(
+                (points_x),
+                (points_y),
+            )) }
+
+            {action_respond_info("Default mesh bounds: {}, {}.".format(
+                (bed_mesh_min[0],bed_mesh_min[1]),
+                (bed_mesh_max[0],bed_mesh_max[1]),
+            )) }
+
+            {% if mesh_margin > 0 %}
+                {action_respond_info("Mesh margin is {}, mesh bounds extended by {}mm.".format(
+                    (mesh_margin),
+                    (mesh_margin),
+                )) }
+            {% else %}
+                {action_respond_info("Mesh margin is 0, margin not increased.")}
+            {% endif %}
+
+            {% if fuzz_amount > 0 %}
+                {action_respond_info("Mesh point fuzzing enabled, points fuzzed up to {}mm.".format(
+                    (fuzz_amount),
+                )) }
+            {% else %}
+                {action_respond_info("Fuzz amount is 0, mesh points not fuzzed.")}
+            {% endif %}
+
+            { action_respond_info("Adapted mesh bounds: {}, {}.".format(
+                (adapted_x_min, adapted_y_min),
+                (adapted_x_max, adapted_y_max),
+            )) }
+
+            {action_respond_info("KAMP adjustments successful. Happy KAMPing!")}
+
+        {% else %}
+
+            {action_respond_info("No objects detected! Check your gcode and make sure that EXCLUDE_OBJECT_DEFINE is happening before BED_MESH_CALIBRATE is called. Defaulting to regular meshing.")}
+            G4 P5000             # Wait 5 seconds to make error more visible
+        {% endif %}
+
+    {% endif %}
+
+    _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y}          # End of verbose
+    BED_MESH_PROFILE LOAD={default_profile}
diff --git a/config/CreatBot_F430NX/base.cfg b/config/CreatBot_F430NX/base.cfg
index 2929ccc90..5e0e4ef44 100644
--- a/config/CreatBot_F430NX/base.cfg
+++ b/config/CreatBot_F430NX/base.cfg
@@ -179,7 +179,7 @@ max_power: 1.0
 sensor_type: Generic 3950
 sensor_pin: PC3
 min_temp: 0
-max_temp: 70
+max_temp: 80
 # control: pid
 # pid_kp: 30.68
 # pid_ki: 0.21
@@ -414,9 +414,11 @@ home_xy_position:200,150
 speed:150
 z_hop:5
 
-[gcode_macro ENABLE_FORCE_MOVE]
+[gcode_macro ENABLE_MOTOR]
 gcode:
-    SET_KINEMATIC_POSITION X=200 Y=150 Z=150
+    SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1
+    SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1
+    SET_KINEMATIC_POSITION X=200 Y=150 Z=0
 
 [gcode_macro _RESTORE_DEFAULT_EXTRUDER]
 gcode:
@@ -542,7 +544,7 @@ gcode:
         M141 S{CHAMBER_TEMP}
     {% endif %}
     G28
-    # BED_MESH_CALIBRATE
+    _START_PRINT_BED_MESH
     {% if BED_TEMP != 0 %}
         M190 S{BED_TEMP}
     {% endif %}
@@ -620,10 +622,6 @@ gcode:
     {% set dual_z_offset=params.S|default(0)|float %}
     SAVE_VARIABLE VARIABLE=dual_z_offset VALUE={dual_z_offset}
 
-[gcode_macro ENABLE_FORCE_MOVE]
-gcode:
-    SET_KINEMATIC_POSITION X=200 Y=150 Z=150
-
 [gcode_macro LOAD_FILAMENT]
 variable_load_distance:  90
 variable_purge_distance:  20
@@ -777,7 +775,7 @@ gcode:
   {% if printer["dual_carriage"] is defined %}
     {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
     {% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
-      SAVE_DUAL_CARRIAGE_STATE 
+      SAVE_DUAL_CARRIAGE_STATE
       SYNC_EXTRUDER_MOTION EXTRUDER=extruder1 MOTION_QUEUE=extruder1
       SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_dual VALUE=True
     {% endif %}
@@ -839,7 +837,7 @@ gcode:
         SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_dual VALUE=False
       {% endif %}
     {% endif %}
-    
+
     _FILAMENT_UPDATE
     #### Printer comming from timeout idle state ####
     {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %}
@@ -949,7 +947,8 @@ gcode:
 initial_duration: 3.5
 gcode:
     {% set was_interrupted = printer.save_variables.variables.was_interrupted | string %}
-    {% if was_interrupted == "True"%}
+    {% set enable_recovery = printer.save_variables.variables.power_loss_recovery | default(Ture) | string %}
+    {% if enable_recovery != "False" and was_interrupted == "True" %}
         RESPOND TYPE=command MSG="action:prompt_begin "
         RESPOND TYPE=command MSG="action:prompt_text The last print job was not completed continue printing?"
         RESPOND TYPE=command MSG="action:prompt_footer_button Continue|_RESUME_INTERRUPTED"
@@ -995,3 +994,154 @@ gcode:
 gcode:
     RESPOND TYPE=command MSG="action:prompt_end"
     _CLEAR_LAST_FILE
+
+########################################
+# Adaptive mesh
+########################################
+
+[gcode_macro Adaptive_Mesh]
+description: This macro contains all adjustable settings for KAMP
+variable_verbose_enable: True               # Set to True to enable KAMP information output when running. This is useful for debugging.
+variable_mesh_margin: 5                     # Expands the mesh size in millimeters if desired. Leave at 0 to disable.
+variable_fuzz_amount: 0                     # Slightly randomizes mesh points to spread out wear from nozzle-based probes. Leave at 0 to disable.
+
+gcode: # Gcode section left intentionally blank. Do not disturb.
+#   Noting
+
+[gcode_macro _START_PRINT_BED_MESH]
+gcode:
+    {% set idex_mode = False %}
+    {% set profiles =  printer["bed_mesh"].profiles %}
+    {% set svv = printer.save_variables.variables %}
+    {% set adaptive_mesh = svv.adaptive_meshing|default(false)|lower %}
+    {% if printer["dual_carriage"] is defined %}
+        {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
+        {% if current_idex_mode == "copy"  or idex_mode == "mirror" %}
+            {% set idex_mode = True %}
+        {% endif %}
+    {% endif %}
+
+    {% if adaptive_mesh|lower == 'true' %}
+        {% if printer.exclude_object.objects != [] %}
+            {% if idex_mode %}
+                BED_MESH_CLEAR
+            {% else %}
+                BED_MESH_CALIBRATE PROFILE=adaptive
+            {% endif %}
+        {% else %}
+            {% if idex_mode %}
+                BED_MESH_CLEAR
+            {% else %}
+                {% if 'default' in profiles %}
+                    BED_MESH_PROFILE LOAD=default
+                {% else %}
+                    BED_MESH_CALIBRATE PROFILE=default
+                    BED_MESH_PROFILE SAVE=default
+                {% endif %}
+            {% endif %}
+        {% endif %}
+    {% endif %}
+
+[gcode_macro BED_MESH_CALIBRATE]
+rename_existing: _BED_MESH_CALIBRATE
+gcode:
+    {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %}                                # Gather all object points
+    {% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %}                                                          # Get bed mesh min from printer.cfg
+    {% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %}                                                          # Get bed mesh max from printer.cfg
+    {% set probe_count = printer.configfile.settings.bed_mesh.probe_count %}                                                        # Get probe count from printer.cfg
+    {% set kamp_settings = printer["gcode_macro Adaptive_Mesh"] %}                                                                  # Pull variables from _KAMP_Settings
+    {% set verbose_enable = kamp_settings.verbose_enable | abs %}                                                                   # Pull verbose setting from _KAMP_Settings
+    {% set mesh_margin = kamp_settings.mesh_margin | float %}                                                                       # Pull mesh margin setting from _KAMP_Settings
+    {% set fuzz_amount = kamp_settings.fuzz_amount | float %}                                                                       # Pull fuzz amount setting from _KAMP_Settings
+	{% set default_profile = params.PROFILE %}                                                                                      # get default mesh profile
+    {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2  %}                                             # If probe count is only a single number, convert it to 2. E.g. probe_count:7 = 7,7
+    {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1)  %}                            # Determine max probe point distance
+    {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1)  %}                            # Determine max probe point distance
+    {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %}                                                # Set x_min from smallest object x point
+    {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %}                                                # Set y_min from smallest object y point
+    {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %}                                                # Set x_max from largest object x point
+    {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %}                                                # Set y_max from largest object y point
+
+    {% set fuzz_range = range((0) | int, (fuzz_amount * 100) | int + 1) %}                                                          # Set fuzz_range between 0 and fuzz_amount
+    {% set adapted_x_min = x_min - mesh_margin - (fuzz_range | random / 100.0) %}                                                   # Adapt x_min to margin and fuzz constraints
+    {% set adapted_y_min = y_min - mesh_margin - (fuzz_range | random / 100.0) %}                                                   # Adapt y_min to margin and fuzz constraints
+    {% set adapted_x_max = x_max + mesh_margin + (fuzz_range | random / 100.0) %}                                                   # Adapt x_max to margin and fuzz constraints
+    {% set adapted_y_max = y_max + mesh_margin + (fuzz_range | random / 100.0) %}                                                   # Adapt y_max to margin and fuzz constraints
+
+    {% set adapted_x_min = [adapted_x_min , bed_mesh_min[0]] | max %}                                                               # Compare adjustments to defaults and choose max
+    {% set adapted_y_min = [adapted_y_min , bed_mesh_min[1]] | max %}                                                               # Compare adjustments to defaults and choose max
+    {% set adapted_x_max = [adapted_x_max , bed_mesh_max[0]] | min %}                                                               # Compare adjustments to defaults and choose min
+    {% set adapted_y_max = [adapted_y_max , bed_mesh_max[1]] | min %}                                                               # Compare adjustments to defaults and choose min
+
+    {% set points_x = (((adapted_x_max - adapted_x_min) / max_probe_point_distance_x) | round(method='ceil') | int) + 1 %}          # Define probe_count's x point count and round up
+    {% set points_y = (((adapted_y_max - adapted_y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %}          # Define probe_count's y point count and round up
+
+    {% if (([points_x, points_y]|max) > 6) %}                                                                                       #
+        {% set algorithm = "bicubic" %}                                                                                             #
+        {% set min_points = 4 %}                                                                                                    #
+    {% else %}                                                                                                                      # Calculate if algorithm should be bicubic or lagrange
+        {% set algorithm = "lagrange" %}                                                                                            #
+        {% set min_points = 3 %}                                                                                                    #
+    {% endif %}                                                                                                                     #
+
+    {% set points_x = [points_x , min_points]|max %}                                                                                # Set probe_count's x points to fit the calculated algorithm
+    {% set points_y = [points_y , min_points]|max %}                                                                                # Set probe_count's y points to fit the calculated algorithm
+    {% set points_x = [points_x , probe_count[0]]|min %}
+    {% set points_y = [points_y , probe_count[1]]|min %}
+
+    {% if verbose_enable == True %}                                                                                                 # If verbose is enabled, print information about KAMP's calculations
+        {% if printer.exclude_object.objects != [] %}
+
+            { action_respond_info( "Algorithm: {}.".format(
+                (algorithm),
+            )) }
+
+            { action_respond_info("Default probe count: {},{}.".format(
+                (probe_count[0]),
+                (probe_count[1]),
+            )) }
+
+            { action_respond_info("Adapted probe count: {},{}.".format(
+                (points_x),
+                (points_y),
+            )) }
+
+            {action_respond_info("Default mesh bounds: {}, {}.".format(
+                (bed_mesh_min[0],bed_mesh_min[1]),
+                (bed_mesh_max[0],bed_mesh_max[1]),
+            )) }
+
+            {% if mesh_margin > 0 %}
+                {action_respond_info("Mesh margin is {}, mesh bounds extended by {}mm.".format(
+                    (mesh_margin),
+                    (mesh_margin),
+                )) }
+            {% else %}
+                {action_respond_info("Mesh margin is 0, margin not increased.")}
+            {% endif %}
+
+            {% if fuzz_amount > 0 %}
+                {action_respond_info("Mesh point fuzzing enabled, points fuzzed up to {}mm.".format(
+                    (fuzz_amount),
+                )) }
+            {% else %}
+                {action_respond_info("Fuzz amount is 0, mesh points not fuzzed.")}
+            {% endif %}
+
+            { action_respond_info("Adapted mesh bounds: {}, {}.".format(
+                (adapted_x_min, adapted_y_min),
+                (adapted_x_max, adapted_y_max),
+            )) }
+
+            {action_respond_info("KAMP adjustments successful. Happy KAMPing!")}
+
+        {% else %}
+
+            {action_respond_info("No objects detected! Check your gcode and make sure that EXCLUDE_OBJECT_DEFINE is happening before BED_MESH_CALIBRATE is called. Defaulting to regular meshing.")}
+            G4 P5000             # Wait 5 seconds to make error more visible
+        {% endif %}
+
+    {% endif %}
+
+    _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y}          # End of verbose
+    BED_MESH_PROFILE LOAD={default_profile}
diff --git a/scripts/clear_plr.sh b/scripts/clear_plr.sh
old mode 100644
new mode 100755
diff --git a/scripts/plr.sh b/scripts/plr.sh
old mode 100644
new mode 100755