diff --git a/manifests/function/workers-capo/workers.yaml b/manifests/function/workers-capo/workers.yaml
index 5e24a83f8..4b9714cd0 100644
--- a/manifests/function/workers-capo/workers.yaml
+++ b/manifests/function/workers-capo/workers.yaml
@@ -70,3 +70,12 @@ spec:
         sshAuthorizedKeys:
         - ${OPENSTACK_SSH_KEY}
         sudo: ALL=(ALL) NOPASSWD:ALL
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: target-cluster-cloud-config
+  namespace: default
+data:
+  cacert: ${CLOUD_CERT_B64}
+  clouds.yaml: ${CLOUDS_YAML_B64}
diff --git a/manifests/site/openstack-test-site/ephemeral/controlplane/cluster_clouds_yaml_patch.yaml b/manifests/site/openstack-test-site/ephemeral/controlplane/cluster_clouds_yaml_patch.yaml
new file mode 100644
index 000000000..d6f49c5a1
--- /dev/null
+++ b/manifests/site/openstack-test-site/ephemeral/controlplane/cluster_clouds_yaml_patch.yaml
@@ -0,0 +1,8 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: target-cluster-cloud-config
+  namespace: default
+data:
+  cacert: Cg==
+  clouds.yaml: Y2xvdWRzOgogIGRldnN0YWNrOgogICAgYXV0aDoKICAgICAgYXV0aF91cmw6IGh0dHA6Ly8xMC4wLjAuNC9pZGVudGl0eQogICAgICBwYXNzd29yZDogcGFzcwogICAgICBwcm9qZWN0X2RvbWFpbl9pZDogZGVmYXVsdAogICAgICBwcm9qZWN0X25hbWU6IGRlbW8KICAgICAgdXNlcl9kb21haW5faWQ6IGRlZmF1bHQKICAgICAgdXNlcm5hbWU6IGRlbW8KICAgIGlkZW50aXR5X2FwaV92ZXJzaW9uOiAnMycKICAgIHJlZ2lvbl9uYW1lOiBSZWdpb25PbmUKICAgIHZvbHVtZV9hcGlfdmVyc2lvbjogJzMnCg==
diff --git a/manifests/site/openstack-test-site/target/controlplane/control_plane_config_patch.yaml b/manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_config_patch.yaml
similarity index 67%
rename from manifests/site/openstack-test-site/target/controlplane/control_plane_config_patch.yaml
rename to manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_config_patch.yaml
index b22ea1855..84489a540 100644
--- a/manifests/site/openstack-test-site/target/controlplane/control_plane_config_patch.yaml
+++ b/manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_config_patch.yaml
@@ -11,7 +11,7 @@ spec:
   kubeadmConfigSpec:
     files:
     - path: /etc/kubernetes/cloud.conf
-      content: W0dsb2JhbF0KYXV0aC11cmw9aHR0cDovLzEwLjAuMS40L2lkZW50aXR5CnVzZXJuYW1lPSJkZW1vIgpwYXNzd29yZD0icGFzcyIKdGVuYW50LWlkPSIyMThkMWNiYzMyOWM0YWUzYWNjODhjYTU5NTAwMTUwMSIKZG9tYWluLW5hbWU9IkRlZmF1bHQiCnJlZ2lvbj0iUmVnaW9uT25lIgo=
+      content: W0dsb2JhbF0KYXV0aC11cmw9aHR0cDovLzEwLjAuMC40L2lkZW50aXR5CnVzZXJuYW1lPSJkZW1vIgpwYXNzd29yZD0icGFzcyIKdGVuYW50LW5hbWU9ImRlbW8iCmRvbWFpbi1pZD0iZGVmYXVsdCIKcmVnaW9uPSJSZWdpb25PbmUiCg==
       encoding: base64
       owner: root
       permissions: "0600"
@@ -19,4 +19,4 @@ spec:
       content: Cg==
       encoding: base64
       owner: root
-      permissions: "0600"
\ No newline at end of file
+      permissions: "0600"
diff --git a/manifests/site/openstack-test-site/target/controlplane/control_plane_ip.json b/manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_ip.json
similarity index 100%
rename from manifests/site/openstack-test-site/target/controlplane/control_plane_ip.json
rename to manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_ip.json
diff --git a/manifests/site/openstack-test-site/target/controlplane/control_plane_ip_patch.yaml b/manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_ip_patch.yaml
similarity index 100%
rename from manifests/site/openstack-test-site/target/controlplane/control_plane_ip_patch.yaml
rename to manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_ip_patch.yaml
diff --git a/manifests/site/openstack-test-site/target/controlplane/control_plane_machine_count_patch.yaml b/manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_machine_count_patch.yaml
similarity index 100%
rename from manifests/site/openstack-test-site/target/controlplane/control_plane_machine_count_patch.yaml
rename to manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_machine_count_patch.yaml
diff --git a/manifests/site/openstack-test-site/target/controlplane/control_plane_machine_flavor_patch.yaml b/manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_machine_flavor_patch.yaml
similarity index 100%
rename from manifests/site/openstack-test-site/target/controlplane/control_plane_machine_flavor_patch.yaml
rename to manifests/site/openstack-test-site/ephemeral/controlplane/control_plane_machine_flavor_patch.yaml
diff --git a/manifests/site/openstack-test-site/target/controlplane/dns_servers.json b/manifests/site/openstack-test-site/ephemeral/controlplane/dns_servers.json
similarity index 100%
rename from manifests/site/openstack-test-site/target/controlplane/dns_servers.json
rename to manifests/site/openstack-test-site/ephemeral/controlplane/dns_servers.json
diff --git a/manifests/site/openstack-test-site/target/controlplane/external_network_id.json b/manifests/site/openstack-test-site/ephemeral/controlplane/external_network_id.json
similarity index 62%
rename from manifests/site/openstack-test-site/target/controlplane/external_network_id.json
rename to manifests/site/openstack-test-site/ephemeral/controlplane/external_network_id.json
index 1603e579f..7eae1a68a 100644
--- a/manifests/site/openstack-test-site/target/controlplane/external_network_id.json
+++ b/manifests/site/openstack-test-site/ephemeral/controlplane/external_network_id.json
@@ -1,3 +1,3 @@
 [
-  { "op": "replace","path": "/spec/externalNetworkId","value": "da57dbbe-c923-4641-b00a-0060d52f6f95" }
+  { "op": "replace","path": "/spec/externalNetworkId","value": "4e9b967f-1aec-41a5-ad1b-9805af62ebdd" }
 ]
diff --git a/manifests/site/openstack-test-site/target/controlplane/kustomization.yaml b/manifests/site/openstack-test-site/ephemeral/controlplane/kustomization.yaml
similarity index 100%
rename from manifests/site/openstack-test-site/target/controlplane/kustomization.yaml
rename to manifests/site/openstack-test-site/ephemeral/controlplane/kustomization.yaml
diff --git a/manifests/site/openstack-test-site/ephemeral/controlplane/ssh_key_patch.yaml b/manifests/site/openstack-test-site/ephemeral/controlplane/ssh_key_patch.yaml
new file mode 100644
index 000000000..b32af3e11
--- /dev/null
+++ b/manifests/site/openstack-test-site/ephemeral/controlplane/ssh_key_patch.yaml
@@ -0,0 +1,11 @@
+apiVersion: controlplane.cluster.x-k8s.io/v1alpha3
+kind: KubeadmControlPlane
+metadata:
+  name: target-cluster-control-plane
+  namespace: default
+spec:
+  kubeadmConfigSpec:
+    users:
+    - name: capo
+      sshAuthorizedKeys:
+      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCV+B0gfF/728wO9XOZbEpxuCP2rhZu0CIic2+O6M9d/t2weLCDl0rdOlssnVzsS5C04OQvm6IDy94xHG8ob2N2G/LGz7/jgCiysHjdQ1Yg6F16hx1rnRFeS2lLDc7PhGco8hAPbY/oN5Q0biutJRSnI5zLNhN1phXRap0ptaI8g3B3t07lxtJGPich2npyGt+ie7QwEzxoPMR81AnmCiqtRC7n2bf5p7CqMxMGHzhg30+BSOx81VlT30SKnExbXrHqV6372+kUvGw/NrUcJEQJNb/QDgAX51BBfTqYyxqZ3RDsBCRdE9IX51BgT6GJnsNjgo6h5CEIdAUNBM1MT23hpzpOTZPbSTdKsc5NHfbKKP6dlPcGYstHvtaVkvZ5x6bQr7dk9qiRs6ujuHybpE95OaH23Pg9PSbTxmZ8GZMMIzg1fToSNstaZe82crd+oY66icUgR7jvOwj7qulOklnkwLTaRUdRtbL4kYORxajLDVAuwF0qEtdGU3Pyb2NXoDs= stack@devstack
diff --git a/manifests/site/openstack-test-site/phases/plan.yaml b/manifests/site/openstack-test-site/phases/plan.yaml
index a11210f1d..df6ac45c5 100644
--- a/manifests/site/openstack-test-site/phases/plan.yaml
+++ b/manifests/site/openstack-test-site/phases/plan.yaml
@@ -6,6 +6,8 @@ phaseGroups:
   - name: group1
     phases:
       - name: clusterctl-init-ephemeral
-      - name: controlplane-target
+      - name: controlplane-ephemeral
+      - name: initinfra-target
+      - name: clusterctl-init-target
+      - name: clusterctl-move
       - name: workers-target
-      - name: clusterctl-init-target
\ No newline at end of file
diff --git a/manifests/site/openstack-test-site/shared/clusterctl/clusterctl.yaml b/manifests/site/openstack-test-site/shared/clusterctl/clusterctl.yaml
deleted file mode 100755
index a05a0366b..000000000
--- a/manifests/site/openstack-test-site/shared/clusterctl/clusterctl.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: airshipit.org/v1alpha1
-kind: Clusterctl
-metadata:
-  labels:
-    airshipit.org/deploy-k8s: "false"
-  name: clusterctl-v1
-init-options:
-  core-provider: "cluster-api:v0.3.7"
-  bootstrap-providers:
-    - "kubeadm:v0.3.7"
-  infrastructure-providers:
-    - "openstack:v0.3.1"
-  control-plane-providers:
-    - "kubeadm:v0.3.7"
-providers:
-  - name: "openstack"
-    type: "InfrastructureProvider"
-    versions:
-      v0.3.1: manifests/function/capo/v0.3.1
-  - name: "kubeadm"
-    type: "BootstrapProvider"
-    variable-substitution: true
-    versions:
-      v0.3.7: manifests/function/cabpk/v0.3.7
-  - name: "cluster-api"
-    type: "CoreProvider"
-    variable-substitution: true
-    versions:
-      v0.3.7: manifests/function/capi/v0.3.7
-  - name: "kubeadm"
-    type: "ControlPlaneProvider"
-    variable-substitution: true
-    versions:
-      v0.3.7: manifests/function/cacpk/v0.3.7
-additional-vars:
-  CONTAINER_CAPM3_MANAGER: quay.io/metal3-io/cluster-api-provider-metal3:v0.3.2
-  CONTAINER_CACPK_MANAGER: us.gcr.io/k8s-artifacts-prod/cluster-api/kubeadm-control-plane-controller:v0.3.7
-  CONTAINER_CABPK_MANAGER: us.gcr.io/k8s-artifacts-prod/cluster-api/kubeadm-bootstrap-controller:v0.3.7
-  CONTAINER_CAPI_MANAGER: us.gcr.io/k8s-artifacts-prod/cluster-api/cluster-api-controller:v0.3.7
-  CONTAINER_CAPM3_AUTH_PROXY: gcr.io/kubebuilder/kube-rbac-proxy:v0.4.0
-  CONTAINER_CACPK_AUTH_PROXY: gcr.io/kubebuilder/kube-rbac-proxy:v0.4.1
-  CONTAINER_CABPK_AUTH_PROXY: gcr.io/kubebuilder/kube-rbac-proxy:v0.4.1
-  CONTAINER_CAPI_AUTH_PROXY: gcr.io/kubebuilder/kube-rbac-proxy:v0.4.1
\ No newline at end of file
diff --git a/manifests/site/openstack-test-site/shared/clusterctl/kustomization.yaml b/manifests/site/openstack-test-site/shared/clusterctl/kustomization.yaml
deleted file mode 100755
index 4bc44013e..000000000
--- a/manifests/site/openstack-test-site/shared/clusterctl/kustomization.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-resources:
-  - clusterctl.yaml
diff --git a/manifests/site/openstack-test-site/target/controlplane/cluster_clouds_yaml_patch.yaml b/manifests/site/openstack-test-site/target/controlplane/cluster_clouds_yaml_patch.yaml
deleted file mode 100644
index 1bbe0eee6..000000000
--- a/manifests/site/openstack-test-site/target/controlplane/cluster_clouds_yaml_patch.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-apiVersion: v1
-kind: Secret
-metadata:
-  name: target-cluster-cloud-config
-  namespace: default
-data:
-  cacert: Cg==
-  clouds.yaml: Y2xvdWRzOgogIGRldnN0YWNrOgogICAgYXV0aDoKICAgICAgYXV0aF91cmw6IGh0dHA6Ly8xMC4wLjEuNC9pZGVudGl0eQogICAgICBwcm9qZWN0X2lkOiAyMThkMWNiYzMyOWM0YWUzYWNjODhjYTU5NTAwMTUwMQogICAgICB1c2VyX2RvbWFpbl9uYW1lOiBEZWZhdWx0CiAgICAgIHVzZXJuYW1lOiBkZW1vCiAgICAgIHBhc3N3b3JkOiBwYXNzCiAgICByZWdpb25fbmFtZTogUmVnaW9uT25lCg==
diff --git a/manifests/site/openstack-test-site/target/controlplane/ssh_key_patch.yaml b/manifests/site/openstack-test-site/target/controlplane/ssh_key_patch.yaml
deleted file mode 100644
index f52015db6..000000000
--- a/manifests/site/openstack-test-site/target/controlplane/ssh_key_patch.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-apiVersion: controlplane.cluster.x-k8s.io/v1alpha3
-kind: KubeadmControlPlane
-metadata:
-  name: target-cluster-control-plane
-  namespace: default
-spec:
-  kubeadmConfigSpec:
-    users:
-    - name: capo
-      sshAuthorizedKeys:
-      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5CeROtz81ZJ/2wCUBnK0X67dL01s5KgOQhqlvn2PG1onGoEwKuwVgnUH3CtGJj1wjq4GqWduBoLvPrSt6qGL/tX8ZiVp2XS8SkDcxo69zo4QMoBdjTwfXwASalcEjQr7nRW8eMlgeI8+bRkhDuCBQLTYHoe6jQh/sWKhj25cgeAkU8eqe+bB9C8d7C/DeWBN6AJaBGjX7F2Azm8Fg6ArtxabuEDw3DYvdm+Y4GvLDfJ3MQR/S2etk8lwWaxlDWIfTwVeCDlG098rRRKKtiaF9LFq08+wEPPEBsyX1q9aNNfdcoCZnuSoWZ5ceBMxZSobA3vBy2jHUGz+slR4ADM7P stack@devstack-magnum
diff --git a/manifests/site/openstack-test-site/target/initinfra/kustomization.yaml b/manifests/site/openstack-test-site/target/initinfra/kustomization.yaml
old mode 100755
new mode 100644
index c2942afaa..37c98fc0f
--- a/manifests/site/openstack-test-site/target/initinfra/kustomization.yaml
+++ b/manifests/site/openstack-test-site/target/initinfra/kustomization.yaml
@@ -1,4 +1,7 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
 resources:
-  - ../../shared/clusterctl
+  - ../../../../composite/infra
+
 commonLabels:
   airshipit.org/stage: initinfra
diff --git a/manifests/site/openstack-test-site/target/workers/cluster_clouds_yaml_patch.yaml b/manifests/site/openstack-test-site/target/workers/cluster_clouds_yaml_patch.yaml
new file mode 100644
index 000000000..d6f49c5a1
--- /dev/null
+++ b/manifests/site/openstack-test-site/target/workers/cluster_clouds_yaml_patch.yaml
@@ -0,0 +1,8 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: target-cluster-cloud-config
+  namespace: default
+data:
+  cacert: Cg==
+  clouds.yaml: Y2xvdWRzOgogIGRldnN0YWNrOgogICAgYXV0aDoKICAgICAgYXV0aF91cmw6IGh0dHA6Ly8xMC4wLjAuNC9pZGVudGl0eQogICAgICBwYXNzd29yZDogcGFzcwogICAgICBwcm9qZWN0X2RvbWFpbl9pZDogZGVmYXVsdAogICAgICBwcm9qZWN0X25hbWU6IGRlbW8KICAgICAgdXNlcl9kb21haW5faWQ6IGRlZmF1bHQKICAgICAgdXNlcm5hbWU6IGRlbW8KICAgIGlkZW50aXR5X2FwaV92ZXJzaW9uOiAnMycKICAgIHJlZ2lvbl9uYW1lOiBSZWdpb25PbmUKICAgIHZvbHVtZV9hcGlfdmVyc2lvbjogJzMnCg==
diff --git a/manifests/site/openstack-test-site/target/workers/kustomization.yaml b/manifests/site/openstack-test-site/target/workers/kustomization.yaml
index 2ee127ed8..2cdbca1e9 100755
--- a/manifests/site/openstack-test-site/target/workers/kustomization.yaml
+++ b/manifests/site/openstack-test-site/target/workers/kustomization.yaml
@@ -1,10 +1,10 @@
 apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 resources:
-  - ../../../../composite/infra
   - ../../../../function/workers-capo
 
 patchesStrategicMerge:
+  - cluster_clouds_yaml_patch.yaml
   - workers_machine_count_patch.yaml
   - workers_machine_flavor_patch.yaml
   - workers_cloud_conf_patch.yaml
diff --git a/manifests/site/openstack-test-site/target/workers/workers_cloud_conf_patch.yaml b/manifests/site/openstack-test-site/target/workers/workers_cloud_conf_patch.yaml
index 6f12e4553..bc6c6644c 100644
--- a/manifests/site/openstack-test-site/target/workers/workers_cloud_conf_patch.yaml
+++ b/manifests/site/openstack-test-site/target/workers/workers_cloud_conf_patch.yaml
@@ -7,7 +7,7 @@ spec:
   template:
     spec:
       files:
-      - content: W0dsb2JhbF0KYXV0aC11cmw9aHR0cDovLzEwLjAuMS40L2lkZW50aXR5CnVzZXJuYW1lPSJkZW1vIgpwYXNzd29yZD0icGFzcyIKdGVuYW50LWlkPSIyMThkMWNiYzMyOWM0YWUzYWNjODhjYTU5NTAwMTUwMSIKZG9tYWluLW5hbWU9IkRlZmF1bHQiCnJlZ2lvbj0iUmVnaW9uT25lIgo=
+      - content: W0dsb2JhbF0KYXV0aC11cmw9aHR0cDovLzEwLjAuMC40L2lkZW50aXR5CnVzZXJuYW1lPSJkZW1vIgpwYXNzd29yZD0icGFzcyIKdGVuYW50LW5hbWU9ImRlbW8iCmRvbWFpbi1pZD0iZGVmYXVsdCIKcmVnaW9uPSJSZWdpb25PbmUiCg==
         encoding: base64
         owner: root
         path: /etc/kubernetes/cloud.conf
diff --git a/manifests/site/openstack-test-site/target/workers/workers_ssh_key_patch.yaml b/manifests/site/openstack-test-site/target/workers/workers_ssh_key_patch.yaml
index caca9c7d4..05c539cbc 100644
--- a/manifests/site/openstack-test-site/target/workers/workers_ssh_key_patch.yaml
+++ b/manifests/site/openstack-test-site/target/workers/workers_ssh_key_patch.yaml
@@ -9,4 +9,4 @@ spec:
       users:
       - name: capo
         sshAuthorizedKeys:
-        - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5CeROtz81ZJ/2wCUBnK0X67dL01s5KgOQhqlvn2PG1onGoEwKuwVgnUH3CtGJj1wjq4GqWduBoLvPrSt6qGL/tX8ZiVp2XS8SkDcxo69zo4QMoBdjTwfXwASalcEjQr7nRW8eMlgeI8+bRkhDuCBQLTYHoe6jQh/sWKhj25cgeAkU8eqe+bB9C8d7C/DeWBN6AJaBGjX7F2Azm8Fg6ArtxabuEDw3DYvdm+Y4GvLDfJ3MQR/S2etk8lwWaxlDWIfTwVeCDlG098rRRKKtiaF9LFq08+wEPPEBsyX1q9aNNfdcoCZnuSoWZ5ceBMxZSobA3vBy2jHUGz+slR4ADM7P stack@devstack-magnum
+        - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCV+B0gfF/728wO9XOZbEpxuCP2rhZu0CIic2+O6M9d/t2weLCDl0rdOlssnVzsS5C04OQvm6IDy94xHG8ob2N2G/LGz7/jgCiysHjdQ1Yg6F16hx1rnRFeS2lLDc7PhGco8hAPbY/oN5Q0biutJRSnI5zLNhN1phXRap0ptaI8g3B3t07lxtJGPich2npyGt+ie7QwEzxoPMR81AnmCiqtRC7n2bf5p7CqMxMGHzhg30+BSOx81VlT30SKnExbXrHqV6372+kUvGw/NrUcJEQJNb/QDgAX51BBfTqYyxqZ3RDsBCRdE9IX51BgT6GJnsNjgo6h5CEIdAUNBM1MT23hpzpOTZPbSTdKsc5NHfbKKP6dlPcGYstHvtaVkvZ5x6bQr7dk9qiRs6ujuHybpE95OaH23Pg9PSbTxmZ8GZMMIzg1fToSNstaZe82crd+oY66icUgR7jvOwj7qulOklnkwLTaRUdRtbL4kYORxajLDVAuwF0qEtdGU3Pyb2NXoDs= stack@devstack