diff --git a/manifests/function/baremetal-operator/ironic.yaml b/manifests/function/baremetal-operator/ironic.yaml
index cef93433f..ebdeb5f91 100644
--- a/manifests/function/baremetal-operator/ironic.yaml
+++ b/manifests/function/baremetal-operator/ironic.yaml
@@ -59,6 +59,16 @@ spec:
             - name: ironic-entrypoints
               mountPath: /bin/init-images
               subPath: init-images
+        - name: qcow-bundle
+          command:
+            - sh
+            - -c
+            - "cp /qcows/*.qcow2 /qcows/*.qcow2.md5sum /shared/html/images/"
+          image: "quay.io/airshipit/qcow-bundle:latest-ubuntu_focal"
+          imagePullPolicy: Always
+          volumeMounts:
+              - mountPath: "/shared"
+                name: ironic-storage
       containers:
         - name: dnsmasq
           image: "quay.io/metal3-io/ironic:latest"
diff --git a/manifests/function/k8scontrol/controlplane.yaml b/manifests/function/k8scontrol/controlplane.yaml
index c5fd4d1ac..71d4d264d 100644
--- a/manifests/function/k8scontrol/controlplane.yaml
+++ b/manifests/function/k8scontrol/controlplane.yaml
@@ -22,34 +22,9 @@ spec:
           Environment="NO_PROXY=REPLACEMENT_NO_PROXY"
     # TODO: add download sources to the versions catalogue
     preKubeadmCommands:
-      - echo 'root:r00tme' | chpasswd
-      - echo 'ubuntu:r00tme' | chpasswd
-      - |
-        cat <<EOF | tee /etc/sysctl.d/k8s.conf
-        net.bridge.bridge-nf-call-ip6tables = 1
-        net.bridge.bridge-nf-call-iptables = 1
-        EOF
-      - sysctl --system
-      - swapoff -a
-      - export HTTP_PROXY=REPLACEMENT_HTTP_PROXY
-      - export HTTPS_PROXY=REPLACEMENT_HTTPS_PROXY
-      - export http_proxy=${HTTP_PROXY}
-      - export https_proxy=${HTTPS_PROXY}
-      - export NO_PROXY=REPLACEMENT_NO_PROXY
-      - export no_proxy=${NO_PROXY}
-      - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
-      - curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
-      - echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee -a /etc/apt/sources.list
-        # Replace xenial with focal or $(lsb_release -cs) once available
-      - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list
-      - apt update
-      - apt install -y
-          docker-ce="$(apt-cache policy docker-ce | grep 19.03.12 | sort | head -n 1 | tr -s " " | cut -d ' ' -f 2)"
-          docker-ce-cli="$(apt-cache policy docker-ce-cli | grep 19.03.12 | sort | head -n 1 | tr -s " " | cut -d ' ' -f 2)"
-          containerd.io
-      - apt install -y kubelet=1.18.6-00 kubeadm=1.18.6-00 kubectl=1.18.6-00
-      - apt-mark hold docker-ce docker-ce-cli containerd.io kubelet kubeadm kubectl
-      - unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY
+      # Restart docker to apply any proxy settings
+      - export HOME=/root
+      - systemctl restart docker
     initConfiguration:
       nodeRegistration:
         name: '{{ ds.meta_data.local_hostname }}'
diff --git a/manifests/site/test-site/target/catalogues/hosts.yaml b/manifests/site/test-site/target/catalogues/hosts.yaml
index dcbea59c4..b172134df 100644
--- a/manifests/site/test-site/target/catalogues/hosts.yaml
+++ b/manifests/site/test-site/target/catalogues/hosts.yaml
@@ -10,7 +10,7 @@ metadata:
 hosts:
   m3:
     node01:
-      bootMode: UEFI
+      bootMode: legacy
       macAddress: 52:54:00:b6:ed:31
       bmcAddress: redfish+http://10.23.25.1:8000/redfish/v1/Systems/air-target-1
       bmcUsername: root
@@ -24,7 +24,7 @@ hosts:
         pxe: 52:54:00:b6:ed:31
       hardwareProfile: default # defined in the hostgenerator-m3 function
     node02:
-      bootMode: UEFI
+      bootMode: legacy
       macAddress: 52:54:00:b6:ed:02
       bmcAddress: redfish+https://10.23.25.1:8443/redfish/v1/Systems/air-ephemeral
       bmcUsername: username
@@ -38,7 +38,7 @@ hosts:
         pxe: 52:54:00:b6:ed:02
       hardwareProfile: example # defined in the hardwareprofile-example function
     node03:
-      bootMode: UEFI
+      bootMode: legacy
       macAddress: 52:54:00:b6:ed:23
       bmcAddress: redfish+http://10.23.25.1:8000/redfish/v1/Systems/air-worker-1
       bmcUsername: username
diff --git a/manifests/site/test-site/target/catalogues/versions-airshipctl.yaml b/manifests/site/test-site/target/catalogues/versions-airshipctl.yaml
index 5ce5f8165..cc115ff59 100644
--- a/manifests/site/test-site/target/catalogues/versions-airshipctl.yaml
+++ b/manifests/site/test-site/target/catalogues/versions-airshipctl.yaml
@@ -7,5 +7,5 @@ files:
   k8scontrol:
     # Host the image in a locally served location for CI
     cluster_controlplane_image:
-      url: http://10.23.24.1:8099/target-image.qcow2
-      checksum: http://10.23.24.1:8099/target-image.qcow2.md5sum
+      url: http://10.23.24.101:80/images/control-plane.qcow2
+      checksum: http://10.23.24.101:80/images/control-plane.qcow2.md5sum
diff --git a/manifests/site/test-site/target/workers/provision/kubeadmconfigtemplate.yaml b/manifests/site/test-site/target/workers/provision/kubeadmconfigtemplate.yaml
index 20b070236..1078b88c1 100644
--- a/manifests/site/test-site/target/workers/provision/kubeadmconfigtemplate.yaml
+++ b/manifests/site/test-site/target/workers/provision/kubeadmconfigtemplate.yaml
@@ -12,50 +12,17 @@ spec:
             node-labels: 'metal3.io/uuid={{ ds.meta_data.uuid }},node-type=worker'
             provider-id: 'metal3://{{ ds.meta_data.uuid }}'
             feature-gates: "IPv6DualStack=true"
-      ntp:
-        enabled: true
-        servers:
-          - 135.188.34.124
-          - 135.38.244.16
-          - 135.188.34.84
+      files:
+        - path: "/etc/systemd/system/docker.service.d/http-proxy.conf"
+          content: |
+            [Service]
+            Environment="HTTP_PROXY=REPLACEMENT_HTTP_PROXY"
+            Environment="HTTPS_PROXY=REPLACEMENT_HTTPS_PROXY"
+            Environment="NO_PROXY=REPLACEMENT_NO_PROXY"
       preKubeadmCommands:
-        - echo 'root:r00tme' | chpasswd
-        - echo 'ubuntu:r00tme' | chpasswd
-        - |
-          cat <<EOF | tee /etc/sysctl.d/k8s.conf
-          net.bridge.bridge-nf-call-ip6tables = 1
-          net.bridge.bridge-nf-call-iptables = 1
-          EOF
-        - sysctl --system
-        - |
-          mkdir -p /etc/systemd/system/docker.service.d/
-          cat <<EOF | tee /etc/systemd/system/docker.service.d/http-proxy.conf
-          [Service]
-          Environment="HTTP_PROXY=REPLACEMENT_HTTP_PROXY"
-          Environment="HTTPS_PROXY=REPLACEMENT_HTTPS_PROXY"
-          Environment="NO_PROXY=REPLACEMENT_NO_PROXY"
-          EOF
-        - export HTTP_PROXY=REPLACEMENT_HTTP_PROXY
-        - export HTTPS_PROXY=REPLACEMENT_HTTPS_PROXY
-        - export http_proxy=${HTTP_PROXY}
-        - export https_proxy=${HTTPS_PROXY}
-        - export NO_PROXY=REPLACEMENT_NO_PROXY
-        - export no_proxy=${NO_PROXY}
-        - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-        - curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
-        - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-        - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list
-        - apt-get update
-        - apt-get install -y
-            docker-ce="$(apt policy docker-ce  | grep 19.03.9 | sort | head -n 1 | tr -s " " | cut -d ' ' -f 2 )"
-            docker-ce-cli="$(apt policy docker-ce-cli  | grep 19.03.9 | sort | head -n 1 | tr -s " " | cut -d ' ' -f 2 )"
-            containerd.io
-        - swapoff -a
-        - apt-get install -y kubelet=1.18.6-00 kubeadm=1.18.6-00
-        - apt-mark hold kubelet kubeadm
-        - systemctl mask ntp
-        - systemctl enable --now systemd-timesyncd
-        - unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY
+        # Restart docker to apply any proxy settings
+        - export HOME=/root
+        - systemctl restart docker
       users:
         - name: deployer
           sshAuthorizedKeys:
diff --git a/manifests/site/test-site/target/workers/provision/metal3machinetemplate.yaml b/manifests/site/test-site/target/workers/provision/metal3machinetemplate.yaml
index 68599b383..f4405f62a 100644
--- a/manifests/site/test-site/target/workers/provision/metal3machinetemplate.yaml
+++ b/manifests/site/test-site/target/workers/provision/metal3machinetemplate.yaml
@@ -6,5 +6,5 @@ spec:
   template:
     spec:
       image:
-        url: http://10.23.24.1:8099/target-image.qcow2
-        checksum: http://10.23.24.1:8099/target-image.qcow2.md5sum
+        url: http://10.23.24.102:80/images/data-plane.qcow2
+        checksum: http://10.23.24.102:80/images/data-plane.qcow2.md5sum
diff --git a/manifests/site/test-site/target/workers/replacements/workers-env-vars.yaml b/manifests/site/test-site/target/workers/replacements/workers-env-vars.yaml
index 744a9093e..79e1517a9 100644
--- a/manifests/site/test-site/target/workers/replacements/workers-env-vars.yaml
+++ b/manifests/site/test-site/target/workers/replacements/workers-env-vars.yaml
@@ -17,7 +17,9 @@ replacements:
     objref:
       kind: KubeadmConfigTemplate
       name: worker-1
-    fieldrefs: ["spec.template.spec.preKubeadmCommands%REPLACEMENT_HTTP_PROXY%"]
+    fieldrefs:
+      - "spec.template.spec.preKubeadmCommands%REPLACEMENT_HTTP_PROXY%"
+      - "spec.template.spec.files[path=/etc/systemd/system/docker.service.d/http-proxy.conf].content%REPLACEMENT_HTTP_PROXY%"
 - source:
     objref:
       name: env-vars-catalogue
@@ -26,7 +28,9 @@ replacements:
     objref:
       kind: KubeadmConfigTemplate
       name: worker-1
-    fieldrefs: ["spec.template.spec.preKubeadmCommands%REPLACEMENT_HTTPS_PROXY%"]
+    fieldrefs:
+      - "spec.template.spec.preKubeadmCommands%REPLACEMENT_HTTPS_PROXY%"
+      - "spec.template.spec.files[path=/etc/systemd/system/docker.service.d/http-proxy.conf].content%REPLACEMENT_HTTPS_PROXY%"
 - source:
     objref:
       name: env-vars-catalogue
@@ -35,4 +39,6 @@ replacements:
     objref:
       kind: KubeadmConfigTemplate
       name: worker-1
-    fieldrefs: ["spec.template.spec.preKubeadmCommands%REPLACEMENT_NO_PROXY%"]
+    fieldrefs:
+      - "spec.template.spec.preKubeadmCommands%REPLACEMENT_NO_PROXY%"
+      - "spec.template.spec.files[path=/etc/systemd/system/docker.service.d/http-proxy.conf].content%REPLACEMENT_NO_PROXY%"
diff --git a/playbooks/airship-airshipctl-build-gate.yaml b/playbooks/airship-airshipctl-build-gate.yaml
index c2eb4c548..1cd391193 100644
--- a/playbooks/airship-airshipctl-build-gate.yaml
+++ b/playbooks/airship-airshipctl-build-gate.yaml
@@ -90,16 +90,16 @@
             disk_format: qcow2
             ephemeral_disk_size: 20G
             ephemeral_vm_cfg: "{{ ephemeral_vm_cfg }}"
-            ephemeral_vm_memory_mb: 6124
+            ephemeral_vm_memory_mb: 6144
             ephemeral_vm_vcpus: 4
             target_disk_size: 20G
             target_vm_cfg: "{{ target_vm_cfg }}"
-            target_vm_memory_mb: 6124
+            target_vm_memory_mb: 7168
             target_vm_vcpus: 2
             target_vms_count: 1
             worker_disk_size: 20G
             worker_vm_cfg: "{{ worker_vm_cfg }}"
-            worker_vm_memory_mb: 6124
+            worker_vm_memory_mb: 7168
             worker_vm_vcpus: 2
             worker_vms_count: 1
         airship_gate_file_exchanger:
diff --git a/tools/deployment/30_deploy_controlplane.sh b/tools/deployment/30_deploy_controlplane.sh
index b9b374b3b..9e774d50d 100755
--- a/tools/deployment/30_deploy_controlplane.sh
+++ b/tools/deployment/30_deploy_controlplane.sh
@@ -14,9 +14,7 @@
 
 set -ex
 
-TARGET_IMAGE_DIR="/srv/images"
 EPHEMERAL_DOMAIN_NAME="air-ephemeral"
-TARGET_IMAGE_URL="https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img"
 export KUBECONFIG=${KUBECONFIG:-"$HOME/.airship/kubeconfig"}
 export KUBECONFIG_TARGET_CONTEXT=${KUBECONFIG_TARGET_CONTEXT:-"target-cluster"}
 
@@ -31,22 +29,6 @@ do
     xargs -I{} sudo virsh change-media $vm {} --eject || :
 done
 
-echo "Download target image"
-DOWNLOAD="200"
-if [ -e ${TARGET_IMAGE_DIR}/target-image.qcow2 ]
-then
-    MTIME=$(date -d @$(stat -c %Y ${TARGET_IMAGE_DIR}/target-image.qcow2) +"%a, %d %b %Y %T %Z")
-    DOWNLOAD=$(curl -sSLI \
-        --write-out '%{http_code}' \
-        -H "If-Modified-Since: ${MTIME}" \
-        ${TARGET_IMAGE_URL} | tail -1)
-fi
-if [ "${DOWNLOAD}" != "304" ]
-then
-    curl -sSLo ${TARGET_IMAGE_DIR}/target-image.qcow2 ${TARGET_IMAGE_URL}
-fi
-md5sum /srv/images/target-image.qcow2 | cut -d ' ' -f 1 > ${TARGET_IMAGE_DIR}/target-image.qcow2.md5sum
-
 echo "Create target k8s cluster resources"
 airshipctl phase run controlplane-ephemeral --debug