diff --git a/src/components/inputs/MoveToInput.vue b/src/components/inputs/MoveToInput.vue
new file mode 100644
index 000000000..e2d581fe1
--- /dev/null
+++ b/src/components/inputs/MoveToInput.vue
@@ -0,0 +1,103 @@
+<template>
+    <v-text-field
+        v-model="position"
+        :label="`[ ${label} ]`"
+        :suffix="suffix"
+        :disabled="disabled"
+        :readonly="readonly"
+        :error="!validate"
+        hide-details="auto"
+        type="number"
+        hide-spin-buttons
+        outlined
+        reverse
+        dense
+        @blur="onBlur"
+        @focus="!readonly ? $event.target.select() : {}">
+        <template v-if="errorMsg.length" #append>
+            <v-tooltip top>
+                <template #activator="{ on, attrs }">
+                    <v-icon color="error" v-bind="attrs" v-on="on">{{ mdiAlert }}</v-icon>
+                </template>
+                <span>{{ errorMsg.join(', ') }}</span>
+            </v-tooltip>
+        </template>
+    </v-text-field>
+</template>
+
+<script lang="ts">
+import { Component, Mixins, Prop, VModel } from 'vue-property-decorator'
+import BaseMixin from '@/components/mixins/base'
+import { mdiAlert } from '@mdi/js'
+
+@Component({
+    components: {},
+})
+export default class MoveToInput extends Mixins(BaseMixin) {
+    mdiAlert = mdiAlert
+
+    @VModel({ type: String })
+    declare position: string
+
+    @Prop({ type: String, required: true })
+    declare readonly currentPos: string
+
+    @Prop({ type: String, required: false })
+    declare readonly label: string
+
+    @Prop({ type: String, required: false })
+    declare readonly suffix: string
+
+    @Prop({ type: Number, required: true })
+    declare readonly positionMax: number
+
+    @Prop({ type: Number, required: true })
+    declare readonly positionMin: number
+
+    @Prop({ type: Boolean, required: false })
+    declare readonly disabled: boolean
+
+    @Prop({ type: Boolean, required: false })
+    declare readonly readonly: boolean
+
+    onBlur() {
+        if (!this.validate && this.position !== this.currentPos) {
+            this.position = this.currentPos
+            this.$emit('validate', { axis: this.suffix.toLowerCase(), valid: true })
+        }
+    }
+
+    get validate(): boolean {
+        const isValid =
+            this.position !== '' &&
+            parseFloat(this.position) <= this.positionMax &&
+            parseFloat(this.position) >= this.positionMin
+        this.$emit('validate', { axis: this.suffix.toLowerCase(), valid: isValid })
+        return isValid
+    }
+
+    get errorMsg() {
+        const errors = []
+        if (this.position === '') errors.push(this.$t('Panels.ToolheadControlPanel.Invalid'))
+        if (parseFloat(this.position) > this.positionMax || parseFloat(this.position) < this.positionMin)
+            errors.push(this.$t('Panels.ToolheadControlPanel.OutOfRange'))
+
+        return errors
+    }
+}
+</script>
+
+<style>
+label {
+    font-size: 14px !important;
+    color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.v-input.error--text .v-input__slot {
+    padding-left: 3px !important;
+}
+
+.v-input.error--text .v-input__append-inner {
+    margin-right: 5px !important;
+}
+</style>
diff --git a/src/components/inputs/NumberInput.vue b/src/components/inputs/NumberInput.vue
index c89ab6fec..2d7a747bd 100644
--- a/src/components/inputs/NumberInput.vue
+++ b/src/components/inputs/NumberInput.vue
@@ -105,7 +105,7 @@ export default class NumberInput extends Mixins(BaseMixin) {
     @Prop({ type: Number, required: false, default: 1 })
     declare readonly step: number
 
-    @Prop({ type: String, required: true })
+    @Prop({ type: String, required: false })
     declare readonly unit: string
 
     // spinner related props
diff --git a/src/components/mixins/control.ts b/src/components/mixins/control.ts
index 0bc9d0a0b..30dd0f7f1 100644
--- a/src/components/mixins/control.ts
+++ b/src/components/mixins/control.ts
@@ -11,6 +11,10 @@ export default class ControlMixin extends Vue {
         return this.$store.state.printer?.toolhead?.homed_axes ?? ''
     }
 
+    get enableXYHoming(): boolean {
+        return this.$store.state.gui.control.enableXYHoming
+    }
+
     get feedrateXY() {
         return this.$store.state.gui.control?.feedrateXY ?? 100
     }
@@ -20,19 +24,27 @@ export default class ControlMixin extends Vue {
     }
 
     get existsQGL() {
-        if (!this.$store.state.printer.configfile?.settings) {
-            return false
-        }
-
-        return 'quad_gantry_level' in this.$store.state.printer.configfile.settings ?? false
+        return this.$store.getters['printer/existsQGL']
     }
 
     get existsZtilt() {
-        if (!this.$store.state.printer.configfile?.settings) {
-            return false
-        }
+        return this.$store.getters['printer/existsZtilt']
+    }
+
+    get existsBedTilt() {
+        return this.$store.getters['printer/existsBedTilt']
+    }
+
+    get existsBedScrews() {
+        return this.$store.getters['printer/existsBedScrews']
+    }
+
+    get existsDeltaCalibrate() {
+        return this.$store.getters['printer/existsDeltaCalibrate']
+    }
 
-        return 'z_tilt' in this.$store.state.printer.configfile.settings ?? false
+    get existsScrewsTilt() {
+        return this.$store.getters['printer/existsScrewsTilt']
     }
 
     get colorQuadGantryLevel() {
@@ -47,6 +59,10 @@ export default class ControlMixin extends Vue {
         return status ? 'primary' : 'warning'
     }
 
+    get defaultActionButton() {
+        return this.$store.getters['gui/getDefaultControlActionButton']
+    }
+
     doHome() {
         this.$store.dispatch('server/addEvent', { message: 'G28', type: 'command' })
         this.$socket.emit('printer.gcode.script', { script: 'G28' }, { loading: 'homeAll' })
@@ -62,6 +78,11 @@ export default class ControlMixin extends Vue {
         this.$socket.emit('printer.gcode.script', { script: 'G28 Y' }, { loading: 'homeY' })
     }
 
+    doHomeXY() {
+        this.$store.dispatch('server/addEvent', { message: 'G28 X Y', type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: 'G28 X Y' }, { loading: 'homeXY' })
+    }
+
     doHomeZ() {
         this.$store.dispatch('server/addEvent', { message: 'G28 Z', type: 'command' })
         this.$socket.emit('printer.gcode.script', { script: 'G28 Z' }, { loading: 'homeZ' })
diff --git a/src/components/panels/ControlPanel.vue b/src/components/panels/ControlPanel.vue
index 4a7be2e9b..e69de29bb 100644
--- a/src/components/panels/ControlPanel.vue
+++ b/src/components/panels/ControlPanel.vue
@@ -1,39 +0,0 @@
-<template>
-    <panel
-        v-if="klipperReadyForGui && ['standby', 'paused', 'complete', 'cancelled', 'error'].includes(printer_state)"
-        :icon="mdiGamepad"
-        :title="$t('Panels.ControlPanel.Headline').toString()"
-        :collapsible="true"
-        card-class="control-panel">
-        <v-container>
-            <control-panel-cross-control v-if="controlStyle === 'cross'"></control-panel-cross-control>
-            <control-panel-circle-control v-else-if="controlStyle === 'circle'"></control-panel-circle-control>
-            <control-panel-bars-control v-else></control-panel-bars-control>
-        </v-container>
-    </panel>
-</template>
-
-<script lang="ts">
-import { Component, Mixins } from 'vue-property-decorator'
-import BaseMixin from '../mixins/base'
-import ControlPanelCrossControl from '@/components/panels/ControlPanelCrossControl.vue'
-import ControlPanelBarsControl from '@/components/panels/ControlPanelBarsControl.vue'
-import ControlPanelCircleControl from '@/components/panels/ControlPanelCircleControl.vue'
-import Panel from '@/components/ui/Panel.vue'
-import { mdiGamepad } from '@mdi/js'
-@Component({
-    components: {
-        Panel,
-        ControlPanelCircleControl,
-        ControlPanelBarsControl,
-        ControlPanelCrossControl,
-    },
-})
-export default class ControlPanel extends Mixins(BaseMixin) {
-    mdiGamepad = mdiGamepad
-
-    get controlStyle() {
-        return this.$store.state.gui.control.style ?? 'bars'
-    }
-}
-</script>
diff --git a/src/components/panels/ControlPanelCrossControl.vue b/src/components/panels/ControlPanelCrossControl.vue
deleted file mode 100644
index 9c720df6a..000000000
--- a/src/components/panels/ControlPanelCrossControl.vue
+++ /dev/null
@@ -1,262 +0,0 @@
-<style lang="scss" scoped>
-.btnMinWidthAuto {
-    min-width: auto !important;
-}
-
-.steps {
-    width: 100%;
-    > div {
-        width: 100%;
-        display: flex;
-        > button {
-            flex-grow: 1;
-        }
-    }
-}
-</style>
-
-<template>
-    <div>
-        <v-row>
-            <v-col :cols="homeCols">
-                <v-row dense class="mb-1">
-                    <v-col cols="3"></v-col>
-                    <v-col cols="3">
-                        <v-btn
-                            class="btnMinWidthAuto fill-width"
-                            :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
-                            @click="
-                                doSendMove('Y' + (reverseY ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY)
-                            ">
-                            <v-icon>{{ mdiChevronUp }}</v-icon>
-                        </v-btn>
-                    </v-col>
-                    <v-col cols="3"></v-col>
-                    <v-col cols="3">
-                        <v-btn
-                            class="btnMinWidthAuto fill-width"
-                            :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
-                            @click="
-                                doSendMove('Z' + (reverseZ ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateZ)
-                            ">
-                            <v-icon>{{ mdiChevronUp }}</v-icon>
-                        </v-btn>
-                    </v-col>
-                </v-row>
-                <v-row dense>
-                    <v-col cols="3" class="p-rel">
-                        <v-btn
-                            class="btnMinWidthAuto fill-width p-abs"
-                            style="top: -50%; width: calc(100% - 8px)"
-                            :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
-                            @click="
-                                doSendMove('X' + (!reverseX ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY)
-                            ">
-                            <v-icon>{{ mdiChevronLeft }}</v-icon>
-                        </v-btn>
-                    </v-col>
-                    <v-col cols="3">
-                        <v-btn
-                            class="btnMinWidthAuto fill-width"
-                            :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
-                            @click="
-                                doSendMove('Y' + (!reverseY ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY)
-                            ">
-                            <v-icon>{{ mdiChevronDown }}</v-icon>
-                        </v-btn>
-                    </v-col>
-                    <v-col cols="3" class="p-rel">
-                        <v-btn
-                            class="btnMinWidthAuto fill-width p-abs"
-                            style="top: -50%; width: calc(100% - 8px)"
-                            :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
-                            @click="
-                                doSendMove('X' + (reverseX ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY)
-                            ">
-                            <v-icon>{{ mdiChevronRight }}</v-icon>
-                        </v-btn>
-                    </v-col>
-                    <v-col cols="3">
-                        <v-btn
-                            class="btnMinWidthAuto fill-width"
-                            :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
-                            @click="
-                                doSendMove('Z' + (!reverseZ ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateZ)
-                            ">
-                            <v-icon>{{ mdiChevronDown }}</v-icon>
-                        </v-btn>
-                    </v-col>
-                </v-row>
-            </v-col>
-            <v-col :cols="homeCols" class="d-flex align-center">
-                <div class="flex-grow-1" style="border-radius: 4px; overflow: hidden">
-                    <v-row dense class="" style="margin-bottom: -2px !important">
-                        <v-col :cols="existsQGL || existsZtilt ? 6 : 12">
-                            <v-btn
-                                class="w-100"
-                                tile
-                                height="30"
-                                :loading="loadings.includes('homeAll')"
-                                :color="homedAxes.includes('xyz') ? 'primary' : 'warning'"
-                                @click="doHome">
-                                <div class="d-flex align-center">
-                                    <v-icon>{{ mdiHome }}</v-icon>
-                                    <span class="ml-1">{{ $t('Panels.ControlPanel.ALL') }}</span>
-                                </div>
-                            </v-btn>
-                        </v-col>
-                        <v-col v-if="existsQGL || existsZtilt" cols="6" class="d-flex">
-                            <v-btn
-                                v-if="existsQGL"
-                                class="btnMinWidthAuto flex-grow-1 px-0"
-                                tile
-                                dense
-                                :color="colorQuadGantryLevel"
-                                height="30"
-                                :loading="loadings.includes('qgl')"
-                                @click="doQGL">
-                                {{ $t('Panels.ControlPanel.QGL') }}
-                            </v-btn>
-                            <v-btn
-                                v-if="existsZtilt"
-                                class="btnMinWidthAuto flex-grow-1 px-0"
-                                tile
-                                dense
-                                :color="colorZTilt"
-                                height="30"
-                                :loading="loadings.includes('zTilt')"
-                                @click="doZtilt">
-                                {{ $t('Panels.ControlPanel.ZTilt') }}
-                            </v-btn>
-                        </v-col>
-                    </v-row>
-                    <v-row dense class="">
-                        <v-col cols="4" class="flex-grow-1">
-                            <v-btn
-                                class="btnMinWidthAuto w-100"
-                                tile
-                                height="30"
-                                :loading="loadings.includes('homeX')"
-                                :color="homedAxes.includes('x') ? 'primary' : 'warning'"
-                                @click="doHomeX">
-                                {{ $t('Panels.ControlPanel.X') }}
-                            </v-btn>
-                        </v-col>
-                        <v-col cols="4" class="flex-grow-1">
-                            <v-btn
-                                class="btnMinWidthAuto w-100"
-                                tile
-                                height="30"
-                                :loading="loadings.includes('homeY')"
-                                :color="homedAxes.includes('y') ? 'primary' : 'warning'"
-                                @click="doHomeY">
-                                {{ $t('Panels.ControlPanel.Y') }}
-                            </v-btn>
-                        </v-col>
-                        <v-col cols="4" class="flex-grow-1">
-                            <v-btn
-                                class="btnMinWidthAuto w-100"
-                                tile
-                                height="30"
-                                :loading="loadings.includes('homeZ')"
-                                :color="homedAxes.includes('z') ? 'primary' : 'warning'"
-                                @click="doHomeZ">
-                                {{ $t('Panels.ControlPanel.Z') }}
-                            </v-btn>
-                        </v-col>
-                    </v-row>
-                </div>
-            </v-col>
-        </v-row>
-        <v-row no-gutters class="mt-3">
-            <v-col class="col-12">
-                <v-btn-toggle
-                    v-if="stepsReversed.length > 0"
-                    :key="'all-steps-' + stepsReversed.join('_')"
-                    v-model="selectedCrossStep"
-                    dense
-                    no-gutters
-                    style="flex-wrap: nowrap; width: 100%">
-                    <v-btn
-                        v-for="step of stepsReversed"
-                        :key="'step-' + step"
-                        dense
-                        class="btnMinWidthAuto flex-grow-1 px-0">
-                        <span class="body-2">{{ step }}</span>
-                    </v-btn>
-                </v-btn-toggle>
-                <div v-else class="font-weight-bold warning rounded pa-2">
-                    {{ $t('Panels.ControlPanel.PleaseConfigureSteps') }}
-                    <br />
-                    <router-link style="color: white" to="/settings/interface">
-                        {{ $t('Panels.ControlPanel.SettingsInterfaceControl') }}
-                    </router-link>
-                </div>
-            </v-col>
-        </v-row>
-    </div>
-</template>
-
-<script lang="ts">
-import { Component, Mixins } from 'vue-property-decorator'
-import BaseMixin from '../mixins/base'
-import ControlMixin from '@/components/mixins/control'
-import { mdiChevronUp, mdiChevronLeft, mdiChevronRight, mdiChevronDown, mdiHome } from '@mdi/js'
-
-@Component
-export default class ControlPanelCrossControl extends Mixins(BaseMixin, ControlMixin) {
-    private homeCols = 6
-
-    mdiChevronUp = mdiChevronUp
-    mdiChevronLeft = mdiChevronLeft
-    mdiChevronRight = mdiChevronRight
-    mdiChevronDown = mdiChevronDown
-    mdiHome = mdiHome
-
-    get selectedCrossStep() {
-        return this.$store.state.gui.control.selectedCrossStep
-    }
-
-    set selectedCrossStep(newVal) {
-        this.$store.dispatch('gui/saveSetting', { name: 'control.selectedCrossStep', value: newVal })
-    }
-
-    get reverseX() {
-        return this.$store.state.gui.control.reverseX
-    }
-
-    get reverseY() {
-        return this.$store.state.gui.control.reverseY
-    }
-
-    get reverseZ() {
-        return this.$store.state.gui.control.reverseZ
-    }
-
-    get stepsAll() {
-        return this.$store.state.gui.control?.stepsAll ?? []
-    }
-
-    get stepsReversed() {
-        return Array.from(new Set([...(this.stepsAll ?? [])])).sort((a, b) => a - b)
-    }
-
-    onResize() {
-        this.homeCols = window.screen.width < 360 ? 12 : 6
-    }
-
-    created() {
-        window.addEventListener('resize', this.onResize)
-    }
-
-    mounted() {
-        if (window.screen.width < 330) {
-            this.homeCols = 12
-        }
-    }
-
-    destroyed() {
-        window.removeEventListener('resize', this.onResize)
-    }
-}
-</script>
diff --git a/src/components/panels/PrintsettingsPanel.vue b/src/components/panels/PrintsettingsPanel.vue
deleted file mode 100644
index e1b8891db..000000000
--- a/src/components/panels/PrintsettingsPanel.vue
+++ /dev/null
@@ -1,44 +0,0 @@
-<template>
-    <panel
-        v-if="klipperReadyForGui && ['printing', 'paused'].includes(printer_state)"
-        :icon="mdiPrinter3d"
-        :title="$t('Panels.PrintsettingsPanel.Headline').toString()"
-        :collapsible="true"
-        card-class="printsettings-panel">
-        <tool-slider
-            :label="$t('Panels.PrintsettingsPanel.SpeedFactor').toString()"
-            :icon="mdiSpeedometer"
-            :target="speed_factor"
-            :min="1"
-            :max="200"
-            :multi="100"
-            :step="5"
-            :dynamic-range="true"
-            :has-input-field="true"
-            command="M220"
-            attribute-name="S"></tool-slider>
-    </panel>
-</template>
-
-<script lang="ts">
-import { Component, Mixins } from 'vue-property-decorator'
-import BaseMixin from '@/components/mixins/base'
-import Panel from '@/components/ui/Panel.vue'
-import ToolSlider from '@/components/inputs/ToolSlider.vue'
-import { mdiPrinter3d, mdiSpeedometer } from '@mdi/js'
-
-@Component({
-    components: {
-        Panel,
-        ToolSlider,
-    },
-})
-export default class PrintsettingsPanel extends Mixins(BaseMixin) {
-    mdiPrinter3d = mdiPrinter3d
-    mdiSpeedometer = mdiSpeedometer
-
-    get speed_factor() {
-        return this.$store.state.printer?.gcode_move?.speed_factor ?? 1
-    }
-}
-</script>
diff --git a/src/components/panels/StatusPanel.vue b/src/components/panels/StatusPanel.vue
index e61774681..5024e4a07 100644
--- a/src/components/panels/StatusPanel.vue
+++ b/src/components/panels/StatusPanel.vue
@@ -134,46 +134,7 @@
                     </v-container>
                     <v-divider class="mt-0 mb-0"></v-divider>
                 </template>
-                <v-container class="py-0">
-                    <v-row
-                        :class="
-                            'text-center ' +
-                            (!['printing', 'paused', 'error', 'complete', 'cancelled'].includes(printer_state)
-                                ? 'pt-5 pb-2 mb-0'
-                                : 'py-5')
-                        "
-                        align="center">
-                        <v-col class="col-3 pa-0">
-                            <strong>{{ $t('Panels.StatusPanel.Position') }}</strong>
-                            <br />
-                            {{ coordinates }}
-                        </v-col>
-                        <v-col class="col-3 pa-0">
-                            <strong>{{ $t('Panels.StatusPanel.X') }}</strong>
-                            <br />
-                            {{ positions.x }}
-                        </v-col>
-                        <v-col class="col-3 pa-0">
-                            <strong>{{ $t('Panels.StatusPanel.Y') }}</strong>
-                            <br />
-                            {{ positions.y }}
-                        </v-col>
-                        <v-col class="col-3 pa-0">
-                            <v-tooltip top>
-                                <template #activator="{ on, attrs }">
-                                    <div v-bind="attrs" class="text-center" v-on="on">
-                                        <strong>{{ $t('Panels.StatusPanel.Z') }}</strong>
-                                        <br />
-                                        {{ positions.z }}
-                                    </div>
-                                </template>
-                                <span>G-Code: {{ positions.gcode_z }}mm</span>
-                            </v-tooltip>
-                        </v-col>
-                    </v-row>
-                </v-container>
                 <template v-if="['printing', 'paused', 'error', 'cancelled'].includes(printer_state)">
-                    <v-divider class="my-0"></v-divider>
                     <v-container class="py-0">
                         <v-row class="text-center py-5" align="center">
                             <v-col class="col-3 pa-0">
@@ -417,16 +378,6 @@ export default class StatusPanel extends Mixins(BaseMixin) {
         return this.$store.state.printer.print_stats?.message ?? ''
     }
 
-    get positions() {
-        return this.$store.getters['printer/getPositions']
-    }
-
-    get coordinates() {
-        return this.positions.coordinates
-            ? this.$t('Panels.StatusPanel.Absolute')
-            : this.$t('Panels.StatusPanel.Relative')
-    }
-
     get filament_used() {
         return this.$store.state.printer.print_stats?.filament_used ?? 0
     }
@@ -574,8 +525,9 @@ export default class StatusPanel extends Mixins(BaseMixin) {
 
     get current_layer() {
         if (this.print_time > 0 && 'first_layer_height' in this.current_file && 'layer_height' in this.current_file) {
+            const gcodePositionZ = this.$store.state.printer.gcode_move?.gcode_position[2] ?? 0
             let current_layer = Math.ceil(
-                (this.positions.gcode_z - this.current_file.first_layer_height) / this.current_file.layer_height + 1
+                (gcodePositionZ - this.current_file.first_layer_height) / this.current_file.layer_height + 1
             )
             current_layer = current_layer <= this.max_layers ? current_layer : this.max_layers
 
diff --git a/src/components/panels/ToolheadControlPanel.vue b/src/components/panels/ToolheadControlPanel.vue
new file mode 100644
index 000000000..355356219
--- /dev/null
+++ b/src/components/panels/ToolheadControlPanel.vue
@@ -0,0 +1,168 @@
+<template>
+    <panel
+        v-if="klipperReadyForGui"
+        :icon="mdiGamepad"
+        :title="$t('Panels.ToolheadControlPanel.Headline').toString()"
+        :collapsible="true"
+        card-class="toolhead-control-panel">
+        <!-- PANEL-HEADER 3-DOT-MENU -->
+        <template
+            v-if="
+                (controlStyle !== 'bars' && (existsZtilt || existsQGL)) ||
+                existsBedScrews ||
+                existsBedTilt ||
+                existsDeltaCalibrate ||
+                existsScrewsTilt
+            "
+            #buttons>
+            <v-menu left offset-y :close-on-content-click="false" class="pa-0">
+                <template #activator="{ on, attrs }">
+                    <v-btn icon tile v-bind="attrs" v-on="on">
+                        <v-icon>{{ mdiDotsVertical }}</v-icon>
+                    </v-btn>
+                </template>
+                <v-list dense>
+                    <v-list-item v-if="controlStyle !== 'bars' && actionButton !== 'm84'">
+                        <v-btn small style="width: 100%" @click="doSend('M84')">
+                            <v-icon left small>{{ mdiEngineOff }}</v-icon>
+                            {{ $t('Settings.ControlTab.MotorsOff', { isDefault: '' }) }}
+                        </v-btn>
+                    </v-list-item>
+                    <v-list-item v-if="controlStyle !== 'bars' && existsZtilt && actionButton !== 'ztilt'">
+                        <v-btn small style="width: 100%" @click="doZtilt">Z-Tilt Adjust</v-btn>
+                    </v-list-item>
+                    <v-list-item v-if="controlStyle !== 'bars' && existsQGL && actionButton !== 'qgl'">
+                        <v-btn small style="width: 100%" @click="doQGL">Quad Gantry Level</v-btn>
+                    </v-list-item>
+                    <!-- SPECIAL BUTTONS ALWAYS INSIDE 3-DOT MENU -->
+                    <v-list-item v-if="existsBedTilt">
+                        <v-btn small style="width: 100%" @click="doSend('BED_TILT_CALIBRATE')">
+                            BED TILT CALIBRATE
+                        </v-btn>
+                    </v-list-item>
+                    <v-list-item v-if="existsBedScrews">
+                        <v-btn small style="width: 100%" @click="doSend('BED_SCREWS_ADJUST')">BED SCREWS ADJUST</v-btn>
+                    </v-list-item>
+                    <v-list-item v-if="existsDeltaCalibrate">
+                        <v-btn small style="width: 100%" @click="doSend('DELTA_CALIBRATE')">DELTA CALIBRATE</v-btn>
+                    </v-list-item>
+                    <v-list-item v-if="existsScrewsTilt">
+                        <div class="d-flex align-center" style="width: 100%">
+                            <v-btn
+                                small
+                                style="border-top-right-radius: 0; border-bottom-right-radius: 0"
+                                @click="doSend('SCREWS_TILT_CALCULATE')">
+                                SCREWS TILT CALCULATE
+                            </v-btn>
+                            <v-menu offset-y left :close-on-content-click="false">
+                                <template #activator="{ on, attrs }">
+                                    <v-btn
+                                        small
+                                        v-bind="attrs"
+                                        class="px-0"
+                                        style="min-width: 32px; border-top-left-radius: 0; border-bottom-left-radius: 0"
+                                        v-on="on">
+                                        <v-icon>{{ mdiMenuDown }}</v-icon>
+                                    </v-btn>
+                                </template>
+                                <v-list dense>
+                                    <v-list-item>
+                                        <v-btn
+                                            small
+                                            style="width: 100%"
+                                            @click="doSend('SCREWS_TILT_CALCULATE DIRECTION=CW')">
+                                            <v-icon left small style="transform: scaleX(-1)">{{ mdiRestore }}</v-icon>
+                                            <span>CW</span>
+                                        </v-btn>
+                                    </v-list-item>
+                                    <v-list-item>
+                                        <v-btn
+                                            small
+                                            style="width: 100%"
+                                            @click="doSend('SCREWS_TILT_CALCULATE DIRECTION=CCW')">
+                                            <v-icon left small>{{ mdiRestore }}</v-icon>
+                                            <span>CCW</span>
+                                        </v-btn>
+                                    </v-list-item>
+                                </v-list>
+                            </v-menu>
+                        </div>
+                    </v-list-item>
+                </v-list>
+            </v-menu>
+        </template>
+        <!-- MOVE TO CONTROL -->
+        <move-to-control class="py-0 pt-3"></move-to-control>
+        <!-- AXIS CONTROL -->
+        <v-container>
+            <component :is="`${controlStyle}-control`"></component>
+        </v-container>
+        <!-- Z-OFFSET CONTROL -->
+        <v-divider></v-divider>
+        <v-container>
+            <zoffset-control></zoffset-control>
+        </v-container>
+        <!-- SPEED FACTOR -->
+        <v-divider></v-divider>
+        <v-container>
+            <tool-slider
+                :label="$t('Panels.ToolheadControlPanel.SpeedFactor').toString()"
+                :icon="mdiSpeedometer"
+                :target="speedFactor"
+                :min="1"
+                :max="200"
+                :multi="100"
+                :step="5"
+                :dynamic-range="true"
+                :has-input-field="true"
+                command="M220"
+                attribute-name="S"></tool-slider>
+        </v-container>
+    </panel>
+</template>
+
+<script lang="ts">
+import { Component, Mixins } from 'vue-property-decorator'
+import BarsControl from '@/components/panels/ToolheadControls/BarsControl.vue'
+import BaseMixin from '../mixins/base'
+import CircleControl from '@/components/panels/ToolheadControls/CircleControl.vue'
+import ControlMixin from '@/components/mixins/control'
+import CrossControl from '@/components/panels/ToolheadControls/CrossControl.vue'
+import MoveToControl from '@/components/panels/ToolheadControls/MoveToControl.vue'
+import Panel from '@/components/ui/Panel.vue'
+import ToolSlider from '@/components/inputs/ToolSlider.vue'
+import ZoffsetControl from '@/components/panels/ToolheadControls/ZoffsetControl.vue'
+import { mdiDotsVertical, mdiEngineOff, mdiGamepad, mdiSpeedometer, mdiMenuDown, mdiRestore } from '@mdi/js'
+
+@Component({
+    components: {
+        BarsControl,
+        CircleControl,
+        CrossControl,
+        MoveToControl,
+        Panel,
+        ToolSlider,
+        ZoffsetControl,
+    },
+})
+export default class ToolheadControlPanel extends Mixins(BaseMixin, ControlMixin) {
+    mdiDotsVertical = mdiDotsVertical
+    mdiEngineOff = mdiEngineOff
+    mdiGamepad = mdiGamepad
+    mdiSpeedometer = mdiSpeedometer
+    mdiRestore = mdiRestore
+    mdiMenuDown = mdiMenuDown
+
+    get controlStyle(): string {
+        return this.$store.state.gui.control.style ?? 'bars'
+    }
+
+    get actionButton(): string {
+        return this.$store.state.gui.control.actionButton ?? this.defaultActionButton
+    }
+
+    get speedFactor(): number {
+        return this.$store.state.printer?.gcode_move?.speed_factor ?? 1
+    }
+}
+</script>
diff --git a/src/components/panels/ControlPanelBarsControl.vue b/src/components/panels/ToolheadControls/BarsControl.vue
similarity index 53%
rename from src/components/panels/ControlPanelBarsControl.vue
rename to src/components/panels/ToolheadControls/BarsControl.vue
index 7d1ae52d2..a3e6117c1 100644
--- a/src/components/panels/ControlPanelBarsControl.vue
+++ b/src/components/panels/ToolheadControls/BarsControl.vue
@@ -4,122 +4,195 @@
     min-width: 36px !important;
 }
 
+.btnGroup {
+    height: 28px !important;
+}
+
 .btnMinWidthAuto {
     min-width: auto !important;
 }
+
+._btn-group {
+    border-radius: 4px;
+    display: inline-flex;
+    flex-wrap: nowrap;
+    max-width: 100%;
+    min-width: 100%;
+    width: 100%;
+
+    .v-btn {
+        border-radius: 0;
+        border-color: rgba(255, 255, 255, 0.12);
+        border-style: solid;
+        border-width: thin;
+        box-shadow: none;
+        height: 28px;
+        opacity: 0.8;
+        min-width: auto !important;
+    }
+
+    .v-btn:first-child {
+        border-top-left-radius: inherit;
+        border-bottom-left-radius: inherit;
+    }
+
+    .v-btn:last-child {
+        border-top-right-radius: inherit;
+        border-bottom-right-radius: inherit;
+    }
+
+    .v-btn:not(:first-child) {
+        border-left-width: 0;
+    }
+}
 </style>
 
 <template>
     <div>
+        <!-- HOME ALL / ACTION BUTTON -->
         <v-row no-gutters>
             <v-col class="col-12 pb-0 text-center">
                 <v-btn
                     small
+                    :disabled="['printing'].includes(printer_state)"
                     :loading="loadings.includes('homeAll')"
                     :color="homedAxes.includes('xyz') ? 'primary' : 'warning'"
                     @click="doHome">
                     <v-icon class="mr-1">{{ mdiHome }}</v-icon>
-                    {{ $t('Panels.ControlPanel.ALL') }}
+                    {{ $t('Panels.ToolheadControlPanel.ALL') }}
+                </v-btn>
+                <v-btn
+                    v-if="enableXYHoming"
+                    :disabled="['printing'].includes(printer_state)"
+                    :loading="loadings.includes('homeAll')"
+                    :color="homedAxes.includes('xy') ? 'primary' : 'warning'"
+                    small
+                    class="ml-2"
+                    @click="doHomeXY">
+                    <v-icon class="mr-1">{{ mdiHome }}</v-icon>
+                    XY
                 </v-btn>
                 <v-btn
                     v-if="existsQGL"
+                    :disabled="['printing'].includes(printer_state)"
                     small
                     :loading="loadings.includes('qgl')"
                     :color="colorQuadGantryLevel"
                     class="ml-2"
                     @click="doQGL">
-                    {{ $t('Panels.ControlPanel.QGL') }}
+                    {{ $t('Panels.ToolheadControlPanel.QGL') }}
                 </v-btn>
                 <v-btn
                     v-if="existsZtilt"
+                    :disabled="['printing'].includes(printer_state)"
                     small
                     :loading="loadings.includes('zTilt')"
                     :color="colorZTilt"
                     class="ml-2"
                     @click="doZtilt">
-                    {{ $t('Panels.ControlPanel.ZTilt') }}
+                    {{ $t('Panels.ToolheadControlPanel.ZTilt') }}
+                </v-btn>
+                <v-btn
+                    small
+                    :disabled="['printing'].includes(printer_state)"
+                    :color="homedAxes !== '' ? 'primary' : 'warning'"
+                    class="ml-2"
+                    @click="doSend('M84')">
+                    <v-icon>{{ mdiEngineOff }}</v-icon>
                 </v-btn>
             </v-col>
         </v-row>
-        <v-row no-gutters class="mt-2">
+        <!-- X MOVEMENT BUTTONGROUPS -->
+        <v-row dense>
             <v-col class="text-center">
-                <v-btn-toggle dense no-gutters class="row no-gutters" style="flex-wrap: nowrap; width: 100%">
+                <v-item-group class="_btn-group row no-gutters">
                     <v-btn
                         v-for="steps of stepsXYsorted"
                         :key="'x-' + steps"
-                        class="btnMinWidthAuto col"
+                        :disabled="['printing'].includes(printer_state)"
+                        class="btnMinWidthAuto col btnGroup"
                         @click="doSendMove('X-' + steps, feedrateXY)">
                         <span class="body-2">–{{ steps }}</span>
                     </v-btn>
                     <v-btn
+                        :disabled="['printing'].includes(printer_state)"
                         :color="homedAxes.includes('x') ? 'primary' : 'warning'"
                         :loading="loadings.includes('homeX')"
-                        class="font-weight-bold btnHomeAxis"
+                        class="font-weight-bold btnHomeAxis btnGroup"
                         @click="doHomeX">
-                        {{ $t('Panels.ControlPanel.X') }}
+                        X
                     </v-btn>
                     <v-btn
                         v-for="steps of stepsXYsortedReverse"
                         :key="'x+' + steps"
-                        class="btnMinWidthAuto col"
+                        :disabled="['printing'].includes(printer_state)"
+                        class="btnMinWidthAuto col btnGroup"
                         @click="doSendMove('X+' + steps, feedrateXY)">
                         <span class="body-2">+{{ steps }}</span>
                     </v-btn>
-                </v-btn-toggle>
+                </v-item-group>
             </v-col>
         </v-row>
-        <v-row no-gutters class="mt-3">
+        <!-- Y MOVEMENT BUTTONGROUPS -->
+        <v-row dense>
             <v-col class="text-center">
-                <v-btn-toggle dense no-gutters class="row no-gutters" style="flex-wrap: nowrap; width: 100%">
+                <v-item-group class="_btn-group row no-gutters">
                     <v-btn
                         v-for="steps of stepsXYsorted"
                         :key="'y-' + steps"
-                        class="btnMinWidthAuto col"
+                        :disabled="['printing'].includes(printer_state)"
+                        class="btnMinWidthAuto col btnGroup"
                         @click="doSendMove('Y-' + steps, feedrateXY)">
                         <span class="body-2">–{{ steps }}</span>
                     </v-btn>
                     <v-btn
+                        :disabled="['printing'].includes(printer_state)"
                         :color="homedAxes.includes('y') ? 'primary' : 'warning'"
                         :loading="loadings.includes('homeY')"
-                        class="font-weight-bold btnHomeAxis"
+                        class="font-weight-bold btnHomeAxis btnGroup"
                         @click="doHomeY">
-                        {{ $t('Panels.ControlPanel.Y') }}
+                        Y
                     </v-btn>
                     <v-btn
                         v-for="steps of stepsXYsortedReverse"
                         :key="'y+' + steps"
-                        class="btnMinWidthAuto col"
+                        :disabled="['printing'].includes(printer_state)"
+                        class="btnMinWidthAuto col btnGroup"
                         @click="doSendMove('Y+' + steps, feedrateXY)">
                         <span class="body-2">+{{ steps }}</span>
                     </v-btn>
-                </v-btn-toggle>
+                </v-item-group>
             </v-col>
         </v-row>
-        <v-row no-gutters class="mt-3">
+        <!-- Z MOVEMENT BUTTONGROUPS -->
+        <v-row dense>
             <v-col class="text-center">
-                <v-btn-toggle dense no-gutters class="row no-gutters" style="flex-wrap: nowrap; width: 100%">
+                <v-item-group class="_btn-group row no-gutters">
                     <v-btn
                         v-for="steps of stepsZsorted"
                         :key="'z-' + steps"
-                        class="btnMinWidthAuto col"
+                        :disabled="['printing'].includes(printer_state)"
+                        class="btnMinWidthAuto col btnGroup"
                         @click="doSendMove('Z-' + steps, feedrateZ)">
                         <span class="body-2">–{{ steps }}</span>
                     </v-btn>
                     <v-btn
+                        :disabled="['printing'].includes(printer_state)"
                         :color="homedAxes.includes('z') ? 'primary' : 'warning'"
                         :loading="loadings.includes('homeZ')"
-                        class="font-weight-bold btnHomeAxis"
+                        class="font-weight-bold btnHomeAxis btnGroup"
                         @click="doHomeZ">
-                        {{ $t('Panels.ControlPanel.Z') }}
+                        Z
                     </v-btn>
                     <v-btn
                         v-for="steps of stepsZsortedReverse"
                         :key="'z+' + steps"
-                        class="btnMinWidthAuto col"
+                        :disabled="['printing'].includes(printer_state)"
+                        class="btnMinWidthAuto col btnGroup"
                         @click="doSendMove('Z+' + steps, feedrateZ)">
                         <span class="body-2">+{{ steps }}</span>
                     </v-btn>
-                </v-btn-toggle>
+                </v-item-group>
             </v-col>
         </v-row>
     </div>
@@ -127,13 +200,19 @@
 
 <script lang="ts">
 import { Component, Mixins } from 'vue-property-decorator'
-import BaseMixin from '../mixins/base'
+import BaseMixin from '@/components/mixins/base'
 import ControlMixin from '@/components/mixins/control'
-import { mdiHome } from '@mdi/js'
+import { mdiEngineOff, mdiHome } from '@mdi/js'
+
 @Component
-export default class ControlPanelBarsControl extends Mixins(BaseMixin, ControlMixin) {
+export default class BarsControl extends Mixins(BaseMixin, ControlMixin) {
+    mdiEngineOff = mdiEngineOff
     mdiHome = mdiHome
 
+    get enableXYHoming(): boolean {
+        return this.$store.state.gui.control.enableXYHoming
+    }
+
     get stepsXYsorted() {
         return [...this.$store.state.gui.control.stepsXY].sort(function (a, b) {
             return b - a
diff --git a/src/components/panels/ControlPanelCircleControl.vue b/src/components/panels/ToolheadControls/CircleControl.vue
similarity index 60%
rename from src/components/panels/ControlPanelCircleControl.vue
rename to src/components/panels/ToolheadControls/CircleControl.vue
index f4d9fbcaa..716bff83a 100644
--- a/src/components/panels/ControlPanelCircleControl.vue
+++ b/src/components/panels/ToolheadControls/CircleControl.vue
@@ -1,8 +1,8 @@
 <style lang="scss" scoped>
 svg {
-    max-height: 300px;
+    max-height: 350px;
+    min-height: 275px;
     user-select: none;
-    user-drag: none;
     filter: drop-shadow(0px 10px 10px rgba(0, 0, 0, 0.3));
 }
 
@@ -16,12 +16,12 @@ svg a.step {
 }
 
 svg a.step:hover {
-    fill: #697180 !important;
+    fill: hsl(215, 0%, 50%) !important;
     transition: fill 100ms ease-in;
 }
 
 svg a.step:active {
-    fill: #858c98 !important;
+    fill: hsl(215, 0%, 70%) !important;
 }
 
 svg a.step.inner {
@@ -41,7 +41,6 @@ svg g#stepsZ,
 svg g#stepsXY {
     pointer-events: none;
     user-select: none;
-    user-drag: none;
     font-family: 'Roboto-Regular', 'Roboto', sans-serif;
     font-size: 3px;
     fill: white;
@@ -59,41 +58,49 @@ svg g#home_buttons text {
     fill: black;
 }
 
-svg g.home_button {
+svg g.home_button,
+svg a#home_all_center {
     fill: var(--color-warning);
     transition: opacity 250ms;
 }
 
-svg a#tilt_adjust {
+svg a#tilt_adjust,
+svg a#stepper_off {
     transition: opacity 250ms;
 }
 
-svg a#tilt_adjust.warning {
+svg a#tilt_adjust.warning,
+svg a#stepper_off.warning {
     fill: var(--color-warning);
 }
 
-svg a#tilt_adjust.primary {
+svg a#tilt_adjust.primary,
+svg a#stepper_off.primary {
     fill: var(--color-primary);
 }
 
-svg g.home_button.homed {
+svg g.home_button.homed,
+svg a#home_all_center.homed {
     fill: var(--color-primary);
 }
 
 svg g.home_button:hover,
-svg a#tilt_adjust:hover {
+svg a#home_all_center:hover,
+svg a#tilt_adjust:hover,
+svg a#stepper_off:hover {
     opacity: 0.8;
 }
 
 svg a#tilt_adjust text,
 svg a#tilt_adjust #tilt_icon,
+svg a#stepper_off #stepper_off_icon,
 svg g#home_buttons .home-icon {
     pointer-events: none;
     user-select: none;
-    user-drag: none;
 }
 
-svg a#tilt_adjust #tilt_icon {
+svg a#tilt_adjust #tilt_icon,
+svg a#stepper_off #stepper_off_icon {
     fill: #000;
 }
 </style>
@@ -101,20 +108,18 @@ svg a#tilt_adjust #tilt_icon {
 <template>
     <div>
         <v-row>
-            <v-col class="pb-0">
+            <v-col class="pa-0">
                 <svg
                     width="100%"
                     height="100%"
                     viewBox="0 0 78 62"
-                    version="1.1"
                     xmlns="http://www.w3.org/2000/svg"
-                    xmlns:xlink="http://www.w3.org/1999/xlink"
                     xml:space="preserve"
-                    xmlns:serif="http://www.serif.com/"
                     style="fill-rule: evenodd; clip-rule: evenodd; stroke-linejoin: round; stroke-miterlimit: 2">
                     <g id="ArtBoard1" transform="matrix(1.24239,0,0,1,0,0)">
                         <rect x="0" y="0" width="62" height="62" style="fill: none" />
                         <g id="home_buttons" transform="matrix(0.804902,0,0,1,0.0430241,0)">
+                            <!-- HOME X BUTTON -->
                             <a @click="doHomeX">
                                 <g
                                     id="home_x"
@@ -123,8 +128,7 @@ svg a#tilt_adjust #tilt_icon {
                                         id="home_button_x"
                                         :class="'home_button' + (homedAxes.includes('x') ? ' homed' : '')"
                                         transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)">
-                                        <path
-                                            d="M9.188,-0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,-0Z" />
+                                        <path :d="pathHomeButtonTop" />
                                     </g>
                                     <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)">
                                         <text x="3.789px" y="6.089px">X</text>
@@ -133,12 +137,11 @@ svg a#tilt_adjust #tilt_icon {
                                         id="Icon"
                                         class="home-icon"
                                         transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)">
-                                        <path
-                                            d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z"
-                                            style="fill-rule: nonzero" />
+                                        <path :d="homeIcon" style="fill-rule: nonzero" />
                                     </g>
                                 </g>
                             </a>
+                            <!-- HOME Y BUTTON -->
                             <a @click="doHomeY">
                                 <g
                                     id="home_y"
@@ -147,8 +150,7 @@ svg a#tilt_adjust #tilt_icon {
                                         id="home_button_y"
                                         :class="'home_button' + (homedAxes.includes('y') ? ' homed' : '')"
                                         transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)">
-                                        <path
-                                            d="M9.188,-0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,-0Z" />
+                                        <path :d="pathHomeButtonTop" />
                                     </g>
                                     <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)">
                                         <text x="3.789px" y="6.089px">Y</text>
@@ -157,12 +159,11 @@ svg a#tilt_adjust #tilt_icon {
                                         id="icon"
                                         class="home-icon"
                                         transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)">
-                                        <path
-                                            d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z"
-                                            style="fill-rule: nonzero" />
+                                        <path :d="homeIcon" style="fill-rule: nonzero" />
                                     </g>
                                 </g>
                             </a>
+                            <!-- HOME Z BUTTON -->
                             <a @click="doHomeZ">
                                 <g
                                     id="home_z"
@@ -171,8 +172,7 @@ svg a#tilt_adjust #tilt_icon {
                                         id="home_button_z"
                                         :class="'home_button ' + (homedAxes.includes('z') ? ' homed' : '')"
                                         transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)">
-                                        <path
-                                            d="M9.188,0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,0Z" />
+                                        <path :d="pathHomeButtonBottom" />
                                     </g>
                                     <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)">
                                         <text x="3.93px" y="6.089px">Z</text>
@@ -180,15 +180,35 @@ svg a#tilt_adjust #tilt_icon {
                                     <g
                                         id="icon1"
                                         class="home-icon"
-                                        serif:id="icon"
                                         transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)">
-                                        <path
-                                            d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z"
-                                            style="fill-rule: nonzero" />
+                                        <path :d="homeIcon" style="fill-rule: nonzero" />
                                     </g>
                                 </g>
                             </a>
-                            <a @click="doHome">
+                            <!-- HOME XY BUTTON -->
+                            <a v-if="enableXYHoming" @click="doHomeXY">
+                                <g
+                                    id="home_xy"
+                                    transform="matrix(-0.707107,-0.707107,0.707107,-0.707107,4.05689,63.3555)">
+                                    <g
+                                        id="home_button_xy"
+                                        :class="'home_button' + (homedAxes.includes('xy') ? ' homed' : '')"
+                                        transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)">
+                                        <path :d="pathHomeButtonBottom" />
+                                    </g>
+                                    <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)">
+                                        <text x="2.3px" y="6.089px">XY</text>
+                                    </g>
+                                    <g
+                                        id="icon2"
+                                        class="home-icon"
+                                        transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)">
+                                        <path :d="homeIcon" style="fill-rule: nonzero" />
+                                    </g>
+                                </g>
+                            </a>
+                            <!-- HOME ALL BUTTON -->
+                            <a v-if="!enableXYHoming" @click="doHome">
                                 <g
                                     id="home_all"
                                     transform="matrix(-0.707107,-0.707107,0.707107,-0.707107,4.05689,63.3555)">
@@ -196,75 +216,77 @@ svg a#tilt_adjust #tilt_icon {
                                         id="home_button_all"
                                         :class="'home_button' + (homedAxes.includes('xyz') ? ' homed' : '')"
                                         transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)">
-                                        <path
-                                            d="M9.188,0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,0Z" />
+                                        <path :d="pathHomeButtonBottom" />
                                     </g>
                                     <g
-                                        id="icon2"
+                                        id="icon3"
                                         class="home-icon"
-                                        serif:id="icon"
                                         transform="matrix(0.29377,0,0,0.29377,0.346087,1.64241)">
-                                        <path
-                                            d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z"
-                                            style="fill-rule: nonzero" />
+                                        <path :d="homeIcon" style="fill-rule: nonzero" />
                                     </g>
                                 </g>
                             </a>
+                            <a v-if="enableXYHoming" @click="doHome">
+                                <g
+                                    id="home_all_center"
+                                    :class="'home_button' + (homedAxes.includes('xyz') ? ' homed' : '')">
+                                    <circle id="home_button_all_center" cx="31" cy="31" r="5" />
+                                </g>
+                                <g id="icon4" class="home-icon" transform="scale(0.3) translate(91.25,91.25)">
+                                    <!-- transform="matrix(0.29377,0,0,0.29377,0.346087,1.64241)"-->
+                                    <path :d="homeIcon" style="fill-rule: nonzero" />
+                                </g>
+                            </a>
                         </g>
                         <g id="step_buttons" transform="matrix(0.804902,0,0,1,0.0430241,0)">
+                            <!-- Z STEPS BUTTONS -->
                             <g id="Z" transform="matrix(1.24239,0,0,1,-0.0534526,0)">
                                 <g id="Bottom" transform="matrix(-1,-1.52149e-16,9.85721e-17,-1,114.34,62)">
                                     <a
                                         class="step inner"
                                         @click="
                                             doSendMove(
-                                                'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 0 ? stepsZ[0] : 0),
+                                                `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 0 ? stepsZ[0] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
-                                        <g transform="matrix(0.804902,0,0,1,0,0)">
-                                            <path
-                                                d="M66.037,19.186C69.409,18.542 72.742,18.52 76.037,19.102L76.037,23.682C76.037,23.815 75.984,23.942 75.891,24.036C75.564,24.362 74.774,25.153 74.359,25.567C74.204,25.722 73.967,25.757 73.773,25.656C72.955,25.236 72.029,25 71.048,25C70.051,25 69.112,25.243 68.284,25.674C68.09,25.777 67.852,25.742 67.697,25.586C67.283,25.175 66.506,24.395 66.183,24.071C66.09,23.977 66.037,23.85 66.037,23.718C66.037,22.806 66.037,19.186 66.037,19.186Z" />
-                                        </g>
+                                        <g transform="matrix(0.804902,0,0,1,0,0)"><path :d="zStepInner" /></g>
                                     </a>
                                     <a
                                         class="step inner-mid"
                                         @click="
                                             doSendMove(
-                                                'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 1 ? stepsZ[1] : 0),
+                                                `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 1 ? stepsZ[1] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
                                         <g
                                             transform="matrix(0.804902,1.2326e-32,-9.92118e-33,1,-5.71917e-15,-7.10543e-15)">
-                                            <path
-                                                d="M66.037,13.244C69.353,12.66 72.687,12.7 76.037,13.355L76.037,20.099C74.523,19.39 72.831,19 71.048,19C69.256,19 67.556,19.393 66.037,20.109L66.037,13.244Z" />
+                                            <path :d="zStepInnerMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer-mid"
                                         @click="
                                             doSendMove(
-                                                'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 2 ? stepsZ[2] : 0),
+                                                `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 2 ? stepsZ[2] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
                                         <g transform="matrix(0.804902,0,0,1,0,0)">
-                                            <path
-                                                d="M66.037,7.221C69.367,6.597 72.7,6.583 76.037,7.192L76.037,13.702C74.453,13.245 72.778,13 71.048,13C69.309,13 67.627,13.247 66.037,13.708L66.037,7.221Z" />
+                                            <path :d="zStepOuterMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer"
                                         @click="
                                             doSendMove(
-                                                'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 3 ? stepsZ[3] : 0),
+                                                `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 3 ? stepsZ[3] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
                                         <g transform="matrix(0.804902,0,0,1,0,0)">
-                                            <path
-                                                d="M66.037,2.5C66.037,1.672 66.709,1 67.537,1L74.537,1C75.365,1 76.037,1.672 76.037,2.5L76.037,7.521C74.428,7.179 72.759,7 71.048,7C69.33,7 67.654,7.181 66.037,7.525L66.037,2.5Z" />
+                                            <path :d="zStepOuter" />
                                         </g>
                                     </a>
                                 </g>
@@ -273,57 +295,54 @@ svg a#tilt_adjust #tilt_icon {
                                         class="step inner"
                                         @click="
                                             doSendMove(
-                                                'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 0 ? stepsZ[0] : 0),
+                                                `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 0 ? stepsZ[0] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
                                         <g transform="matrix(0.804902,0,0,1,0,0)">
-                                            <path
-                                                d="M66.037,19.186C69.409,18.542 72.742,18.52 76.037,19.102L76.037,23.682C76.037,23.815 75.984,23.942 75.891,24.036C75.564,24.362 74.774,25.153 74.359,25.567C74.204,25.722 73.967,25.757 73.773,25.656C72.955,25.236 72.029,25 71.048,25C70.051,25 69.112,25.243 68.284,25.674C68.09,25.777 67.852,25.742 67.697,25.586C67.283,25.175 66.506,24.395 66.183,24.071C66.09,23.977 66.037,23.85 66.037,23.718C66.037,22.806 66.037,19.186 66.037,19.186Z" />
+                                            <path :d="zStepInner" />
                                         </g>
                                     </a>
                                     <a
                                         class="step inner-mid"
                                         @click="
                                             doSendMove(
-                                                'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 1 ? stepsZ[1] : 0),
+                                                `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 1 ? stepsZ[1] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
                                         <g
                                             transform="matrix(0.804902,1.2326e-32,-9.92118e-33,1,-5.71917e-15,-7.10543e-15)">
-                                            <path
-                                                d="M66.037,13.244C69.353,12.66 72.687,12.7 76.037,13.355L76.037,20.099C74.523,19.39 72.831,19 71.048,19C69.256,19 67.556,19.393 66.037,20.109L66.037,13.244Z" />
+                                            <path :d="zStepInnerMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer-mid"
                                         @click="
                                             doSendMove(
-                                                'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 2 ? stepsZ[2] : 0),
+                                                `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 2 ? stepsZ[2] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
                                         <g transform="matrix(0.804902,0,0,1,0,0)">
-                                            <path
-                                                d="M66.037,7.221C69.367,6.597 72.7,6.583 76.037,7.192L76.037,13.702C74.453,13.245 72.778,13 71.048,13C69.309,13 67.627,13.247 66.037,13.708L66.037,7.221Z" />
+                                            <path :d="zStepOuterMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer"
                                         @click="
                                             doSendMove(
-                                                'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 3 ? stepsZ[3] : 0),
+                                                `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 3 ? stepsZ[3] : 0}`,
                                                 feedrateZ
                                             )
                                         ">
                                         <g transform="matrix(0.804902,0,0,1,0,0)">
-                                            <path
-                                                d="M66.037,2.5C66.037,1.672 66.709,1 67.537,1L74.537,1C75.365,1 76.037,1.672 76.037,2.5L76.037,7.521C74.428,7.179 72.759,7 71.048,7C69.33,7 67.654,7.181 66.037,7.525L66.037,2.5Z" />
+                                            <path :d="zStepOuter" />
                                         </g>
                                     </a>
                                 </g>
                             </g>
+                            <!-- Z STEP BUTTON TEXT -->
                             <g id="stepsZ" transform="matrix(1,0,0,1,40,0)">
                                 <g transform="matrix(1,0,0,1,0.483899,4.07983)">
                                     <text x="30.7px" y="19.056px" text-anchor="middle">
@@ -346,58 +365,55 @@ svg a#tilt_adjust #tilt_icon {
                                     </text>
                                 </g>
                             </g>
+                            <!-- XY STEP BUTTONS -->
                             <g id="XY">
                                 <g id="Right">
                                     <a
                                         class="step inner"
                                         @click="
                                             doSendMove(
-                                                'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0),
+                                                `X${reverseX ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.48,0,0,0.48,19,19)">
-                                            <path
-                                                d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" />
+                                            <path :d="xyStepInner" />
                                         </g>
                                     </a>
                                     <a
                                         class="step inner-mid"
                                         @click="
                                             doSendMove(
-                                                'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0),
+                                                `X${reverseX ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.72,0,0,0.72,13,13)">
-                                            <path
-                                                d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" />
+                                            <path :d="xyStepInnerMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer-mid"
                                         @click="
                                             doSendMove(
-                                                'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0),
+                                                `X${reverseX ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.96,0,0,0.96,7,7)">
-                                            <path
-                                                d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" />
+                                            <path :d="xyStepOuterMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer"
                                         @click="
                                             doSendMove(
-                                                'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0),
+                                                `X${reverseX ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(1.2,0,0,1.2,1,1)">
-                                            <path
-                                                d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" />
+                                            <path :d="xyStepOuter" />
                                         </g>
                                     </a>
                                 </g>
@@ -406,170 +422,153 @@ svg a#tilt_adjust #tilt_icon {
                                         class="step inner"
                                         @click="
                                             doSendMove(
-                                                'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0),
+                                                `X${!reverseX ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.48,0,0,0.48,19,19)">
-                                            <path
-                                                d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" />
+                                            <path :d="xyStepInner" />
                                         </g>
                                     </a>
                                     <a
                                         class="step inner-mid"
                                         @click="
                                             doSendMove(
-                                                'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0),
+                                                `X${!reverseX ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.72,0,0,0.72,13,13)">
-                                            <path
-                                                d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" />
+                                            <path :d="xyStepInnerMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer-mid"
                                         @click="
                                             doSendMove(
-                                                'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0),
+                                                `X${!reverseX ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.96,0,0,0.96,7,7)">
-                                            <path
-                                                d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" />
+                                            <path :d="xyStepOuterMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer"
                                         @click="
                                             doSendMove(
-                                                'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0),
+                                                `X${!reverseX ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(1.2,0,0,1.2,1,1)">
-                                            <path
-                                                d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" />
+                                            <path :d="xyStepOuter" />
                                         </g>
                                     </a>
                                 </g>
-                                <g
-                                    id="Bottom1"
-                                    serif:id="Bottom"
-                                    transform="matrix(6.12323e-17,1,-1,6.12323e-17,61.9767,-1.77705e-14)">
+                                <g id="Bottom1" transform="matrix(6.12323e-17,1,-1,6.12323e-17,61.9767,-1.77705e-14)">
                                     <a
                                         class="step inner"
                                         @click="
                                             doSendMove(
-                                                'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0),
+                                                `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.48,0,0,0.48,19,19)">
-                                            <path
-                                                d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" />
+                                            <path :d="xyStepInner" />
                                         </g>
                                     </a>
                                     <a
                                         class="step inner-mid"
                                         @click="
                                             doSendMove(
-                                                'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0),
+                                                `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.72,0,0,0.72,13,13)">
-                                            <path
-                                                d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" />
+                                            <path :d="xyStepInnerMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer-mid"
                                         @click="
                                             doSendMove(
-                                                'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0),
+                                                `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.96,0,0,0.96,7,7)">
-                                            <path
-                                                d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" />
+                                            <path :d="xyStepOuterMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer"
                                         @click="
                                             doSendMove(
-                                                'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0),
+                                                `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(1.2,0,0,1.2,1,1)">
-                                            <path
-                                                d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" />
+                                            <path :d="xyStepOuter" />
                                         </g>
                                     </a>
                                 </g>
-                                <g
-                                    id="Top1"
-                                    serif:id="Top"
-                                    transform="matrix(6.12323e-17,-1,1,6.12323e-17,7.10543e-15,61.9767)">
+                                <g id="Top1" transform="matrix(6.12323e-17,-1,1,6.12323e-17,7.10543e-15,61.9767)">
                                     <a
                                         class="step inner"
                                         @click="
                                             doSendMove(
-                                                'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0),
+                                                `Y${reverseY ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.48,0,0,0.48,19,19)">
-                                            <path
-                                                d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" />
+                                            <path :d="xyStepInner" />
                                         </g>
                                     </a>
                                     <a
                                         class="step inner-mid"
                                         @click="
                                             doSendMove(
-                                                'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0),
+                                                `Y${reverseY ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.72,0,0,0.72,13,13)">
-                                            <path
-                                                d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" />
+                                            <path :d="xyStepInnerMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer-mid"
                                         @click="
                                             doSendMove(
-                                                'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0),
+                                                `Y${reverseY ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(0.96,0,0,0.96,7,7)">
-                                            <path
-                                                d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" />
+                                            <path :d="xyStepOuterMid" />
                                         </g>
                                     </a>
                                     <a
                                         class="step outer"
                                         @click="
                                             doSendMove(
-                                                'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0),
+                                                `Y${reverseY ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`,
                                                 feedrateXY
                                             )
                                         ">
                                         <g transform="matrix(1.2,0,0,1.2,1,1)">
-                                            <path
-                                                d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" />
+                                            <path :d="xyStepOuter" />
                                         </g>
                                     </a>
                                 </g>
                             </g>
+                            <!-- XY STEP BUTTON TEXT -->
                             <g id="stepsXY">
                                 <g transform="matrix(1,0,0,1,0.483899,4.07983)">
                                     <text x="30.5px" y="19.056px" text-anchor="middle">
@@ -595,16 +594,33 @@ svg a#tilt_adjust #tilt_icon {
                         </g>
                     </g>
                     <a
-                        v-if="existsQGL || existsZtilt"
+                        v-if="existsQGL && actionButton === 'qgl'"
+                        id="tilt_adjust"
+                        :class="colorSpecialButton"
+                        @click="clickSpecialButton">
+                        <circle id="qgl_button" cx="70.92" cy="31" r="5" />
+                        <text x="66.776px" y="32.066px">QGL</text>
+                        <g id="tilt_icon">
+                            <path :d="zTiltIcon1" />
+                            <path :d="zTiltIcon2" />
+                        </g>
+                    </a>
+                    <a
+                        v-else-if="existsZtilt && actionButton === 'ztilt'"
                         id="tilt_adjust"
                         :class="colorSpecialButton"
                         @click="clickSpecialButton">
                         <circle id="tilt_button" cx="70.92" cy="31" r="5" />
                         <text x="66.776px" y="32.066px">Z-TILT</text>
                         <g id="tilt_icon">
-                            <path d="M74.189,31.503L67.751,30.009L67.638,30.496L74.076,31.99L74.189,31.503Z" />
-                            <path
-                                d="M74.361,32.85L74.034,32.676L74.939,32.188L75.039,33.211L74.745,33.055C74.386,33.724 73.858,34.288 73.213,34.69L72.983,34.321C73.563,33.959 74.038,33.452 74.361,32.85ZM67.193,28.75C67.586,28.1 68.142,27.564 68.807,27.196L69.018,27.576C68.42,27.907 67.919,28.389 67.565,28.974L67.883,29.165L66.954,29.605L66.907,28.578L67.193,28.75Z" />
+                            <path :d="zTiltIcon1" />
+                            <path :d="zTiltIcon2" />
+                        </g>
+                    </a>
+                    <a v-else id="stepper_off" :class="homedAxes !== '' ? 'primary' : 'warning'" @click="doSend('M84')">
+                        <circle id="stepper_off_button" cx="70.92" cy="31" r="5" />
+                        <g id="stepper_off_icon" transform="scale(0.3) translate(224,91)">
+                            <path :d="engineOffIcon" />
                         </g>
                     </a>
                 </svg>
@@ -615,11 +631,61 @@ svg a#tilt_adjust #tilt_icon {
 
 <script lang="ts">
 import { Component, Mixins } from 'vue-property-decorator'
-import BaseMixin from '../mixins/base'
+import BaseMixin from '@/components/mixins/base'
 import ControlMixin from '@/components/mixins/control'
 
 @Component
-export default class ControlPanelCrossControl extends Mixins(BaseMixin, ControlMixin) {
+export default class CircleControl extends Mixins(BaseMixin, ControlMixin) {
+    /**
+     * SVG paths for home buttons
+     */
+    homeIcon = 'M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z'
+    pathHomeButtonTop =
+        'M9.188,-0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,-0Z'
+    pathHomeButtonBottom =
+        'M9.188,0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,0Z'
+    /**
+     * SVG paths for XY steps
+     */
+    xyStepOuter =
+        'M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z'
+    xyStepOuterMid =
+        'M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z'
+    xyStepInnerMid =
+        'M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z'
+    xyStepInner =
+        'M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z'
+    /**
+     * SVG paths for Z steps
+     */
+    zStepOuter =
+        'M66.037,2.5C66.037,1.672 66.709,1 67.537,1L74.537,1C75.365,1 76.037,1.672 76.037,2.5L76.037,7.521C74.428,7.179 72.759,7 71.048,7C69.33,7 67.654,7.181 66.037,7.525L66.037,2.5Z'
+    zStepOuterMid =
+        'M66.037,7.221C69.367,6.597 72.7,6.583 76.037,7.192L76.037,13.702C74.453,13.245 72.778,13 71.048,13C69.309,13 67.627,13.247 66.037,13.708L66.037,7.221Z'
+    zStepInnerMid =
+        'M66.037,13.244C69.353,12.66 72.687,12.7 76.037,13.355L76.037,20.099C74.523,19.39 72.831,19 71.048,19C69.256,19 67.556,19.393 66.037,20.109L66.037,13.244Z'
+    zStepInner =
+        'M66.037,19.186C69.409,18.542 72.742,18.52 76.037,19.102L76.037,23.682C76.037,23.815 75.984,23.942 75.891,24.036C75.564,24.362 74.774,25.153 74.359,25.567C74.204,25.722 73.967,25.757 73.773,25.656C72.955,25.236 72.029,25 71.048,25C70.051,25 69.112,25.243 68.284,25.674C68.09,25.777 67.852,25.742 67.697,25.586C67.283,25.175 66.506,24.395 66.183,24.071C66.09,23.977 66.037,23.85 66.037,23.718C66.037,22.806 66.037,19.186 66.037,19.186Z'
+    /**
+     * SVG path for Z Tilt icon
+     */
+    zTiltIcon1 = 'M74.189,31.503L67.751,30.009L67.638,30.496L74.076,31.99L74.189,31.503Z'
+    zTiltIcon2 =
+        'M74.361,32.85L74.034,32.676L74.939,32.188L75.039,33.211L74.745,33.055C74.386,33.724 73.858,34.288 73.213,34.69L72.983,34.321C73.563,33.959 74.038,33.452 74.361,32.85ZM67.193,28.75C67.586,28.1 68.142,27.564 68.807,27.196L69.018,27.576C68.42,27.907 67.919,28.389 67.565,28.974L67.883,29.165L66.954,29.605L66.907,28.578L67.193,28.75Z'
+    /**
+     * SVG path for engine off icon
+     */
+    engineOffIcon =
+        'M3.78 2.5L21.5 20.22l-1.27 1.28L18 19.27V20h-8l-2-2H5v-3H3v3H1v-8h2v3h2v-3l1.87-1.86L2.5 3.77L3.78 2.5M20 9v3h-2V8h-6V6h3V4H7.82l15 15H23V9h-3Z'
+
+    get actionButton(): string {
+        return this.$store.state.gui.control.actionButton ?? this.defaultActionButton
+    }
+
+    get enableXYHoming(): boolean {
+        return this.$store.state.gui.control.enableXYHoming
+    }
+
     get reverseX() {
         return this.$store.state.gui.control.reverseX
     }
diff --git a/src/components/panels/ToolheadControls/CrossControl.vue b/src/components/panels/ToolheadControls/CrossControl.vue
new file mode 100644
index 000000000..f5ac949f2
--- /dev/null
+++ b/src/components/panels/ToolheadControls/CrossControl.vue
@@ -0,0 +1,434 @@
+<style lang="scss" scoped>
+.btnMinWidthAuto {
+    min-width: auto !important;
+}
+</style>
+
+<template>
+    <responsive
+        :breakpoints="{
+            small: (el) => el.width <= 300,
+        }">
+        <template #default="{ el }">
+            <div>
+                <v-row>
+                    <!-- DIRECTION BUTTONS -->
+                    <v-col>
+                        <v-row dense class="mb-1">
+                            <v-col cols="3"></v-col>
+                            <v-col cols="3">
+                                <v-btn
+                                    class="btnMinWidthAuto fill-width"
+                                    :disabled="
+                                        !yAxisHomed ||
+                                        selectedCrossStep === null ||
+                                        selectedCrossStep === undefined ||
+                                        ['printing'].includes(printer_state)
+                                    "
+                                    @click="doSendMove(`Y${reverseY ? '-' : '+'}${stepSize}`, feedrateXY)">
+                                    <v-icon>{{ mdiChevronUp }}</v-icon>
+                                </v-btn>
+                            </v-col>
+                            <v-col cols="3"></v-col>
+                            <v-col cols="3">
+                                <v-btn
+                                    class="btnMinWidthAuto fill-width"
+                                    :disabled="
+                                        !zAxisHomed ||
+                                        selectedCrossStep === null ||
+                                        selectedCrossStep === undefined ||
+                                        ['printing'].includes(printer_state)
+                                    "
+                                    @click="doSendMove(`Z${reverseZ ? '-' : '+'}${stepSize}`, feedrateZ)">
+                                    <v-icon>{{ mdiChevronUp }}</v-icon>
+                                </v-btn>
+                            </v-col>
+                        </v-row>
+                        <v-row dense>
+                            <v-col cols="3" class="p-rel">
+                                <v-btn
+                                    class="btnMinWidthAuto fill-width p-abs"
+                                    style="top: -50%; width: calc(100% - 8px)"
+                                    :disabled="
+                                        !xAxisHomed ||
+                                        selectedCrossStep === null ||
+                                        selectedCrossStep === undefined ||
+                                        ['printing'].includes(printer_state)
+                                    "
+                                    @click="doSendMove(`X${!reverseX ? '-' : '+'}${stepSize}`, feedrateXY)">
+                                    <v-icon>{{ mdiChevronLeft }}</v-icon>
+                                </v-btn>
+                            </v-col>
+                            <v-col cols="3">
+                                <v-btn
+                                    class="btnMinWidthAuto fill-width"
+                                    :disabled="
+                                        !yAxisHomed ||
+                                        selectedCrossStep === null ||
+                                        selectedCrossStep === undefined ||
+                                        ['printing'].includes(printer_state)
+                                    "
+                                    @click="doSendMove(`Y${!reverseY ? '-' : '+'}${stepSize}`, feedrateXY)">
+                                    <v-icon>{{ mdiChevronDown }}</v-icon>
+                                </v-btn>
+                            </v-col>
+                            <v-col cols="3" class="p-rel">
+                                <v-btn
+                                    class="btnMinWidthAuto fill-width p-abs"
+                                    style="top: -50%; width: calc(100% - 8px)"
+                                    :disabled="
+                                        !xAxisHomed ||
+                                        selectedCrossStep === null ||
+                                        selectedCrossStep === undefined ||
+                                        ['printing'].includes(printer_state)
+                                    "
+                                    @click="doSendMove(`X${reverseX ? '-' : '+'}${stepSize}`, feedrateXY)">
+                                    <v-icon>{{ mdiChevronRight }}</v-icon>
+                                </v-btn>
+                            </v-col>
+                            <v-col cols="3">
+                                <v-btn
+                                    class="btnMinWidthAuto fill-width"
+                                    :disabled="
+                                        !zAxisHomed ||
+                                        selectedCrossStep === null ||
+                                        selectedCrossStep === undefined ||
+                                        ['printing'].includes(printer_state)
+                                    "
+                                    @click="doSendMove(`Z${!reverseZ ? '-' : '+'}${stepSize}`, feedrateZ)">
+                                    <v-icon>{{ mdiChevronDown }}</v-icon>
+                                </v-btn>
+                            </v-col>
+                        </v-row>
+                    </v-col>
+                    <!-- HOME / 5th ACTION BUTTONS -->
+                    <v-col v-if="!el.is.small" class="d-flex align-center">
+                        <div class="flex-grow-1" style="border-radius: 4px; overflow: hidden">
+                            <v-row dense style="margin-bottom: -2px !important">
+                                <v-col cols="6">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeAll')"
+                                        :color="homedAxes.includes('xyz') ? 'primary' : 'warning'"
+                                        height="30"
+                                        tile
+                                        class="w-100"
+                                        @click="doHome">
+                                        <div class="d-flex align-center">
+                                            <v-icon>{{ mdiHome }}</v-icon>
+                                            <span>{{ $t('Panels.ToolheadControlPanel.ALL') }}</span>
+                                        </div>
+                                    </v-btn>
+                                </v-col>
+                                <v-col cols="6" class="d-flex">
+                                    <v-btn
+                                        v-if="actionButton === 'qgl'"
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('qgl')"
+                                        :color="colorQuadGantryLevel"
+                                        height="30"
+                                        dense
+                                        tile
+                                        class="btnMinWidthAuto flex-grow-1 px-0"
+                                        @click="doQGL">
+                                        {{ $t('Panels.ToolheadControlPanel.QGL') }}
+                                    </v-btn>
+                                    <v-btn
+                                        v-else-if="actionButton === 'ztilt'"
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('zTilt')"
+                                        :color="colorZTilt"
+                                        height="30"
+                                        dense
+                                        tile
+                                        class="btnMinWidthAuto flex-grow-1 px-0"
+                                        @click="doZtilt">
+                                        {{ $t('Panels.ToolheadControlPanel.ZTilt') }}
+                                    </v-btn>
+                                    <v-btn
+                                        v-else
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :color="homedAxes !== '' ? 'primary' : 'warning'"
+                                        height="30"
+                                        dense
+                                        tile
+                                        class="flex-grow-1 px-0"
+                                        @click="doSend('M84')">
+                                        <v-icon>{{ mdiEngineOff }}</v-icon>
+                                    </v-btn>
+                                </v-col>
+                            </v-row>
+                            <!-- X/Y/Z HOME BUTTONS -->
+                            <v-row dense>
+                                <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeX')"
+                                        :color="homedAxes.includes('x') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeX">
+                                        X
+                                    </v-btn>
+                                </v-col>
+                                <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeY')"
+                                        :color="homedAxes.includes('y') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeY">
+                                        Y
+                                    </v-btn>
+                                </v-col>
+                                <v-col v-else cols="6" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeY')"
+                                        :color="homedAxes.includes('xy') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeXY">
+                                        XY
+                                    </v-btn>
+                                </v-col>
+                                <v-col :class="enableXYHoming ? 'col-6' : 'col-4'" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeZ')"
+                                        :color="homedAxes.includes('z') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeZ">
+                                        Z
+                                    </v-btn>
+                                </v-col>
+                            </v-row>
+                        </div>
+                    </v-col>
+                </v-row>
+                <v-row v-if="el.is.small">
+                    <!-- HOME / 5th ACTION BUTTONS -->
+                    <v-col class="d-flex align-center">
+                        <div class="flex-grow-1" style="border-radius: 4px; overflow: hidden">
+                            <v-row dense style="margin-bottom: -2px !important">
+                                <v-col cols="6">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeAll')"
+                                        :color="homedAxes.includes('xyz') ? 'primary' : 'warning'"
+                                        height="30"
+                                        tile
+                                        class="w-100"
+                                        @click="doHome">
+                                        <div class="d-flex align-center">
+                                            <v-icon>{{ mdiHome }}</v-icon>
+                                            <span>{{ $t('Panels.ToolheadControlPanel.ALL') }}</span>
+                                        </div>
+                                    </v-btn>
+                                </v-col>
+                                <v-col cols="6" class="d-flex">
+                                    <v-btn
+                                        v-if="actionButton === 'qgl'"
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('qgl')"
+                                        :color="colorQuadGantryLevel"
+                                        height="30"
+                                        dense
+                                        tile
+                                        class="btnMinWidthAuto flex-grow-1 px-0"
+                                        @click="doQGL">
+                                        {{ $t('Panels.ToolheadControlPanel.QGL') }}
+                                    </v-btn>
+                                    <v-btn
+                                        v-else-if="actionButton === 'ztilt'"
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('zTilt')"
+                                        :color="colorZTilt"
+                                        height="30"
+                                        dense
+                                        tile
+                                        class="btnMinWidthAuto flex-grow-1 px-0"
+                                        @click="doZtilt">
+                                        {{ $t('Panels.ToolheadControlPanel.ZTilt') }}
+                                    </v-btn>
+                                    <v-btn
+                                        v-else
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :color="homedAxes !== '' ? 'primary' : 'warning'"
+                                        height="30"
+                                        dense
+                                        tile
+                                        class="flex-grow-1 px-0"
+                                        @click="doSend('M84')">
+                                        <v-icon>{{ mdiEngineOff }}</v-icon>
+                                    </v-btn>
+                                </v-col>
+                            </v-row>
+                            <!-- X/Y/Z HOME BUTTONS -->
+                            <v-row dense>
+                                <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeX')"
+                                        :color="homedAxes.includes('x') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeX">
+                                        X
+                                    </v-btn>
+                                </v-col>
+                                <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeY')"
+                                        :color="homedAxes.includes('y') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeY">
+                                        Y
+                                    </v-btn>
+                                </v-col>
+                                <v-col v-else cols="6" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeY')"
+                                        :color="homedAxes.includes('xy') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeXY">
+                                        XY
+                                    </v-btn>
+                                </v-col>
+                                <v-col :class="enableXYHoming ? 'col-6' : 'col-4'" class="flex-grow-1">
+                                    <v-btn
+                                        :disabled="['printing'].includes(printer_state)"
+                                        :loading="loadings.includes('homeZ')"
+                                        :color="homedAxes.includes('z') ? 'primary' : 'warning'"
+                                        tile
+                                        height="30"
+                                        class="btnMinWidthAuto w-100"
+                                        @click="doHomeZ">
+                                        Z
+                                    </v-btn>
+                                </v-col>
+                            </v-row>
+                        </div>
+                    </v-col>
+                </v-row>
+                <!-- STEP SIZE BUTTON GROUP -->
+                <v-row no-gutters class="mt-3">
+                    <v-col>
+                        <v-btn-toggle
+                            v-if="stepsReversed.length > 0"
+                            :key="`all-steps-${stepsReversed.join('_')}`"
+                            v-model="selectedCrossStep"
+                            dense
+                            mandatory
+                            style="flex-wrap: nowrap; width: 100%">
+                            <v-btn
+                                v-for="step of stepsReversed"
+                                :key="`step-${step}`"
+                                :disabled="['printing'].includes(printer_state)"
+                                dense
+                                class="btnMinWidthAuto flex-grow-1 px-0"
+                                style="height: 28px">
+                                <span class="body-2">{{ step }}</span>
+                            </v-btn>
+                        </v-btn-toggle>
+                        <div v-else class="font-weight-bold warning rounded pa-2">
+                            {{ $t('Panels.ToolheadControlPanel.PleaseConfigureSteps') }}
+                            <br />
+                            <router-link style="color: white" to="/settings/interface">
+                                {{ $t('Panels.ToolheadControlPanel.SettingsInterfaceControl') }}
+                            </router-link>
+                        </div>
+                    </v-col>
+                </v-row>
+            </div>
+        </template>
+    </responsive>
+</template>
+
+<script lang="ts">
+import { Component, Mixins } from 'vue-property-decorator'
+import BaseMixin from '@/components/mixins/base'
+import ControlMixin from '@/components/mixins/control'
+import Responsive from '@/components/ui/Responsive.vue'
+import { mdiChevronUp, mdiChevronLeft, mdiChevronRight, mdiChevronDown, mdiEngineOff, mdiHome } from '@mdi/js'
+
+@Component({
+    components: { Responsive },
+})
+export default class CrossControl extends Mixins(BaseMixin, ControlMixin) {
+    mdiChevronUp = mdiChevronUp
+    mdiChevronLeft = mdiChevronLeft
+    mdiChevronRight = mdiChevronRight
+    mdiChevronDown = mdiChevronDown
+    mdiEngineOff = mdiEngineOff
+    mdiHome = mdiHome
+
+    private stepSize = this.stepsReversed[this.selectedCrossStep]
+
+    get actionButton(): string {
+        return this.$store.state.gui.control.actionButton ?? this.defaultActionButton
+    }
+
+    /**
+     * Step size selection
+     */
+    get selectedCrossStep() {
+        return this.$store.state.gui.control.selectedCrossStep
+    }
+
+    set selectedCrossStep(newVal) {
+        this.$store.dispatch('gui/saveSetting', { name: 'control.selectedCrossStep', value: newVal })
+    }
+
+    /**
+     * Axes reverse states
+     */
+    get reverseX() {
+        return this.$store.state.gui.control.reverseX
+    }
+
+    get reverseY() {
+        return this.$store.state.gui.control.reverseY
+    }
+
+    get reverseZ() {
+        return this.$store.state.gui.control.reverseZ
+    }
+
+    get stepsAll() {
+        return this.$store.state.gui.control?.stepsAll ?? []
+    }
+
+    get stepsReversed() {
+        return Array.from(new Set([...(this.stepsAll ?? [])])).sort((a, b) => a - b)
+    }
+
+    /**
+     * Axes home states
+     */
+    get xAxisHomed(): boolean {
+        return this.$store.state.printer.toolhead?.homed_axes.includes('x') ?? false
+    }
+
+    get yAxisHomed(): boolean {
+        return this.$store.state.printer.toolhead?.homed_axes.includes('y') ?? false
+    }
+
+    get zAxisHomed(): boolean {
+        return this.$store.state.printer.toolhead?.homed_axes.includes('z') ?? false
+    }
+}
+</script>
diff --git a/src/components/panels/ToolheadControls/MoveToControl.vue b/src/components/panels/ToolheadControls/MoveToControl.vue
new file mode 100644
index 000000000..d5afef421
--- /dev/null
+++ b/src/components/panels/ToolheadControls/MoveToControl.vue
@@ -0,0 +1,220 @@
+<template>
+    <responsive
+        :breakpoints="{
+            small: (el) => el.width <= 320,
+        }">
+        <template #default="{ el }">
+            <v-container class="py-0">
+                <v-row>
+                    <v-col>
+                        <v-btn-toggle v-model="positionString" dense mandatory style="flex-wrap: nowrap; width: 100%">
+                            <v-btn
+                                value="absolute"
+                                :disabled="['printing'].includes(printer_state)"
+                                dense
+                                class="btnMinWidthAuto flex-grow-1 px-0"
+                                style="height: 28px">
+                                <span class="body-2">{{ $t('Panels.ToolheadControlPanel.Absolute') }}</span>
+                            </v-btn>
+                            <v-btn
+                                value="relative"
+                                :disabled="['printing'].includes(printer_state)"
+                                dense
+                                class="btnMinWidthAuto flex-grow-1 px-0"
+                                style="height: 28px">
+                                <span class="body-2">{{ $t('Panels.ToolheadControlPanel.Relative') }}</span>
+                            </v-btn>
+                        </v-btn-toggle>
+                    </v-col>
+                </v-row>
+                <v-form class="pt-3" @keyup.native.enter="sendCmd">
+                    <v-row dense>
+                        <v-col :class="el.is.small ? 'col-12' : 'col-4'">
+                            <move-to-input
+                                v-model="input.x.pos"
+                                :label="livePositions.x"
+                                :suffix="'X'"
+                                :position-max="stepperXmax"
+                                :position-min="stepperXmin"
+                                :current-pos="gcodePositions.x"
+                                :readonly="['printing'].includes(printer_state)"
+                                :disabled="!xAxisHomed"
+                                @validate="validate"></move-to-input>
+                        </v-col>
+                        <v-col :class="el.is.small ? 'col-12' : 'col-4'">
+                            <move-to-input
+                                v-model="input.y.pos"
+                                :label="livePositions.y"
+                                :suffix="'Y'"
+                                :position-max="stepperYmax"
+                                :position-min="stepperYmin"
+                                :current-pos="gcodePositions.y"
+                                :readonly="['printing'].includes(printer_state)"
+                                :disabled="!yAxisHomed"
+                                @validate="validate"></move-to-input>
+                        </v-col>
+                        <v-col :class="el.is.small ? 'col-12' : 'col-4'">
+                            <move-to-input
+                                v-model="input.z.pos"
+                                :label="livePositions.z"
+                                :suffix="'Z'"
+                                :position-max="stepperZmax"
+                                :position-min="stepperZmin"
+                                :current-pos="gcodePositions.z"
+                                :readonly="['printing'].includes(printer_state)"
+                                :disabled="!zAxisHomed"
+                                @validate="validate"></move-to-input>
+                        </v-col>
+                    </v-row>
+                </v-form>
+            </v-container>
+        </template>
+    </responsive>
+</template>
+
+<script lang="ts">
+import { Component, Mixins, Watch } from 'vue-property-decorator'
+import BaseMixin from '@/components/mixins/base'
+import ControlMixin from '@/components/mixins/control'
+import MoveToInput from '@/components/inputs/MoveToInput.vue'
+import Responsive from '@/components/ui/Responsive.vue'
+
+@Component({
+    components: { MoveToInput, Responsive },
+})
+export default class MoveToControl extends Mixins(BaseMixin, ControlMixin) {
+    input: { [index: string]: any } = {
+        x: { pos: '', valid: true },
+        y: { pos: '', valid: true },
+        z: { pos: '', valid: true },
+    }
+
+    validate(event: { axis: string; valid: boolean }): void {
+        this.input[event.axis].valid = event.valid
+    }
+
+    @Watch('gcodePositions.x', { immediate: true })
+    updatePositionX(newVal: string): void {
+        this.input.x.pos = newVal
+    }
+
+    @Watch('gcodePositions.y', { immediate: true })
+    updatePositionY(newVal: string): void {
+        this.input.y.pos = newVal
+    }
+
+    @Watch('gcodePositions.z', { immediate: true })
+    updatePositionZ(newVal: string): void {
+        this.input.z.pos = newVal
+    }
+
+    /**
+     * Axes home states
+     */
+    get xAxisHomed(): boolean {
+        return this.$store.state.printer.toolhead?.homed_axes.includes('x') ?? false
+    }
+
+    get yAxisHomed(): boolean {
+        return this.$store.state.printer.toolhead?.homed_axes.includes('y') ?? false
+    }
+
+    get zAxisHomed(): boolean {
+        return this.$store.state.printer.toolhead?.homed_axes.includes('z') ?? false
+    }
+
+    /**
+     * Axis limits
+     */
+    get stepperXmin(): number {
+        return this.$store.state.printer.configfile?.settings?.stepper_x?.position_min ?? Number.NEGATIVE_INFINITY
+    }
+
+    get stepperXmax(): number {
+        return this.$store.state.printer.configfile?.settings?.stepper_x?.position_max ?? Number.POSITIVE_INFINITY
+    }
+
+    get stepperYmin(): number {
+        return this.$store.state.printer.configfile?.settings?.stepper_y?.position_min ?? Number.NEGATIVE_INFINITY
+    }
+
+    get stepperYmax(): number {
+        return this.$store.state.printer.configfile?.settings?.stepper_y?.position_max ?? Number.POSITIVE_INFINITY
+    }
+
+    get stepperZmin(): number {
+        return this.$store.state.printer.configfile?.settings?.stepper_z?.position_min ?? Number.NEGATIVE_INFINITY
+    }
+
+    get stepperZmax(): number {
+        return this.$store.state.printer.configfile?.settings?.stepper_z?.position_max ?? Number.POSITIVE_INFINITY
+    }
+
+    /**
+     * Axes positions and positioning mode (G90 / G91)
+     */
+    get displayPositionAbsolute() {
+        return this.positionAbsolute
+            ? this.$t('Panels.ToolheadControlPanel.Absolute')
+            : this.$t('Panels.ToolheadControlPanel.Relative')
+    }
+
+    get positionAbsolute() {
+        return this.$store.state.printer.gcode_move?.absolute_coordinates ?? true
+    }
+
+    get positionString() {
+        return this.positionAbsolute ? 'absolute' : 'relative'
+    }
+
+    set positionString(newVal) {
+        let gcode = 'G90'
+        if (newVal === 'relative') gcode = 'G91'
+
+        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: gcode })
+    }
+
+    get livePositions() {
+        const pos = this.$store.state.printer.motion_report?.live_position ?? [0, 0, 0]
+        return {
+            x: pos[0]?.toFixed(2) ?? '--',
+            y: pos[1]?.toFixed(2) ?? '--',
+            z: pos[2]?.toFixed(3) ?? '--',
+        }
+    }
+
+    get gcodePositions() {
+        const pos = this.$store.state.printer.gcode_move?.gcode_position ?? [0, 0, 0]
+        return {
+            x: pos[0]?.toFixed(2) ?? '--',
+            y: pos[1]?.toFixed(2) ?? '--',
+            z: pos[2]?.toFixed(3) ?? '--',
+        }
+    }
+
+    sendCmd(): void {
+        const xPos = this.input.x.pos !== this.gcodePositions.x ? ` X${this.input.x.pos}` : ''
+        const yPos = this.input.y.pos !== this.gcodePositions.y ? ` Y${this.input.y.pos}` : ''
+        const zPos = this.input.z.pos !== this.gcodePositions.z ? ` Z${this.input.z.pos}` : ''
+
+        let gcode = ''
+        if (!this.positionAbsolute) {
+            gcode += 'G90\n'
+        }
+        if (zPos !== '') {
+            gcode += `G1${zPos} F${this.feedrateZ * 60}\n`
+        }
+        if (xPos !== '' || yPos !== '') {
+            gcode += `G1${xPos}${yPos} F${this.feedrateXY * 60}`
+        }
+
+        if (gcode !== '' && this.input.x.valid && this.input.y.valid && this.input.z.valid) {
+            this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+            this.$socket.emit('printer.gcode.script', { script: gcode })
+        }
+
+        return
+    }
+}
+</script>
diff --git a/src/components/panels/ToolheadControls/ZoffsetControl.vue b/src/components/panels/ToolheadControls/ZoffsetControl.vue
new file mode 100644
index 000000000..8aa9f8c30
--- /dev/null
+++ b/src/components/panels/ToolheadControls/ZoffsetControl.vue
@@ -0,0 +1,296 @@
+<style lang="scss" scoped>
+.v-btn-toggle {
+    width: 100%;
+}
+
+._btn-group {
+    border-radius: 4px;
+    display: inline-flex;
+    flex-wrap: nowrap;
+    max-width: 100%;
+    min-width: 100%;
+    width: 100%;
+
+    .v-btn {
+        border-radius: 0;
+        border-color: rgba(255, 255, 255, 0.12);
+        border-style: solid;
+        border-width: thin;
+        box-shadow: none;
+        height: 28px;
+        opacity: 0.8;
+        min-width: auto !important;
+    }
+
+    .v-btn:first-child {
+        border-top-left-radius: inherit;
+        border-bottom-left-radius: inherit;
+    }
+
+    .v-btn:last-child {
+        border-top-right-radius: inherit;
+        border-bottom-right-radius: inherit;
+    }
+
+    .v-btn:not(:first-child) {
+        border-left-width: 0;
+    }
+}
+
+._btn-qs {
+    font-size: 0.8rem !important;
+    font-weight: 400;
+    max-height: 28px;
+}
+</style>
+
+<template>
+    <responsive
+        :breakpoints="{
+            xsmall: (el) => el.width <= 285,
+        }">
+        <template #default="{ el }">
+            <v-container class="pa-0">
+                <v-row>
+                    <v-col class="v-subheader text--secondary pr-0">
+                        <v-icon small class="mr-2">
+                            {{ mdiLayersOutline }}
+                        </v-icon>
+                        <span>{{ $t('Panels.ZoffsetPanel.Headline') }}: {{ zOffset }}</span>
+                    </v-col>
+                    <v-col class="v-subheader justify-end pl-0">
+                        <div class="d-flex align-center">
+                            <v-btn
+                                v-if="z_gcode_offset !== 0"
+                                :loading="loadings.includes('babySteppingClear')"
+                                text
+                                small
+                                plain
+                                class="px-2 mr-1"
+                                @click="clearZOffset()">
+                                <v-icon small>{{ mdiBroom }}</v-icon>
+                                <span v-if="!el.is.xsmall" class="ml-1">{{ $t('Panels.ZoffsetPanel.Clear') }}</span>
+                            </v-btn>
+                            <v-btn
+                                v-if="
+                                    z_gcode_offset !== 0 &&
+                                    ((existZOffsetApplyProbe && !existZOffsetApplyEndstop) ||
+                                        (!existZOffsetApplyProbe && existZOffsetApplyEndstop))
+                                "
+                                color="primary"
+                                text
+                                small
+                                plain
+                                class="px-2"
+                                @click="saveZOffset">
+                                <v-icon small>{{ mdiContentSave }}</v-icon>
+                                <span v-if="!el.is.xsmall" class="ml-1">{{ $t('Panels.ZoffsetPanel.Save') }}</span>
+                            </v-btn>
+                            <v-menu v-else-if="z_gcode_offset !== 0" offset-y left :close-on-content-click="false">
+                                <template #activator="{ on, attrs }">
+                                    <v-btn plain text small color="primary" v-bind="attrs" class="pl-2 pr-0" v-on="on">
+                                        <v-icon small>{{ mdiContentSave }}</v-icon>
+                                        <span v-if="!el.is.xsmall" class="ml-1">
+                                            {{ $t('Panels.ZoffsetPanel.Save') }}
+                                        </span>
+                                        <v-icon small>{{ mdiMenuDown }}</v-icon>
+                                    </v-btn>
+                                </template>
+                                <v-list dense>
+                                    <v-list-item>
+                                        <v-btn small style="width: 100%" @click="saveZOffsetToEndstop">
+                                            <v-icon left small>{{ mdiElectricSwitch }}</v-icon>
+                                            {{ $t('Panels.ZoffsetPanel.ToEndstop') }}
+                                        </v-btn>
+                                    </v-list-item>
+                                    <v-list-item>
+                                        <v-btn small style="width: 100%" @click="saveZOffsetToProbe">
+                                            <v-icon left small>{{ mdiElevator }}</v-icon>
+                                            {{ $t('Panels.ZoffsetPanel.ToProbe') }}
+                                        </v-btn>
+                                    </v-list-item>
+                                </v-list>
+                            </v-menu>
+                        </div>
+                    </v-col>
+                </v-row>
+                <v-row dense>
+                    <v-col>
+                        <div class="d-flex align-center">
+                            <v-item-group class="_btn-group">
+                                <v-btn
+                                    v-for="(offset, index) in offsetsZ"
+                                    :key="`offsetsUp-${index}`"
+                                    small
+                                    class="_btn-qs flex-grow-1 px-1"
+                                    @click="sendBabyStepUp(offset)">
+                                    <v-icon v-if="index === 0 && !el.is.xsmall" left small class="mr-1 ml-1">
+                                        {{ mdiArrowSplitHorizontal }}
+                                    </v-icon>
+                                    <span>&plus;{{ offset }}</span>
+                                </v-btn>
+                            </v-item-group>
+                        </div>
+                    </v-col>
+                    <v-col>
+                        <v-item-group class="_btn-group">
+                            <v-btn
+                                v-for="(offset, index) in offsetsZ"
+                                :key="`offsetsDown-${index}`"
+                                small
+                                class="_btn-qs flex-grow-1 px-1"
+                                @click="sendBabyStepDown(offset)">
+                                <v-icon v-if="index === 0 && !el.is.xsmall" left small class="mr-1 ml-1">
+                                    {{ mdiArrowCollapseVertical }}
+                                </v-icon>
+                                <span>&minus;{{ offset }}</span>
+                            </v-btn>
+                        </v-item-group>
+                    </v-col>
+                </v-row>
+
+                <v-dialog v-model="saveOffsetDialog" max-width="290">
+                    <panel
+                        :title="$t('Panels.ZoffsetPanel.SaveInfoHeadline').toString()"
+                        :icon="mdiInformation"
+                        card-class="zoffset-saveinfo-dialog"
+                        :margin-bottom="false">
+                        <v-card-text v-if="printerIsPrinting" class="mt-3">
+                            {{ $t('Panels.ZoffsetPanel.SaveInfoDescriptionPrint') }}
+                        </v-card-text>
+                        <v-card-text v-else class="mt-3">
+                            {{ $t('Panels.ZoffsetPanel.SaveInfoDescription') }}
+                        </v-card-text>
+                        <v-card-actions v-if="printerIsPrinting">
+                            <v-spacer></v-spacer>
+                            <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Ok') }}</v-btn>
+                        </v-card-actions>
+                        <v-card-actions v-else>
+                            <v-spacer></v-spacer>
+                            <v-btn color="primary" text @click="saveConfig">
+                                {{ $t('Panels.ZoffsetPanel.SaveConfig') }}
+                            </v-btn>
+                            <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Later') }}</v-btn>
+                        </v-card-actions>
+                    </panel>
+                </v-dialog>
+            </v-container>
+        </template>
+    </responsive>
+</template>
+
+<script lang="ts">
+import { Component, Mixins } from 'vue-property-decorator'
+import { CommandHelp } from '@/store/printer/types'
+import BaseMixin from '@/components/mixins/base'
+import Panel from '@/components/ui/Panel.vue'
+import Responsive from '@/components/ui/Responsive.vue'
+
+import {
+    mdiBroom,
+    mdiElectricSwitch,
+    mdiElevator,
+    mdiContentSave,
+    mdiArrowCollapseVertical,
+    mdiInformation,
+    mdiMenuDown,
+    mdiArrowSplitHorizontal,
+    mdiLayersOutline,
+} from '@mdi/js'
+@Component({
+    components: { Panel, Responsive },
+})
+export default class ZoffsetControl extends Mixins(BaseMixin) {
+    mdiBroom = mdiBroom
+    mdiElectricSwitch = mdiElectricSwitch
+    mdiElevator = mdiElevator
+    mdiContentSave = mdiContentSave
+    mdiArrowCollapseVertical = mdiArrowCollapseVertical
+    mdiInformation = mdiInformation
+    mdiMenuDown = mdiMenuDown
+    mdiArrowSplitHorizontal = mdiArrowSplitHorizontal
+    mdiLayersOutline = mdiLayersOutline
+
+    private saveOffsetDialog = false
+
+    get homing_origin() {
+        return this.$store.state.printer?.gcode_move?.homing_origin ?? []
+    }
+
+    get z_gcode_offset() {
+        return this.homing_origin.length > 1 ? Math.round(this.homing_origin[2] * 1000) / 1000 : 0
+    }
+
+    get offsetsZ() {
+        return this.$store.state.gui.control.offsetsZ
+    }
+
+    get homed_axis() {
+        return this.$store.state.printer.toolhead.homed_axes ?? ''
+    }
+
+    get helplist() {
+        return this.$store.state.printer.helplist ?? []
+    }
+
+    get existZOffsetApplyProbe() {
+        return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_probe') !== -1
+    }
+
+    get existZOffsetApplyEndstop() {
+        return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_endstop') !== -1
+    }
+
+    get zOffset(): number {
+        return this.$store.state.printer?.gcode_move?.homing_origin[2].toFixed(3)
+    }
+
+    sendBabyStepDown(offset: number): void {
+        const gcode = `SET_GCODE_OFFSET Z_ADJUST=-${offset} ${this.homed_axis === 'xyz' ? 'MOVE=1' : ''}`
+        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babyStepDown' })
+    }
+
+    sendBabyStepUp(offset: number): void {
+        const gcode = `SET_GCODE_OFFSET Z_ADJUST=+${offset} ${this.homed_axis === 'xyz' ? 'MOVE=1' : ''}`
+        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babyStepUp' })
+    }
+
+    clearZOffset(): void {
+        const gcode = 'SET_GCODE_OFFSET Z=0' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '')
+        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingClear' })
+    }
+
+    saveZOffset(): void {
+        if (this.existZOffsetApplyProbe && !this.existZOffsetApplyEndstop) {
+            this.saveZOffsetToProbe()
+        }
+        if (!this.existZOffsetApplyProbe && this.existZOffsetApplyEndstop) {
+            this.saveZOffsetToEndstop()
+        }
+    }
+
+    saveZOffsetToEndstop(): void {
+        const gcode = 'Z_OFFSET_APPLY_ENDSTOP'
+        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: gcode })
+        this.saveOffsetDialog = true
+    }
+
+    saveZOffsetToProbe(): void {
+        const gcode = 'Z_OFFSET_APPLY_PROBE'
+        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: gcode })
+        this.saveOffsetDialog = true
+    }
+
+    saveConfig(): void {
+        const gcode = 'SAVE_CONFIG'
+        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
+        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'topbarSaveConfig' })
+        this.saveOffsetDialog = false
+    }
+}
+</script>
diff --git a/src/components/panels/ZoffsetPanel.vue b/src/components/panels/ZoffsetPanel.vue
deleted file mode 100644
index 1c4541183..000000000
--- a/src/components/panels/ZoffsetPanel.vue
+++ /dev/null
@@ -1,266 +0,0 @@
-<style></style>
-
-<template>
-    <div>
-        <panel
-            v-if="displayPanel"
-            :icon="mdiArrowCollapseVertical"
-            :title="$t('Panels.ZoffsetPanel.Headline')"
-            :collapsible="true"
-            card-class="zoffset-panel">
-            <template #buttons>
-                <template v-if="z_gcode_offset !== 0">
-                    <v-btn icon tile :loading="loadings.includes('babySteppingClear')" @click="clearZOffset()">
-                        <v-icon>{{ mdiBroom }}</v-icon>
-                    </v-btn>
-                    <v-menu v-if="existZOffsetApplyProbe && existZOffsetApplyEndstop" offset-y left>
-                        <template #activator="{ on, attrs }">
-                            <v-btn text tile color="primary" v-bind="attrs" class="pa-1" v-on="on">
-                                <span class="ml-1">{{ $t('Panels.ZoffsetPanel.Save') }}</span>
-                                <v-icon>{{ mdiMenuDown }}</v-icon>
-                            </v-btn>
-                        </template>
-                        <v-list dense class="py-0">
-                            <v-list-item link @click="saveZOffsetToEndstop">
-                                <v-list-item-icon class="mr-0">
-                                    <v-icon small>{{ mdiElectricSwitch }}</v-icon>
-                                </v-list-item-icon>
-                                <v-list-item-content>
-                                    <v-list-item-title>{{ $t('Panels.ZoffsetPanel.ToEndstop') }}</v-list-item-title>
-                                </v-list-item-content>
-                            </v-list-item>
-                            <v-list-item link @click="saveZOffsetToProbe">
-                                <v-list-item-icon class="mr-0">
-                                    <v-icon small>{{ mdiElevator }}</v-icon>
-                                </v-list-item-icon>
-                                <v-list-item-content>
-                                    <v-list-item-title>{{ $t('Panels.ZoffsetPanel.ToProbe') }}</v-list-item-title>
-                                </v-list-item-content>
-                            </v-list-item>
-                        </v-list>
-                    </v-menu>
-                    <v-btn
-                        v-else-if="existZOffsetApplyProbe && !existZOffsetApplyEndstop"
-                        text
-                        tile
-                        class="px-2 minwidth-0"
-                        color="primary ml-3"
-                        @click="saveZOffsetToProbe">
-                        <v-icon small class="mr-1">{{ mdiContentSave }}</v-icon>
-                        {{ $t('Panels.ZoffsetPanel.Save') }}
-                    </v-btn>
-                    <v-btn
-                        v-else-if="!existZOffsetApplyProbe && existZOffsetApplyEndstop"
-                        text
-                        tile
-                        class="px-2 minwidth-0"
-                        color="primary ml-3"
-                        @click="saveZOffsetToEndstop">
-                        <v-icon small class="mr-1">{{ mdiContentSave }}</v-icon>
-                        {{ $t('Panels.ZoffsetPanel.Save') }}
-                    </v-btn>
-                </template>
-            </template>
-            <v-card-text class="px-0 py-0">
-                <v-container>
-                    <v-row class="py-0">
-                        <v-col class="pb-0 text-center">
-                            <p class="mb-0">
-                                {{ $t('Panels.ZoffsetPanel.CurrentOffset') }}: {{ z_gcode_offset.toFixed(3) }}mm
-                            </p>
-                        </v-col>
-                    </v-row>
-                    <v-row>
-                        <v-col class="col text-center d-flex flex-column align-center flex-sm-row justify-center">
-                            <v-btn-toggle
-                                dense
-                                no-gutters
-                                class="mx-2 mt-3 mt-sm-0 order-last flex-nowrap order-sm-first">
-                                <v-btn
-                                    small
-                                    class=""
-                                    :loading="loadings.includes('babySteppingDownFine')"
-                                    @click="sendBabySteppingDownFine()">
-                                    <v-icon small class="mr-2">{{ mdiArrowCollapseDown }}</v-icon>
-                                    -0.01
-                                    <span class="d-sm-none d-md-inline">mm</span>
-                                </v-btn>
-                                <v-btn
-                                    small
-                                    class=""
-                                    :loading="loadings.includes('babySteppingDown')"
-                                    @click="sendBabySteppingDown()">
-                                    -0.05
-                                    <span class="d-sm-none d-md-inline">mm</span>
-                                </v-btn>
-                            </v-btn-toggle>
-                            <v-btn-toggle dense no-gutters class="mx-2 order-first flex-nowrap order-sm-last">
-                                <v-btn
-                                    small
-                                    class=""
-                                    :loading="loadings.includes('babySteppingUpFine')"
-                                    @click="sendBabySteppingUpFine()">
-                                    <v-icon small class="mr-2">{{ mdiArrowExpandUp }}</v-icon>
-                                    +0.01
-                                    <span class="d-sm-none d-md-inline">mm</span>
-                                </v-btn>
-                                <v-btn
-                                    small
-                                    class=""
-                                    :loading="loadings.includes('babySteppingUp')"
-                                    @click="sendBabySteppingUp()">
-                                    +0.05
-                                    <span class="d-sm-none d-md-inline">mm</span>
-                                </v-btn>
-                            </v-btn-toggle>
-                        </v-col>
-                    </v-row>
-                </v-container>
-            </v-card-text>
-        </panel>
-        <v-dialog v-model="saveOffsetDialog" max-width="290">
-            <panel
-                :title="$t('Panels.ZoffsetPanel.SaveInfoHeadline')"
-                :icon="mdiInformation"
-                card-class="zoffset-saveinfo-dialog"
-                :margin-bottom="false">
-                <v-card-text v-if="printerIsPrinting" class="mt-3">
-                    {{ $t('Panels.ZoffsetPanel.SaveInfoDescriptionPrint') }}
-                </v-card-text>
-                <v-card-text v-else class="mt-3">{{ $t('Panels.ZoffsetPanel.SaveInfoDescription') }}</v-card-text>
-                <v-card-actions v-if="printerIsPrinting">
-                    <v-spacer></v-spacer>
-                    <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Ok') }}</v-btn>
-                </v-card-actions>
-                <v-card-actions v-else>
-                    <v-spacer></v-spacer>
-                    <v-btn color="primary" text @click="saveConfig">{{ $t('Panels.ZoffsetPanel.SAVE_CONFIG') }}</v-btn>
-                    <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Later') }}</v-btn>
-                </v-card-actions>
-            </panel>
-        </v-dialog>
-    </div>
-</template>
-
-<script lang="ts">
-import { Component, Mixins } from 'vue-property-decorator'
-import BaseMixin from '../mixins/base'
-import { CommandHelp } from '@/store/printer/types'
-import Panel from '@/components/ui/Panel.vue'
-import {
-    mdiBroom,
-    mdiMenuDown,
-    mdiElectricSwitch,
-    mdiElevator,
-    mdiContentSave,
-    mdiArrowCollapseVertical,
-    mdiArrowCollapseDown,
-    mdiArrowExpandUp,
-    mdiInformation,
-} from '@mdi/js'
-@Component({
-    components: { Panel },
-})
-export default class ZoffsetPanel extends Mixins(BaseMixin) {
-    mdiBroom = mdiBroom
-    mdiMenuDown = mdiMenuDown
-    mdiElectricSwitch = mdiElectricSwitch
-    mdiElevator = mdiElevator
-    mdiContentSave = mdiContentSave
-    mdiArrowCollapseVertical = mdiArrowCollapseVertical
-    mdiArrowCollapseDown = mdiArrowCollapseDown
-    mdiArrowExpandUp = mdiArrowExpandUp
-    mdiInformation = mdiInformation
-
-    private saveOffsetDialog = false
-
-    get displayPanel() {
-        if (!this.klippyIsConnected) return false
-
-        if (this.displayZOffsetStandby) return this.klipperReadyForGui
-        else if (this.klipperReadyForGui && this.z_gcode_offset !== 0) return true
-        else if (['printing', 'paused'].includes(this.printer_state)) return true
-
-        return false
-    }
-
-    get displayZOffsetStandby() {
-        return this.$store.state.gui.uiSettings.displayZOffsetStandby ?? false
-    }
-
-    get homing_origin() {
-        return this.$store.state.printer?.gcode_move?.homing_origin ?? []
-    }
-
-    get z_gcode_offset() {
-        return this.homing_origin.length > 1 ? Math.round(this.homing_origin[2] * 1000) / 1000 : 0
-    }
-
-    get homed_axis() {
-        return this.$store.state.printer.toolhead.homed_axes ?? ''
-    }
-
-    get helplist() {
-        return this.$store.state.printer.helplist ?? []
-    }
-
-    get existZOffsetApplyProbe() {
-        return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_probe') !== -1
-    }
-
-    get existZOffsetApplyEndstop() {
-        return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_endstop') !== -1
-    }
-
-    sendBabySteppingDownFine() {
-        const gcode = 'SET_GCODE_OFFSET Z_ADJUST=-0.01' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '')
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingDownFine' })
-    }
-
-    sendBabySteppingDown() {
-        const gcode = 'SET_GCODE_OFFSET Z_ADJUST=-0.05' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '')
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingDown' })
-    }
-
-    sendBabySteppingUpFine() {
-        const gcode = 'SET_GCODE_OFFSET Z_ADJUST=0.01' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '')
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingUpFine' })
-    }
-
-    sendBabySteppingUp() {
-        const gcode = 'SET_GCODE_OFFSET Z_ADJUST=0.05' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '')
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingUp' })
-    }
-
-    clearZOffset() {
-        const gcode = 'SET_GCODE_OFFSET Z=0' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '')
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingClear' })
-    }
-
-    saveZOffsetToEndstop() {
-        const gcode = 'Z_OFFSET_APPLY_ENDSTOP'
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode })
-        this.saveOffsetDialog = true
-    }
-
-    saveZOffsetToProbe() {
-        const gcode = 'Z_OFFSET_APPLY_PROBE'
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode })
-        this.saveOffsetDialog = true
-    }
-
-    saveConfig() {
-        const gcode = 'SAVE_CONFIG'
-        this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' })
-        this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'topbarSaveConfig' })
-        this.saveOffsetDialog = false
-    }
-}
-</script>
diff --git a/src/components/settings/SettingsConsoleTab.vue b/src/components/settings/SettingsConsoleTab.vue
index 2d0bb6214..27542e35c 100644
--- a/src/components/settings/SettingsConsoleTab.vue
+++ b/src/components/settings/SettingsConsoleTab.vue
@@ -4,7 +4,7 @@
     <div>
         <v-card v-if="!form.bool" flat>
             <v-card-text>
-                <settings-row :title="$t('Settings.ConsoleTab.Direction')">
+                <settings-row :title="$t('Settings.ConsoleTab.Direction').toString()">
                     <v-select
                         v-model="consoleDirection"
                         :items="availableDirections"
@@ -14,7 +14,7 @@
                         attach></v-select>
                 </settings-row>
                 <v-divider class="my-2"></v-divider>
-                <settings-row :title="$t('Settings.ConsoleTab.EntryStyle')">
+                <settings-row :title="$t('Settings.ConsoleTab.EntryStyle').toString()">
                     <v-select
                         v-model="entryStyle"
                         :items="availableEntryStyles"
@@ -24,7 +24,7 @@
                         attach></v-select>
                 </settings-row>
                 <v-divider class="my-2"></v-divider>
-                <settings-row :title="$t('Settings.ConsoleTab.Height')">
+                <settings-row :title="$t('Settings.ConsoleTab.Height').toString()">
                     <v-slider
                         v-model="consoleHeightTmp"
                         hide-details
@@ -35,12 +35,14 @@
                         @change="updateConsoleHeight"></v-slider>
                 </settings-row>
                 <v-divider class="my-2"></v-divider>
-                <settings-row :title="$t('Settings.ConsoleTab.HideTemperatures')" :dynamic-slot-width="true">
+                <settings-row :title="$t('Settings.ConsoleTab.HideTemperatures').toString()" :dynamic-slot-width="true">
                     <v-switch v-model="hideWaitTemperatures" hide-details class="mt-0"></v-switch>
                 </settings-row>
                 <template v-if="moonrakerComponents.includes('timelapse')">
                     <v-divider class="my-2"></v-divider>
-                    <settings-row :title="$t('Settings.ConsoleTab.HideTimelapse')" :dynamic-slot-width="true">
+                    <settings-row
+                        :title="$t('Settings.ConsoleTab.HideTimelapse').toString()"
+                        :dynamic-slot-width="true">
                         <v-switch v-model="hideTimelapse" hide-details class="mt-0"></v-switch>
                     </settings-row>
                 </template>
@@ -85,7 +87,7 @@
                     }}
                 </v-card-title>
                 <v-card-text>
-                    <settings-row :title="$t('Settings.ConsoleTab.Name')">
+                    <settings-row :title="$t('Settings.ConsoleTab.Name').toString()">
                         <v-text-field
                             v-model="form.name"
                             hide-details="auto"
@@ -94,7 +96,7 @@
                             outlined></v-text-field>
                     </settings-row>
                     <v-divider class="my-2"></v-divider>
-                    <settings-row :title="$t('Settings.ConsoleTab.Regex')">
+                    <settings-row :title="$t('Settings.ConsoleTab.Regex').toString()">
                         <v-textarea v-model="form.regex" outlined hide-details="auto"></v-textarea>
                     </settings-row>
                 </v-card-text>
diff --git a/src/components/settings/SettingsControlTab.vue b/src/components/settings/SettingsControlTab.vue
index 6fdfb5362..de438fca0 100644
--- a/src/components/settings/SettingsControlTab.vue
+++ b/src/components/settings/SettingsControlTab.vue
@@ -17,6 +17,24 @@
                             attach></v-select>
                     </settings-row>
                     <v-divider class="my-2"></v-divider>
+                    <template v-if="['circle', 'cross'].includes(controlStyle) && actionOptions.length > 1">
+                        <settings-row :title="'Overwrite action button'">
+                            <v-select
+                                v-model="actionButton"
+                                :items="actionOptions"
+                                outlined
+                                dense
+                                hide-details
+                                attach></v-select>
+                        </settings-row>
+                        <v-divider class="my-2"></v-divider>
+                    </template>
+                    <settings-row
+                        :title="$t('Settings.ControlTab.EnableXYHoming').toString()"
+                        :dynamic-slot-width="true">
+                        <v-switch v-model="enableXYHoming" hide-details class="mt-0"></v-switch>
+                    </settings-row>
+                    <v-divider class="my-2"></v-divider>
                     <template v-if="['circle', 'cross'].includes(controlStyle)">
                         <settings-row
                             :title="$t('Settings.ControlTab.InvertXMovement').toString()"
@@ -63,6 +81,7 @@
                             @blur="blurFeedrateZ"></v-text-field>
                     </settings-row>
                     <v-divider class="my-2"></v-divider>
+                    <!-- CONTROL STYLE CROSS SPECIFICS -->
                     <template v-if="controlStyle === 'cross'">
                         <settings-row
                             :title="$t('Settings.ControlTab.MoveDistancesInMm').toString()"
@@ -88,6 +107,7 @@
                         </settings-row>
                         <v-divider class="my-2"></v-divider>
                     </template>
+                    <!-- CONTROL STYLE CIRCLE SPECIFICS -->
                     <template v-else-if="controlStyle === 'circle'">
                         <settings-row
                             :title="$t('Settings.ControlTab.MoveDistancesXYInMm').toString()"
@@ -132,6 +152,7 @@
                         </settings-row>
                         <v-divider class="my-2"></v-divider>
                     </template>
+                    <!-- CONTROL STYLE BARS SPECIFICS -->
                     <template v-else>
                         <settings-row
                             :title="$t('Settings.ControlTab.MoveDistancesXYInMm').toString()"
@@ -182,6 +203,31 @@
                     </template>
                     <!-- EXTRUDER CONTROL SETTINGS -->
                     <v-card-title class="mx-n4">{{ $t('Panels.ExtruderControlPanel.Headline') }}</v-card-title>
+                    <settings-row
+                        :title="$t('Settings.ControlTab.ZOffsetIncrements').toString()"
+                        :mobile-second-row="true">
+                        <v-combobox
+                            v-model="offsetsZ"
+                            hide-selected
+                            hide-details="auto"
+                            multiple
+                            small-chips
+                            :deletable-chips="true"
+                            append-icon=""
+                            type="number"
+                            :rules="[
+                                (v) => v.length > 0 || $t('Settings.ControlTab.MinimumValues', { minimum: '1' }),
+                                (v) =>
+                                    v.length <= 4 ||
+                                    $t('Settings.ControlTab.MaximumValuesVisibility', { maximum: '4' }),
+                            ]"
+                            dense
+                            outlined
+                            hide-spin-buttons />
+                    </settings-row>
+                    <v-divider class="my-2"></v-divider>
+                    <!-- EXTRUDER CONTROL SETTINGS -->
+                    <v-card-title class="mx-n4">{{ $t('Panels.ExtruderControlPanel.Headline') }}</v-card-title>
                     <settings-row
                         :title="$t('Settings.ControlTab.MoveDistancesEInMm').toString()"
                         :mobile-second-row="true">
@@ -240,11 +286,13 @@
 <script lang="ts">
 import { Component, Mixins } from 'vue-property-decorator'
 import BaseMixin from '@/components/mixins/base'
+import ControlMixin from '@/components/mixins/control'
 import SettingsRow from '@/components/settings/SettingsRow.vue'
+
 @Component({
     components: { SettingsRow },
 })
-export default class SettingsControlTab extends Mixins(BaseMixin) {
+export default class SettingsControlTab extends Mixins(BaseMixin, ControlMixin) {
     declare $refs: {
         formControlExtruder: HTMLFormElement
     }
@@ -274,6 +322,54 @@ export default class SettingsControlTab extends Mixins(BaseMixin) {
         this.$store.dispatch('gui/saveSetting', { name: 'control.style', value: newVal })
     }
 
+    get actionOptions() {
+        let actions = [
+            {
+                text: this.$t('Settings.ControlTab.MotorsOff', {
+                    isDefault: this.defaultActionButton === 'm84' ? this.$t('Settings.ControlTab.IsDefault') : '',
+                }),
+                value: 'm84',
+            },
+        ]
+        if (this.existsQGL) {
+            actions.push({
+                text: this.$t('Settings.ControlTab.QuadGantryLevel', {
+                    isDefault: this.defaultActionButton === 'qgl' ? this.$t('Settings.ControlTab.IsDefault') : '',
+                }),
+                value: 'qgl',
+            })
+        }
+        if (this.existsZtilt) {
+            actions.push({
+                text: this.$t('Settings.ControlTab.ZTiltAdjust', {
+                    isDefault: this.defaultActionButton === 'ztilt' ? this.$t('Settings.ControlTab.IsDefault') : '',
+                }),
+                value: 'ztilt',
+            })
+        }
+        return actions
+    }
+
+    get actionButton(): string {
+        return this.$store.state.gui.control.actionButton ?? this.defaultActionButton
+    }
+
+    set actionButton(newVal) {
+        this.$store.dispatch('gui/saveSetting', { name: 'control.actionButton', value: newVal })
+    }
+
+    get defaultActionButton() {
+        return this.$store.getters['gui/getDefaultControlActionButton']
+    }
+
+    get enableXYHoming(): boolean {
+        return this.$store.state.gui.control.enableXYHoming ?? false
+    }
+
+    set enableXYHoming(newVal) {
+        this.$store.dispatch('gui/saveSetting', { name: 'control.enableXYHoming', value: newVal })
+    }
+
     get reverseX() {
         return this.$store.state.gui.control.reverseX
     }
@@ -314,6 +410,20 @@ export default class SettingsControlTab extends Mixins(BaseMixin) {
         this.$store.dispatch('gui/saveSetting', { name: 'control.feedrateZ', value: newVal })
     }
 
+    get offsetsZ() {
+        const steps = this.$store.state.gui.control.offsetsZ
+        return steps.sort(function (a: number, b: number) {
+            return a - b
+        })
+    }
+
+    set offsetsZ(steps) {
+        // Use a set to prevent adding duplicate entries.
+        const absSteps = new Set()
+        for (const value of steps) absSteps.add(Math.abs(value))
+        this.$store.dispatch('gui/saveSetting', { name: 'control.offsetsZ', value: Array.from(absSteps) })
+    }
+
     get stepsAll() {
         const steps = this.$store.state.gui.control.stepsAll
         return (steps ?? []).sort(function (a: number, b: number) {
diff --git a/src/components/settings/SettingsUiSettingsTab.vue b/src/components/settings/SettingsUiSettingsTab.vue
index 2b5bb2a68..5881030f2 100644
--- a/src/components/settings/SettingsUiSettingsTab.vue
+++ b/src/components/settings/SettingsUiSettingsTab.vue
@@ -211,14 +211,6 @@ export default class SettingsUiSettingsTab extends Mixins(BaseMixin) {
         this.$store.dispatch('gui/saveSetting', { name: 'uiSettings.displayCancelPrint', value: newVal })
     }
 
-    get displayZOffsetStandby() {
-        return this.$store.state.gui.uiSettings.displayZOffsetStandby
-    }
-
-    set displayZOffsetStandby(newVal) {
-        this.$store.dispatch('gui/saveSetting', { name: 'uiSettings.displayZOffsetStandby', value: newVal })
-    }
-
     get confirmOnEmergencyStop() {
         return this.$store.state.gui.uiSettings.confirmOnEmergencyStop
     }
diff --git a/src/locales/da.json b/src/locales/da.json
index 366df946f..3de6dd4c4 100644
--- a/src/locales/da.json
+++ b/src/locales/da.json
@@ -412,22 +412,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "Alle",
-            "AlternateControls": "Alternative kontroller",
-            "Headline": "Kontrolpanel",
-            "InvertX": "Invertér X",
-            "InvertY": "Invertér Y",
-            "InvertZ": "Invertér Z",
-            "PleaseConfigureSteps": "Konfigurer steps",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Indstillinger > Interface > Control",
-            "SetupControls": "Kontrolindstillinger",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z Tilt"
-        },
         "DependenciesPanel": {
             "Dependency": "Afhængighed | Afhængigheder",
             "DependencyDescription": "Din nuværende version af {name} understøtter ikke alle funktioner i Mainsail. Opdater {name} til mindst version {neededVersion}."
@@ -504,13 +488,7 @@
             "On": "Tænd",
             "PowerControl": "Strømstyring"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Ekstrudering",
-            "Headline": "Print indstillinger",
-            "SpeedFactor": "Hastighed"
-        },
         "StatusPanel": {
-            "Absolute": "Absolut",
             "CancelPrint": "Afbryd print",
             "ClearPrintStats": "Slet printstatistik",
             "Difference": "Opvarmning",
@@ -531,19 +509,14 @@
             "Max": "maks",
             "ObjectHeight": "Objekt Højde",
             "PausePrint": "Pause print",
-            "Position": "Position",
             "Print": "Reel printtid",
-            "Relative": "Relativ",
             "ReprintJob": "Print job igen",
             "Requested": "Anmodet",
             "ResumePrint": "Genoptag print",
             "Slicer": "Slicer",
             "Speed": "Hastighed",
             "Total": "Total",
-            "Unknown": "Ukendt",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Ukendt"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Autoskalér diagram",
@@ -572,6 +545,22 @@
             "TempTooHigh": "Temperaturen er for høj for {name}! (max: {max})",
             "TempTooLow": "Temperaturen er for lav for {name}! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "absolut",
+            "ALL": "Alle",
+            "Headline": "Kontrolpanel",
+            "InvertX": "Invertér X",
+            "InvertY": "Invertér Y",
+            "InvertZ": "Invertér Z",
+            "PleaseConfigureSteps": "Konfigurer steps",
+            "Position": "Position",
+            "QGL": "QGL",
+            "Relative": "relativ",
+            "SettingsInterfaceControl": "Indstillinger > Interface > Control",
+            "SetupControls": "Kontrolindstillinger",
+            "SpeedFactor": "Hastighed",
+            "ZTilt": "Z Tilt"
+        },
         "WebcamPanel": {
             "All": "Alle",
             "FPS": "FPS",
@@ -585,9 +574,9 @@
             "Later": "Senere",
             "Ok": "OK",
             "Save": "Gem",
-            "SAVE_CONFIG": "GEM KONFIGURATION",
-            "SaveInfoDescription": "Det nye z-offset er blevet beregnet og registreret. Klik på GEM KONFIGURATION for at gemme det nye z-offset i CONFIG og genstarte Klipper.",
-            "SaveInfoDescriptionPrint": "Det nye z-offset er blevet beregnet og registreret. Klik på GEM KONFIGURATION i topbaren efter endt print for at gemme det nye z-offset i CONFIG og genstarte Klipper.",
+            "SaveConfig": "GEM KONFIGURATION",
+            "SaveInfoDescription": "Det nye z-offset er blevet beregnet og registreret. Klik på \"GEM KONFIGURATION\" for at gemme det nye z-offset i CONFIG og genstarte Klipper.",
+            "SaveInfoDescriptionPrint": "Det nye z-offset er blevet beregnet og registreret. Klik på \"GEM KONFIGURATION\" i topbaren efter endt print for at gemme det nye z-offset i CONFIG og genstarte Klipper.",
             "SaveInfoHeadline": "Information",
             "ToEndstop": "Til Endstop",
             "ToProbe": "Til Probe"
diff --git a/src/locales/de.json b/src/locales/de.json
index 18a2b0eec..a6863b56f 100644
--- a/src/locales/de.json
+++ b/src/locales/de.json
@@ -1,16 +1,9 @@
 {
     "App": {
         "Notifications": {
-            "DependencyName": "Abhängigkeit: {name}",
             "DependencyDescription": "Die momentane {name} Version unterstützt nicht alle Funktionen von Mainsail. Aktualisiere {name} mindestens auf Version {neededVersion}.",
+            "DependencyName": "Abhängigkeit: {name}",
             "DismissAll": "Dismiss all",
-            "MoonrakerWarnings": {
-                "MoonrakerComponent": "Moonraker: {component}",
-                "MoonrakerFailedComponentDescription": "Beim Laden der Moonraker-Komponenten wurde ein Fehler festgestellt. Bitte prüfe die Logdatei und behebe das Problem.",
-                "MoonrakerWarning": "Moonraker Warnung",
-                "UnparsedConfigOption": "Nicht erkannte Config-Option '{option}: {value}' in Abschnitt [{section}] entdeckt. Dies kann eine Option sein, die nicht mehr verfügbar ist, oder das Ergebnis eines Moduls sein, das nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen.",
-                "UnparsedConfigSection": "Nicht erkannter Config-Abschnitt [{section}] gefunden. Dies kann das Ergebnis einer Komponente sein, die nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen."
-            },
             "KlipperWarnings": {
                 "DeprecatedOption": "Option '{option}' im Abschnitt '{section}' ist veraltet und wird in einem zukünftigen Release entfernt.",
                 "DeprecatedOptionHeadline": "Veralterte Klipper Option",
@@ -18,6 +11,13 @@
                 "DeprecatedValueHeadline": "Veralteter Klipper Wert",
                 "KlipperWarning": "Klipper Warnung"
             },
+            "MoonrakerWarnings": {
+                "MoonrakerComponent": "Moonraker: {component}",
+                "MoonrakerFailedComponentDescription": "Beim Laden der Moonraker-Komponenten wurde ein Fehler festgestellt. Bitte prüfe die Logdatei und behebe das Problem.",
+                "MoonrakerWarning": "Moonraker Warnung",
+                "UnparsedConfigOption": "Nicht erkannte Config-Option '{option}: {value}' in Abschnitt [{section}] entdeckt. Dies kann eine Option sein, die nicht mehr verfügbar ist, oder das Ergebnis eines Moduls sein, das nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen.",
+                "UnparsedConfigSection": "Nicht erkannter Config-Abschnitt [{section}] gefunden. Dies kann das Ergebnis einer Komponente sein, die nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen."
+            },
             "Never": "nie",
             "NextReboot": "nächsten Reboot",
             "NoNotification": "Keine Benachrichtigung vorhanden",
@@ -433,22 +433,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "ALLE",
-            "AlternateControls": "Steuerkreuz",
-            "Headline": "Steuerung",
-            "InvertX": "X invertieren",
-            "InvertY": "Y invertieren",
-            "InvertZ": "Z invertieren",
-            "PleaseConfigureSteps": "Bitte Schritte konfigurieren",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Einstellungen > Interface > Steuerung",
-            "SetupControls": "Setup-Steuerelemente",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z Tilt"
-        },
         "ExtruderControlPanel": {
             "Allowed": "Erlaubt",
             "EstimatedExtrusion": "Geschätzte Extrusion:",
@@ -529,13 +513,7 @@
             "On": "An",
             "PowerControl": "Stromversorgung"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Extrusionsfaktor",
-            "Headline": "Druckeinstellungen",
-            "SpeedFactor": "Geschwindigkeitsfaktor"
-        },
         "StatusPanel": {
-            "Absolute": "absolut",
             "CancelPrint": "Druck abbrechen",
             "ClearPrintStats": "Druckstatistiken löschen",
             "Difference": "Unterschied",
@@ -556,22 +534,14 @@
             "Max": "max",
             "ObjectHeight": "Objekthöhe",
             "PausePrint": "Druck pausieren",
-            "Position": "Position",
             "Print": "Druck",
-            "Relative": "relativ",
             "ReprintJob": "Auftrag erneut drucken",
             "Requested": "Angefordert",
             "ResumePrint": "Druck fortführen",
             "Slicer": "Slicer",
             "Speed": "Geschwindigkeit",
             "Total": "Gesamt",
-            "Unknown": "Unbekannt",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
-        },
-        "ToolheadControlPanel": {
-            "Headline": "Werkzeugkopf-Steuerung"
+            "Unknown": "Unbekannt"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Autoskalierung",
@@ -600,6 +570,25 @@
             "TempTooHigh": "Temperature von {name} zu hoch! (max: {max})",
             "TempTooLow": "Temperature von {name} zu niedrig! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "absolut",
+            "ALL": "ALLE",
+            "Headline": "Werkzeugkopf",
+            "InvertX": "X invertieren",
+            "InvertY": "Y invertieren",
+            "InvertZ": "Z invertieren",
+            "PleaseConfigureSteps": "Bitte Schritte konfigurieren",
+            "Position": "Position",
+            "QGL": "QGL",
+            "Relative": "relativ",
+            "SettingsInterfaceControl": "Einstellungen > Interface > Steuerung",
+            "SetupControls": "Setup-Steuerelemente",
+            "SpeedFactor": "Geschwindigkeitsfaktor",
+            "XOffset": "X-Versatz",
+            "YOffset": "Y-Versatz",
+            "ZOffset": "Z-Versatz",
+            "ZTilt": "Z Tilt"
+        },
         "WebcamPanel": {
             "All": "Alle",
             "FPS": "FPS",
@@ -609,14 +598,15 @@
             "UrlNotAvailable": "URL nicht verfügbar"
         },
         "ZoffsetPanel": {
+            "Clear": "Löschen",
             "CurrentOffset": "Aktueller Versatz",
-            "Headline": "Z-Offset",
+            "Headline": "Z-Versatz",
             "Later": "Später",
             "Ok": "OK",
             "Save": "Speichern",
-            "SAVE_CONFIG": "SAVE_CONFIG",
-            "SaveInfoDescription": "Der neue Z-Versatz wurde berechnet und registriert. Auf SAVE_CONFIG, klicken um den neuen Z-Versatz in Ihrer printer.cfg zu speichern und Klipper neu zu starten.",
-            "SaveInfoDescriptionPrint": "Der neue Z-Versatz wurde berechnet und registriert. Nach dem Drucken auf SAVE_CONFIG in der oberen Leiste klicken um die Einstellungen in der Datei printer.cfg zu speichern und Klipper neu zu starten.",
+            "SaveConfig": "SAVE CONFIG",
+            "SaveInfoDescription": "Der neue Z-Versatz wurde berechnet und registriert. Auf \"SAVE CONFIG\", klicken um den neuen Z-Versatz in der printer.cfg zu speichern und Klipper neu zu starten.",
+            "SaveInfoDescriptionPrint": "Der neue Z-Versatz wurde berechnet und registriert. Nach dem Drucken auf \"SAVE CONFIG\" in der oberen Leiste klicken um den neuen Z-Versatz in der printer.cfg zu speichern und Klipper neu zu starten.",
             "SaveInfoHeadline": "Information",
             "ToEndstop": "bis Endschalter",
             "ToProbe": "bis Sensor"
@@ -685,23 +675,31 @@
             "Circle": "Kreis",
             "Control": "Steuerung",
             "Cross": "Kreuz",
-            "EstimatedExtrusionInfo": "Info zur geschätzten Extrusion",
+            "DisplayZOffset": "Z-Offset-Steuerung immer anzeigen",
+            "DisplayZOffsetDescription": "Wenn deaktiviert, dann werden die Steuerelemente nur angezeigt wenn ein Druckvorgang gestartet wurde.",
+            "EnableXYHoming": "Aktiviere kombiniertes X & Y homing",
+            "EstimatedExtrusionInfo": "Zeige Info zur geschätzten Extrusion",
             "EstimatedExtrusionInfoDescription": "Anzeigen/ausblenden der Info zur geschätzten Extrusion, basierend auf Extrusionmenge und Extrusionsgeschwindigkeit",
-            "InvertXMovement": "X-Bewegung invertieren",
-            "InvertYMovement": "Y-Bewegung invertieren",
-            "InvertZMovement": "Z-Bewegung invertieren",
+            "InvertXMovement": "Bewegung der X-Achse invertieren",
+            "InvertYMovement": "Bewegung der Y-Achse invertieren",
+            "InvertZMovement": "Bewegung der Z-Achse invertieren",
+            "IsDefault": " (standard)",
             "MaximumValues": "Maximum: {maximum} Einträge",
             "MaximumValuesVisibility": "Maximal {maximum} Einträge für beste Darstellung",
             "MinimumValues": "Minimum: {minimum} Eintrag",
-            "MoveDistancesEInMm": "Verfahrwege E in mm",
-            "MoveDistancesInMm": "Abstände in mm verschieben",
-            "MoveDistancesXYInMm": "Verfahrwege XY in mm",
-            "MoveDistancesZInMm": "Verfahrwege Z in mm",
-            "SpeedEInMms": "Geschw. E in mm/s",
-            "SpeedXY": "Geschw. XY",
-            "SpeedZ": "Geschw. Z",
+            "MotorsOff": "Motoren aus{isDefault}",
+            "MoveDistancesEInMm": "Extrusionslängen (in mm)",
+            "MoveDistancesInMm": "Schrittweiten (in mm)",
+            "MoveDistancesXYInMm": "Schrittweiten X & Y-Achse (in mm)",
+            "MoveDistancesZInMm": "Schrittweiten Z-Achse (in mm)",
+            "QuadGantryLevel": "Quad Gantry Level{isDefault}",
+            "SpeedEInMms": "Extrusions-Geschwindigkeit (in mm/s)",
+            "SpeedXY": "Geschwindigkeit X & Y-Achse (in mm/s)",
+            "SpeedZ": "Geschwindigkeit Z-Achse (in mm/s)",
             "Style": "Stil",
-            "ValueGreaterThan": "Wert muss größer als {value} sein"
+            "ValueGreaterThan": "Wert muss größer als {value} sein",
+            "ZOffsetIncrements": "Schrittweiten Z-Versatz (in mm)",
+            "ZTiltAdjust": "Z-Tilt Adjust{isDefault}"
         },
         "DashboardTab": {
             "Dashboard": "Dashboard",
@@ -898,8 +896,6 @@
             "ConfirmOnPowerDeviceChangeDescription": "Zeige vor Änderung der Stromversorgung von Geräten einen Bestätigungsdialog.",
             "DisplayCANCEL_PRINT": "Zeige CANCEL_PRINT an",
             "DisplayCANCEL_PRINTDescription": "Zeigt die CANCEL_PRINT Schaltfläche dauerhaft an - keine weitere Bestätigung erforderlich.",
-            "DisplayZOffset": "Zeige Z-Offset-Panel an",
-            "DisplayZOffsetDescription": "Andernfalls wird das Bedienfeld nur nach dem Starten eines Drucks angezeigt .",
             "GcodeThumbnails": "G-Code Vorschaubilder",
             "GcodeThumbnailsDescription": "Klicke auf die Schaltfläche um zum Leitfaden zu gelangen.",
             "Guide": "Leitfaden",
diff --git a/src/locales/en.json b/src/locales/en.json
index ab0082564..b42c48945 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -1,16 +1,9 @@
 {
     "App": {
         "Notifications": {
-            "DependencyName": "Dependency: {name}",
             "DependencyDescription": "The current {name} version does not support all features of Mainsail. Update {name} to at least {neededVersion}.",
+            "DependencyName": "Dependency: {name}",
             "DismissAll": "Dismiss all",
-            "MoonrakerWarnings": {
-                "MoonrakerComponent": "Moonraker: {component}",
-                "MoonrakerFailedComponentDescription": "An error was detected while loading the moonraker component '{component}'. Please check the logfile and fix the issue.",
-                "MoonrakerWarning": "Moonraker warning",
-                "UnparsedConfigOption": "Unparsed config option '{option}: {value}' detected in section [{section}]. This may be an option no longer available or could be the result of a module that failed to load. In the future this will result in a startup error.",
-                "UnparsedConfigSection": "Unparsed config section [{section}] detected. This may be the result of a component that failed to load. In the future this will result in a startup error."
-            },
             "KlipperWarnings": {
                 "DeprecatedOption": "Option '{option}' in section '{section}' is deprecated and will be removed in a future release.",
                 "DeprecatedOptionHeadline": "Deprecated Klipper Option",
@@ -18,6 +11,13 @@
                 "DeprecatedValueHeadline": "Deprecated Klipper Value",
                 "KlipperWarning": "Klipper warning"
             },
+            "MoonrakerWarnings": {
+                "MoonrakerComponent": "Moonraker: {component}",
+                "MoonrakerFailedComponentDescription": "An error was detected while loading the moonraker component '{component}'. Please check the logfile and fix the issue.",
+                "MoonrakerWarning": "Moonraker warning",
+                "UnparsedConfigOption": "Unparsed config option '{option}: {value}' detected in section [{section}]. This may be an option no longer available or could be the result of a module that failed to load. In the future this will result in a startup error.",
+                "UnparsedConfigSection": "Unparsed config section [{section}] detected. This may be the result of a component that failed to load. In the future this will result in a startup error."
+            },
             "Never": "never",
             "NextReboot": "next reboot",
             "NoNotification": "No Notification available",
@@ -531,13 +531,7 @@
             "On": "On",
             "PowerControl": "Power Control"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Extrusion factor",
-            "Headline": "Print Settings",
-            "SpeedFactor": "Speed factor"
-        },
         "StatusPanel": {
-            "Absolute": "absolute",
             "CancelPrint": "Cancel print",
             "ClearPrintStats": "Clear print stats",
             "Difference": "Difference",
@@ -558,24 +552,16 @@
             "Max": "max",
             "ObjectHeight": "Object Height",
             "PausePrint": "Pause print",
-            "Position": "Position",
             "Print": "Print",
-            "Relative": "relative",
             "ReprintJob": "Reprint job",
             "Requested": "Requested",
             "ResumePrint": "Resume print",
             "Slicer": "Slicer",
             "Speed": "Speed",
             "Total": "Total",
-            "Unknown": "Unknown",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
-        },
-        "ToolheadControlPanel": {
-            "Headline": "Toolhead Controls"
+            "Unknown": "Unknown"
         },
-        "ToolsPanel": {
+        "TemperaturePanel": {
             "AutoscaleChart": "Autoscale Chart",
             "Avg": "Avg",
             "Color": "Color",
@@ -602,6 +588,26 @@
             "TempTooHigh": "Temperature too high for {name}! (max: {max})",
             "TempTooLow": "Temperature too low for {name}! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "absolute",
+            "ALL": "ALL",
+            "Headline": "Toolhead",
+            "InvertX": "Invert X",
+            "InvertY": "Invert Y",
+            "InvertZ": "Invert Z",
+            "MotorsOff": "Motors Off",
+            "PleaseConfigureSteps": "Please configure steps",
+            "Position": "Position",
+            "QGL": "QGL",
+            "Relative": "relative",
+            "SettingsInterfaceControl": "Settings > Interface > Control",
+            "SetupControls": "Setup Controls",
+            "SpeedFactor": "Speed factor",
+            "XOffset": "X-Offset",
+            "YOffset": "Y-Offset",
+            "ZOffset": "Z-Offset",
+            "ZTilt": "Z-Tilt"
+        },
         "WebcamPanel": {
             "All": "All",
             "FPS": "FPS",
@@ -611,14 +617,15 @@
             "UrlNotAvailable": "URL not available"
         },
         "ZoffsetPanel": {
+            "Clear": "Clear",
             "CurrentOffset": "current offset",
             "Headline": "Z-Offset",
             "Later": "Later",
             "Ok": "OK",
             "Save": "Save",
-            "SAVE_CONFIG": "SAVE_CONFIG",
-            "SaveInfoDescription": "The new z-offset has been calculated and registered. Click on SAVE_CONFIG to store the new z-offset in your printer.cfg and restart Klipper.",
-            "SaveInfoDescriptionPrint": "The new Z offset has been calculated and registered. After printing, click on SAVE_CONFIG in the top bar to store it in printer.cfg and restart Klipper.",
+            "SaveConfig": "SAVE CONFIG",
+            "SaveInfoDescription": "The new Z-Offset has been calculated and registered. Click on \"SAVE CONFIG\" to save it to the printer.cfg and restart Klipper.",
+            "SaveInfoDescriptionPrint": "The new Z-Offset has been calculated and registered. After printing, click on \"SAVE CONFIG\" in the top bar to save it to the printer.cfg and restart Klipper.",
             "SaveInfoHeadline": "Information",
             "ToEndstop": "to Endstop",
             "ToProbe": "to Probe"
@@ -689,23 +696,31 @@
             "Circle": "Circle",
             "Control": "Control",
             "Cross": "Cross",
-            "EstimatedExtrusionInfo": "Estimated Extrusion Info",
+            "DisplayZOffset": "Always display Z-Offset-Controls",
+            "DisplayZOffsetDescription": "If disabled, the controls will appear only if a print has started.",
+            "EnableXYHoming": "Enable combined X & Y axes homing",
+            "EstimatedExtrusionInfo": "Show estimated extrusion info",
             "EstimatedExtrusionInfoDescription": "Show / Hide info for estimated extrusions based on extrusion amount and feedrate",
-            "InvertXMovement": "Invert X movement",
-            "InvertYMovement": "Invert Y movement",
-            "InvertZMovement": "Invert Z movement",
+            "InvertXMovement": "Invert X axis movement direction",
+            "InvertYMovement": "Invert Y axis movement direction",
+            "InvertZMovement": "Invert Z axis movement direction",
+            "IsDefault": " (default)",
             "MaximumValues": "Maximum values: {maximum}",
             "MaximumValuesVisibility": "Maximum of {maximum} values is recommended for best visibilty",
             "MinimumValues": "Minimum values: {minimum}",
-            "MoveDistancesEInMm": "Move distances E in mm",
-            "MoveDistancesInMm": "Move distances in mm",
-            "MoveDistancesXYInMm": "Move distances XY in mm",
-            "MoveDistancesZInMm": "Move distances Z in mm",
-            "SpeedEInMms": "Speed E in mm/s",
-            "SpeedXY": "Speed XY",
-            "SpeedZ": "Speed Z",
+            "MotorsOff": "Motors off{isDefault}",
+            "MoveDistancesEInMm": "Extrusion amount presets (in mm)",
+            "MoveDistancesInMm": "Move distance increments (in mm)",
+            "MoveDistancesXYInMm": "Move distance increments X & Y axes (in mm)",
+            "MoveDistancesZInMm": "Move distance increments Z axis (in mm)",
+            "QuadGantryLevel": "Quad Gantry Level{isDefault}",
+            "SpeedEInMms": "Extrusion speed presets (in mm/s)",
+            "SpeedXY": "Movement speed X & Y axes",
+            "SpeedZ": "Movement speed Z axis",
             "Style": "Style",
-            "ValueGreaterThan": "Value has to be greater than {value}"
+            "ValueGreaterThan": "Value has to be greater than {value}",
+            "ZOffsetIncrements": "Z-Offset increments (in mm)",
+            "ZTiltAdjust": "Z-Tilt Adjust{isDefault}"
         },
         "DashboardTab": {
             "Dashboard": "Dashboard",
@@ -906,8 +921,6 @@
             "ConfirmOnPowerDeviceChangeDescription": "Show a confirmation dialog on Device Power changes",
             "DisplayCANCEL_PRINT": "Display CANCEL_PRINT",
             "DisplayCANCEL_PRINTDescription": "Shows the CANCEL_PRINT button permanently - no second layer confirmation needed.",
-            "DisplayZOffset": "Show Z-Offset-Panel",
-            "DisplayZOffsetDescription": "Otherwise, the panel will appear only after a print has started.",
             "GcodeThumbnails": "G-Code thumbnails",
             "GcodeThumbnailsDescription": "Click on the button to get to the instructions.",
             "Guide": "Guide",
diff --git a/src/locales/es.json b/src/locales/es.json
index c1c12fd33..a5aad1ef5 100644
--- a/src/locales/es.json
+++ b/src/locales/es.json
@@ -396,26 +396,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "TODO",
-            "AlternateControls": "Alternar controles",
-            "Headline": "Controles",
-            "InvertX": "Invertir X",
-            "InvertY": "Invertir Y",
-            "InvertZ": "Invertir Z",
-            "PleaseConfigureSteps": "Por favor configure los pasos",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Configuración > Interfaz > Control",
-            "SetupControls": "Configurar controles",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z Tilt"
-        },
-        "DependenciesPanel": {
-            "Dependency": "Dependencia | Dependencias",
-            "DependencyDescription": "La versión de {name} actual no soporta todas las funciones de Mainsail. Actualice {name} por lo menos a la versión {neededVersion}."
-        },
         "ExtruderControlPanel": {
             "Extrude": "Extruir",
             "ExtrusionFactor": "Factor de extrusión",
@@ -493,13 +473,7 @@
             "On": "Encendido",
             "PowerControl": "Control de energía"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Factor de extrusión",
-            "Headline": "Configuración de impresión",
-            "SpeedFactor": "Factor de velocidad"
-        },
         "StatusPanel": {
-            "Absolute": "absoluta",
             "CancelPrint": "Cancelar impresión",
             "ClearPrintStats": "Limpiar estadísticas de impresión",
             "Difference": "Diferencia",
@@ -520,19 +494,14 @@
             "Max": "max",
             "ObjectHeight": "Altura del objeto",
             "PausePrint": "Pausar impresión",
-            "Position": "Posición",
             "Print": "Imprimir",
-            "Relative": "relativa",
             "ReprintJob": "Reimprimir trabajo",
             "Requested": "Solicitada",
             "ResumePrint": "Reanudar impresión",
             "Slicer": "Laminador",
             "Speed": "Velocidad",
             "Total": "Total",
-            "Unknown": "Desconocido",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Desconocido"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Autoescalar gráfico",
@@ -561,6 +530,21 @@
             "TempTooHigh": "¡Temperatura muy alta para {name}! (max: {max})",
             "TempTooLow": "¡Temperatura muy baja para {name}! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "absoluta",
+            "ALL": "TODO",
+            "InvertX": "Invertir X",
+            "InvertY": "Invertir Y",
+            "InvertZ": "Invertir Z",
+            "PleaseConfigureSteps": "Por favor configure los pasos",
+            "Position": "Posición",
+            "QGL": "QGL",
+            "Relative": "relativa",
+            "SettingsInterfaceControl": "Configuración > Interfaz > Control",
+            "SetupControls": "Configurar controles",
+            "SpeedFactor": "Factor de velocidad",
+            "ZTilt": "Z Tilt"
+        },
         "WebcamPanel": {
             "All": "Todos",
             "FPS": "FPS",
@@ -574,9 +558,9 @@
             "Later": "Más tarde",
             "Ok": "OK",
             "Save": "Guardar",
-            "SAVE_CONFIG": "SAVEE_CONFIG",
-            "SaveInfoDescription": "El nuervo Z-Offset fue calculado y registrado. Haga click en SAVE_CONFIG para guardar el nuevo Z-Offset en su archivo printer.cfg y reiniciar Klipper.",
-            "SaveInfoDescriptionPrint": "El nuevo Z-Offset fue calculado y registrado. Después de imprimir, haga click en SAVE_CONFIG en la barra superior para guardarlo en printer.cfg y reiniciar Klipper.",
+            "SaveConfig": "SAVEE CONFIG",
+            "SaveInfoDescription": "El nuervo Z-Offset fue calculado y registrado. Haga click en \"SAVE CONFIG\" para guardar el nuevo Z-Offset en su archivo printer.cfg y reiniciar Klipper.",
+            "SaveInfoDescriptionPrint": "El nuevo Z-Offset fue calculado y registrado. Después de imprimir, haga click en \"SAVE CONFIG\" en la barra superior para guardarlo en printer.cfg y reiniciar Klipper.",
             "SaveInfoHeadline": "Información",
             "ToEndstop": "al fin de carrera",
             "ToProbe": "a la sonda"
diff --git a/src/locales/fr.json b/src/locales/fr.json
index fbd6286fc..e3eab5634 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -380,22 +380,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "Tous",
-            "AlternateControls": "Commandes en croix",
-            "Headline": "Contrôles",
-            "InvertX": "Inversion X",
-            "InvertY": "Inversion Y",
-            "InvertZ": "Inversion Z",
-            "PleaseConfigureSteps": "Configurez Pas",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Réglages > Interface > Contrôle",
-            "SetupControls": "Réglages",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z Tilt"
-        },
         "DependenciesPanel": {
             "Dependency": "Dépendance(s)",
             "DependencyDescription": "Votre version {name} ne supporte pas toutes possibilités de Mainsail. Mettez à jour {name} vers {neededVersion}."
@@ -479,13 +463,7 @@
             "On": "Marche",
             "PowerControl": "Alimentation"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Facteur d'extrusion",
-            "Headline": "Réglages d'impression",
-            "SpeedFactor": "Facteur de vitesse"
-        },
         "StatusPanel": {
-            "Absolute": "absolue",
             "CancelPrint": "Annuler l'impression",
             "ClearPrintStats": "Effacer les statistiques d'impression",
             "Difference": "Différence",
@@ -506,19 +484,14 @@
             "Max": "max",
             "ObjectHeight": "hauteur objet",
             "PausePrint": "Pause impression",
-            "Position": "Position",
             "Print": "Impression",
-            "Relative": "relative",
             "ReprintJob": "Ré-impression",
             "Requested": "Requis",
             "ResumePrint": "Reprise impression",
             "Slicer": "Trancheur",
             "Speed": "Vitesse",
             "Total": "Total",
-            "Unknown": "Inconnu",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Inconnu"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Echelle automatique",
@@ -547,6 +520,21 @@
             "TempTooHigh": "La température de {name} est trop haute, (max: {max})",
             "TempTooLow": "La température de {name} est trop basse, (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "absolue",
+            "ALL": "Tous",
+            "InvertX": "Inversion X",
+            "InvertY": "Inversion Y",
+            "InvertZ": "Inversion Z",
+            "PleaseConfigureSteps": "Configurez Pas",
+            "Position": "Position",
+            "QGL": "QGL",
+            "Relative": "relative",
+            "SettingsInterfaceControl": "Réglages > Interface > Contrôle",
+            "SetupControls": "Réglages",
+            "SpeedFactor": "Facteur de vitesse",
+            "ZTilt": "Z Tilt"
+        },
         "WebcamPanel": {
             "All": "Tous",
             "FPS": "IPS",
@@ -560,9 +548,9 @@
             "Later": "Plus tard",
             "Ok": "Ok",
             "Save": "Sauvegarder",
-            "SAVE_CONFIG": "SAVE_CONFIG",
-            "SaveInfoDescription": "Le nouvel offset Z a été calculé et enregistré. Cliquez sur SAVE_CONFIG afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.",
-            "SaveInfoDescriptionPrint": "Le nouvel offset Z a été calculé et enregistré. Après l'impression cliquez sur SAVE_CONFIG dans la barre du haut afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.",
+            "SaveConfig": "SAVE CONFIG",
+            "SaveInfoDescription": "Le nouvel offset Z a été calculé et enregistré. Cliquez sur \"SAVE CONFIG\" afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.",
+            "SaveInfoDescriptionPrint": "Le nouvel offset Z a été calculé et enregistré. Après l'impression cliquez sur \"SAVE CONFIG\" dans la barre du haut afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.",
             "SaveInfoHeadline": "Information",
             "ToEndstop": "jusqu'au fin de course",
             "ToProbe": "jusqu'à la sonde"
diff --git a/src/locales/hu.json b/src/locales/hu.json
index 592dcde23..eb57afdb4 100644
--- a/src/locales/hu.json
+++ b/src/locales/hu.json
@@ -1,12 +1,12 @@
 {
     "App": {
-        "Printers": "Nyomtatók",
         "Notifications": {
             "KlipperWarnings": {
                 "DeprecatedOption": "'{section}' / '{option}' opcióját leírtuk, és a következő verzióban már nem lesz benne.",
                 "DeprecatedValue": "'{section}' / '{option}' / Value '{value}' opcióját leírtuk, és a következő verzióban már nem lesz benne."
             }
         },
+        "Printers": "Nyomtatók",
         "ThrottledStates": {
             "DescriptionCurrentlyThrottled": "Az rPi ARM mag(ok) jelenleg túlterheltek.",
             "DescriptionFrequencyCapped": "Az rPi ARM max frekvenciája jelenleg 1,2 GHz -re korlátozódik.",
@@ -379,22 +379,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "MIND",
-            "AlternateControls": "Vezérlési alternatívák",
-            "Headline": "Vezérlések",
-            "InvertX": "X invertálása",
-            "InvertY": "Y invertálása",
-            "InvertZ": "Z invertálása",
-            "PleaseConfigureSteps": "Kérlek állítsd be a step értékét",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Beállítások > Kezelőfelület > Vezérlés",
-            "SetupControls": "Beállítás vezérlései",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z dőlésszög"
-        },
         "DependenciesPanel": {
             "Dependency": "Függőség | Függőségek",
             "DependencyDescription": "A jelenlegi verzió {name} nem támogatja a Mainsail minden funkcióját. Frissítsd a {name} verziót legalább erre: {neededVersion}."
@@ -476,13 +460,7 @@
             "On": "BE",
             "PowerControl": "Tápellátás vezérlés"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Extrudálási szorzó",
-            "Headline": "Nyomtatási beállítások",
-            "SpeedFactor": "Sebességállítás"
-        },
         "StatusPanel": {
-            "Absolute": "abszolút",
             "CancelPrint": "Nyomtatás megszakítása",
             "ClearPrintStats": "Nyomt. statisztikák törlése",
             "Difference": "Különbség",
@@ -503,19 +481,14 @@
             "Max": "max",
             "ObjectHeight": "Tárgy magassága",
             "PausePrint": "Nyomtatás szüneteltetése",
-            "Position": "Pozíció",
             "Print": "Nyomtatás",
-            "Relative": "relatív",
             "ReprintJob": "Munka újranyomtatása",
             "Requested": "Kért",
             "ResumePrint": "Nyomtatás folytatása",
             "Slicer": "Slicer",
             "Speed": "Sebesség",
             "Total": "Összesen",
-            "Unknown": "Ismeretlen",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Ismeretlen"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Grafikon automatikus méretezése",
@@ -544,6 +517,21 @@
             "TempTooHigh": "A {name} hőmérséklete túl magas! (max: {max})",
             "TempTooLow": "A {name} hőmérséklete túl alacsony! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "abszolút",
+            "ALL": "MIND",
+            "InvertX": "X invertálása",
+            "InvertY": "Y invertálása",
+            "InvertZ": "Z invertálása",
+            "PleaseConfigureSteps": "Kérlek állítsd be a step értékét",
+            "Position": "Pozíció",
+            "QGL": "QGL",
+            "Relative": "relatív",
+            "SettingsInterfaceControl": "Beállítások > Kezelőfelület > Vezérlés",
+            "SetupControls": "Beállítás vezérlései",
+            "SpeedFactor": "Sebességállítás",
+            "ZTilt": "Z dőlésszög"
+        },
         "WebcamPanel": {
             "All": "Mind",
             "FPS": "FPS",
@@ -557,9 +545,9 @@
             "Later": "Később",
             "Ok": "OK",
             "Save": "Mentés",
-            "SAVE_CONFIG": "BÁLLÍTÁS MENTÉSE",
-            "SaveInfoDescription": "Új Z-eltolás kiszámítva és regisztrálva. Kattints a BÁLLÍTÁS MENTÉSE gombra az új Z-eltolás eltárolásához a printer.cfg-be és indítsd újra a Klippert.",
-            "SaveInfoDescriptionPrint": "Új Z-eltolás kiszámítva és regisztrálva. Nyomtatás után kattints a BÁLLÍTÁS MENTÉSE-re a felső sávban, a printer.cfg-be eltárolásához  és a Klipper újraindításához.",
+            "SaveConfig": "BÁLLÍTÁS MENTÉSE",
+            "SaveInfoDescription": "Új Z-eltolás kiszámítva és regisztrálva. Kattints a \"BÁLLÍTÁS MENTÉSE\" gombra az új Z-eltolás eltárolásához a printer.cfg-be és indítsd újra a Klippert.",
+            "SaveInfoDescriptionPrint": "Új Z-eltolás kiszámítva és regisztrálva. Nyomtatás után kattints a \"BÁLLÍTÁS MENTÉSE\"-re a felső sávban, a printer.cfg-be eltárolásához  és a Klipper újraindításához.",
             "SaveInfoHeadline": "Információ",
             "ToEndstop": "a végállásig",
             "ToProbe": "szondáig"
diff --git a/src/locales/it.json b/src/locales/it.json
index d805128ea..aac71ec8b 100644
--- a/src/locales/it.json
+++ b/src/locales/it.json
@@ -1,12 +1,12 @@
 {
     "App": {
-        "Printers": "Stampanti",
         "Notifications": {
             "KlipperWarnings": {
                 "DeprecatedOption": "L'opzione '{option}' nella sezione '{section}' è obsoleta e sarà rimossa in una versione futura.",
                 "DeprecatedValue": "Il valore '{value}' in '{option}' nella sezione '{section}' è obsoleto e sarà rimosso in una versione futura."
             }
         },
+        "Printers": "Stampanti",
         "ThrottledStates": {
             "DescriptionCurrentlyThrottled": "Uno o più core ARM dell'rPI sono attualmente rallentati.",
             "DescriptionFrequencyCapped": "La frequenza massima del processore ARM dell'rPI è attualmente limitata a 1,2 GHz.",
@@ -379,26 +379,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "TUTTI",
-            "AlternateControls": "Controlli Alternativi",
-            "Headline": "Controlli",
-            "InvertX": "Inverti X",
-            "InvertY": "Inverti Y",
-            "InvertZ": "Inverti Z",
-            "PleaseConfigureSteps": "Configura gli step",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Impostazioni> Interfaccia> Controllo",
-            "SetupControls": "Controlli Installazione",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Inclinazione Z"
-        },
-        "DependenciesPanel": {
-            "Dependency": "Dipendenze",
-            "DependencyDescription": "L'attuale versione di {name} non supporta tutte le features di Mainsail. Aggiorna {name} almeno alla versione {neededVersion}."
-        },
         "ExtruderControlPanel": {
             "Extrude": "Estrudi",
             "ExtrusionFactor": "Fattore di estrusione",
@@ -478,13 +458,7 @@
             "On": "Acceso",
             "PowerControl": "Controllo Alimentazione"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Fattore di estrusione",
-            "Headline": "Impostazioni di Stampa",
-            "SpeedFactor": "Fattore di velocità"
-        },
         "StatusPanel": {
-            "Absolute": "assoluto",
             "CancelPrint": "Annulla stampa",
             "ClearPrintStats": "Cancella statistiche di stampa",
             "Difference": "Differenza",
@@ -505,19 +479,14 @@
             "Max": "max",
             "ObjectHeight": "Altezza Oggetto",
             "PausePrint": "Metti in Pausa la stampa",
-            "Position": "Posizione",
             "Print": "Stampa",
-            "Relative": "relativo",
             "ReprintJob": "Ristampa il processo",
             "Requested": "Richiesto",
             "ResumePrint": "Riprendi stampa",
             "Slicer": "Slicer",
             "Speed": "Velocità",
             "Total": "Totale",
-            "Unknown": "Sconosciuto",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Sconosciuto"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Scala automaticamente il Grafico",
@@ -546,6 +515,21 @@
             "TempTooHigh": "Temperatura troppo alta per {name}! (max: {max})",
             "TempTooLow": "Temperatura troppo bassa per {name}! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "assoluto",
+            "ALL": "TUTTI",
+            "InvertX": "Inverti X",
+            "InvertY": "Inverti Y",
+            "InvertZ": "Inverti Z",
+            "PleaseConfigureSteps": "Configura gli step",
+            "Position": "Posizione",
+            "QGL": "QGL",
+            "Relative": "relativo",
+            "SettingsInterfaceControl": "Impostazioni> Interfaccia> Controllo",
+            "SetupControls": "Controlli Installazione",
+            "SpeedFactor": "Fattore di velocità",
+            "ZTilt": "Inclinazione Z"
+        },
         "WebcamPanel": {
             "All": "Tutto",
             "FPS": "FPS",
@@ -553,16 +537,15 @@
             "UnknownWebcamService": "Servizio Webcam Sconosciuto",
             "UrlNotAvailable": "URL non disponibile"
         },
-        "ZOffsetPanel": {},
         "ZoffsetPanel": {
             "CurrentOffset": "offset corrente",
             "Headline": "Z-Offset",
             "Later": "Dopo",
             "Ok": "OK",
             "Save": "Salva",
-            "SAVE_CONFIG": "SAVE_CONFIG",
-            "SaveInfoDescription": "Il nuovo z-offset è stato calcolato e registrato. Fai clic su SAVE_CONFIG per memorizzare il nuovo z-offset nel tuo printer.cfg e riavviare Klipper.",
-            "SaveInfoDescriptionPrint": "Il nuovo Z offset è stato calcolato e registrato. Dopo la stampa, fai clic su SAVE_CONFIG nella barra in alto per salvarlo in printer.cfg e riavviare Klipper.",
+            "SaveConfig": "SAVE CONFIG",
+            "SaveInfoDescription": "Il nuovo z-offset è stato calcolato e registrato. Fai clic su \"SAVE CONFIG\" per memorizzare il nuovo z-offset nel tuo printer.cfg e riavviare Klipper.",
+            "SaveInfoDescriptionPrint": "Il nuovo Z offset è stato calcolato e registrato. Dopo la stampa, fai clic su \"SAVE CONFIG\" nella barra in alto per salvarlo in printer.cfg e riavviare Klipper.",
             "SaveInfoHeadline": "Informazione",
             "ToEndstop": "all'Endstop",
             "ToProbe": "alla Sonda"
diff --git a/src/locales/nl.json b/src/locales/nl.json
index ecefc9ffd..82fa02a09 100644
--- a/src/locales/nl.json
+++ b/src/locales/nl.json
@@ -1,12 +1,12 @@
 {
     "App": {
-        "Printers": "Printers",
         "Notifications": {
             "KlipperWarnings": {
                 "DeprecatedOption": "Optie '{option}' in sectie '{section}' is verouderd en wordt in een toekomstige versie verwijderd.",
                 "DeprecatedValue": "Waarde '{value}' in optie '{option}' in sectie '{section}' is verouderd en wordt in een toekomstige versie verwijderd."
             }
         },
+        "Printers": "Printers",
         "ThrottledStates": {
             "DescriptionCurrentlyThrottled": "rPi ARM core(s) worden momenteel gethrottled.",
             "DescriptionFrequencyCapped": "rPi ARM max frequency is momenteel beperkt tot 1.2 GHz.",
@@ -379,30 +379,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "ALLES",
-            "AlternateControls": "Alternatieve bediening",
-            "Controls": "Bediening",
-            "Headline": "Bediening",
-            "Home": "Home",
-            "HotendTooCold": "Hotend temp. lager dan",
-            "InvertX": "Inverteer X",
-            "InvertY": "Inverteer Y",
-            "InvertZ": "Inverteer Z",
-            "Macros": "Macros",
-            "PleaseConfigureSteps": "Configureer steps",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Instllingen > Interface > Bediening",
-            "SetupControls": "Bewerk Bediening",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z Tilt"
-        },
-        "DependenciesPanel": {
-            "Dependency": "Afhankelijkheid | Afhankelijkheden",
-            "DependencyDescription": "Je huidige {name} versie ondersteunt niet alle features van Mainsail. Update {name} naar tenminste {neededVersion}"
-        },
         "ExtruderControlPanel": {
             "Extrude": "Extrude",
             "ExtrusionFactor": "Extrusie factor",
@@ -496,13 +472,7 @@
             "On": "Aan",
             "PowerControl": "Power Control"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Extrusie factor",
-            "Headline": "Print instellingen",
-            "SpeedFactor": "Snelheid factor"
-        },
         "StatusPanel": {
-            "Absolute": "absoluut",
             "CancelPrint": "Annuleer print",
             "ClearPrintStats": "Wis print statistieken",
             "Difference": "Verschil",
@@ -523,19 +493,14 @@
             "Max": "max",
             "ObjectHeight": "Objecthoogte",
             "PausePrint": "Pauzeer print",
-            "Position": "Positie",
             "Print": "Print",
-            "Relative": "relatief",
             "ReprintJob": "Herprint job",
             "Requested": "Aangevraagd",
             "ResumePrint": "Hervat print",
             "Slicer": "Slicer",
             "Speed": "Snelheid",
             "Total": "Totaal",
-            "Unknown": "Onbekend",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Onbekend"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Schaal automatisch",
@@ -571,6 +536,25 @@
             "TempTooLow": "Temperatuur te laag voor {name}! (min: {min})",
             "UNKNOWN": "ONBEKEND"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "absoluut",
+            "ALL": "ALLES",
+            "Controls": "Bediening",
+            "Home": "Home",
+            "HotendTooCold": "Hotend temp. lager dan",
+            "InvertX": "Inverteer X",
+            "InvertY": "Inverteer Y",
+            "InvertZ": "Inverteer Z",
+            "Macros": "Macros",
+            "PleaseConfigureSteps": "Configureer steps",
+            "Position": "Positie",
+            "QGL": "QGL",
+            "Relative": "relatief",
+            "SettingsInterfaceControl": "Instllingen > Interface > Bediening",
+            "SetupControls": "Bewerk Bediening",
+            "SpeedFactor": "Snelheid factor",
+            "ZTilt": "Z Tilt"
+        },
         "WebcamPanel": {
             "All": "Alle",
             "FPS": "FPS",
@@ -579,19 +563,15 @@
             "UrlNotAvailable": "URL niet beschikbaar",
             "Webcam": "Webcam"
         },
-        "ZOffsetPanel": {
-            "CurrentOffset": "Huidige Offset",
-            "ZBabyStepping": "Z Baby Stepping"
-        },
         "ZoffsetPanel": {
             "CurrentOffset": "Huidige offset",
             "Headline": "Z offset",
             "Later": "Later",
             "Ok": "Ok",
             "Save": "Opslaan",
-            "SAVE_CONFIG": "SAVE_CONFIG",
-            "SaveInfoDescription": "De nieuwe z-offset is berekend en geregistreerd. Klik op SAVE_CONFIG om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.",
-            "SaveInfoDescriptionPrint": "De nieuwe z-offset is berekend en geregistreerd. Klik na het printen op SAVE_CONFIG om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.",
+            "SaveConfig": "SAVE CONFIG",
+            "SaveInfoDescription": "De nieuwe z-offset is berekend en geregistreerd. Klik op \"SAVE CONFIG\" om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.",
+            "SaveInfoDescriptionPrint": "De nieuwe z-offset is berekend en geregistreerd. Klik na het printen op \"SAVE CONFIG\" om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.",
             "SaveInfoHeadline": "Informatie",
             "ToEndstop": "naar Endstop",
             "ToProbe": "naar Probe",
diff --git a/src/locales/pl.json b/src/locales/pl.json
index ab0942318..e9fd50d5c 100644
--- a/src/locales/pl.json
+++ b/src/locales/pl.json
@@ -1,12 +1,12 @@
 {
     "App": {
-        "Printers": "Drukarki",
         "Notifications": {
             "KlipperWarnings": {
                 "DeprecatedOption": "Opcja '{option}' w sekcji '{section}' jest przestarzała i zostanie usunięta w przyszłych wydaniach.",
                 "DeprecatedValue": "Ustawienie '{value}' w opcji '{option}' w sekcji '{section}' jest przestarzała i zostanie usunięta w przyszłych wydaniach."
             }
         },
+        "Printers": "Drukarki",
         "ThrottledStates": {
             "DescriptionCurrentlyThrottled": "Częstotliwość rdzeni rPi jest aktualnie obniżona.",
             "DescriptionFrequencyCapped": "Taktowanie rPi ograniczone do 1.2 GHz.",
@@ -379,26 +379,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "WSZYSTKIE",
-            "AlternateControls": "Alternatywne sterowanie",
-            "Headline": "Sterowanie drukarką",
-            "InvertX": "Odwróć oś X",
-            "InvertY": "Odwróć oś Y",
-            "InvertZ": "Odwróć oś Z",
-            "PleaseConfigureSteps": "Proszę skonfigurować kroki",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Ustawienia > Interfejs > Konfiguracja",
-            "SetupControls": "Konfiguracja sterowania",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Nachylenie osi Z"
-        },
-        "DependenciesPanel": {
-            "Dependency": "Zależność | Zależności",
-            "DependencyDescription": "Twoja aktualna {name} wersja nie wspiera wszystkich funkcji Mainsaila. Zaktualizuj {name} do wersji co najmniej {neededVersion}."
-        },
         "ExtruderControlPanel": {
             "Extrude": "Wytłocz",
             "ExtrusionFactor": "Wartość ekstruzji",
@@ -476,13 +456,7 @@
             "On": "Wł.",
             "PowerControl": "Kontrola zasilania"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Wartość ekstruzji",
-            "Headline": "Ustawienia wydruku",
-            "SpeedFactor": "Wartość prędkości"
-        },
         "StatusPanel": {
-            "Absolute": "absolutna",
             "CancelPrint": "Anuluj wydruk",
             "ClearPrintStats": "Wyczyść statystyki drukarki",
             "Difference": "Różnica",
@@ -503,19 +477,14 @@
             "Max": "Maks.",
             "ObjectHeight": "Wysokość obiektu",
             "PausePrint": "Pauza wydruku",
-            "Position": "Pozycja",
             "Print": "Drukuj",
-            "Relative": "względna",
             "ReprintJob": "Ponownie wydrukuj",
             "Requested": "Wymagane",
             "ResumePrint": "Wznowienie wydruku",
             "Slicer": "Slicer",
             "Speed": "Prędkość",
             "Total": "Całkowicie",
-            "Unknown": "Nieznany",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Nieznany"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Autoskaluj wykres",
@@ -544,6 +513,22 @@
             "TempTooHigh": "Temperatura zbyt wysoka dla {name}! (max: {max})",
             "TempTooLow": "Temperatura zbyt mała dla {name}! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "absolutna",
+            "ALL": "WSZYSTKIE",
+            "Headline": "Sterowanie drukarką",
+            "InvertX": "Odwróć oś X",
+            "InvertY": "Odwróć oś Y",
+            "InvertZ": "Odwróć oś Z",
+            "PleaseConfigureSteps": "Proszę skonfigurować kroki",
+            "Position": "Pozycja",
+            "QGL": "QGL",
+            "Relative": "względna",
+            "SettingsInterfaceControl": "Ustawienia > Interfejs > Konfiguracja",
+            "SetupControls": "Konfiguracja sterowania",
+            "SpeedFactor": "Wartość prędkości",
+            "ZTilt": "Nachylenie osi Z"
+        },
         "WebcamPanel": {
             "All": "Wszystkie",
             "FPS": "Kl/S",
@@ -557,9 +542,9 @@
             "Later": "Później",
             "Ok": "Okej",
             "Save": "Zapisz",
-            "SAVE_CONFIG": "ZAPISZ_KONFIGURACJĘ",
-            "SaveInfoDescription": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Kliknij na ZAPISZ_KONFIGURACJĘ aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.",
-            "SaveInfoDescriptionPrint": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Po wydrukowaniu , kliknij na ZAPISZ_KONFIGURACJĘ aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.",
+            "SaveConfig": "ZAPISZ KONFIGURACJĘ",
+            "SaveInfoDescription": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Kliknij na \"ZAPISZ KONFIGURACJĘ\" aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.",
+            "SaveInfoDescriptionPrint": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Po wydrukowaniu , kliknij na \"ZAPISZ KONFIGURACJĘ\" aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.",
             "SaveInfoHeadline": "Informacja",
             "ToEndstop": "Do krańcówki",
             "ToProbe": "Do sondy"
diff --git a/src/locales/ru.json b/src/locales/ru.json
index 9add4bafd..83dee1ad0 100644
--- a/src/locales/ru.json
+++ b/src/locales/ru.json
@@ -1,12 +1,12 @@
 {
     "App": {
-        "Printers": "Принтер",
         "Notifications": {
             "KlipperWarnings": {
                 "DeprecatedOption": "Опция '{option}' в разделе '{section}' устарела и будет удалена в будущем выпуске.",
                 "DeprecatedValue": "Значение '{value}' в опции '{option}' в секции '{section}' устарело и будет удалено в будущем релизе."
             }
         },
+        "Printers": "Принтер",
         "ThrottledStates": {
             "DescriptionCurrentlyThrottled": "ARM-ядро(ядра) rPi в настоящее время дросселируется.",
             "DescriptionFrequencyCapped": "Максимальная частота rPi ARM в настоящее время ограничена 1,2 ГГц.",
@@ -379,29 +379,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "ALL",
-            "AlternateControls": "Альтернативный контроль",
-            "Controls": "Контроль",
-            "Headline": "Управление",
-            "Home": "Home",
-            "InvertX": "X инвертировать",
-            "InvertY": "Y инвертировать",
-            "InvertZ": "Z инвертировать",
-            "Macros": "Макрос",
-            "PleaseConfigureSteps": "Пожалуйста, настройте расстояние вращения",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "Настройки > интерфейс > управление",
-            "SetupControls": "Установить контроль",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z Tilt"
-        },
-        "DependenciesPanel": {
-            "Dependency": "Зависимость | Зависимости",
-            "DependencyDescription": "Ваша текущая версия {name} не поддерживает все функции Mainsail. Обновите {name} по крайней мере до версии {neededVersion}."
-        },
         "ExtruderControlPanel": {
             "Extrude": "Экструдировать",
             "ExtrusionFactor": "Коэффициент экструзии",
@@ -495,13 +472,7 @@
             "On": "На сайте",
             "PowerControl": "Переключатель питания"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "Коэффициент экструзии",
-            "Headline": "Настройки печати",
-            "SpeedFactor": "Коэффициент скорости"
-        },
         "StatusPanel": {
-            "Absolute": "Абсолютно",
             "CancelPrint": "Отменить давление",
             "ClearPrintStats": "Удаление статистики печати",
             "Difference": "Разница",
@@ -522,19 +493,14 @@
             "Max": "макс.",
             "ObjectHeight": "Высота объекта",
             "PausePrint": "Давление прерывания",
-            "Position": "Позиция",
             "Print": "Печать",
-            "Relative": "Инкрементальный",
             "ReprintJob": "Повторять давление",
             "Requested": "Запрошено",
             "ResumePrint": "Возобновить печать",
             "Slicer": "Slicer",
             "Speed": "Скорость",
             "Total": "Всего",
-            "Unknown": "Неизвестный",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Неизвестный"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "Автомасштабируемая диаграмма",
@@ -570,6 +536,24 @@
             "TempTooLow": "Температура слишком низкая для {name}! (min: {min})",
             "UNKNOWN": "ЗНАЕТЕ"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "Абсолютно",
+            "ALL": "ALL",
+            "Controls": "Контроль",
+            "Home": "Home",
+            "InvertX": "X инвертировать",
+            "InvertY": "Y инвертировать",
+            "InvertZ": "Z инвертировать",
+            "Macros": "Макрос",
+            "PleaseConfigureSteps": "Пожалуйста, настройте расстояние вращения",
+            "Position": "Позиция",
+            "QGL": "QGL",
+            "Relative": "Инкрементальный",
+            "SettingsInterfaceControl": "Настройки > интерфейс > управление",
+            "SetupControls": "Установить контроль",
+            "SpeedFactor": "Коэффициент скорости",
+            "ZTilt": "Z Tilt"
+        },
         "WebcamPanel": {
             "All": "Все",
             "FPS": "FPS",
@@ -578,19 +562,15 @@
             "UrlNotAvailable": "URL недоступен",
             "Webcam": "Веб-камера"
         },
-        "ZOffsetPanel": {
-            "CurrentOffset": "Смещение тока: ",
-            "ZBabyStepping": "Z Смещение"
-        },
         "ZoffsetPanel": {
             "CurrentOffset": "Текущее смещение",
             "Headline": "Z-смещение",
             "Later": "Позже",
             "Ok": "OK",
             "Save": "Сохранить",
-            "SAVE_CONFIG": "СОХРАНИТЬ_КОНФИГ",
-            "SaveInfoDescription": "Новое z-смещение было рассчитано и зарегистрировано. Нажмите SAVE_CONFIG, чтобы сохранить новое z-смещение в файле printer.cfg, и перезапустите Klipper.",
-            "SaveInfoDescriptionPrint": "Новое смещение по Z было рассчитано и зарегистрировано. После печати нажмите на SAVE_CONFIG в верхней панели, чтобы сохранить его в файле printer.cfg, и перезапустите Klipper.",
+            "SaveConfig": "SAVE CONFIG",
+            "SaveInfoDescription": "Новое z-смещение было рассчитано и зарегистрировано. Нажмите \"SAVE CONFIG\", чтобы сохранить новое z-смещение в файле printer.cfg, и перезапустите Klipper.",
+            "SaveInfoDescriptionPrint": "Новое смещение по Z было рассчитано и зарегистрировано. После печати нажмите на \"SAVE CONFIG\" в верхней панели, чтобы сохранить его в файле printer.cfg, и перезапустите Klipper.",
             "SaveInfoHeadline": "Информация",
             "ToEndstop": "до конечной остановки",
             "ToProbe": "к зонду"
diff --git a/src/locales/zh-tw.json b/src/locales/zh-tw.json
index 126a344cb..25f0932fc 100644
--- a/src/locales/zh-tw.json
+++ b/src/locales/zh-tw.json
@@ -1,12 +1,12 @@
 {
     "App": {
-        "Printers": "列印機組",
         "Notifications": {
             "KlipperWarnings": {
                 "DeprecatedOption": "{section}' 中的部分選項 '{option}' 已棄用,將在未來版本中刪除。",
                 "DeprecatedValue": "不推薦使用'{section}' 部分的選項'{option}' 中的值'{value}',並將在未來版本中刪除。"
             }
         },
+        "Printers": "列印機組",
         "ThrottledStates": {
             "DescriptionCurrentlyThrottled": "樹莓派ARM核心目前已被限制.",
             "DescriptionFrequencyCapped": "樹莓派ARM最大頻率目前限制為1.2 GHz.",
@@ -328,26 +328,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "所有",
-            "AlternateControls": "備用控制",
-            "Headline": "控制",
-            "InvertX": "翻轉 X",
-            "InvertY": "翻轉 Y",
-            "InvertZ": "翻轉 Z",
-            "PleaseConfigureSteps": "請設定步進",
-            "QGL": "QGL",
-            "SettingsInterfaceControl": "設定 > 界面 > 控制",
-            "SetupControls": "設定控制",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z 傾斜"
-        },
-        "DependenciesPanel": {
-            "Dependency": "依賴 | 依賴關係",
-            "DependencyDescription": "您當前的 {name} 版本不支持 Mainsail 的所有功能。將 {name} 更新為至少 {neededVersion}。"
-        },
         "ExtruderControlPanel": {
             "Extrude": "擠出",
             "ExtrusionFactor": "擠出係數",
@@ -424,13 +404,7 @@
             "On": "開",
             "PowerControl": "電源管理"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "擠出係數",
-            "Headline": "列印設定",
-            "SpeedFactor": "速度係數"
-        },
         "StatusPanel": {
-            "Absolute": "絕對",
             "CancelPrint": "取消列印",
             "ClearPrintStats": "清除列印統計數據",
             "Difference": "差異",
@@ -451,19 +425,14 @@
             "Max": "max",
             "ObjectHeight": "物體高度",
             "PausePrint": "暫停列印",
-            "Position": "位置",
             "Print": "列印",
-            "Relative": "相對的",
             "ReprintJob": "繼續列印",
             "Requested": "請求",
             "ResumePrint": "繼續列印",
             "Slicer": "切片",
             "Speed": "速度",
             "Total": "總共: ",
-            "Unknown": "Unknown",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "Unknown"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "自動縮放圖表",
@@ -490,6 +459,21 @@
             "Target": "目標",
             "TemperaturesInChart": "溫度 [°C]"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "絕對",
+            "ALL": "所有",
+            "InvertX": "翻轉 X",
+            "InvertY": "翻轉 Y",
+            "InvertZ": "翻轉 Z",
+            "PleaseConfigureSteps": "請設定步進",
+            "Position": "位置",
+            "QGL": "QGL",
+            "Relative": "相對的",
+            "SettingsInterfaceControl": "設定 > 界面 > 控制",
+            "SetupControls": "設定控制",
+            "SpeedFactor": "速度係數",
+            "ZTilt": "Z 傾斜"
+        },
         "WebcamPanel": {
             "All": "全部",
             "FPS": "FPS",
@@ -503,7 +487,7 @@
             "Later": "最後的",
             "Ok": "好",
             "Save": "儲存",
-            "SAVE_CONFIG": "儲存配置",
+            "SaveConfig": "儲存配置",
             "SaveInfoDescription": "已經計算生成新的Z偏移. 點擊 儲存配置 儲存到 printer.cfg 中並重啟 Klipper.",
             "SaveInfoDescriptionPrint": "已經計算生成新的Z偏移. 列印後點擊 儲存配置 儲存到 printer.cfg 中並重啟 Klipper.",
             "SaveInfoHeadline": "資訊",
diff --git a/src/locales/zh.json b/src/locales/zh.json
index 7834df04d..d7fd2e256 100644
--- a/src/locales/zh.json
+++ b/src/locales/zh.json
@@ -1,12 +1,12 @@
 {
     "App": {
-        "Printers": "打印机组",
         "Notifications": {
             "KlipperWarnings": {
                 "DeprecatedOption": "选项 '{option}' 在章节 '{section}' 已经弃用,在未来版本会被移除.",
                 "DeprecatedValue": "数值 '{value}' 在选项 '{option}' 中的章节'{section}' 已经弃用,在未来版本会被移除."
             }
         },
+        "Printers": "打印机组",
         "ThrottledStates": {
             "DescriptionCurrentlyThrottled": "rPi ARM 核心当前被限制.",
             "DescriptionFrequencyCapped": "rPi ARM 最高频率限制再 1.2 GHz.",
@@ -379,26 +379,6 @@
         }
     },
     "Panels": {
-        "ControlPanel": {
-            "ALL": "所有",
-            "AlternateControls": "翻转控制",
-            "Headline": "控制",
-            "InvertX": "翻转 X",
-            "InvertY": "翻转 Y",
-            "InvertZ": "翻转 Z",
-            "PleaseConfigureSteps": "请设置步",
-            "QGL": "四点调平",
-            "SettingsInterfaceControl": "设置 > 界面 > 控制",
-            "SetupControls": "设置",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z",
-            "ZTilt": "Z 抬升"
-        },
-        "DependenciesPanel": {
-            "Dependency": "依赖",
-            "DependencyDescription": "你当前 {name} 版本并不支持所有 Mainsail 的特性. 跟新 {name} 到至少 {neededVersion}版本."
-        },
         "ExtruderControlPanel": {
             "Extrude": "挤出",
             "ExtrusionFactor": "挤出因子",
@@ -476,13 +456,7 @@
             "On": "打开",
             "PowerControl": "电源控制"
         },
-        "PrintsettingsPanel": {
-            "ExtrusionFactor": "挤出因子",
-            "Headline": "打印机设置",
-            "SpeedFactor": "速度因子"
-        },
         "StatusPanel": {
-            "Absolute": "绝对",
             "CancelPrint": "终止打印",
             "ClearPrintStats": "清除打印提醒",
             "Difference": "不同",
@@ -503,19 +477,14 @@
             "Max": "最大",
             "ObjectHeight": "物体高度",
             "PausePrint": "暂停打印",
-            "Position": "位置",
             "Print": "打印",
-            "Relative": "相对",
             "ReprintJob": "再次打印",
             "Requested": "已发送请求",
             "ResumePrint": "继续打印",
             "Slicer": "切片",
             "Speed": "速度",
             "Total": "总",
-            "Unknown": "未知",
-            "X": "X",
-            "Y": "Y",
-            "Z": "Z"
+            "Unknown": "未知"
         },
         "TemperaturePanel": {
             "AutoscaleChart": "自动缩放图表",
@@ -544,6 +513,21 @@
             "TempTooHigh": "温度过高 {name}! (max: {max})",
             "TempTooLow": "温度过低 {name}! (min: {min})"
         },
+        "ToolheadControlPanel": {
+            "Absolute": "绝对",
+            "ALL": "所有",
+            "InvertX": "翻转 X",
+            "InvertY": "翻转 Y",
+            "InvertZ": "翻转 Z",
+            "PleaseConfigureSteps": "请设置步",
+            "Position": "位置",
+            "QGL": "四点调平",
+            "Relative": "相对",
+            "SettingsInterfaceControl": "设置 > 界面 > 控制",
+            "SetupControls": "设置",
+            "SpeedFactor": "速度因子",
+            "ZTilt": "Z 抬升"
+        },
         "WebcamPanel": {
             "All": "所有",
             "FPS": "帧率",
@@ -557,7 +541,7 @@
             "Later": "最后的",
             "Ok": "好",
             "Save": "保存",
-            "SAVE_CONFIG": "保存配置",
+            "SaveConfig": "保存配置",
             "SaveInfoDescription": "已经计算生成新的Z偏移. 点击 保存配置 保存到 printer.cfg 中并重启 Klipper.",
             "SaveInfoDescriptionPrint": "已经计算生成新的Z偏移. 打印后点击 保存配置 保存到 printer.cfg 中并重启 Klipper.",
             "SaveInfoHeadline": "信息",
diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index a9dd472b7..7361a73c6 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -82,7 +82,6 @@
 <script lang="ts">
 import Component from 'vue-class-component'
 import { Mixins } from 'vue-property-decorator'
-import ControlPanel from '@/components/panels/ControlPanel.vue'
 import ExtruderControlPanel from '@/components/panels/ExtruderControlPanel.vue'
 import DashboardMixin from '@/components/mixins/dashboard'
 import KlippyStatePanel from '@/components/panels/KlippyStatePanel.vue'
@@ -92,16 +91,14 @@ import MacrosPanel from '@/components/panels/MacrosPanel.vue'
 import MiniconsolePanel from '@/components/panels/MiniconsolePanel.vue'
 import MinSettingsPanel from '@/components/panels/MinSettingsPanel.vue'
 import MiscellaneousPanel from '@/components/panels/MiscellaneousPanel.vue'
-import PrintsettingsPanel from '@/components/panels/PrintsettingsPanel.vue'
 import StatusPanel from '@/components/panels/StatusPanel.vue'
+import ToolheadControlPanel from '@/components/panels/ToolheadControlPanel.vue'
 import TemperaturePanel from '@/components/panels/TemperaturePanel.vue'
 import WebcamPanel from '@/components/panels/WebcamPanel.vue'
-import ZoffsetPanel from '@/components/panels/ZoffsetPanel.vue'
 import kebabCase from 'lodash.kebabcase'
 
 @Component({
     components: {
-        ControlPanel,
         ExtruderControlPanel,
         KlippyStatePanel,
         MachineSettingsPanel,
@@ -110,11 +107,10 @@ import kebabCase from 'lodash.kebabcase'
         MiniconsolePanel,
         MinSettingsPanel,
         MiscellaneousPanel,
-        PrintsettingsPanel,
         StatusPanel,
+        ToolheadControlPanel,
         TemperaturePanel,
         WebcamPanel,
-        ZoffsetPanel,
     },
 })
 export default class PageDashboard extends Mixins(DashboardMixin) {
diff --git a/src/plugins/helpers.ts b/src/plugins/helpers.ts
index 9ebd82d88..d9e4ae6fe 100644
--- a/src/plugins/helpers.ts
+++ b/src/plugins/helpers.ts
@@ -13,6 +13,25 @@ import {
     mdiThermometerLines,
     mdiWebcam,
 } from '@mdi/js'
+import Vue from 'vue'
+
+export const setDataDeep = (currentState: any, payload: any) => {
+    if (payload !== null && typeof payload === 'object') {
+        Object.keys(payload).forEach((key: string) => {
+            const value = payload[key]
+
+            if (
+                typeof value === 'object' &&
+                !Array.isArray(value) &&
+                key in currentState &&
+                value !== null &&
+                currentState[key] !== null
+            ) {
+                setDataDeep(currentState[key], value)
+            } else Vue.set(currentState, key, value)
+        })
+    }
+}
 
 export const findDirectory = (folder: FileStateFile[], dirArray: string[]): FileStateFile[] | null => {
     if (folder !== undefined && folder !== null && dirArray.length) {
@@ -54,12 +73,10 @@ export const convertPanelnameToIcon = (name: string): string => {
             return mdiWebcam
         case 'zoffset':
             return mdiArrowCollapseVertical
-        case 'control':
+        case 'toolhead-control':
             return mdiGamepad
         case 'macros':
             return mdiCodeTags
-        case 'printsettings':
-            return mdiPrinter3d
         case 'miscellaneous':
             return mdiDipSwitch
         case 'temperature':
diff --git a/src/store/farm/printer/mutations.ts b/src/store/farm/printer/mutations.ts
index 0857aba41..4598195d6 100644
--- a/src/store/farm/printer/mutations.ts
+++ b/src/store/farm/printer/mutations.ts
@@ -2,6 +2,7 @@ import Vue from 'vue'
 import { getDefaultState } from './index'
 import { MutationTree } from 'vuex'
 import { FarmPrinterState } from '@/store/farm/printer/types'
+import { setDataDeep } from '@/plugins/helpers'
 
 export const mutations: MutationTree<FarmPrinterState> = {
     reset(state) {
@@ -82,17 +83,6 @@ export const mutations: MutationTree<FarmPrinterState> = {
     },
 
     setMainsailData(state, payload) {
-        // eslint-disable-next-line
-        const setDataDeep = (currentState: any, payload: any) => {
-            Object.entries(payload).forEach(([key, value]) => {
-                if (typeof value === 'object' && !Array.isArray(value) && key in currentState) {
-                    setDataDeep(currentState[key], value)
-                } else if (key in currentState) {
-                    Vue.set(currentState, key, value)
-                }
-            })
-        }
-
         setDataDeep(state.data.gui, payload)
     },
 
diff --git a/src/store/gui/getters.ts b/src/store/gui/getters.ts
index 6343f0921..9022c6c9a 100644
--- a/src/store/gui/getters.ts
+++ b/src/store/gui/getters.ts
@@ -63,4 +63,11 @@ export const getters: GetterTree<GuiState, any> = {
 
         return panels
     },
+
+    getDefaultControlActionButton: (state, getters, rootState, rootGetters) => {
+        if (rootGetters['printer/existsQGL']) return 'qgl'
+        else if (rootGetters['printer/existsZtilt']) return 'ztilt'
+
+        return 'm84'
+    },
 }
diff --git a/src/store/gui/index.ts b/src/store/gui/index.ts
index 8d650397f..c60c1a5e0 100644
--- a/src/store/gui/index.ts
+++ b/src/store/gui/index.ts
@@ -24,9 +24,12 @@ export const getDefaultState = (): GuiState => {
         },
         control: {
             style: 'bars',
+            actionButton: null,
+            enableXYHoming: false,
             feedrateXY: 100,
             stepsXY: [100, 10, 1],
             feedrateZ: 25,
+            offsetsZ: [0.005, 0.01, 0.025, 0.05],
             stepsZ: [25, 1, 0.1],
             stepsAll: [0.1, 1, 10, 25, 50, 100],
             stepsCircleXY: [1, 10, 50, 100],
@@ -37,7 +40,7 @@ export const getDefaultState = (): GuiState => {
             reverseZ: false,
             extruder: {
                 feedamount: 25,
-                feedamounts: [50, 10, 5, 1],
+                feedamounts: [50, 25, 10, 5, 1],
                 feedrate: 5,
                 feedrates: [10, 5, 2, 1],
                 showEstimatedExtrusionInfo: true,
@@ -52,11 +55,9 @@ export const getDefaultState = (): GuiState => {
             },
             mobileLayout: [
                 { name: 'webcam', visible: false },
-                { name: 'zoffset', visible: true },
-                { name: 'control', visible: true },
+                { name: 'toolhead-control', visible: true },
                 { name: 'extruder-control', visible: true },
                 { name: 'macros', visible: true },
-                { name: 'printsettings', visible: true },
                 { name: 'machine-settings', visible: true },
                 { name: 'miscellaneous', visible: true },
                 { name: 'temperature', visible: true },
@@ -64,11 +65,9 @@ export const getDefaultState = (): GuiState => {
             ],
             tabletLayout1: [
                 { name: 'webcam', visible: true },
-                { name: 'zoffset', visible: true },
-                { name: 'control', visible: true },
+                { name: 'toolhead-control', visible: true },
                 { name: 'extruder-control', visible: true },
                 { name: 'macros', visible: true },
-                { name: 'printsettings', visible: true },
                 { name: 'machine-settings', visible: true },
                 { name: 'miscellaneous', visible: true },
             ],
@@ -78,11 +77,9 @@ export const getDefaultState = (): GuiState => {
             ],
             desktopLayout1: [
                 { name: 'webcam', visible: true },
-                { name: 'zoffset', visible: true },
-                { name: 'control', visible: true },
+                { name: 'toolhead-control', visible: true },
                 { name: 'extruder-control', visible: true },
                 { name: 'macros', visible: true },
-                { name: 'printsettings', visible: true },
                 { name: 'machine-settings', visible: true },
                 { name: 'miscellaneous', visible: true },
             ],
@@ -91,15 +88,13 @@ export const getDefaultState = (): GuiState => {
                 { name: 'miniconsole', visible: true },
             ],
             widescreenLayout1: [
-                { name: 'zoffset', visible: true },
-                { name: 'control', visible: true },
+                { name: 'toolhead-control', visible: true },
                 { name: 'extruder-control', visible: true },
                 { name: 'macros', visible: true },
                 { name: 'miscellaneous', visible: true },
             ],
             widescreenLayout2: [
                 { name: 'temperature', visible: true },
-                { name: 'printsettings', visible: true },
                 { name: 'machine-settings', visible: true },
             ],
             widescreenLayout3: [
@@ -144,7 +139,6 @@ export const getDefaultState = (): GuiState => {
             logo: defaultLogoColor,
             primary: defaultPrimaryColor,
             displayCancelPrint: false,
-            displayZOffsetStandby: false,
             lockSlidersOnTouchDevices: true,
             lockSlidersDelay: 1.5,
             confirmOnEmergencyStop: false,
diff --git a/src/store/gui/mutations.ts b/src/store/gui/mutations.ts
index 28ce73c9a..fcae432df 100644
--- a/src/store/gui/mutations.ts
+++ b/src/store/gui/mutations.ts
@@ -2,6 +2,7 @@ import Vue from 'vue'
 import { getDefaultState } from './index'
 import { MutationTree } from 'vuex'
 import { GuiState } from '@/store/gui/types'
+import { setDataDeep } from '@/plugins/helpers'
 
 export const mutations: MutationTree<GuiState> = {
     reset(state) {
@@ -9,19 +10,6 @@ export const mutations: MutationTree<GuiState> = {
     },
 
     setData(state, payload) {
-        // eslint-disable-next-line
-        const setDataDeep = (currentState: any, payload: any) => {
-            if (typeof payload === 'object') {
-                Object.keys(payload).forEach((key: string) => {
-                    const value = payload[key]
-
-                    if (typeof value === 'object' && !Array.isArray(value) && key in currentState) {
-                        setDataDeep(currentState[key], value)
-                    } else Vue.set(currentState, key, value)
-                })
-            }
-        }
-
         setDataDeep(state, payload)
     },
 
diff --git a/src/store/gui/types.ts b/src/store/gui/types.ts
index 5f7425544..668e11029 100644
--- a/src/store/gui/types.ts
+++ b/src/store/gui/types.ts
@@ -15,9 +15,12 @@ export interface GuiState {
     console?: GuiConsoleState
     control: {
         style: 'bars' | 'circle' | 'cross'
+        actionButton: null | 'm84' | 'qgl' | 'ztilt'
+        enableXYHoming: boolean
         feedrateXY: number
         stepsXY: number[]
         feedrateZ: number
+        offsetsZ: number[]
         stepsZ: number[]
         stepsAll: number[]
         stepsCircleXY: number[]
@@ -88,7 +91,6 @@ export interface GuiState {
         logo: string
         primary: string
         displayCancelPrint: boolean
-        displayZOffsetStandby: boolean
         lockSlidersOnTouchDevices: boolean
         lockSlidersDelay: number
         confirmOnEmergencyStop: boolean
diff --git a/src/store/printer/getters.ts b/src/store/printer/getters.ts
index 3cd240ff0..5474f0df5 100644
--- a/src/store/printer/getters.ts
+++ b/src/store/printer/getters.ts
@@ -48,20 +48,6 @@ export const getters: GetterTree<PrinterState, RootState> = {
         return state.virtual_sdcard?.progress ?? 0
     },
 
-    getPositions: (state) => {
-        const position = state.motion_report?.live_position ?? state.toolhead?.position ?? [0, 0, 0]
-        const gcode_position = state.gcode_move?.gcode_position ?? [0, 0, 0]
-        const absolute = state.gcode_move?.absolute_coordinates ?? true
-
-        return {
-            coordinates: absolute,
-            x: position[0]?.toFixed(2) ?? '--',
-            y: position[1]?.toFixed(2) ?? '--',
-            z: position[2]?.toFixed(2) ?? '--',
-            gcode_z: gcode_position[2]?.toFixed(2) ?? '--',
-        }
-    },
-
     getMacros: (state, getters, rootState) => {
         const array: PrinterStateMacro[] = []
         const hiddenMacros: string[] = []
@@ -849,4 +835,40 @@ export const getters: GetterTree<PrinterState, RootState> = {
 
         return 0
     },
+
+    existsQGL: (state) => {
+        if (!state.configfile?.settings) return false
+
+        return 'quad_gantry_level' in state.configfile.settings
+    },
+
+    existsZtilt: (state) => {
+        if (!state.configfile?.settings) return false
+
+        return 'z_tilt' in state.configfile.settings
+    },
+
+    existsBedTilt: (state) => {
+        if (!state.configfile?.settings) return false
+
+        return 'bed_tilt' in state.configfile.settings
+    },
+
+    existsBedScrews: (state) => {
+        if (!state.configfile?.settings) return false
+
+        return 'bed_screws' in state.configfile.settings
+    },
+
+    existsDeltaCalibrate: (state) => {
+        if (!state.configfile?.settings) return false
+
+        return 'delta_calibrate' in state.configfile.settings
+    },
+
+    existsScrewsTilt: (state) => {
+        if (!state.configfile?.settings) return false
+
+        return 'screws_tilt_adjust' in state.configfile.settings
+    },
 }
diff --git a/src/store/printer/mutations.ts b/src/store/printer/mutations.ts
index 0a642e801..5c4869f14 100644
--- a/src/store/printer/mutations.ts
+++ b/src/store/printer/mutations.ts
@@ -2,6 +2,7 @@ import Vue from 'vue'
 import { getDefaultState } from './index'
 import { MutationTree } from 'vuex'
 import { PrinterState } from '@/store/printer/types'
+import { setDataDeep } from '@/plugins/helpers'
 
 export const mutations: MutationTree<PrinterState> = {
     reset(state) {
@@ -19,25 +20,6 @@ export const mutations: MutationTree<PrinterState> = {
     },
 
     setData(state, payload) {
-        // eslint-disable-next-line
-        const setDataDeep = (currentState: any, payload: any) => {
-            if (payload !== null && typeof payload === 'object') {
-                Object.keys(payload).forEach((key: string) => {
-                    const value = payload[key]
-
-                    if (
-                        typeof value === 'object' &&
-                        !Array.isArray(value) &&
-                        key in currentState &&
-                        value !== null &&
-                        currentState[key] !== null
-                    ) {
-                        setDataDeep(currentState[key], value)
-                    } else Vue.set(currentState, key, value)
-                })
-            }
-        }
-
         setDataDeep(state, payload)
     },
 
diff --git a/src/store/printer/types.ts b/src/store/printer/types.ts
index 9a6760b49..d6c04a814 100644
--- a/src/store/printer/types.ts
+++ b/src/store/printer/types.ts
@@ -212,3 +212,12 @@ export interface PrinterStateExtruder {
     nozzleDiameter: number
     maxExtrudeOnlyDistance: number
 }
+
+export interface PrinterStateExtruder {
+    key: string
+    name: string
+    filamentDiameter: number
+    minExtrudeTemp: number
+    nozzleDiameter: number
+    maxExtrudeOnlyDistance: number
+}
diff --git a/src/store/variables.ts b/src/store/variables.ts
index 8457f9413..e6f74efef 100644
--- a/src/store/variables.ts
+++ b/src/store/variables.ts
@@ -69,16 +69,14 @@ export const maxGcodeHistory = 50
  * List of generic dashboard panels
  */
 export const allDashboardPanels = [
-    'control',
+    'toolhead-control',
     'extruder-control',
     'macros',
     'machine-settings',
     'miniconsole',
     'miscellaneous',
-    'printsettings',
     'temperature',
     'webcam',
-    'zoffset',
 ]
 
 export const thumbnailSmallMin = 32