diff --git a/manifests/function/ephemeral/secret.yaml b/manifests/function/ephemeral/secret.yaml
index 8690a0169..40b33ceee 100644
--- a/manifests/function/ephemeral/secret.yaml
+++ b/manifests/function/ephemeral/secret.yaml
@@ -26,20 +26,21 @@ stringData:
       net.bridge.bridge-nf-call-iptables = 1
       EOF
     - sysctl --system
-    - curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
-    - curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
-    - echo "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee -a /etc/apt/sources.list
-    - 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.17.3-00 kubeadm=1.17.3-00 kubectl=1.17.3-00
-    - apt-mark hold kubelet kubeadm kubectl
+    - 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
     - kubeadm init --config /tmp/kubeadm.yaml
-    - kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
+    - kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
     - mkdir -p /opt/metal3-dev-env/ironic/html/images
     write_files:
     - content: |
diff --git a/manifests/function/k8scontrol/controlplane.yaml b/manifests/function/k8scontrol/controlplane.yaml
index 7e93aa858..a21a904ac 100644
--- a/manifests/function/k8scontrol/controlplane.yaml
+++ b/manifests/function/k8scontrol/controlplane.yaml
@@ -4,7 +4,7 @@ metadata:
   name: cluster-controlplane
 spec:
   replicas: 1
-  version: v1.17.0
+  version: v1.18.6
   infrastructureTemplate:
     kind: Metal3MachineTemplate
     apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
@@ -17,18 +17,19 @@ spec:
         net.bridge.bridge-nf-call-iptables = 1
         EOF
       - sysctl --system
-      - 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.17.3-00 kubeadm=1.17.3-00 kubectl=1.17.3-00
-      - apt-mark hold kubelet kubeadm kubectl
+      - 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
     initConfiguration:
       nodeRegistration:
         name: '{{ ds.meta_data.local_hostname }}'
@@ -41,7 +42,7 @@ spec:
         kubeletExtraArgs:
           node-labels: 'metal3.io/uuid={{ ds.meta_data.uuid }}'
     postKubeadmCommands:
-      - kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
+      - kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
 ---
 apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
 kind: Metal3MachineTemplate
@@ -52,8 +53,8 @@ spec:
     spec:
       image:
         # NOTE (dukov) this should be overridden on lower levels
-        url: https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img
-        checksum: 4a6909d1480ac30d676accd7b37ec711
+        url: https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
+        checksum: 2c890254ecbd4e6b4931f864ef72b337
       hostSelector:
         matchLabels:
           airshipit.org/k8s-role: controlplane-host
diff --git a/pkg/clusterctl/cmd/testdata/airshipconfig.yaml b/pkg/clusterctl/cmd/testdata/airshipconfig.yaml
index d46839ff6..ecb5b921f 100644
--- a/pkg/clusterctl/cmd/testdata/airshipconfig.yaml
+++ b/pkg/clusterctl/cmd/testdata/airshipconfig.yaml
@@ -3,14 +3,14 @@ bootstrapInfo:
   dummy_bootstrap_config:
     container:
       volume: /tmp/airship:/config
-      image: quay.io/airshipit/isogen:latest-debian_stable
+      image: quay.io/airshipit/isogen:latest-ubuntu_focal
       containerRuntime: docker
     builder:
       userDataFileName: user-data
       networkConfigFileName: network-config
       outputMetadataFileName: output-metadata.yaml
     remoteDirect:
-      isoUrl: http://localhost:8099/debian-custom.iso
+      isoUrl: http://localhost:8099/ubuntu-focal.iso
 clusters:
   dummycluster:
     clusterType:
diff --git a/pkg/config/constants.go b/pkg/config/constants.go
index 9e7da97df..d78bad049 100644
--- a/pkg/config/constants.go
+++ b/pkg/config/constants.go
@@ -57,8 +57,8 @@ const (
 	AirshipPluginPathEnv                  = "AIRSHIP_KUSTOMIZE_PLUGINS"
 
 	// Modules
-	AirshipDefaultBootstrapImage = "quay.io/airshipit/isogen:latest-debian_stable"
-	AirshipDefaultIsoURL         = "http://localhost:8099/debian-custom.iso"
+	AirshipDefaultBootstrapImage = "quay.io/airshipit/isogen:latest-ubuntu_focal"
+	AirshipDefaultIsoURL         = "http://localhost:8099/ubuntu-focal.iso"
 	AirshipDefaultManagementType = redfish.ClientType
 )
 
diff --git a/pkg/phase/apply/testdata/config.yaml b/pkg/phase/apply/testdata/config.yaml
index 00a65f560..81b280473 100644
--- a/pkg/phase/apply/testdata/config.yaml
+++ b/pkg/phase/apply/testdata/config.yaml
@@ -3,14 +3,14 @@ bootstrapInfo:
   dummy_bootstrap_config:
     container:
       volume: /tmp/airship:/config
-      image: quay.io/airshipit/isogen:latest-debian_stable
+      image: quay.io/airshipit/isogen:latest-ubuntu_focal
       containerRuntime: docker
     builder:
       userDataFileName: user-data
       networkConfigFileName: network-config
       outputMetadataFileName: output-metadata.yaml
     remoteDirect:
-      isoUrl: http://localhost:8099/debian-custom.iso
+      isoUrl: http://localhost:8099/ubuntu-focal.iso
 clusters:
   dummycluster:
     clusterType:
diff --git a/pkg/phase/testdata/airshipconfig.yaml b/pkg/phase/testdata/airshipconfig.yaml
index 71b0caa1e..1e9c40270 100644
--- a/pkg/phase/testdata/airshipconfig.yaml
+++ b/pkg/phase/testdata/airshipconfig.yaml
@@ -3,14 +3,14 @@ bootstrapInfo:
   dummy_bootstrap_config:
     container:
       volume: /tmp/airship:/config
-      image: quay.io/airshipit/isogen:latest-debian_stable
+      image: quay.io/airshipit/isogen:latest-ubuntu_focal
       containerRuntime: docker
     builder:
       userDataFileName: user-data
       networkConfigFileName: network-config
       outputMetadataFileName: output-metadata.yaml
     remoteDirect:
-      isoUrl: http://localhost:8099/debian-custom.iso
+      isoUrl: http://localhost:8099/ubuntu-focal.iso
       remoteType: redfish
 clusters:
   dummycluster:
diff --git a/pkg/remote/redfish/client_test.go b/pkg/remote/redfish/client_test.go
index 49f6580a1..57d5d8407 100644
--- a/pkg/remote/redfish/client_test.go
+++ b/pkg/remote/redfish/client_test.go
@@ -33,7 +33,7 @@ import (
 
 const (
 	nodeID              = "System.Embedded.1"
-	isoPath             = "https://localhost:8080/debian.iso"
+	isoPath             = "http://localhost:8099/ubuntu-focal.iso"
 	redfishURL          = "redfish+https://localhost:2224/Systems/System.Embedded.1"
 	systemActionRetries = 1
 	systemRebootDelay   = 0
diff --git a/playbooks/vars/test-config.yaml b/playbooks/vars/test-config.yaml
index c6c35d0d9..3fd689998 100644
--- a/playbooks/vars/test-config.yaml
+++ b/playbooks/vars/test-config.yaml
@@ -15,7 +15,7 @@ airship_config_iso_gen_target_path: "{{ serve_dir }}"
 airship_config_primary_repo_url: "https://review.opendev.org/airship/airshipctl"
 airship_config_manifest_directory: "{{ remote_work_dir | default(zuul.project.src_dir) | default(local_src_dir) }}"
 airship_config_ephemeral_ip: "{{ airship_gate_ipam.nat_network.ephemeral_ip }}"
-airship_config_iso_builder_docker_image: "quay.io/airshipit/isogen:latest-debian_stable"
+airship_config_iso_builder_docker_image: "quay.io/airshipit/isogen:latest-ubuntu_focal"
 airship_config_site_path: manifests/site/test-site
 airship_config_ca_data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNU1USXlOakE0TWpneU5Gb1hEVEk1TVRJeU16QTRNamd5TkZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTFSClM0d3lnajNpU0JBZjlCR0JUS1p5VTFwYmdDaGQ2WTdJektaZWRoakM2K3k1ZEJpWm81ZUx6Z2tEc2gzOC9YQ1MKenFPS2V5cE5RcDN5QVlLdmJKSHg3ODZxSFZZNjg1ZDVYVDNaOHNyVVRzVDR5WmNzZHAzV3lHdDM0eXYzNi9BSQoxK1NlUFErdU5JemN6bzNEdWhXR0ZoQjk3VjZwRitFUTBlVWN5bk05c2hkL3AwWVFzWDR1ZlhxaENENVpzZnZUCnBka3UvTWkyWnVGUldUUUtNeGpqczV3Z2RBWnBsNnN0L2ZkbmZwd1Q5cC9WTjRuaXJnMEsxOURTSFFJTHVrU2MKb013bXNBeDJrZmxITWhPazg5S3FpMEloL2cyczRFYTRvWURZemt0Y2JRZ24wd0lqZ2dmdnVzM3pRbEczN2lwYQo4cVRzS2VmVGdkUjhnZkJDNUZNQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFJek9BL00xWmRGUElzd2VoWjFuemJ0VFNURG4KRHMyVnhSV0VnclFFYzNSYmV3a1NkbTlBS3MwVGR0ZHdEbnBEL2tRYkNyS2xEeFF3RWg3NFZNSFZYYkFadDdsVwpCSm90T21xdXgxYThKYklDRTljR0FHRzFvS0g5R29jWERZY0JzOTA3ckxIdStpVzFnL0xVdG5hN1dSampqZnBLCnFGelFmOGdJUHZIM09BZ3B1RVVncUx5QU8ya0VnelZwTjZwQVJxSnZVRks2TUQ0YzFmMnlxWGxwNXhrN2dFSnIKUzQ4WmF6d0RmWUVmV3Jrdld1YWdvZ1M2SktvbjVEZ0Z1ZHhINXM2Snl6R3lPVnZ0eG1TY2FvOHNxaCs3UXkybgoyLzFVcU5ZK0hlN0x4d04rYkhwYkIxNUtIMTU5ZHNuS3BRbjRORG1jSTZrVnJ3MDVJMUg5ZGRBbGF0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
 airship_config_client_cert_data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQwRENDQXJnQ0ZFdFBveEZYSjVrVFNWTXQ0OVlqcHBQL3hCYnlNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1CVXgKRXpBUkJnTlZCQU1UQ210MVltVnlibVYwWlhNd0hoY05NakF3TVRJME1Ua3hOVEV3V2hjTk1qa3hNakF5TVRreApOVEV3V2pBME1Sa3dGd1lEVlFRRERCQnJkV0psY201bGRHVnpMV0ZrYldsdU1SY3dGUVlEVlFRS0RBNXplWE4wClpXMDZiV0Z6ZEdWeWN6Q0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1iaFhUUmsKVjZiZXdsUjBhZlpBdTBGYWVsOXRtRThaSFEvaGtaSHhuTjc2bDZUUFltcGJvaDRvRjNGMFFqbzROS1o5NVRuWgo0OWNoV240eFJiZVlPU25EcDBpV0Qzd0pXUlZ5aVFvVUFyYTlNcHVPNkVFU1FpbFVGNXNxc0VXUVdVMjBETStBCkdxK1k0Z2c3eDJ1Q0hTdk1GUmkrNEw5RWlXR2xnRDIvb1hXUm5NWEswNExQajZPb3Vkb2Zid2RmT3J6dTBPVkUKUzR0eGtuS1BCY1BUU3YxMWVaWVhja0JEVjNPbExENEZ3dTB3NTcwcnczNzAraEpYdlZxd3Zjb2RjZjZEL1BXWQowamlnd2ppeUJuZ2dXYW04UVFjd1Nud3o0d05sV3hKOVMyWUJFb1ptdWxVUlFaWVk5ZXRBcEpBdFMzTjlUNlQ2ClovSlJRdEdhZDJmTldTYkxEck5qdU1OTGhBYWRMQnhJUHpBNXZWWk5aalJkdEMwU25pMlFUMTVpSFp4d1RxcjQKakRQQ0pYRXU3KytxcWpQVldUaUZLK3JqcVNhS1pqVWZVaUpHQkJWcm5RZkJENHNtRnNkTjB5cm9tYTZOYzRMNQpKS21RV1NHdmd1aG0zbW5sYjFRaVRZanVyZFJQRFNmdmwrQ0NHbnA1QkkvZ1pwMkF1SHMvNUpKVTJlc1ZvL0xsCkVPdHdSOXdXd3dXcTAvZjhXS3R4bVRrMTUyOUp2dFBGQXQweW1CVjhQbHZlYnVwYmJqeW5pL2xWbTJOYmV6dWUKeCtlMEpNbGtWWnFmYkRSS243SjZZSnJHWW1CUFV0QldoSVkzb1pJVTFEUXI4SUlIbkdmYlZoWlR5ME1IMkFCQQp1dlVQcUtSVk80UGkxRTF4OEE2eWVPeVRDcnB4L0pBazVyR2RBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnRUJBSWNFM1BxZHZDTVBIMnJzMXJESk9ESHY3QWk4S01PVXZPRi90RjlqR2EvSFBJbkh3RlVFNEltbldQeDYKVUdBMlE1bjFsRDFGQlU0T0M4eElZc3VvS1VQVHk1T0t6SVNMNEZnL0lEcG54STlrTXlmNStMR043aG8rblJmawpCZkpJblVYb0tERW1neHZzSWFGd1h6bGtSTDJzL1lKYUZRRzE1Uis1YzFyckJmd2dJOFA5Tkd6aEM1cXhnSmovCm04K3hPMGhXUmJIYklrQ21NekRib2pCSWhaL00rb3VYR1doei9TakpodXhZTVBnek5MZkFGcy9PMTVaSjd3YXcKZ3ZoSGc3L2E5UzRvUCtEYytPa3VrMkV1MUZjL0E5WHpWMzc5aWhNWW5ub3RQMldWeFZ3b0ZZQUg0NUdQcDZsUApCQmwyNnkxc2JMbjl6aGZYUUJIMVpFN0EwZVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
diff --git a/testdata/k8s/config.yaml b/testdata/k8s/config.yaml
index d7d527d4e..79a4ca59c 100644
--- a/testdata/k8s/config.yaml
+++ b/testdata/k8s/config.yaml
@@ -7,10 +7,10 @@ bootstrapInfo:
       userDataFileName: user-data
     container:
       containerRuntime: docker
-      image: quay.io/airshipit/isogen:latest-debian_stable
+      image: quay.io/airshipit/isogen:latest-ubuntu_focal
       volume: /srv/iso:/config
     remoteDirect:
-      isoUrl: http://localhost:8099/debian-custom.iso
+      isoUrl: http://localhost:8099/ubuntu-focal.iso
 clusters:
   default:
     clusterType:
diff --git a/tools/deployment/22_test_configs.sh b/tools/deployment/22_test_configs.sh
index 04836b84e..73eaf260d 100755
--- a/tools/deployment/22_test_configs.sh
+++ b/tools/deployment/22_test_configs.sh
@@ -23,13 +23,13 @@ export HTTPS_PROXY=${HTTPS_PROXY:-${https_proxy}}
 export HTTP_PROXY=${HTTP_PROXY:-${http_proxy}}
 export NO_PROXY=${NO_PROXY:-${no_proxy}}
 export AIRSHIP_CONFIG_ISO_GEN_TARGET_PATH=${ISO_DIR}
-export AIRSHIP_CONFIG_ISO_BUILDER_DOCKER_IMAGE=${BUILDER_IMAGE:-"quay.io/airshipit/isogen:latest-debian_stable"}
+export AIRSHIP_CONFIG_ISO_BUILDER_DOCKER_IMAGE=${BUILDER_IMAGE:-"quay.io/airshipit/isogen:latest-ubuntu_focal"}
 export REMOTE_TYPE=redfish
 export REMOTE_INSECURE=true
 export REMOTE_PROXY=false
 export AIRSHIP_CONFIG_ISO_SERVE_HOST=${HOST:-"localhost"}
 export AIRSHIP_CONFIG_ISO_PORT=${SERVE_PORT}
-export AIRSHIP_CONFIG_ISO_NAME=${ISO_NAME:-"debian-custom.iso"}
+export AIRSHIP_CONFIG_ISO_NAME=${ISO_NAME:-"ubuntu-focal.iso"}
 export SYSTEM_ACTION_RETRIES=30
 export SYSTEM_REBOOT_DELAY=30
 export AIRSHIP_CONFIG_PRIMARY_REPO_BRANCH=${BRANCH:-"master"}
diff --git a/tools/deployment/30_deploy_controlplane.sh b/tools/deployment/30_deploy_controlplane.sh
index 87da33557..1c783c733 100755
--- a/tools/deployment/30_deploy_controlplane.sh
+++ b/tools/deployment/30_deploy_controlplane.sh
@@ -16,7 +16,7 @@ set -ex
 
 TARGET_IMAGE_DIR="/srv/iso"
 EPHEMERAL_DOMAIN_NAME="air-ephemeral"
-TARGET_IMAGE_URL="https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img"
+TARGET_IMAGE_URL="https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img"
 
 # TODO (dukov) this is needed due to sushy tools inserts cdrom image to
 # all vms. This can be removed once sushy tool is fixed
diff --git a/tools/document/validate_site_docs.sh b/tools/document/validate_site_docs.sh
index 1a19a4c00..94e5fc3d2 100755
--- a/tools/document/validate_site_docs.sh
+++ b/tools/document/validate_site_docs.sh
@@ -62,10 +62,10 @@ bootstrapInfo:
       userDataFileName: user-data
     container:
       containerRuntime: docker
-      image: quay.io/airshipit/isogen:latest-debian_stable
+      image: quay.io/airshipit/isogen:latest-ubuntu_focal
       volume: /srv/iso:/config
     remoteDirect:
-      isoUrl: http://localhost:8099/debian-custom.iso
+      isoUrl: http://localhost:8099/ubuntu-focal.iso
 clusters:
   ${CONTEXT}_${cluster}:
     clusterType: