chore: rename roles
diff --git a/docs/dns.md b/docs/dns.md
index 5815232..5141345 100644
--- a/docs/dns.md
+++ b/docs/dns.md
@@ -29,7 +29,7 @@
     "registering nameservers").  This is out of the scope of this document.
 
 ```yaml
-openstack_helm_designate_pools: |
+designate_pools: |
   - name: default
     description: Default PowerDNS Pool
 
diff --git a/docs/storage.md b/docs/storage.md
index 7c09fdf..d06b252 100644
--- a/docs/storage.md
+++ b/docs/storage.md
@@ -42,7 +42,7 @@
 the use of the Cinder driver by adding the following to your Ansible inventory:
 
 ```yaml
-openstack_helm_glance_helm_values:
+glance_helm_values:
   storage: cinder
   conf:
     glance:
@@ -64,7 +64,7 @@
 configuration inside your Ansible inventory:
 
 ```yaml
-openstack_helm_cinder_helm_values:
+cinder_helm_values:
   storage: powerstore
   dependencies:
     static:
@@ -122,7 +122,7 @@
 configuration inside your Ansible inventory:
 
 ```yaml
-openstack_helm_nova_helm_values:
+nova_helm_values:
   conf:
     enable_iscsi: true
 ```
diff --git a/molecule/default/group_vars/all/molecule.yml b/molecule/default/group_vars/all/molecule.yml
index f07d9b3..c11a73b 100644
--- a/molecule/default/group_vars/all/molecule.yml
+++ b/molecule/default/group_vars/all/molecule.yml
@@ -2,7 +2,7 @@
 

 cluster_issuer_type: self-signed

 

-openstack_helm_glance_images:

+glance_images:

   - name: cirros

     source_url:  https://object-storage.public.mtl1.vexxhost.net/swift/v1/a91f106f55e64246babde7402c21b87a/cirros/

     image_file: cirros-0.6.0-x86_64-disk.raw

diff --git a/playbooks/generate_workspace.yml b/playbooks/generate_workspace.yml
index da0a52a..984eb71 100644
--- a/playbooks/generate_workspace.yml
+++ b/playbooks/generate_workspace.yml
@@ -261,11 +261,11 @@
       #               so we generate a stub one if and only if it doesn't exist
       when: item.key not in neutron
       with_dict:
-        openstack_helm_neutron_helm_values:
+        neutron_helm_values:
           conf:
             auto_bridge_add:
               br-ex: ens4
-        openstack_helm_neutron_networks:
+        neutron_networks:
           - name: public
             external: true
             shared: true
@@ -310,7 +310,7 @@
       #               so we generate a stub one if and only if it doesn't exist
       when: item.key not in nova
       with_dict:
-        openstack_helm_nova_flavors:
+        nova_flavors:
           - name: m1.tiny
             ram: 512
             disk: 1
diff --git a/playbooks/openstack.yml b/playbooks/openstack.yml
index 8543a0d..6abcbaa 100644
--- a/playbooks/openstack.yml
+++ b/playbooks/openstack.yml
@@ -88,78 +88,77 @@
       tags:
         - memcached
 
-    - role: openstack_helm_keystone
+    - role: keystone
       tags:
-        - openstack-helm-keystone
+        - keystone
 
-    - role: openstack_helm_barbican
+    - role: barbican
       tags:
-        - openstack-helm-barbican
+        - barbican
 
-    - role: openstack_helm_infra_ceph_provisioners
+    - role: ceph_provisioners
       when: atmosphere_ceph_enabled | default(true)
       tags:
-        - openstack-helm-infra-ceph-provisioners
+        - ceph-provisioners
 
-    - role: openstack_helm_glance
+    - role: glance
       tags:
-        - openstack-helm-glance
+        - glance
 
-    - role: openstack_helm_cinder
+    - role: cinder
       tags:
-        - openstack-helm-cinder
+        - cinder
 
-    - role: openstack_helm_placement
+    - role: placement
       tags:
-        - openstack-helm-placement
+        - placement
 
-
-    - role: openstack_helm_infra_openvswitch
+    - role: openvswitch
       tags:
-        - openstack-helm-infra-openvswitch
+        - openvswitch
 
-    - role: openstack_helm_infra_libvirt
+    - role: libvirt
       tags:
-        - openstack-helm-infra-libvirt
+        - libvirt
 
     - role: coredns
       tags:
         - coredns
 
-    - role: openstack_helm_neutron
+    - role: neutron
       tags:
-        - openstack-helm-neutron
+        - neutron
 
-    - role: openstack_helm_nova
+    - role: nova
       tags:
-        - openstack-helm-nova
+        - nova
 
-    - role: openstack_helm_senlin
+    - role: senlin
       tags:
-        - openstack-helm-senlin
+        - senlin
 
     # NOTE(mnaser): This is disabled out of the box until we have a native way
     #               of configuring it with a pre-configured backend out of the
     #               box.
-    # - role: openstack_helm_designate
+    # - role: designate
     #   tags:
-    #     - openstack-helm-designate
+    #     - designate
 
-    - role: openstack_helm_heat
+    - role: heat
       tags:
-        - openstack-helm-heat
+        - heat
 
-    - role: openstack_helm_octavia
+    - role: octavia
       tags:
-        - openstack-helm-octavia
+        - octavia
 
-    - role: openstack_helm_magnum
+    - role: magnum
       tags:
-        - openstack-helm-magnum
+        - magnum
 
-    - role: openstack_helm_horizon
+    - role: horizon
       tags:
-        - openstack-helm-horizon
+        - horizon
 
     - role: openstack_exporter
       tags:
diff --git a/playbooks/tempest.yml b/playbooks/tempest.yml
index c633817..3032564 100644
--- a/playbooks/tempest.yml
+++ b/playbooks/tempest.yml
@@ -16,6 +16,6 @@
   gather_facts: false
   become: true
   roles:
-    - role: openstack_helm_tempest
+    - role: tempest
       tags:
-        - openstack-helm-tempest
+        - tempest
diff --git a/roles/barbican/README.md b/roles/barbican/README.md
new file mode 100644
index 0000000..c2e9c14
--- /dev/null
+++ b/roles/barbican/README.md
@@ -0,0 +1 @@
+# `barbican`
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/barbican/defaults/main.yml
similarity index 63%
copy from roles/openstack_helm_cinder/defaults/main.yml
copy to roles/barbican/defaults/main.yml
index acb7a8a..d57c6c2 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/barbican/defaults/main.yml
@@ -12,12 +12,14 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_cinder_helm_release_name: cinder
-openstack_helm_cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
-openstack_helm_cinder_helm_chart_ref: /usr/local/src/cinder
+barbican_helm_release_name: barbican
+barbican_helm_chart_path: "{{ role_path }}/../../charts/barbican/"
+barbican_helm_chart_ref: /usr/local/src/barbican
 
-openstack_helm_cinder_helm_release_namespace: openstack
-openstack_helm_cinder_helm_values: {}
+barbican_helm_release_namespace: openstack
+barbican_helm_values: {}
 
 # List of annotations to apply to the Ingress
-openstack_helm_cinder_ingress_annotations: {}
+barbican_ingress_annotations: {}
+# Barbican key encryption key
+barbican_kek: "{{ undef(hint='You must specify a Barbican key encryption key') }}"
diff --git a/roles/openstack_helm_barbican/meta/main.yml b/roles/barbican/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_barbican/meta/main.yml
rename to roles/barbican/meta/main.yml
index b5e71ac..f892148 100644
--- a/roles/openstack_helm_barbican/meta/main.yml
+++ b/roles/barbican/meta/main.yml
@@ -30,5 +30,5 @@
       openstack_helm_endpoints_chart: barbican
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_barbican_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_barbican_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ barbican_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ barbican_helm_chart_ref }}"
diff --git a/roles/openstack_helm_barbican/tasks/main.yml b/roles/barbican/tasks/main.yml
similarity index 67%
rename from roles/openstack_helm_barbican/tasks/main.yml
rename to roles/barbican/tasks/main.yml
index 684cdfe..ebf57b6 100644
--- a/roles/openstack_helm_barbican/tasks/main.yml
+++ b/roles/barbican/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_barbican_helm_release_name }}"
-        namespace: "{{ openstack_helm_barbican_helm_release_namespace }}"
+        name: "{{ barbican_helm_release_name }}"
+        namespace: "{{ barbican_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_barbican_helm_release_name }}"
-        namespace: "{{ openstack_helm_barbican_helm_release_namespace }}"
+        name: "{{ barbican_helm_release_name }}"
+        namespace: "{{ barbican_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_barbican_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_barbican_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_barbican_helm_release_namespace }}"
+    name: "{{ barbican_helm_release_name }}"
+    chart_ref: "{{ barbican_helm_chart_ref }}"
+    release_namespace: "{{ barbican_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_barbican_helm_values | combine(openstack_helm_barbican_helm_values, recursive=True) }}"
+    values: "{{ _barbican_helm_values | combine(barbican_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,4 +51,4 @@
     openstack_helm_ingress_endpoint: key_manager
     openstack_helm_ingress_service_name: barbican-api
     openstack_helm_ingress_service_port: 9311
-    openstack_helm_ingress_annotations: "{{ openstack_helm_barbican_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ barbican_ingress_annotations }}"
diff --git a/roles/openstack_helm_barbican/vars/main.yml b/roles/barbican/vars/main.yml
similarity index 87%
rename from roles/openstack_helm_barbican/vars/main.yml
rename to roles/barbican/vars/main.yml
index 9de593b..7eb2c78 100644
--- a/roles/openstack_helm_barbican/vars/main.yml
+++ b/roles/barbican/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_barbican_helm_values:
+_barbican_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('barbican') }}"
@@ -26,9 +26,9 @@
       oslo_messaging_notifications:
         driver: noop
       simple_crypto_plugin:
-        kek: "{{ openstack_helm_barbican_kek }}"
+        kek: "{{ barbican_kek }}"
     simple_crypto_kek_rewrap:
-      old_kek: "{{ openstack_helm_barbican_kek }}"
+      old_kek: "{{ barbican_kek }}"
 
   manifests:
     ingress_api: false
diff --git a/roles/ceph_provisioners/README.md b/roles/ceph_provisioners/README.md
new file mode 100644
index 0000000..e59fadc
--- /dev/null
+++ b/roles/ceph_provisioners/README.md
@@ -0,0 +1 @@
+# `ceph_provisioners`
diff --git a/roles/ceph_provisioners/defaults/main.yml b/roles/ceph_provisioners/defaults/main.yml
new file mode 100644
index 0000000..fa98bb5
--- /dev/null
+++ b/roles/ceph_provisioners/defaults/main.yml
@@ -0,0 +1,38 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+ceph_provisioners_helm_release_name: ceph-provisioners
+ceph_provisioners_helm_chart_path: "{{ role_path }}/../../charts/ceph-provisioners/"
+ceph_provisioners_helm_chart_ref: /usr/local/src/ceph-provisioners
+
+ceph_provisioners_helm_release_namespace: openstack
+ceph_provisioners_helm_values: {}
+
+# Ansible inventory group containing Ceph monitors.
+ceph_provisioners_ceph_mon_group: controllers
+
+# IP address list of Ceph monitors
+ceph_provisioners_ceph_monitors: "{{ _ceph_csi_rbd_helm_info.status['values']['csiConfig'][0]['monitors'] }}"
+
+# Filesystem ID for Ceph cluster
+ceph_provisioners_ceph_fsid: "{{ _ceph_csi_rbd_helm_info.status['values']['csiConfig'][0]['clusterID'] }}"
+
+# Public network used by Ceph
+ceph_provisioners_ceph_public_network: "{{ ceph_mon_public_network }}"
+
+# Cluster (replication) network used by Ceph
+ceph_provisioners_ceph_cluster_network: "{{ ceph_provisioners_ceph_public_network }}"
+
+# Overrides for Helm chart values
+ceph_provisioners_values: {}
diff --git a/roles/openstack_helm_infra_ceph_provisioners/meta/main.yml b/roles/ceph_provisioners/meta/main.yml
similarity index 84%
rename from roles/openstack_helm_infra_ceph_provisioners/meta/main.yml
rename to roles/ceph_provisioners/meta/main.yml
index 36ae7c8..5528dbe 100644
--- a/roles/openstack_helm_infra_ceph_provisioners/meta/main.yml
+++ b/roles/ceph_provisioners/meta/main.yml
@@ -30,6 +30,6 @@
       openstack_helm_endpoints_chart: ceph-provisioners
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_infra_ceph_provisioners_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_infra_ceph_provisioners_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ ceph_provisioners_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ ceph_provisioners_helm_chart_ref }}"
   - role: ceph_csi_rbd
diff --git a/roles/openstack_helm_infra_ceph_provisioners/tasks/main.yml b/roles/ceph_provisioners/tasks/main.yml
similarity index 70%
rename from roles/openstack_helm_infra_ceph_provisioners/tasks/main.yml
rename to roles/ceph_provisioners/tasks/main.yml
index 336ab01..057b75a 100644
--- a/roles/openstack_helm_infra_ceph_provisioners/tasks/main.yml
+++ b/roles/ceph_provisioners/tasks/main.yml
@@ -44,12 +44,12 @@
 
 - name: Generate Ceph endpoint list
   ansible.builtin.set_fact:
-    _openstack_helm_infra_ceph_provisioners_ceph_monitors: |
+    _ceph_provisioners_ceph_monitors: |
       {{
-        _openstack_helm_infra_ceph_provisioners_ceph_monitors | default([]) +
+        _ceph_provisioners_ceph_monitors | default([]) +
           [{'ip': item}]
       }}
-  loop: "{{ openstack_helm_infra_ceph_provisioners_ceph_monitors }}"
+  loop: "{{ ceph_provisioners_ceph_monitors }}"
 
 - name: Create Ceph endpoints
   kubernetes.core.k8s:
@@ -63,7 +63,7 @@
         labels:
           application: ceph
       subsets:
-        - addresses: "{{ _openstack_helm_infra_ceph_provisioners_ceph_monitors }}"
+        - addresses: "{{ _ceph_provisioners_ceph_monitors }}"
           ports:
             - name: mon
               port: 6789
@@ -76,16 +76,16 @@
               protocol: TCP
 
 - name: Retrieve client.admin keyring
-  delegate_to: "{{ groups[openstack_helm_infra_ceph_provisioners_ceph_mon_group][0] }}"
+  delegate_to: "{{ groups[ceph_provisioners_ceph_mon_group][0] }}"
   vexxhost.atmosphere.ceph_key:
     name: client.admin
     state: info
     output_format: json
-  register: _openstack_helm_infra_ceph_provisioners_ceph_key
+  register: _ceph_provisioners_ceph_key
 
 - name: Parse client.admin keyring
   ansible.builtin.set_fact:
-    _openstack_helm_infra_ceph_provisioners_keyring: "{{ _openstack_helm_infra_ceph_provisioners_ceph_key.stdout | from_json | first }}"
+    _ceph_provisioners_keyring: "{{ _ceph_provisioners_ceph_key.stdout | from_json | first }}"
 
 - name: Create "pvc-ceph-client-key" secret
   kubernetes.core.k8s:
@@ -100,14 +100,14 @@
         labels:
           application: ceph
       stringData:
-        key: "{{ _openstack_helm_infra_ceph_provisioners_keyring.key }}"
+        key: "{{ _ceph_provisioners_keyring.key }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_infra_ceph_provisioners_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_infra_ceph_provisioners_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_infra_ceph_provisioners_helm_release_namespace }}"
+    name: "{{ ceph_provisioners_helm_release_name }}"
+    chart_ref: "{{ ceph_provisioners_helm_chart_ref }}"
+    release_namespace: "{{ ceph_provisioners_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_infra_ceph_provisioners_helm_values | combine(openstack_helm_infra_ceph_provisioners_helm_values, recursive=True) }}"
+    values: "{{ _ceph_provisioners_helm_values | combine(ceph_provisioners_helm_values, recursive=True) }}"
diff --git a/roles/openstack_helm_infra_ceph_provisioners/vars/main.yml b/roles/ceph_provisioners/vars/main.yml
similarity index 76%
rename from roles/openstack_helm_infra_ceph_provisioners/vars/main.yml
rename to roles/ceph_provisioners/vars/main.yml
index 8336d66..193207b 100644
--- a/roles/openstack_helm_infra_ceph_provisioners/vars/main.yml
+++ b/roles/ceph_provisioners/vars/main.yml
@@ -12,14 +12,14 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_infra_ceph_provisioners_helm_values:
+_ceph_provisioners_helm_values:
   network:
-    public: "{{ openstack_helm_infra_ceph_provisioners_ceph_public_network }}"
-    cluster: "{{ openstack_helm_infra_ceph_provisioners_ceph_cluster_network }}"
+    public: "{{ ceph_provisioners_ceph_public_network }}"
+    cluster: "{{ ceph_provisioners_ceph_cluster_network }}"
   conf:
     ceph:
       global:
-        fsid: "{{ openstack_helm_infra_ceph_provisioners_ceph_fsid }}"
+        fsid: "{{ ceph_provisioners_ceph_fsid }}"
   manifests:
     configmap_bin: false
     configmap_bin_common: false
diff --git a/roles/cinder/README.md b/roles/cinder/README.md
new file mode 100644
index 0000000..14fb1e9
--- /dev/null
+++ b/roles/cinder/README.md
@@ -0,0 +1 @@
+# `cinder`
diff --git a/roles/openstack_helm_tempest/defaults/main.yml b/roles/cinder/defaults/main.yml
similarity index 66%
copy from roles/openstack_helm_tempest/defaults/main.yml
copy to roles/cinder/defaults/main.yml
index b07578a..3dc6e3b 100644
--- a/roles/openstack_helm_tempest/defaults/main.yml
+++ b/roles/cinder/defaults/main.yml
@@ -12,9 +12,12 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_tempest_helm_release_name: tempest
-openstack_helm_tempest_helm_chart_path: "{{ role_path }}/../../charts/tempest/"
-openstack_helm_tempest_helm_chart_ref: /usr/local/src/tempest
+cinder_helm_release_name: cinder
+cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
+cinder_helm_chart_ref: /usr/local/src/cinder
 
-openstack_helm_tempest_helm_release_namespace: openstack
-openstack_helm_tempest_helm_values: {}
+cinder_helm_release_namespace: openstack
+cinder_helm_values: {}
+
+# List of annotations to apply to the Ingress
+cinder_ingress_annotations: {}
diff --git a/roles/openstack_helm_cinder/meta/main.yml b/roles/cinder/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_cinder/meta/main.yml
rename to roles/cinder/meta/main.yml
index 4dabd54..7f258ff 100644
--- a/roles/openstack_helm_cinder/meta/main.yml
+++ b/roles/cinder/meta/main.yml
@@ -30,5 +30,5 @@
       openstack_helm_endpoints_chart: cinder
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_cinder_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_cinder_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ cinder_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ cinder_helm_chart_ref }}"
diff --git a/roles/openstack_helm_cinder/tasks/main.yml b/roles/cinder/tasks/main.yml
similarity index 66%
rename from roles/openstack_helm_cinder/tasks/main.yml
rename to roles/cinder/tasks/main.yml
index b5bb82f..e52eaf7 100644
--- a/roles/openstack_helm_cinder/tasks/main.yml
+++ b/roles/cinder/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_cinder_helm_release_name }}"
-        namespace: "{{ openstack_helm_cinder_helm_release_namespace }}"
+        name: "{{ cinder_helm_release_name }}"
+        namespace: "{{ cinder_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_cinder_helm_release_name }}"
-        namespace: "{{ openstack_helm_cinder_helm_release_namespace }}"
+        name: "{{ cinder_helm_release_name }}"
+        namespace: "{{ cinder_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_cinder_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_cinder_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_cinder_helm_release_namespace }}"
+    name: "{{ cinder_helm_release_name }}"
+    chart_ref: "{{ cinder_helm_chart_ref }}"
+    release_namespace: "{{ cinder_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_cinder_helm_values | combine(openstack_helm_cinder_helm_values, recursive=True) }}"
+    values: "{{ _cinder_helm_values | combine(cinder_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,4 +51,4 @@
     openstack_helm_ingress_endpoint: volumev3
     openstack_helm_ingress_service_name: cinder-api
     openstack_helm_ingress_service_port: 8776
-    openstack_helm_ingress_annotations: "{{ _openstack_helm_cinder_ingress_annotations | combine(openstack_helm_cinder_ingress_annotations) }}"
+    openstack_helm_ingress_annotations: "{{ _cinder_ingress_annotations | combine(cinder_ingress_annotations) }}"
diff --git a/roles/openstack_helm_cinder/vars/main.yml b/roles/cinder/vars/main.yml
similarity index 95%
rename from roles/openstack_helm_cinder/vars/main.yml
rename to roles/cinder/vars/main.yml
index 860b736..e65b1c4 100644
--- a/roles/openstack_helm_cinder/vars/main.yml
+++ b/roles/cinder/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_cinder_helm_values:
+_cinder_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('cinder') }}"
@@ -47,6 +47,6 @@
     job_clean: false
     service_ingress_api: false
 
-_openstack_helm_cinder_ingress_annotations:
+_cinder_ingress_annotations:
   nginx.ingress.kubernetes.io/proxy-body-size: "0"
   nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/designate/defaults/main.yml
similarity index 65%
copy from roles/openstack_helm_cinder/defaults/main.yml
copy to roles/designate/defaults/main.yml
index acb7a8a..a246cce 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/designate/defaults/main.yml
@@ -12,12 +12,15 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_cinder_helm_release_name: cinder
-openstack_helm_cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
-openstack_helm_cinder_helm_chart_ref: /usr/local/src/cinder
+designate_helm_release_name: designate
+designate_helm_chart_path: "{{ role_path }}/../../charts/designate/"
+designate_helm_chart_ref: /usr/local/src/designate
 
-openstack_helm_cinder_helm_release_namespace: openstack
-openstack_helm_cinder_helm_values: {}
+designate_helm_release_namespace: openstack
+designate_helm_values: {}
 
 # List of annotations to apply to the Ingress
-openstack_helm_cinder_ingress_annotations: {}
+designate_ingress_annotations: {}
+
+# Pools definition
+designate_pools: ""
diff --git a/roles/openstack_helm_designate/meta/main.yml b/roles/designate/meta/main.yml
similarity index 85%
rename from roles/openstack_helm_designate/meta/main.yml
rename to roles/designate/meta/main.yml
index 3512391..7887ded 100644
--- a/roles/openstack_helm_designate/meta/main.yml
+++ b/roles/designate/meta/main.yml
@@ -29,5 +29,5 @@
       openstack_helm_endpoints_chart: designate
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_designate_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_designate_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ designate_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ designate_helm_chart_ref }}"
diff --git a/roles/openstack_helm_designate/tasks/main.yml b/roles/designate/tasks/main.yml
similarity index 67%
rename from roles/openstack_helm_designate/tasks/main.yml
rename to roles/designate/tasks/main.yml
index df07df9..bf1022e 100644
--- a/roles/openstack_helm_designate/tasks/main.yml
+++ b/roles/designate/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_designate_helm_release_name }}"
-        namespace: "{{ openstack_helm_designate_helm_release_namespace }}"
+        name: "{{ designate_helm_release_name }}"
+        namespace: "{{ designate_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_designate_helm_release_name }}"
-        namespace: "{{ openstack_helm_designate_helm_release_namespace }}"
+        name: "{{ designate_helm_release_name }}"
+        namespace: "{{ designate_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_designate_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_designate_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_designate_helm_release_namespace }}"
+    name: "{{ designate_helm_release_name }}"
+    chart_ref: "{{ designate_helm_chart_ref }}"
+    release_namespace: "{{ designate_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_designate_helm_values | combine(openstack_helm_designate_helm_values, recursive=True) }}"
+    values: "{{ _designate_helm_values | combine(designate_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,4 +51,4 @@
     openstack_helm_ingress_endpoint: dns
     openstack_helm_ingress_service_name: designate-api
     openstack_helm_ingress_service_port: 8778
-    openstack_helm_ingress_annotations: "{{ openstack_helm_designate_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ designate_ingress_annotations }}"
diff --git a/roles/openstack_helm_designate/vars/main.yml b/roles/designate/vars/main.yml
similarity index 90%
rename from roles/openstack_helm_designate/vars/main.yml
rename to roles/designate/vars/main.yml
index 6e39446..7d89daf 100644
--- a/roles/openstack_helm_designate/vars/main.yml
+++ b/roles/designate/vars/main.yml
@@ -12,9 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_designate_helm_values:
+_designate_helm_values:
   conf:
-    pools: "{{ openstack_helm_designate_pools }}"
+    pools: "{{ designate_pools }}"
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('designate') }}"
diff --git a/roles/glance/README.md b/roles/glance/README.md
new file mode 100644
index 0000000..70fcbee
--- /dev/null
+++ b/roles/glance/README.md
@@ -0,0 +1 @@
+# `glance`
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/glance/defaults/main.yml
similarity index 65%
copy from roles/openstack_helm_cinder/defaults/main.yml
copy to roles/glance/defaults/main.yml
index acb7a8a..6d9eaeb 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/glance/defaults/main.yml
@@ -12,12 +12,15 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_cinder_helm_release_name: cinder
-openstack_helm_cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
-openstack_helm_cinder_helm_chart_ref: /usr/local/src/cinder
+glance_helm_release_name: glance
+glance_helm_chart_path: "{{ role_path }}/../../charts/glance/"
+glance_helm_chart_ref: /usr/local/src/glance
 
-openstack_helm_cinder_helm_release_namespace: openstack
-openstack_helm_cinder_helm_values: {}
+glance_helm_release_namespace: openstack
+glance_helm_values: {}
 
 # List of annotations to apply to the Ingress
-openstack_helm_cinder_ingress_annotations: {}
+glance_ingress_annotations: {}
+
+# List of images to provision inside OpenStack
+glance_images: []
diff --git a/roles/openstack_helm_glance/meta/main.yml b/roles/glance/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_glance/meta/main.yml
rename to roles/glance/meta/main.yml
index f4ba894..a56adc2 100644
--- a/roles/openstack_helm_glance/meta/main.yml
+++ b/roles/glance/meta/main.yml
@@ -31,5 +31,5 @@
       openstack_helm_endpoints_chart: glance
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_glance_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_glance_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ glance_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ glance_helm_chart_ref }}"
diff --git a/roles/openstack_helm_glance/tasks/main.yml b/roles/glance/tasks/main.yml
similarity index 75%
rename from roles/openstack_helm_glance/tasks/main.yml
rename to roles/glance/tasks/main.yml
index 45a83b2..b9c3bfd 100644
--- a/roles/openstack_helm_glance/tasks/main.yml
+++ b/roles/glance/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_glance_helm_release_name }}"
-        namespace: "{{ openstack_helm_glance_helm_release_namespace }}"
+        name: "{{ glance_helm_release_name }}"
+        namespace: "{{ glance_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_glance_helm_release_name }}"
-        namespace: "{{ openstack_helm_glance_helm_release_namespace }}"
+        name: "{{ glance_helm_release_name }}"
+        namespace: "{{ glance_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_glance_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_glance_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_glance_helm_release_namespace }}"
+    name: "{{ glance_helm_release_name }}"
+    chart_ref: "{{ glance_helm_chart_ref }}"
+    release_namespace: "{{ glance_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_glance_helm_values | combine(openstack_helm_glance_helm_values, recursive=True) }}"
+    values: "{{ _glance_helm_values | combine(glance_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,10 +51,10 @@
     openstack_helm_ingress_endpoint: image
     openstack_helm_ingress_service_name: glance-api
     openstack_helm_ingress_service_port: 9292
-    openstack_helm_ingress_annotations: "{{ _openstack_helm_glance_ingress_annotations | combine(openstack_helm_glance_ingress_annotations) }}"
+    openstack_helm_ingress_annotations: "{{ _glance_ingress_annotations | combine(glance_ingress_annotations) }}"
 
 - name: Create images
-  when: openstack_helm_glance_images | length > 0
+  when: glance_images | length > 0
   block:
     - name: Wait until image service ready
       kubernetes.core.k8s_info:
@@ -74,7 +74,7 @@
         url: "{{ item.source_url | regex_replace('\\/$', '') }}/{{ item.image_file }}"
         dest: "/tmp/{{ item.image_file }}"
         mode: "0600"
-      loop: "{{ openstack_helm_glance_images }}"
+      loop: "{{ glance_images }}"
 
     - name: Upload images
       openstack.cloud.image:
@@ -90,4 +90,4 @@
         kernel: "{{ item.kernel | default(omit) }}"
         ramdisk: "{{ item.ramdisk | default(omit) }}"
         is_public: "{{ item.is_public | default(omit) }}"
-      loop: "{{ openstack_helm_glance_images }}"
+      loop: "{{ glance_images }}"
diff --git a/roles/openstack_helm_glance/vars/main.yml b/roles/glance/vars/main.yml
similarity index 61%
rename from roles/openstack_helm_glance/vars/main.yml
rename to roles/glance/vars/main.yml
index 4dff03d..af5a431 100644
--- a/roles/openstack_helm_glance/vars/main.yml
+++ b/roles/glance/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_glance_helm_values:
+_glance_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   storage: rbd
   images:
@@ -24,13 +24,13 @@
       glance:
         container:
           glance_api:
-            allowPrivilegeEscalation: "{{ ('cinder' in openstack_helm_glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
-            readOnlyRootFilesystem: "{{ ('cinder' not in openstack_helm_glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
-            privileged: "{{ ('cinder' in openstack_helm_glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
+            allowPrivilegeEscalation: "{{ ('cinder' in glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
+            readOnlyRootFilesystem: "{{ ('cinder' not in glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
+            privileged: "{{ ('cinder' in glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
             capabilities:
-              add: "{{ ('cinder' in openstack_helm_glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | ternary(['SYS_ADMIN'], []) }}"
+              add: "{{ ('cinder' in glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | ternary(['SYS_ADMIN'], []) }}"
     useHostNetwork:
-      api: "{{ ('cinder' in openstack_helm_glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
+      api: "{{ ('cinder' in glance_helm_values.get('conf', {}).get('glance', {}).get('glance_store', {}).get('stores', '')) | bool }}"
     replicas:
       api: 3
   conf:
@@ -51,6 +51,6 @@
     ingress_api: false
     service_ingress_api: false
 
-_openstack_helm_glance_ingress_annotations:
+_glance_ingress_annotations:
   nginx.ingress.kubernetes.io/proxy-body-size: "0"
   nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
diff --git a/roles/heat/README.md b/roles/heat/README.md
new file mode 100644
index 0000000..8d356e6
--- /dev/null
+++ b/roles/heat/README.md
@@ -0,0 +1 @@
+# `heat`
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/heat/defaults/main.yml
similarity index 60%
copy from roles/openstack_helm_cinder/defaults/main.yml
copy to roles/heat/defaults/main.yml
index acb7a8a..2a1bddd 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/heat/defaults/main.yml
@@ -12,12 +12,14 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_cinder_helm_release_name: cinder
-openstack_helm_cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
-openstack_helm_cinder_helm_chart_ref: /usr/local/src/cinder
+heat_helm_release_name: heat
+heat_helm_chart_path: "{{ role_path }}/../../charts/heat/"
+heat_helm_chart_ref: /usr/local/src/heat
 
-openstack_helm_cinder_helm_release_namespace: openstack
-openstack_helm_cinder_helm_values: {}
+heat_helm_release_namespace: openstack
+heat_helm_values: {}
 
-# List of annotations to apply to the Ingress
-openstack_helm_cinder_ingress_annotations: {}
+heat_ingress_annotations: {}
+
+# Encryption key for Heat to use for encrypting sensitive data
+heat_auth_encryption_key: "{{ undef(hint='You must specifiy an encryption key for Heat.') }}"
diff --git a/roles/openstack_helm_heat/meta/main.yml b/roles/heat/meta/main.yml
similarity index 87%
rename from roles/openstack_helm_heat/meta/main.yml
rename to roles/heat/meta/main.yml
index a36b828..d541165 100644
--- a/roles/openstack_helm_heat/meta/main.yml
+++ b/roles/heat/meta/main.yml
@@ -31,5 +31,5 @@
       openstack_helm_endpoints_chart: heat
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_heat_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_heat_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ heat_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ heat_helm_chart_ref }}"
diff --git a/roles/openstack_helm_heat/tasks/main.yml b/roles/heat/tasks/main.yml
similarity index 69%
rename from roles/openstack_helm_heat/tasks/main.yml
rename to roles/heat/tasks/main.yml
index 807fd24..32688fb 100644
--- a/roles/openstack_helm_heat/tasks/main.yml
+++ b/roles/heat/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_heat_helm_release_name }}"
-        namespace: "{{ openstack_helm_heat_helm_release_namespace }}"
+        name: "{{ heat_helm_release_name }}"
+        namespace: "{{ heat_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_heat_helm_release_name }}"
-        namespace: "{{ openstack_helm_heat_helm_release_namespace }}"
+        name: "{{ heat_helm_release_name }}"
+        namespace: "{{ heat_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_heat_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_heat_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_heat_helm_release_namespace }}"
+    name: "{{ heat_helm_release_name }}"
+    chart_ref: "{{ heat_helm_chart_ref }}"
+    release_namespace: "{{ heat_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_heat_helm_values | combine(openstack_helm_heat_helm_values, recursive=True) }}"
+    values: "{{ _heat_helm_values | combine(heat_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,7 +51,7 @@
     openstack_helm_ingress_endpoint: orchestration
     openstack_helm_ingress_service_name: heat-api
     openstack_helm_ingress_service_port: 8004
-    openstack_helm_ingress_annotations: "{{ openstack_helm_heat_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ heat_ingress_annotations }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -60,4 +60,4 @@
     openstack_helm_ingress_endpoint: cloudformation
     openstack_helm_ingress_service_name: heat-cfn
     openstack_helm_ingress_service_port: 8000
-    openstack_helm_ingress_annotations: "{{ openstack_helm_heat_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ heat_ingress_annotations }}"
diff --git a/roles/openstack_helm_heat/vars/main.yml b/roles/heat/vars/main.yml
similarity index 91%
rename from roles/openstack_helm_heat/vars/main.yml
rename to roles/heat/vars/main.yml
index a4fd757..370fc07 100644
--- a/roles/openstack_helm_heat/vars/main.yml
+++ b/roles/heat/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_heat_helm_values:
+_heat_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('heat') }}"
@@ -25,7 +25,7 @@
   conf:
     heat:
       DEFAULT:
-        auth_encryption_key: "{{ openstack_helm_heat_auth_encryption_key }}"
+        auth_encryption_key: "{{ heat_auth_encryption_key }}"
         log_config_append: null
         region_name_for_services: "{{ openstack_helm_endpoints['identity']['auth']['heat']['region_name'] }}"
         server_keystone_endpoint_type: public
diff --git a/roles/horizon/README.md b/roles/horizon/README.md
new file mode 100644
index 0000000..c44e6d7
--- /dev/null
+++ b/roles/horizon/README.md
@@ -0,0 +1 @@
+# `horizon`
diff --git a/roles/openstack_helm_tempest/defaults/main.yml b/roles/horizon/defaults/main.yml
similarity index 66%
rename from roles/openstack_helm_tempest/defaults/main.yml
rename to roles/horizon/defaults/main.yml
index b07578a..1340d2d 100644
--- a/roles/openstack_helm_tempest/defaults/main.yml
+++ b/roles/horizon/defaults/main.yml
@@ -12,9 +12,12 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_tempest_helm_release_name: tempest
-openstack_helm_tempest_helm_chart_path: "{{ role_path }}/../../charts/tempest/"
-openstack_helm_tempest_helm_chart_ref: /usr/local/src/tempest
+horizon_helm_release_name: horizon
+horizon_helm_chart_path: "{{ role_path }}/../../charts/horizon/"
+horizon_helm_chart_ref: /usr/local/src/horizon
 
-openstack_helm_tempest_helm_release_namespace: openstack
-openstack_helm_tempest_helm_values: {}
+horizon_helm_release_namespace: openstack
+horizon_helm_values: {}
+
+# List of annotations to apply to the Ingress
+horizon_ingress_annotations: {}
diff --git a/roles/openstack_helm_horizon/files/50-monasca-ui-settings.py b/roles/horizon/files/50-monasca-ui-settings.py
similarity index 100%
rename from roles/openstack_helm_horizon/files/50-monasca-ui-settings.py
rename to roles/horizon/files/50-monasca-ui-settings.py
diff --git a/roles/openstack_helm_horizon/meta/main.yml b/roles/horizon/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_horizon/meta/main.yml
rename to roles/horizon/meta/main.yml
index 666e398..5be6c83 100644
--- a/roles/openstack_helm_horizon/meta/main.yml
+++ b/roles/horizon/meta/main.yml
@@ -30,5 +30,5 @@
       openstack_helm_endpoints_chart: horizon
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_horizon_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_horizon_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ horizon_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ horizon_helm_chart_ref }}"
diff --git a/roles/openstack_helm_horizon/tasks/main.yml b/roles/horizon/tasks/main.yml
similarity index 67%
rename from roles/openstack_helm_horizon/tasks/main.yml
rename to roles/horizon/tasks/main.yml
index 0baa29c..d708713 100644
--- a/roles/openstack_helm_horizon/tasks/main.yml
+++ b/roles/horizon/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_horizon_helm_release_name }}"
-        namespace: "{{ openstack_helm_horizon_helm_release_namespace }}"
+        name: "{{ horizon_helm_release_name }}"
+        namespace: "{{ horizon_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_horizon_helm_release_name }}"
-        namespace: "{{ openstack_helm_horizon_helm_release_namespace }}"
+        name: "{{ horizon_helm_release_name }}"
+        namespace: "{{ horizon_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_horizon_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_horizon_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_horizon_helm_release_namespace }}"
+    name: "{{ horizon_helm_release_name }}"
+    chart_ref: "{{ horizon_helm_chart_ref }}"
+    release_namespace: "{{ horizon_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_horizon_helm_values | combine(openstack_helm_horizon_helm_values, recursive=True) }}"
+    values: "{{ _horizon_helm_values | combine(horizon_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,4 +51,4 @@
     openstack_helm_ingress_endpoint: dashboard
     openstack_helm_ingress_service_name: horizon-int
     openstack_helm_ingress_service_port: 80
-    openstack_helm_ingress_annotations: "{{ openstack_helm_horizon_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ horizon_ingress_annotations }}"
diff --git a/roles/openstack_helm_horizon/vars/main.yml b/roles/horizon/vars/main.yml
similarity index 97%
rename from roles/openstack_helm_horizon/vars/main.yml
rename to roles/horizon/vars/main.yml
index 7f4de64..0812b1b 100644
--- a/roles/openstack_helm_horizon/vars/main.yml
+++ b/roles/horizon/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_horizon_helm_values:
+_horizon_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('horizon') }}"
diff --git a/roles/keystone/README.md b/roles/keystone/README.md
new file mode 100644
index 0000000..cb7b7c6
--- /dev/null
+++ b/roles/keystone/README.md
@@ -0,0 +1 @@
+# `keystone`
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/keystone/defaults/main.yml
similarity index 65%
copy from roles/openstack_helm_cinder/defaults/main.yml
copy to roles/keystone/defaults/main.yml
index acb7a8a..d92cfc7 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/keystone/defaults/main.yml
@@ -12,12 +12,12 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_cinder_helm_release_name: cinder
-openstack_helm_cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
-openstack_helm_cinder_helm_chart_ref: /usr/local/src/cinder
+keystone_helm_release_name: keystone
+keystone_helm_chart_path: "{{ role_path }}/../../charts/keystone/"
+keystone_helm_chart_ref: /usr/local/src/keystone
 
-openstack_helm_cinder_helm_release_namespace: openstack
-openstack_helm_cinder_helm_values: {}
+keystone_helm_release_namespace: openstack
+keystone_helm_values: {}
 
 # List of annotations to apply to the Ingress
-openstack_helm_cinder_ingress_annotations: {}
+keystone_ingress_annotations: {}
diff --git a/roles/openstack_helm_keystone/meta/main.yml b/roles/keystone/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_keystone/meta/main.yml
rename to roles/keystone/meta/main.yml
index 0f9a4d2..61485cb 100644
--- a/roles/openstack_helm_keystone/meta/main.yml
+++ b/roles/keystone/meta/main.yml
@@ -30,5 +30,5 @@
       openstack_helm_endpoints_chart: keystone
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_keystone_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_keystone_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ keystone_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ keystone_helm_chart_ref }}"
diff --git a/roles/openstack_helm_keystone/tasks/main.yml b/roles/keystone/tasks/main.yml
similarity index 67%
rename from roles/openstack_helm_keystone/tasks/main.yml
rename to roles/keystone/tasks/main.yml
index 43c9971..4bc689e 100644
--- a/roles/openstack_helm_keystone/tasks/main.yml
+++ b/roles/keystone/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_keystone_helm_release_name }}"
-        namespace: "{{ openstack_helm_keystone_helm_release_namespace }}"
+        name: "{{ keystone_helm_release_name }}"
+        namespace: "{{ keystone_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_keystone_helm_release_name }}"
-        namespace: "{{ openstack_helm_keystone_helm_release_namespace }}"
+        name: "{{ keystone_helm_release_name }}"
+        namespace: "{{ keystone_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_keystone_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_keystone_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_keystone_helm_release_namespace }}"
+    name: "{{ keystone_helm_release_name }}"
+    chart_ref: "{{ keystone_helm_chart_ref }}"
+    release_namespace: "{{ keystone_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_keystone_helm_values | combine(openstack_helm_keystone_helm_values, recursive=True) }}"
+    values: "{{ _keystone_helm_values | combine(keystone_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,4 +51,4 @@
     openstack_helm_ingress_endpoint: identity
     openstack_helm_ingress_service_name: keystone-api
     openstack_helm_ingress_service_port: 5000
-    openstack_helm_ingress_annotations: "{{ openstack_helm_keystone_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ keystone_ingress_annotations }}"
diff --git a/roles/openstack_helm_keystone/vars/main.yml b/roles/keystone/vars/main.yml
similarity index 98%
rename from roles/openstack_helm_keystone/vars/main.yml
rename to roles/keystone/vars/main.yml
index 1bbab06..fc16ccd 100644
--- a/roles/openstack_helm_keystone/vars/main.yml
+++ b/roles/keystone/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_keystone_helm_values:
+_keystone_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('keystone') }}"
diff --git a/roles/libvirt/README.md b/roles/libvirt/README.md
new file mode 100644
index 0000000..d7ce305
--- /dev/null
+++ b/roles/libvirt/README.md
@@ -0,0 +1 @@
+# `libvirt`
diff --git a/roles/openstack_helm_infra_openvswitch/vars/main.yml b/roles/libvirt/defaults/main.yml
similarity index 68%
copy from roles/openstack_helm_infra_openvswitch/vars/main.yml
copy to roles/libvirt/defaults/main.yml
index ef74425..d35ffa9 100644
--- a/roles/openstack_helm_infra_openvswitch/vars/main.yml
+++ b/roles/libvirt/defaults/main.yml
@@ -1,4 +1,4 @@
-# Copyright (c) 2022 VEXXHOST, Inc.
+# Copyright (c) 2023 VEXXHOST, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_infra_openvswitch_helm_values:
-  endpoints: "{{ openstack_helm_endpoints }}"
-  images:
-    tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('openvswitch') }}"
+libvirt_helm_release_name: libvirt
+libvirt_helm_chart_path: "{{ role_path }}/../../charts/libvirt/"
+libvirt_helm_chart_ref: /usr/local/src/libvirt
+
+libvirt_helm_release_namespace: openstack
+libvirt_helm_values: {}
diff --git a/roles/openstack_helm_infra_libvirt/meta/main.yml b/roles/libvirt/meta/main.yml
similarity index 85%
rename from roles/openstack_helm_infra_libvirt/meta/main.yml
rename to roles/libvirt/meta/main.yml
index 7fb5192..2b277b4 100644
--- a/roles/openstack_helm_infra_libvirt/meta/main.yml
+++ b/roles/libvirt/meta/main.yml
@@ -30,5 +30,5 @@
       openstack_helm_endpoints_chart: libvirt
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_infra_libvirt_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_infra_libvirt_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ libvirt_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ libvirt_helm_chart_ref }}"
diff --git a/roles/openstack_helm_infra_libvirt/tasks/main.yml b/roles/libvirt/tasks/main.yml
similarity index 65%
rename from roles/openstack_helm_infra_libvirt/tasks/main.yml
rename to roles/libvirt/tasks/main.yml
index e347c21..f941b64 100644
--- a/roles/openstack_helm_infra_libvirt/tasks/main.yml
+++ b/roles/libvirt/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_infra_libvirt_helm_release_name }}"
-        namespace: "{{ openstack_helm_infra_libvirt_helm_release_namespace }}"
+        name: "{{ libvirt_helm_release_name }}"
+        namespace: "{{ libvirt_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,15 +31,15 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_infra_libvirt_helm_release_name }}"
-        namespace: "{{ openstack_helm_infra_libvirt_helm_release_namespace }}"
+        name: "{{ libvirt_helm_release_name }}"
+        namespace: "{{ libvirt_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_infra_libvirt_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_infra_libvirt_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_infra_libvirt_helm_release_namespace }}"
+    name: "{{ libvirt_helm_release_name }}"
+    chart_ref: "{{ libvirt_helm_chart_ref }}"
+    release_namespace: "{{ libvirt_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_infra_libvirt_helm_values | combine(openstack_helm_infra_libvirt_helm_values, recursive=True) }}"
+    values: "{{ _libvirt_helm_values | combine(libvirt_helm_values, recursive=True) }}"
diff --git a/roles/openstack_helm_infra_libvirt/vars/main.yml b/roles/libvirt/vars/main.yml
similarity index 94%
rename from roles/openstack_helm_infra_libvirt/vars/main.yml
rename to roles/libvirt/vars/main.yml
index 63231b9..e80fc82 100644
--- a/roles/openstack_helm_infra_libvirt/vars/main.yml
+++ b/roles/libvirt/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_infra_libvirt_helm_values:
+_libvirt_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('libvirt') }}"
diff --git a/roles/magnum/README.md b/roles/magnum/README.md
new file mode 100644
index 0000000..01bffb9
--- /dev/null
+++ b/roles/magnum/README.md
@@ -0,0 +1 @@
+# `magnum`
diff --git a/roles/openstack_helm_magnum/defaults/main.yml b/roles/magnum/defaults/main.yml
similarity index 79%
rename from roles/openstack_helm_magnum/defaults/main.yml
rename to roles/magnum/defaults/main.yml
index 124bd1f..b74fad5 100644
--- a/roles/openstack_helm_magnum/defaults/main.yml
+++ b/roles/magnum/defaults/main.yml
@@ -12,18 +12,18 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_magnum_helm_release_name: magnum
-openstack_helm_magnum_helm_chart_path: "{{ role_path }}/../../charts/magnum/"
-openstack_helm_magnum_helm_chart_ref: /usr/local/src/magnum
+magnum_helm_release_name: magnum
+magnum_helm_chart_path: "{{ role_path }}/../../charts/magnum/"
+magnum_helm_chart_ref: /usr/local/src/magnum
 
-openstack_helm_magnum_helm_release_namespace: openstack
-openstack_helm_magnum_helm_values: {}
+magnum_helm_release_namespace: openstack
+magnum_helm_values: {}
 
 # List of annotations to apply to the Ingress
-openstack_helm_magnum_ingress_annotations: {}
+magnum_ingress_annotations: {}
 
 # List of images to load into OpenStack for Magnum
-openstack_helm_magnum_images:
+magnum_images:
   - name: ubuntu-2004-v1.23.13
     source_url: https://object-storage.public.mtl1.vexxhost.net/swift/v1/a91f106f55e64246babde7402c21b87a/magnum-capi/
     image_file: ubuntu-2004-v1.23.13.qcow2
diff --git a/roles/openstack_helm_magnum/meta/main.yml b/roles/magnum/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_magnum/meta/main.yml
rename to roles/magnum/meta/main.yml
index 9590493..6d3ae24 100644
--- a/roles/openstack_helm_magnum/meta/main.yml
+++ b/roles/magnum/meta/main.yml
@@ -29,5 +29,5 @@
       openstack_helm_endpoints_chart: magnum
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_magnum_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_magnum_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ magnum_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ magnum_helm_chart_ref }}"
diff --git a/roles/openstack_helm_magnum/tasks/main.yml b/roles/magnum/tasks/main.yml
similarity index 95%
rename from roles/openstack_helm_magnum/tasks/main.yml
rename to roles/magnum/tasks/main.yml
index 071c64e..f22a502 100644
--- a/roles/openstack_helm_magnum/tasks/main.yml
+++ b/roles/magnum/tasks/main.yml
@@ -23,8 +23,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_magnum_helm_release_name }}"
-        namespace: "{{ openstack_helm_magnum_helm_release_namespace }}"
+        name: "{{ magnum_helm_release_name }}"
+        namespace: "{{ magnum_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -34,8 +34,8 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_magnum_helm_release_name }}"
-        namespace: "{{ openstack_helm_magnum_helm_release_namespace }}"
+        name: "{{ magnum_helm_release_name }}"
+        namespace: "{{ magnum_helm_release_namespace }}"
 
 - name: Deploy cluster api
   kubernetes.core.k8s:
@@ -53,12 +53,12 @@
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_magnum_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_magnum_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_magnum_helm_release_namespace }}"
+    name: "{{ magnum_helm_release_name }}"
+    chart_ref: "{{ magnum_helm_chart_ref }}"
+    release_namespace: "{{ magnum_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_magnum_helm_values | combine(openstack_helm_magnum_helm_values, recursive=True) }}"
+    values: "{{ _magnum_helm_values | combine(magnum_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -67,7 +67,7 @@
     openstack_helm_ingress_endpoint: container_infra
     openstack_helm_ingress_service_name: magnum-api
     openstack_helm_ingress_service_port: 9511
-    openstack_helm_ingress_annotations: "{{ openstack_helm_magnum_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ magnum_ingress_annotations }}"
 
 - name: Deploy magnum registry
   kubernetes.core.k8s:
@@ -380,7 +380,7 @@
     openstack_helm_ingress_service_port: 5000
 
 - name: Create k8s images
-  when: openstack_helm_magnum_images | length > 0
+  when: magnum_images | length > 0
   block:
     - name: Wait until image service ready
       kubernetes.core.k8s_info:
@@ -400,7 +400,7 @@
         url: "{{ item.source_url | regex_replace('\\/$', '') }}/{{ item.image_file }}"
         dest: "/tmp/{{ item.image_file }}"
         mode: "0600"
-      loop: "{{ openstack_helm_magnum_images }}"
+      loop: "{{ magnum_images }}"
 
     - name: Upload images
       openstack.cloud.image:
@@ -412,4 +412,4 @@
         disk_format: "{{ item.disk_format | default(omit) }}"
         properties:
           os_distro: ubuntu-focal
-      loop: "{{ openstack_helm_magnum_images }}"
+      loop: "{{ magnum_images }}"
diff --git a/roles/openstack_helm_magnum/templates/capi-bootstrap.yml.j2 b/roles/magnum/templates/capi-bootstrap.yml.j2
similarity index 100%
rename from roles/openstack_helm_magnum/templates/capi-bootstrap.yml.j2
rename to roles/magnum/templates/capi-bootstrap.yml.j2
diff --git a/roles/openstack_helm_magnum/templates/capi-control-plane.yml.j2 b/roles/magnum/templates/capi-control-plane.yml.j2
similarity index 100%
rename from roles/openstack_helm_magnum/templates/capi-control-plane.yml.j2
rename to roles/magnum/templates/capi-control-plane.yml.j2
diff --git a/roles/openstack_helm_magnum/templates/capi-core.yml.j2 b/roles/magnum/templates/capi-core.yml.j2
similarity index 100%
rename from roles/openstack_helm_magnum/templates/capi-core.yml.j2
rename to roles/magnum/templates/capi-core.yml.j2
diff --git a/roles/openstack_helm_magnum/templates/capi-provider.yml.j2 b/roles/magnum/templates/capi-provider.yml.j2
similarity index 100%
rename from roles/openstack_helm_magnum/templates/capi-provider.yml.j2
rename to roles/magnum/templates/capi-provider.yml.j2
diff --git a/roles/openstack_helm_magnum/templates/capi-rbac.yml.j2 b/roles/magnum/templates/capi-rbac.yml.j2
similarity index 100%
rename from roles/openstack_helm_magnum/templates/capi-rbac.yml.j2
rename to roles/magnum/templates/capi-rbac.yml.j2
diff --git a/roles/openstack_helm_magnum/vars/main.yml b/roles/magnum/vars/main.yml
similarity index 98%
rename from roles/openstack_helm_magnum/vars/main.yml
rename to roles/magnum/vars/main.yml
index 0e70ce0..0a72ef1 100644
--- a/roles/openstack_helm_magnum/vars/main.yml
+++ b/roles/magnum/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_magnum_helm_values:
+_magnum_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('magnum') }}"
diff --git a/roles/neutron/README.md b/roles/neutron/README.md
new file mode 100644
index 0000000..252c90a
--- /dev/null
+++ b/roles/neutron/README.md
@@ -0,0 +1 @@
+# `neutron`
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/neutron/defaults/main.yml
similarity index 65%
copy from roles/openstack_helm_cinder/defaults/main.yml
copy to roles/neutron/defaults/main.yml
index acb7a8a..584d3e9 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/neutron/defaults/main.yml
@@ -12,12 +12,15 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_cinder_helm_release_name: cinder
-openstack_helm_cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
-openstack_helm_cinder_helm_chart_ref: /usr/local/src/cinder
+neutron_helm_release_name: neutron
+neutron_helm_chart_path: "{{ role_path }}/../../charts/neutron/"
+neutron_helm_chart_ref: /usr/local/src/neutron
 
-openstack_helm_cinder_helm_release_namespace: openstack
-openstack_helm_cinder_helm_values: {}
+neutron_helm_release_namespace: openstack
+neutron_helm_values: {}
+
+# List of networks to provision inside OpenStack
+neutron_networks: []
 
 # List of annotations to apply to the Ingress
-openstack_helm_cinder_ingress_annotations: {}
+neutron_ingress_annotations: {}
diff --git a/roles/openstack_helm_neutron/meta/main.yml b/roles/neutron/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_neutron/meta/main.yml
rename to roles/neutron/meta/main.yml
index 8887a54..9c8f17f 100644
--- a/roles/openstack_helm_neutron/meta/main.yml
+++ b/roles/neutron/meta/main.yml
@@ -31,5 +31,5 @@
       openstack_helm_endpoints_chart: neutron
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_neutron_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_neutron_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ neutron_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ neutron_helm_chart_ref }}"
diff --git a/roles/openstack_helm_neutron/tasks/main.yml b/roles/neutron/tasks/main.yml
similarity index 80%
rename from roles/openstack_helm_neutron/tasks/main.yml
rename to roles/neutron/tasks/main.yml
index 8edda8e..b2a42f0 100644
--- a/roles/openstack_helm_neutron/tasks/main.yml
+++ b/roles/neutron/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_neutron_helm_release_name }}"
-        namespace: "{{ openstack_helm_neutron_helm_release_namespace }}"
+        name: "{{ neutron_helm_release_name }}"
+        namespace: "{{ neutron_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_neutron_helm_release_name }}"
-        namespace: "{{ openstack_helm_neutron_helm_release_namespace }}"
+        name: "{{ neutron_helm_release_name }}"
+        namespace: "{{ neutron_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_neutron_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_neutron_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_neutron_helm_release_namespace }}"
+    name: "{{ neutron_helm_release_name }}"
+    chart_ref: "{{ neutron_helm_chart_ref }}"
+    release_namespace: "{{ neutron_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_neutron_helm_values | combine(openstack_helm_neutron_helm_values, recursive=True) }}"
+    values: "{{ _neutron_helm_values | combine(neutron_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,10 +51,10 @@
     openstack_helm_ingress_endpoint: network
     openstack_helm_ingress_service_name: neutron-server
     openstack_helm_ingress_service_port: 9696
-    openstack_helm_ingress_annotations: "{{ openstack_helm_neutron_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ neutron_ingress_annotations }}"
 
 - name: Create networks
-  when: openstack_helm_neutron_networks | length > 0
+  when: neutron_networks | length > 0
   block:
     - name: Wait until network service ready
       kubernetes.core.k8s_info:
@@ -81,7 +81,7 @@
         provider_network_type: "{{ item.provider_network_type | default(omit) }}"
         provider_physical_network: "{{ item.provider_physical_network | default(omit) }}"
         provider_segmentation_id: "{{ item.provider_segmentation_id | default(omit) }}"
-      loop: "{{ openstack_helm_neutron_networks }}"
+      loop: "{{ neutron_networks }}"
 
     - name: Create subnets
       openstack.cloud.subnet:
@@ -101,5 +101,5 @@
         ipv6_address_mode: "{{ item.1.ipv6_address_mode | default(omit) }}"
         ipv6_ra_mode: "{{ item.1.ipv6_ra_mode | default(omit) }}"
       with_subelements:
-        - "{{ openstack_helm_neutron_networks }}"
+        - "{{ neutron_networks }}"
         - subnets
diff --git a/roles/openstack_helm_neutron/vars/main.yml b/roles/neutron/vars/main.yml
similarity index 98%
rename from roles/openstack_helm_neutron/vars/main.yml
rename to roles/neutron/vars/main.yml
index 0c04da2..cdab428 100644
--- a/roles/openstack_helm_neutron/vars/main.yml
+++ b/roles/neutron/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_neutron_helm_values:
+_neutron_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('neutron') }}"
diff --git a/roles/nova/README.md b/roles/nova/README.md
new file mode 100644
index 0000000..0a4b9db
--- /dev/null
+++ b/roles/nova/README.md
@@ -0,0 +1 @@
+# `nova`
diff --git a/roles/openstack_helm_nova/defaults/main.yml b/roles/nova/defaults/main.yml
similarity index 62%
rename from roles/openstack_helm_nova/defaults/main.yml
rename to roles/nova/defaults/main.yml
index 0cc3af0..3aa38d4 100644
--- a/roles/openstack_helm_nova/defaults/main.yml
+++ b/roles/nova/defaults/main.yml
@@ -12,18 +12,18 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_nova_helm_release_name: nova
-openstack_helm_nova_helm_chart_path: "{{ role_path }}/../../charts/nova/"
-openstack_helm_nova_helm_chart_ref: /usr/local/src/nova
+nova_helm_release_name: nova
+nova_helm_chart_path: "{{ role_path }}/../../charts/nova/"
+nova_helm_chart_ref: /usr/local/src/nova
 
-openstack_helm_nova_helm_release_namespace: openstack
-openstack_helm_nova_helm_values: {}
+nova_helm_release_namespace: openstack
+nova_helm_values: {}
 
 # Private SSH key used for cold & live migration
-openstack_helm_nova_ssh_key: "{{ undef(hint='You must specifiy an SSH key for Nova.') }}"
+nova_ssh_key: "{{ undef(hint='You must specifiy an SSH key for Nova.') }}"
 
 # List of flavors to provision inside Nova
-openstack_helm_nova_flavors: []
+nova_flavors: []
 
 # List of annotations to apply to the Ingress
-openstack_helm_nova_ingress_annotations: {}
+nova_ingress_annotations: {}
diff --git a/roles/openstack_helm_nova/meta/main.yml b/roles/nova/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_nova/meta/main.yml
rename to roles/nova/meta/main.yml
index 50c6c00..7b289d3 100644
--- a/roles/openstack_helm_nova/meta/main.yml
+++ b/roles/nova/meta/main.yml
@@ -31,5 +31,5 @@
       openstack_helm_endpoints_chart: nova
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_nova_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_nova_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ nova_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ nova_helm_chart_ref }}"
diff --git a/roles/openstack_helm_nova/tasks/main.yml b/roles/nova/tasks/main.yml
similarity index 82%
rename from roles/openstack_helm_nova/tasks/main.yml
rename to roles/nova/tasks/main.yml
index ccf3602..518409d 100644
--- a/roles/openstack_helm_nova/tasks/main.yml
+++ b/roles/nova/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_nova_helm_release_name }}"
-        namespace: "{{ openstack_helm_nova_helm_release_namespace }}"
+        name: "{{ nova_helm_release_name }}"
+        namespace: "{{ nova_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,8 +31,8 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_nova_helm_release_name }}"
-        namespace: "{{ openstack_helm_nova_helm_release_namespace }}"
+        name: "{{ nova_helm_release_name }}"
+        namespace: "{{ nova_helm_release_namespace }}"
 
 - name: Generate public key for SSH private key
   become: false
@@ -50,7 +50,7 @@
       changed_when: false
       ansible.builtin.copy:
         dest: "{{ _nova_ssh_key_tempfile.path }}"
-        content: "{{ openstack_helm_nova_ssh_key }}\n"
+        content: "{{ nova_ssh_key }}\n"
         mode: "0600"
     - name: Generate public key for SSH private key
       changed_when: false
@@ -68,12 +68,12 @@
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_nova_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_nova_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_nova_helm_release_namespace }}"
+    name: "{{ nova_helm_release_name }}"
+    chart_ref: "{{ nova_helm_chart_ref }}"
+    release_namespace: "{{ nova_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_nova_helm_values | combine(openstack_helm_nova_helm_values, recursive=True) }}"
+    values: "{{ _nova_helm_values | combine(nova_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -82,7 +82,7 @@
     openstack_helm_ingress_endpoint: compute
     openstack_helm_ingress_service_name: nova-api
     openstack_helm_ingress_service_port: 8774
-    openstack_helm_ingress_annotations: "{{ openstack_helm_nova_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ nova_ingress_annotations }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -91,10 +91,10 @@
     openstack_helm_ingress_endpoint: compute_novnc_proxy
     openstack_helm_ingress_service_name: nova-novncproxy
     openstack_helm_ingress_service_port: 6080
-    openstack_helm_ingress_annotations: "{{ openstack_helm_nova_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ nova_ingress_annotations }}"
 
 - name: Create flavors
-  when: openstack_helm_nova_flavors | length > 0
+  when: nova_flavors | length > 0
   block:
     - name: Wait until compute api service ready
       kubernetes.core.k8s_info:
@@ -123,7 +123,7 @@
         is_public: "{{ item.is_public | default(omit) }}"
         rxtx_factor: "{{ item.rxtx_factor | default(omit) }}"
         extra_specs: "{{ item.extra_specs | default(omit) }}"
-      loop: "{{ openstack_helm_nova_flavors }}"
+      loop: "{{ nova_flavors }}"
       # NOTE(mnaser): This often fails with a 503 since we're sending a request
       #               way too fast after the service is ready, retry for now
       #               but the Helm chart should be fixed.
diff --git a/roles/openstack_helm_nova/vars/main.yml b/roles/nova/vars/main.yml
similarity index 97%
rename from roles/openstack_helm_nova/vars/main.yml
rename to roles/nova/vars/main.yml
index 5207948..820b12c 100644
--- a/roles/openstack_helm_nova/vars/main.yml
+++ b/roles/nova/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_nova_helm_values:
+_nova_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   labels:
     agent:
@@ -25,7 +25,7 @@
     ssh:
       enabled: true
       public_key: "{{ _nova_ssh_publickey.public_key }}"
-      private_key: "{{ openstack_helm_nova_ssh_key }}"
+      private_key: "{{ nova_ssh_key }}"
   bootstrap:
     structured:
       flavors:
diff --git a/roles/octavia/README.md b/roles/octavia/README.md
new file mode 100644
index 0000000..0100979
--- /dev/null
+++ b/roles/octavia/README.md
@@ -0,0 +1 @@
+# `octavia`
diff --git a/roles/octavia/defaults/main.yml b/roles/octavia/defaults/main.yml
new file mode 100644
index 0000000..7aa9366
--- /dev/null
+++ b/roles/octavia/defaults/main.yml
@@ -0,0 +1,32 @@
+# Copyright (c) 2023 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+octavia_helm_release_name: octavia
+octavia_helm_chart_path: "{{ role_path }}/../../charts/octavia/"
+octavia_helm_chart_ref: /usr/local/src/octavia
+
+octavia_helm_release_namespace: openstack
+octavia_helm_values: {}
+
+# List of annotations to apply to the Ingress
+octavia_ingress_annotations: {}
+
+# Heartbeat key
+octavia_heartbeat_key: "{{ undef(hint='You must specify a Octavia heartbeat key') }}"
+
+# Octavia management subnet (CIDR)
+octavia_management_subnet_cidr: "172.24.0.0/22"
+
+# Octavia amphora image url
+octavia_amphora_image_url: "https://tarballs.opendev.org/openstack/octavia/test-images/test-only-amphora-x64-haproxy-ubuntu-focal.qcow2"
diff --git a/roles/openstack_helm_octavia/meta/main.yml b/roles/octavia/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_octavia/meta/main.yml
rename to roles/octavia/meta/main.yml
index 4066287..b700837 100644
--- a/roles/openstack_helm_octavia/meta/main.yml
+++ b/roles/octavia/meta/main.yml
@@ -31,5 +31,5 @@
       openstack_helm_endpoints_chart: octavia
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_octavia_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_octavia_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ octavia_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ octavia_helm_chart_ref }}"
diff --git a/roles/openstack_helm_octavia/tasks/main.yml b/roles/octavia/tasks/main.yml
similarity index 73%
rename from roles/openstack_helm_octavia/tasks/main.yml
rename to roles/octavia/tasks/main.yml
index 141f94a..7ccbd0a 100644
--- a/roles/openstack_helm_octavia/tasks/main.yml
+++ b/roles/octavia/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_octavia_helm_release_name }}"
-        namespace: "{{ openstack_helm_octavia_helm_release_namespace }}"
+        name: "{{ octavia_helm_release_name }}"
+        namespace: "{{ octavia_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,15 +31,15 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_octavia_helm_release_name }}"
-        namespace: "{{ openstack_helm_octavia_helm_release_namespace }}"
+        name: "{{ octavia_helm_release_name }}"
+        namespace: "{{ octavia_helm_release_namespace }}"
 
 - name: Create management network
   openstack.cloud.network:
     cloud: atmosphere
     # Network settings
     name: lb-mgmt-net
-  register: _openstack_helm_octavia_management_network
+  register: _octavia_management_network
 
 - name: Create management subnet
   openstack.cloud.subnet:
@@ -47,18 +47,18 @@
     # Subnet settings
     network_name: lb-mgmt-net
     name: lb-mgmt-subnet
-    cidr: "{{ openstack_helm_octavia_management_subnet_cidr }}"
+    cidr: "{{ octavia_management_subnet_cidr }}"
 
 - name: Create health manager security group
   openstack.cloud.security_group:
     cloud: atmosphere
     name: lb-health-mgr-sec-grp
-  register: _openstack_helm_octavia_health_manager_sg
+  register: _octavia_health_manager_sg
 
 - name: Create health manager security group rules
   openstack.cloud.security_group_rule:
     cloud: atmosphere
-    security_group: "{{ _openstack_helm_octavia_health_manager_sg.id }}"
+    security_group: "{{ _octavia_health_manager_sg.id }}"
     direction: ingress
     ethertype: IPv4
     protocol: tcp
@@ -74,9 +74,9 @@
     cloud: atmosphere
     name: "octavia-health-manager-port-{{ hostvars[item]['inventory_hostname_short'] }}"
     device_owner: octavia:health-mgr
-    network: "{{ _openstack_helm_octavia_management_network.id }}"
+    network: "{{ _octavia_management_network.id }}"
     security_groups:
-      - "{{ _openstack_helm_octavia_health_manager_sg.id }}"
+      - "{{ _octavia_health_manager_sg.id }}"
   loop: "{{ groups['controllers'] }}"
 
 - name: Set binding for ports
@@ -94,12 +94,12 @@
     cloud: atmosphere
     port: "octavia-health-manager-port-{{ hostvars[item]['ansible_fqdn'] | split('.') | first }}"
   loop: "{{ groups['controllers'] }}"
-  register: _openstack_helm_octavia_health_manager_ports
+  register: _octavia_health_manager_ports
 
 - name: Set controller_ip_port_list
   ansible.builtin.set_fact:
-    _openstack_helm_octavia_controller_ip_port_list: "{{ (_openstack_helm_octavia_controller_ip_port_list | d([]) + [item.openstack_ports[0].fixed_ips[0].ip_address + ':5555']) | unique }}"
-  loop: "{{ _openstack_helm_octavia_health_manager_ports.results }}"
+    _octavia_controller_ip_port_list: "{{ (_octavia_controller_ip_port_list | d([]) + [item.openstack_ports[0].fixed_ips[0].ip_address + ':5555']) | unique }}"
+  loop: "{{ _octavia_health_manager_ports.results }}"
   loop_control:
     label: "{{ item.openstack_ports[0].name }}"
 
@@ -107,12 +107,12 @@
   openstack.cloud.security_group:
     cloud: atmosphere
     name: lb-mgmt-sec-grp
-  register: _openstack_helm_octavia_amphora_sg
+  register: _octavia_amphora_sg
 
 - name: Create amphora security group rules
   openstack.cloud.security_group_rule:
     cloud: atmosphere
-    security_group: "{{ _openstack_helm_octavia_amphora_sg.id }}"
+    security_group: "{{ _octavia_amphora_sg.id }}"
     direction: ingress
     ethertype: IPv4
     protocol: tcp
@@ -121,7 +121,7 @@
     remote_ip_prefix: "{{ item.1.openstack_ports[0].fixed_ips[0].ip_address }}/32"
   with_nested:
     - [22, 9443]
-    - "{{ _openstack_helm_octavia_health_manager_ports.results }}"
+    - "{{ _octavia_health_manager_ports.results }}"
 
 - name: Create amphora flavor
   openstack.cloud.compute_flavor:
@@ -131,24 +131,24 @@
     ram: "1024"
     disk: "2"
     is_public: false
-  register: _openstack_helm_octavia_amphora_flavor
+  register: _octavia_amphora_flavor
 
 - name: Download amphora image
   ansible.builtin.get_url:
-    url: "{{ openstack_helm_octavia_amphora_image_url }}"
-    dest: "/tmp/{{ openstack_helm_octavia_amphora_image_url | basename }}"
+    url: "{{ octavia_amphora_image_url }}"
+    dest: "/tmp/{{ octavia_amphora_image_url | basename }}"
     mode: 0644
 
 - name: Upload images
   openstack.cloud.image:
     cloud: atmosphere
     name: "amphora-x64-haproxy"
-    filename: "/tmp/{{ openstack_helm_octavia_amphora_image_url | basename }}"
+    filename: "/tmp/{{ octavia_amphora_image_url | basename }}"
     container_format: "bare"
     disk_format: "qcow2"
     tags:
       - "amphora"
-  register: _openstack_helm_octavia_amphora_image
+  register: _octavia_amphora_image
 
 - name: Create CAs & Issuers
   kubernetes.core.k8s:
@@ -218,12 +218,12 @@
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_octavia_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_octavia_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_octavia_helm_release_namespace }}"
+    name: "{{ octavia_helm_release_name }}"
+    chart_ref: "{{ octavia_helm_chart_ref }}"
+    release_namespace: "{{ octavia_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_octavia_helm_values | combine(openstack_helm_octavia_helm_values, recursive=True) }}"
+    values: "{{ _octavia_helm_values | combine(octavia_helm_values, recursive=True) }}"
 
 - name: Add implied role of load-balancer_member to member
   run_once: true
@@ -233,9 +233,9 @@
       member
   environment:
     OS_CLOUD: atmosphere
-  register: _openstack_helm_octavia_implied_role_create
-  changed_when: _openstack_helm_octavia_implied_role_create.rc == 0
-  failed_when: _openstack_helm_octavia_implied_role_create.rc != 0 and 'Duplicate entry.' not in _openstack_helm_octavia_implied_role_create.stderr
+  register: _octavia_implied_role_create
+  changed_when: _octavia_implied_role_create.rc == 0
+  failed_when: _octavia_implied_role_create.rc != 0 and 'Duplicate entry.' not in _octavia_implied_role_create.stderr
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -244,4 +244,4 @@
     openstack_helm_ingress_endpoint: load_balancer
     openstack_helm_ingress_service_name: octavia-api
     openstack_helm_ingress_service_port: 9876
-    openstack_helm_ingress_annotations: "{{ openstack_helm_octavia_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ octavia_ingress_annotations }}"
diff --git a/roles/openstack_helm_octavia/vars/main.yml b/roles/octavia/vars/main.yml
similarity index 87%
rename from roles/openstack_helm_octavia/vars/main.yml
rename to roles/octavia/vars/main.yml
index 629898f..af3c061 100644
--- a/roles/openstack_helm_octavia/vars/main.yml
+++ b/roles/octavia/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_octavia_helm_values:
+_octavia_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('octavia') }}"
@@ -90,10 +90,10 @@
       cinder:
         endpoint_type: internalURL
       controller_worker:
-        amp_boot_network_list: "{{ _openstack_helm_octavia_management_network.id }}"
-        amp_flavor_id: "{{ _openstack_helm_octavia_amphora_flavor.id }}"
-        amp_image_owner_id: "{{ _openstack_helm_octavia_amphora_image.image.owner }}"
-        amp_secgroup_list: "{{ _openstack_helm_octavia_amphora_sg.id }}"
+        amp_boot_network_list: "{{ _octavia_management_network.id }}"
+        amp_flavor_id: "{{ _octavia_amphora_flavor.id }}"
+        amp_image_owner_id: "{{ _octavia_amphora_image.image.owner }}"
+        amp_secgroup_list: "{{ _octavia_amphora_sg.id }}"
         amp_ssh_key_name: null
         client_ca: /etc/octavia/certs/client/ca.crt
         workers: 4
@@ -103,8 +103,8 @@
         client_cert: /etc/octavia/certs/client/tls-combined.pem
         server_ca: /etc/octavia/certs/server/ca.crt
       health_manager:
-        controller_ip_port_list: "{{ _openstack_helm_octavia_controller_ip_port_list | sort | join(',') }}"
-        heartbeat_key: "{{ openstack_helm_octavia_heartbeat_key }}"
+        controller_ip_port_list: "{{ _octavia_controller_ip_port_list | sort | join(',') }}"
+        heartbeat_key: "{{ octavia_heartbeat_key }}"
       oslo_messaging_notifications:
         driver: noop
       neutron:
diff --git a/roles/openstack_helm_barbican/README.md b/roles/openstack_helm_barbican/README.md
deleted file mode 100644
index 795d83f..0000000
--- a/roles/openstack_helm_barbican/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_barbican`
diff --git a/roles/openstack_helm_barbican/defaults/main.yml b/roles/openstack_helm_barbican/defaults/main.yml
deleted file mode 100644
index bd080eb..0000000
--- a/roles/openstack_helm_barbican/defaults/main.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_barbican_helm_release_name: barbican
-openstack_helm_barbican_helm_chart_path: "{{ role_path }}/../../charts/barbican/"
-openstack_helm_barbican_helm_chart_ref: /usr/local/src/barbican
-
-openstack_helm_barbican_helm_release_namespace: openstack
-openstack_helm_barbican_helm_values: {}
-
-# List of annotations to apply to the Ingress
-openstack_helm_barbican_ingress_annotations: {}
-# Barbican key encryption key
-openstack_helm_barbican_kek: "{{ undef(hint='You must specify a Barbican key encryption key') }}"
diff --git a/roles/openstack_helm_cinder/README.md b/roles/openstack_helm_cinder/README.md
deleted file mode 100644
index 875ec31..0000000
--- a/roles/openstack_helm_cinder/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_cinder`
diff --git a/roles/openstack_helm_designate/defaults/main.yml b/roles/openstack_helm_designate/defaults/main.yml
deleted file mode 100644
index 4aec6eb..0000000
--- a/roles/openstack_helm_designate/defaults/main.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_designate_helm_release_name: designate
-openstack_helm_designate_helm_chart_path: "{{ role_path }}/../../charts/designate/"
-openstack_helm_designate_helm_chart_ref: /usr/local/src/designate
-
-openstack_helm_designate_helm_release_namespace: openstack
-openstack_helm_designate_helm_values: {}
-
-# List of annotations to apply to the Ingress
-openstack_helm_designate_ingress_annotations: {}
-
-# Pools definition
-openstack_helm_designate_pools: ""
diff --git a/roles/openstack_helm_glance/README.md b/roles/openstack_helm_glance/README.md
deleted file mode 100644
index f1ade58..0000000
--- a/roles/openstack_helm_glance/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_glance`
diff --git a/roles/openstack_helm_glance/defaults/main.yml b/roles/openstack_helm_glance/defaults/main.yml
deleted file mode 100644
index 6785464..0000000
--- a/roles/openstack_helm_glance/defaults/main.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_glance_helm_release_name: glance
-openstack_helm_glance_helm_chart_path: "{{ role_path }}/../../charts/glance/"
-openstack_helm_glance_helm_chart_ref: /usr/local/src/glance
-
-openstack_helm_glance_helm_release_namespace: openstack
-openstack_helm_glance_helm_values: {}
-
-# List of annotations to apply to the Ingress
-openstack_helm_glance_ingress_annotations: {}
-
-# List of images to provision inside OpenStack
-openstack_helm_glance_images: []
diff --git a/roles/openstack_helm_heat/README.md b/roles/openstack_helm_heat/README.md
deleted file mode 100644
index d7de4ca..0000000
--- a/roles/openstack_helm_heat/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_heat`
diff --git a/roles/openstack_helm_heat/defaults/main.yml b/roles/openstack_helm_heat/defaults/main.yml
deleted file mode 100644
index f8caece..0000000
--- a/roles/openstack_helm_heat/defaults/main.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_heat_helm_release_name: heat
-openstack_helm_heat_helm_chart_path: "{{ role_path }}/../../charts/heat/"
-openstack_helm_heat_helm_chart_ref: /usr/local/src/heat
-
-openstack_helm_heat_helm_release_namespace: openstack
-openstack_helm_heat_helm_values: {}
-
-openstack_helm_heat_ingress_annotations: {}
-
-# Encryption key for Heat to use for encrypting sensitive data
-openstack_helm_heat_auth_encryption_key: "{{ undef(hint='You must specifiy an encryption key for Heat.') }}"
diff --git a/roles/openstack_helm_horizon/README.md b/roles/openstack_helm_horizon/README.md
deleted file mode 100644
index 20cb487..0000000
--- a/roles/openstack_helm_horizon/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_horizon`
diff --git a/roles/openstack_helm_horizon/defaults/main.yml b/roles/openstack_helm_horizon/defaults/main.yml
deleted file mode 100644
index 91330ad..0000000
--- a/roles/openstack_helm_horizon/defaults/main.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_horizon_helm_release_name: horizon
-openstack_helm_horizon_helm_chart_path: "{{ role_path }}/../../charts/horizon/"
-openstack_helm_horizon_helm_chart_ref: /usr/local/src/horizon
-
-openstack_helm_horizon_helm_release_namespace: openstack
-openstack_helm_horizon_helm_values: {}
-
-# List of annotations to apply to the Ingress
-openstack_helm_horizon_ingress_annotations: {}
diff --git a/roles/openstack_helm_infra_ceph_provisioners/README.md b/roles/openstack_helm_infra_ceph_provisioners/README.md
deleted file mode 100644
index 381bac4..0000000
--- a/roles/openstack_helm_infra_ceph_provisioners/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_infra_ceph_provisioners`
diff --git a/roles/openstack_helm_infra_ceph_provisioners/defaults/main.yml b/roles/openstack_helm_infra_ceph_provisioners/defaults/main.yml
deleted file mode 100644
index 1f64828..0000000
--- a/roles/openstack_helm_infra_ceph_provisioners/defaults/main.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_infra_ceph_provisioners_helm_release_name: ceph-provisioners
-openstack_helm_infra_ceph_provisioners_helm_chart_path: "{{ role_path }}/../../charts/ceph-provisioners/"
-openstack_helm_infra_ceph_provisioners_helm_chart_ref: /usr/local/src/ceph-provisioners
-
-openstack_helm_infra_ceph_provisioners_helm_release_namespace: openstack
-openstack_helm_infra_ceph_provisioners_helm_values: {}
-
-# Ansible inventory group containing Ceph monitors.
-openstack_helm_infra_ceph_provisioners_ceph_mon_group: controllers
-
-# IP address list of Ceph monitors
-openstack_helm_infra_ceph_provisioners_ceph_monitors: "{{ _ceph_csi_rbd_helm_info.status['values']['csiConfig'][0]['monitors'] }}"
-
-# Filesystem ID for Ceph cluster
-openstack_helm_infra_ceph_provisioners_ceph_fsid: "{{ _ceph_csi_rbd_helm_info.status['values']['csiConfig'][0]['clusterID'] }}"
-
-# Public network used by Ceph
-openstack_helm_infra_ceph_provisioners_ceph_public_network: "{{ ceph_mon_public_network }}"
-
-# Cluster (replication) network used by Ceph
-openstack_helm_infra_ceph_provisioners_ceph_cluster_network: "{{ openstack_helm_infra_ceph_provisioners_ceph_public_network }}"
-
-# Overrides for Helm chart values
-openstack_helm_infra_ceph_provisioners_values: {}
diff --git a/roles/openstack_helm_infra_libvirt/README.md b/roles/openstack_helm_infra_libvirt/README.md
deleted file mode 100644
index 50379eb..0000000
--- a/roles/openstack_helm_infra_libvirt/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_infra_libvirt`
diff --git a/roles/openstack_helm_infra_libvirt/defaults/main.yml b/roles/openstack_helm_infra_libvirt/defaults/main.yml
deleted file mode 100644
index d52b29f..0000000
--- a/roles/openstack_helm_infra_libvirt/defaults/main.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_infra_libvirt_helm_release_name: libvirt
-openstack_helm_infra_libvirt_helm_chart_path: "{{ role_path }}/../../charts/libvirt/"
-openstack_helm_infra_libvirt_helm_chart_ref: /usr/local/src/libvirt
-
-openstack_helm_infra_libvirt_helm_release_namespace: openstack
-openstack_helm_infra_libvirt_helm_values: {}
diff --git a/roles/openstack_helm_infra_openvswitch/README.md b/roles/openstack_helm_infra_openvswitch/README.md
deleted file mode 100644
index 8b4412e..0000000
--- a/roles/openstack_helm_infra_openvswitch/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_infra_openvswitch`
diff --git a/roles/openstack_helm_infra_openvswitch/defaults/main.yml b/roles/openstack_helm_infra_openvswitch/defaults/main.yml
deleted file mode 100644
index 3f2dba7..0000000
--- a/roles/openstack_helm_infra_openvswitch/defaults/main.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_infra_openvswitch_helm_release_name: openvswitch
-openstack_helm_infra_openvswitch_helm_chart_path: "{{ role_path }}/../../charts/openvswitch/"
-openstack_helm_infra_openvswitch_helm_chart_ref: /usr/local/src/openvswitch
-
-openstack_helm_infra_openvswitch_helm_release_namespace: openstack
-openstack_helm_infra_openvswitch_helm_values: {}
diff --git a/roles/openstack_helm_infra_openvswitch/tasks/main.yml b/roles/openstack_helm_infra_openvswitch/tasks/main.yml
deleted file mode 100644
index b0b2349..0000000
--- a/roles/openstack_helm_infra_openvswitch/tasks/main.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (c) 2022 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-- name: Uninstall the legacy HelmRelease
-  run_once: true
-  block:
-    - name: Suspend the existing HelmRelease
-      kubernetes.core.k8s:
-        state: patched
-        api_version: helm.toolkit.fluxcd.io/v2beta1
-        kind: HelmRelease
-        name: "{{ openstack_helm_infra_openvswitch_helm_release_name }}"
-        namespace: "{{ openstack_helm_infra_openvswitch_helm_release_namespace }}"
-        definition:
-          spec:
-            suspend: true
-
-    - name: Remove the existing HelmRelease
-      kubernetes.core.k8s:
-        state: absent
-        api_version: helm.toolkit.fluxcd.io/v2beta1
-        kind: HelmRelease
-        name: "{{ openstack_helm_infra_openvswitch_helm_release_name }}"
-        namespace: "{{ openstack_helm_infra_openvswitch_helm_release_namespace }}"
-
-- name: Deploy Helm chart
-  run_once: true
-  kubernetes.core.helm:
-    name: "{{ openstack_helm_infra_openvswitch_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_infra_openvswitch_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_infra_openvswitch_helm_release_namespace }}"
-    create_namespace: true
-    kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_infra_openvswitch_helm_values | combine(openstack_helm_infra_openvswitch_helm_values, recursive=True) }}"
diff --git a/roles/openstack_helm_keystone/README.md b/roles/openstack_helm_keystone/README.md
deleted file mode 100644
index 4398a41..0000000
--- a/roles/openstack_helm_keystone/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_keystone`
diff --git a/roles/openstack_helm_keystone/defaults/main.yml b/roles/openstack_helm_keystone/defaults/main.yml
deleted file mode 100644
index c389aad..0000000
--- a/roles/openstack_helm_keystone/defaults/main.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_keystone_helm_release_name: keystone
-openstack_helm_keystone_helm_chart_path: "{{ role_path }}/../../charts/keystone/"
-openstack_helm_keystone_helm_chart_ref: /usr/local/src/keystone
-
-openstack_helm_keystone_helm_release_namespace: openstack
-openstack_helm_keystone_helm_values: {}
-
-# List of annotations to apply to the Ingress
-openstack_helm_keystone_ingress_annotations: {}
diff --git a/roles/openstack_helm_magnum/README.md b/roles/openstack_helm_magnum/README.md
deleted file mode 100644
index d4cf7d3..0000000
--- a/roles/openstack_helm_magnum/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_magnum`
diff --git a/roles/openstack_helm_neutron/README.md b/roles/openstack_helm_neutron/README.md
deleted file mode 100644
index 3a0c2e0..0000000
--- a/roles/openstack_helm_neutron/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_neutron`
diff --git a/roles/openstack_helm_neutron/defaults/main.yml b/roles/openstack_helm_neutron/defaults/main.yml
deleted file mode 100644
index 619284d..0000000
--- a/roles/openstack_helm_neutron/defaults/main.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_neutron_helm_release_name: neutron
-openstack_helm_neutron_helm_chart_path: "{{ role_path }}/../../charts/neutron/"
-openstack_helm_neutron_helm_chart_ref: /usr/local/src/neutron
-
-openstack_helm_neutron_helm_release_namespace: openstack
-openstack_helm_neutron_helm_values: {}
-
-# List of networks to provision inside OpenStack
-openstack_helm_neutron_networks: []
-
-# List of annotations to apply to the Ingress
-openstack_helm_neutron_ingress_annotations: {}
diff --git a/roles/openstack_helm_nova/README.md b/roles/openstack_helm_nova/README.md
deleted file mode 100644
index 56596c0..0000000
--- a/roles/openstack_helm_nova/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_nova`
diff --git a/roles/openstack_helm_octavia/README.md b/roles/openstack_helm_octavia/README.md
deleted file mode 100644
index e463264..0000000
--- a/roles/openstack_helm_octavia/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_octavia`
diff --git a/roles/openstack_helm_octavia/defaults/main.yml b/roles/openstack_helm_octavia/defaults/main.yml
deleted file mode 100644
index df77075..0000000
--- a/roles/openstack_helm_octavia/defaults/main.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_octavia_helm_release_name: octavia
-openstack_helm_octavia_helm_chart_path: "{{ role_path }}/../../charts/octavia/"
-openstack_helm_octavia_helm_chart_ref: /usr/local/src/octavia
-
-openstack_helm_octavia_helm_release_namespace: openstack
-openstack_helm_octavia_helm_values: {}
-
-# List of annotations to apply to the Ingress
-openstack_helm_octavia_ingress_annotations: {}
-
-# Heartbeat key
-openstack_helm_octavia_heartbeat_key: "{{ undef(hint='You must specify a Octavia heartbeat key') }}"
-
-# Octavia management subnet (CIDR)
-openstack_helm_octavia_management_subnet_cidr: "172.24.0.0/22"
-
-# Octavia amphora image url
-openstack_helm_octavia_amphora_image_url: "https://tarballs.opendev.org/openstack/octavia/test-images/test-only-amphora-x64-haproxy-ubuntu-focal.qcow2"
diff --git a/roles/openstack_helm_placement/README.md b/roles/openstack_helm_placement/README.md
deleted file mode 100644
index 5ac0e93..0000000
--- a/roles/openstack_helm_placement/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_placement`
diff --git a/roles/openstack_helm_placement/defaults/main.yml b/roles/openstack_helm_placement/defaults/main.yml
deleted file mode 100644
index b6512e1..0000000
--- a/roles/openstack_helm_placement/defaults/main.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_placement_helm_release_name: placement
-openstack_helm_placement_helm_chart_path: "{{ role_path }}/../../charts/placement/"
-openstack_helm_placement_helm_chart_ref: /usr/local/src/placement
-
-openstack_helm_placement_helm_release_namespace: openstack
-openstack_helm_placement_helm_values: {}
-
-# List of annotations to apply to the Ingress
-openstack_helm_placement_ingress_annotations: {}
diff --git a/roles/openstack_helm_senlin/README.md b/roles/openstack_helm_senlin/README.md
deleted file mode 100644
index 579597d..0000000
--- a/roles/openstack_helm_senlin/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_senlin`
diff --git a/roles/openstack_helm_senlin/defaults/main.yml b/roles/openstack_helm_senlin/defaults/main.yml
deleted file mode 100644
index a628365..0000000
--- a/roles/openstack_helm_senlin/defaults/main.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (c) 2023 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-openstack_helm_senlin_helm_release_name: senlin
-openstack_helm_senlin_helm_chart_path: "{{ role_path }}/../../charts/senlin/"
-openstack_helm_senlin_helm_chart_ref: /usr/local/src/senlin
-
-openstack_helm_senlin_helm_release_namespace: openstack
-openstack_helm_senlin_helm_values: {}
-
-openstack_helm_senlin_ingress_annotations: {}
diff --git a/roles/openstack_helm_tempest/README.md b/roles/openstack_helm_tempest/README.md
deleted file mode 100644
index fc51b4b..0000000
--- a/roles/openstack_helm_tempest/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# `openstack_helm_tempest`
diff --git a/roles/openstack_helm_tempest/tasks/main.yml b/roles/openstack_helm_tempest/tasks/main.yml
deleted file mode 100644
index e0e5dd6..0000000
--- a/roles/openstack_helm_tempest/tasks/main.yml
+++ /dev/null
@@ -1,115 +0,0 @@
-# Copyright (c) 2022 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-- name: Generate OpenStack-Helm endpoints
-  ansible.builtin.include_role:
-    name: openstack_helm_endpoints
-  vars:
-    openstack_helm_endpoints_chart: tempest
-
-- name: Configure tempest
-  block:
-    - name: Get test image object
-      openstack.cloud.image_info:
-        cloud: atmosphere
-        image: cirros
-      register: _openstack_helm_tempest_test_image
-      when: openstack_helm_tempest_helm_values.conf.tempest.compute.image_ref is not defined
-
-    - name: Configure test image ref
-      ansible.builtin.set_fact:
-        openstack_helm_tempest_helm_values: "{{ openstack_helm_tempest_helm_values | default({}) | combine({item.key: item.value}, recursive=True) }}"
-      with_dict:
-        conf:
-          tempest:
-            compute:
-              image_ref: "{{ _openstack_helm_tempest_test_image.openstack_image.id }}"
-      when:
-        - openstack_helm_tempest_helm_values.conf.tempest.compute.image_ref is not defined
-        - _openstack_helm_tempest_test_image.openstack_image.id is defined
-
-    - name: Get test flavor object
-      openstack.cloud.compute_flavor_info:
-        cloud: atmosphere
-        name: m1.tiny
-      register: _openstack_helm_tempest_test_flavor
-      when: openstack_helm_tempest_helm_values.conf.tempest.compute.flavor_ref is not defined
-
-    - name: Set test flavor ref
-      ansible.builtin.set_fact:
-        openstack_helm_tempest_helm_values: "{{ openstack_helm_tempest_helm_values | default({}) | combine({item.key: item.value}, recursive=True) }}"
-      with_dict:
-        conf:
-          tempest:
-            compute:
-              flavor_ref: "{{ _openstack_helm_tempest_test_flavor.openstack_flavors[0].id }}"
-      when:
-        - openstack_helm_tempest_helm_values.conf.tempest.compute.flavor_ref is not defined
-        - _openstack_helm_tempest_test_flavor.openstack_flavors[0].id is defined
-
-    - name: Get test network object
-      openstack.cloud.networks_info:
-        cloud: atmosphere
-        name: public
-      register: _openstack_helm_tempest_test_network
-      when: openstack_helm_tempest_helm_values.conf.tempest.network.public_network_id is not defined
-
-    - name: Set test network ref
-      ansible.builtin.set_fact:
-        openstack_helm_tempest_helm_values: "{{ openstack_helm_tempest_helm_values | default({}) | combine({item.key: item.value}, recursive=True) }}"
-      with_dict:
-        conf:
-          tempest:
-            network:
-              public_network_id: "{{ _openstack_helm_tempest_test_network.openstack_networks[0].id }}"
-      when:
-        - openstack_helm_tempest_helm_values.conf.tempest.network.public_network_id is not defined
-        - _openstack_helm_tempest_test_network.openstack_networks[0].id is defined
-
-- name: Deploy Helm chart
-  failed_when: false
-  run_once: true
-  kubernetes.core.helm:
-    name: "{{ openstack_helm_tempest_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_tempest_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_tempest_helm_release_namespace }}"
-    kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_tempest_helm_values | combine(openstack_helm_tempest_helm_values, recursive=True) }}"
-    wait: true
-    wait_timeout: 20m
-
-- name: Get tempest job object
-  kubernetes.core.k8s_info:
-    api_version: batch/v1
-    kind: Job
-    name: tempest-run-tests
-    namespace: openstack
-  register: _tempest_job_obj
-
-- name: Get tempest log
-  kubernetes.core.k8s_log:
-    namespace: openstack
-    label_selectors:
-      - job-name=tempest-run-tests
-  register: _tempest_log
-
-- name: Print tempest log details
-  ansible.builtin.debug:
-    msg: "{{ _tempest_log.log_lines }}"
-
-- name: Fail when tempest result is failed
-  ansible.builtin.fail:
-    msg: "Tempest failed!"
-  when: _tempest_job_obj.resources[0]['status']['succeeded'] is not defined or
-        _tempest_job_obj.resources[0]['status']['succeeded'] != 1
diff --git a/roles/openvswitch/README.md b/roles/openvswitch/README.md
new file mode 100644
index 0000000..481d385
--- /dev/null
+++ b/roles/openvswitch/README.md
@@ -0,0 +1 @@
+# `openvswitch`
diff --git a/roles/openstack_helm_tempest/defaults/main.yml b/roles/openvswitch/defaults/main.yml
similarity index 66%
copy from roles/openstack_helm_tempest/defaults/main.yml
copy to roles/openvswitch/defaults/main.yml
index b07578a..f20e412 100644
--- a/roles/openstack_helm_tempest/defaults/main.yml
+++ b/roles/openvswitch/defaults/main.yml
@@ -12,9 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_tempest_helm_release_name: tempest
-openstack_helm_tempest_helm_chart_path: "{{ role_path }}/../../charts/tempest/"
-openstack_helm_tempest_helm_chart_ref: /usr/local/src/tempest
+openvswitch_helm_release_name: openvswitch
+openvswitch_helm_chart_path: "{{ role_path }}/../../charts/openvswitch/"
+openvswitch_helm_chart_ref: /usr/local/src/openvswitch
 
-openstack_helm_tempest_helm_release_namespace: openstack
-openstack_helm_tempest_helm_values: {}
+openvswitch_helm_release_namespace: openstack
+openvswitch_helm_values: {}
diff --git a/roles/openstack_helm_infra_openvswitch/meta/main.yml b/roles/openvswitch/meta/main.yml
similarity index 84%
rename from roles/openstack_helm_infra_openvswitch/meta/main.yml
rename to roles/openvswitch/meta/main.yml
index 0f2764e..3e62a92 100644
--- a/roles/openstack_helm_infra_openvswitch/meta/main.yml
+++ b/roles/openvswitch/meta/main.yml
@@ -30,5 +30,5 @@
       openstack_helm_endpoints_chart: openvswitch
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_infra_openvswitch_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_infra_openvswitch_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ openvswitch_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ openvswitch_helm_chart_ref }}"
diff --git a/roles/openstack_helm_infra_libvirt/tasks/main.yml b/roles/openvswitch/tasks/main.yml
similarity index 65%
copy from roles/openstack_helm_infra_libvirt/tasks/main.yml
copy to roles/openvswitch/tasks/main.yml
index e347c21..908b004 100644
--- a/roles/openstack_helm_infra_libvirt/tasks/main.yml
+++ b/roles/openvswitch/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_infra_libvirt_helm_release_name }}"
-        namespace: "{{ openstack_helm_infra_libvirt_helm_release_namespace }}"
+        name: "{{ openvswitch_helm_release_name }}"
+        namespace: "{{ openvswitch_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,15 +31,15 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_infra_libvirt_helm_release_name }}"
-        namespace: "{{ openstack_helm_infra_libvirt_helm_release_namespace }}"
+        name: "{{ openvswitch_helm_release_name }}"
+        namespace: "{{ openvswitch_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_infra_libvirt_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_infra_libvirt_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_infra_libvirt_helm_release_namespace }}"
+    name: "{{ openvswitch_helm_release_name }}"
+    chart_ref: "{{ openvswitch_helm_chart_ref }}"
+    release_namespace: "{{ openvswitch_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_infra_libvirt_helm_values | combine(openstack_helm_infra_libvirt_helm_values, recursive=True) }}"
+    values: "{{ _openvswitch_helm_values | combine(openvswitch_helm_values, recursive=True) }}"
diff --git a/roles/openstack_helm_infra_openvswitch/vars/main.yml b/roles/openvswitch/vars/main.yml
similarity index 93%
rename from roles/openstack_helm_infra_openvswitch/vars/main.yml
rename to roles/openvswitch/vars/main.yml
index ef74425..74874f3 100644
--- a/roles/openstack_helm_infra_openvswitch/vars/main.yml
+++ b/roles/openvswitch/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_infra_openvswitch_helm_values:
+_openvswitch_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('openvswitch') }}"
diff --git a/roles/placement/README.md b/roles/placement/README.md
new file mode 100644
index 0000000..7fd6e6f
--- /dev/null
+++ b/roles/placement/README.md
@@ -0,0 +1 @@
+# `placement`
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/placement/defaults/main.yml
similarity index 65%
rename from roles/openstack_helm_cinder/defaults/main.yml
rename to roles/placement/defaults/main.yml
index acb7a8a..c0625df 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/placement/defaults/main.yml
@@ -12,12 +12,12 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-openstack_helm_cinder_helm_release_name: cinder
-openstack_helm_cinder_helm_chart_path: "{{ role_path }}/../../charts/cinder/"
-openstack_helm_cinder_helm_chart_ref: /usr/local/src/cinder
+placement_helm_release_name: placement
+placement_helm_chart_path: "{{ role_path }}/../../charts/placement/"
+placement_helm_chart_ref: /usr/local/src/placement
 
-openstack_helm_cinder_helm_release_namespace: openstack
-openstack_helm_cinder_helm_values: {}
+placement_helm_release_namespace: openstack
+placement_helm_values: {}
 
 # List of annotations to apply to the Ingress
-openstack_helm_cinder_ingress_annotations: {}
+placement_ingress_annotations: {}
diff --git a/roles/openstack_helm_placement/meta/main.yml b/roles/placement/meta/main.yml
similarity index 85%
rename from roles/openstack_helm_placement/meta/main.yml
rename to roles/placement/meta/main.yml
index 006d1da..47265b3 100644
--- a/roles/openstack_helm_placement/meta/main.yml
+++ b/roles/placement/meta/main.yml
@@ -30,5 +30,5 @@
       openstack_helm_endpoints_chart: placement
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_placement_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_placement_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ placement_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ placement_helm_chart_ref }}"
diff --git a/roles/openstack_helm_placement/tasks/main.yml b/roles/placement/tasks/main.yml
similarity index 69%
rename from roles/openstack_helm_placement/tasks/main.yml
rename to roles/placement/tasks/main.yml
index f4c850e..d338ebe 100644
--- a/roles/openstack_helm_placement/tasks/main.yml
+++ b/roles/placement/tasks/main.yml
@@ -23,8 +23,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_placement_helm_release_name }}"
-        namespace: "{{ openstack_helm_placement_helm_release_namespace }}"
+        name: "{{ placement_helm_release_name }}"
+        namespace: "{{ placement_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -34,18 +34,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_placement_helm_release_name }}"
-        namespace: "{{ openstack_helm_placement_helm_release_namespace }}"
+        name: "{{ placement_helm_release_name }}"
+        namespace: "{{ placement_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_placement_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_placement_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_placement_helm_release_namespace }}"
+    name: "{{ placement_helm_release_name }}"
+    chart_ref: "{{ placement_helm_chart_ref }}"
+    release_namespace: "{{ placement_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_placement_helm_values | combine(openstack_helm_placement_helm_values, recursive=True) }}"
+    values: "{{ _placement_helm_values | combine(placement_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -54,4 +54,4 @@
     openstack_helm_ingress_endpoint: placement
     openstack_helm_ingress_service_name: placement-api
     openstack_helm_ingress_service_port: 8778
-    openstack_helm_ingress_annotations: "{{ openstack_helm_placement_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ placement_ingress_annotations }}"
diff --git a/roles/openstack_helm_placement/vars/main.yml b/roles/placement/vars/main.yml
similarity index 95%
rename from roles/openstack_helm_placement/vars/main.yml
rename to roles/placement/vars/main.yml
index 0dca580..322a0ba 100644
--- a/roles/openstack_helm_placement/vars/main.yml
+++ b/roles/placement/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_placement_helm_values:
+_placement_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('placement') }}"
diff --git a/roles/senlin/README.md b/roles/senlin/README.md
new file mode 100644
index 0000000..8714a46
--- /dev/null
+++ b/roles/senlin/README.md
@@ -0,0 +1 @@
+# `senlin`
diff --git a/roles/openstack_helm_infra_openvswitch/vars/main.yml b/roles/senlin/defaults/main.yml
similarity index 66%
copy from roles/openstack_helm_infra_openvswitch/vars/main.yml
copy to roles/senlin/defaults/main.yml
index ef74425..715dd37 100644
--- a/roles/openstack_helm_infra_openvswitch/vars/main.yml
+++ b/roles/senlin/defaults/main.yml
@@ -1,4 +1,4 @@
-# Copyright (c) 2022 VEXXHOST, Inc.
+# Copyright (c) 2023 VEXXHOST, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
@@ -12,7 +12,11 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_infra_openvswitch_helm_values:
-  endpoints: "{{ openstack_helm_endpoints }}"
-  images:
-    tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('openvswitch') }}"
+senlin_helm_release_name: senlin
+senlin_helm_chart_path: "{{ role_path }}/../../charts/senlin/"
+senlin_helm_chart_ref: /usr/local/src/senlin
+
+senlin_helm_release_namespace: openstack
+senlin_helm_values: {}
+
+senlin_ingress_annotations: {}
diff --git a/roles/openstack_helm_senlin/meta/main.yml b/roles/senlin/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_senlin/meta/main.yml
rename to roles/senlin/meta/main.yml
index 866b729..aa4500c 100644
--- a/roles/openstack_helm_senlin/meta/main.yml
+++ b/roles/senlin/meta/main.yml
@@ -31,5 +31,5 @@
       openstack_helm_endpoints_chart: senlin
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_senlin_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_senlin_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ senlin_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ senlin_helm_chart_ref }}"
diff --git a/roles/openstack_helm_senlin/tasks/main.yml b/roles/senlin/tasks/main.yml
similarity index 68%
rename from roles/openstack_helm_senlin/tasks/main.yml
rename to roles/senlin/tasks/main.yml
index 8d90d49..673d308 100644
--- a/roles/openstack_helm_senlin/tasks/main.yml
+++ b/roles/senlin/tasks/main.yml
@@ -20,8 +20,8 @@
         state: patched
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_senlin_helm_release_name }}"
-        namespace: "{{ openstack_helm_senlin_helm_release_namespace }}"
+        name: "{{ senlin_helm_release_name }}"
+        namespace: "{{ senlin_helm_release_namespace }}"
         definition:
           spec:
             suspend: true
@@ -31,18 +31,18 @@
         state: absent
         api_version: helm.toolkit.fluxcd.io/v2beta1
         kind: HelmRelease
-        name: "{{ openstack_helm_senlin_helm_release_name }}"
-        namespace: "{{ openstack_helm_senlin_helm_release_namespace }}"
+        name: "{{ senlin_helm_release_name }}"
+        namespace: "{{ senlin_helm_release_namespace }}"
 
 - name: Deploy Helm chart
   run_once: true
   kubernetes.core.helm:
-    name: "{{ openstack_helm_senlin_helm_release_name }}"
-    chart_ref: "{{ openstack_helm_senlin_helm_chart_ref }}"
-    release_namespace: "{{ openstack_helm_senlin_helm_release_namespace }}"
+    name: "{{ senlin_helm_release_name }}"
+    chart_ref: "{{ senlin_helm_chart_ref }}"
+    release_namespace: "{{ senlin_helm_release_namespace }}"
     create_namespace: true
     kubeconfig: /etc/kubernetes/admin.conf
-    values: "{{ _openstack_helm_senlin_helm_values | combine(openstack_helm_senlin_helm_values, recursive=True) }}"
+    values: "{{ _senlin_helm_values | combine(senlin_helm_values, recursive=True) }}"
 
 - name: Create Ingress
   ansible.builtin.include_role:
@@ -51,4 +51,4 @@
     openstack_helm_ingress_endpoint: clustering
     openstack_helm_ingress_service_name: senlin-api
     openstack_helm_ingress_service_port: 8778
-    openstack_helm_ingress_annotations: "{{ openstack_helm_senlin_ingress_annotations }}"
+    openstack_helm_ingress_annotations: "{{ senlin_ingress_annotations }}"
diff --git a/roles/openstack_helm_senlin/vars/main.yml b/roles/senlin/vars/main.yml
similarity index 96%
rename from roles/openstack_helm_senlin/vars/main.yml
rename to roles/senlin/vars/main.yml
index eba58b5..6f62432 100644
--- a/roles/openstack_helm_senlin/vars/main.yml
+++ b/roles/senlin/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_senlin_helm_values:
+_senlin_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('senlin') }}"
diff --git a/roles/tempest/README.md b/roles/tempest/README.md
new file mode 100644
index 0000000..430101f
--- /dev/null
+++ b/roles/tempest/README.md
@@ -0,0 +1 @@
+# `tempest`
diff --git a/roles/openstack_helm_infra_openvswitch/vars/main.yml b/roles/tempest/defaults/main.yml
similarity index 68%
copy from roles/openstack_helm_infra_openvswitch/vars/main.yml
copy to roles/tempest/defaults/main.yml
index ef74425..59872db 100644
--- a/roles/openstack_helm_infra_openvswitch/vars/main.yml
+++ b/roles/tempest/defaults/main.yml
@@ -1,4 +1,4 @@
-# Copyright (c) 2022 VEXXHOST, Inc.
+# Copyright (c) 2023 VEXXHOST, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_infra_openvswitch_helm_values:
-  endpoints: "{{ openstack_helm_endpoints }}"
-  images:
-    tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('openvswitch') }}"
+tempest_helm_release_name: tempest
+tempest_helm_chart_path: "{{ role_path }}/../../charts/tempest/"
+tempest_helm_chart_ref: /usr/local/src/tempest
+
+tempest_helm_release_namespace: openstack
+tempest_helm_values: {}
diff --git a/roles/openstack_helm_tempest/meta/main.yml b/roles/tempest/meta/main.yml
similarity index 86%
rename from roles/openstack_helm_tempest/meta/main.yml
rename to roles/tempest/meta/main.yml
index 32c7ae6..0c51f46 100644
--- a/roles/openstack_helm_tempest/meta/main.yml
+++ b/roles/tempest/meta/main.yml
@@ -31,5 +31,5 @@
       openstack_helm_endpoints_chart: tempest
   - role: upload_helm_chart
     vars:
-      upload_helm_chart_src: "{{ openstack_helm_tempest_helm_chart_path }}"
-      upload_helm_chart_dest: "{{ openstack_helm_tempest_helm_chart_ref }}"
+      upload_helm_chart_src: "{{ tempest_helm_chart_path }}"
+      upload_helm_chart_dest: "{{ tempest_helm_chart_ref }}"
diff --git a/roles/tempest/tasks/main.yml b/roles/tempest/tasks/main.yml
new file mode 100644
index 0000000..3a46f9e
--- /dev/null
+++ b/roles/tempest/tasks/main.yml
@@ -0,0 +1,115 @@
+# Copyright (c) 2022 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- name: Generate OpenStack-Helm endpoints
+  ansible.builtin.include_role:
+    name: openstack_helm_endpoints
+  vars:
+    openstack_helm_endpoints_chart: tempest
+
+- name: Configure tempest
+  block:
+    - name: Get test image object
+      openstack.cloud.image_info:
+        cloud: atmosphere
+        image: cirros
+      register: _tempest_test_image
+      when: tempest_helm_values.conf.tempest.compute.image_ref is not defined
+
+    - name: Configure test image ref
+      ansible.builtin.set_fact:
+        tempest_helm_values: "{{ tempest_helm_values | default({}) | combine({item.key: item.value}, recursive=True) }}"
+      with_dict:
+        conf:
+          tempest:
+            compute:
+              image_ref: "{{ _tempest_test_image.openstack_image.id }}"
+      when:
+        - tempest_helm_values.conf.tempest.compute.image_ref is not defined
+        - _tempest_test_image.openstack_image.id is defined
+
+    - name: Get test flavor object
+      openstack.cloud.compute_flavor_info:
+        cloud: atmosphere
+        name: m1.tiny
+      register: _tempest_test_flavor
+      when: tempest_helm_values.conf.tempest.compute.flavor_ref is not defined
+
+    - name: Set test flavor ref
+      ansible.builtin.set_fact:
+        tempest_helm_values: "{{ tempest_helm_values | default({}) | combine({item.key: item.value}, recursive=True) }}"
+      with_dict:
+        conf:
+          tempest:
+            compute:
+              flavor_ref: "{{ _tempest_test_flavor.openstack_flavors[0].id }}"
+      when:
+        - tempest_helm_values.conf.tempest.compute.flavor_ref is not defined
+        - _tempest_test_flavor.openstack_flavors[0].id is defined
+
+    - name: Get test network object
+      openstack.cloud.networks_info:
+        cloud: atmosphere
+        name: public
+      register: _tempest_test_network
+      when: tempest_helm_values.conf.tempest.network.public_network_id is not defined
+
+    - name: Set test network ref
+      ansible.builtin.set_fact:
+        tempest_helm_values: "{{ tempest_helm_values | default({}) | combine({item.key: item.value}, recursive=True) }}"
+      with_dict:
+        conf:
+          tempest:
+            network:
+              public_network_id: "{{ _tempest_test_network.openstack_networks[0].id }}"
+      when:
+        - tempest_helm_values.conf.tempest.network.public_network_id is not defined
+        - _tempest_test_network.openstack_networks[0].id is defined
+
+- name: Deploy Helm chart
+  failed_when: false
+  run_once: true
+  kubernetes.core.helm:
+    name: "{{ tempest_helm_release_name }}"
+    chart_ref: "{{ tempest_helm_chart_ref }}"
+    release_namespace: "{{ tempest_helm_release_namespace }}"
+    kubeconfig: /etc/kubernetes/admin.conf
+    values: "{{ _tempest_helm_values | combine(tempest_helm_values, recursive=True) }}"
+    wait: true
+    wait_timeout: 20m
+
+- name: Get tempest job object
+  kubernetes.core.k8s_info:
+    api_version: batch/v1
+    kind: Job
+    name: tempest-run-tests
+    namespace: openstack
+  register: _tempest_job_obj
+
+- name: Get tempest log
+  kubernetes.core.k8s_log:
+    namespace: openstack
+    label_selectors:
+      - job-name=tempest-run-tests
+  register: _tempest_log
+
+- name: Print tempest log details
+  ansible.builtin.debug:
+    msg: "{{ _tempest_log.log_lines }}"
+
+- name: Fail when tempest result is failed
+  ansible.builtin.fail:
+    msg: "Tempest failed!"
+  when: _tempest_job_obj.resources[0]['status']['succeeded'] is not defined or
+        _tempest_job_obj.resources[0]['status']['succeeded'] != 1
diff --git a/roles/openstack_helm_tempest/vars/main.yml b/roles/tempest/vars/main.yml
similarity index 97%
rename from roles/openstack_helm_tempest/vars/main.yml
rename to roles/tempest/vars/main.yml
index d7ec1f5..36a641b 100644
--- a/roles/openstack_helm_tempest/vars/main.yml
+++ b/roles/tempest/vars/main.yml
@@ -12,7 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-_openstack_helm_tempest_helm_values:
+_tempest_helm_values:
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags: "{{ atmosphere_images | vexxhost.atmosphere.openstack_helm_image_tags('tempest') }}"