diff --git a/build-requirements.txt b/build-requirements.txt
new file mode 100644
index 0000000..b6d2452
--- /dev/null
+++ b/build-requirements.txt
@@ -0,0 +1,7 @@
+# NOTES(lourot):
+# * We don't install charmcraft via pip anymore because it anyway spins up a
+#   container and scp the system's charmcraft snap inside it. So the charmcraft
+#   snap is necessary on the system anyway.
+# * `tox -e build` successfully validated with charmcraft 1.2.1
+
+cffi==1.14.6; python_version < '3.6'  # cffi 1.15.0 drops support for py35.
diff --git a/charmcraft.yaml b/charmcraft.yaml
new file mode 100644
index 0000000..4968216
--- /dev/null
+++ b/charmcraft.yaml
@@ -0,0 +1,25 @@
+type: charm
+
+parts:
+  charm:
+    build-packages:
+      - tox
+      - git
+      - python3-dev
+    override-build: |
+      apt-get install ca-certificates -y
+      tox -e build-reactive
+    override-stage: |
+      echo "Copying charm to staging area: $CHARMCRAFT_STAGE"
+      NAME=$(ls $CHARMCRAFT_PART_BUILD/build/builds)
+      cp -r $CHARMCRAFT_PART_BUILD/build/builds/$NAME/* $CHARMCRAFT_STAGE/
+    override-prime: |
+      # For some reason, the normal priming chokes on the fact that there's a
+      # hooks directory.
+      cp -r $CHARMCRAFT_STAGE/* .
+
+bases:
+  - name: ubuntu
+    channel: "20.04"
+    architectures:
+      - amd64
diff --git a/metadata.yaml b/metadata.yaml
new file mode 120000
index 0000000..0768683
--- /dev/null
+++ b/metadata.yaml
@@ -0,0 +1 @@
+src/metadata.yaml
\ No newline at end of file
diff --git a/osci.yaml b/osci.yaml
index 78590d9..2c0d22d 100644
--- a/osci.yaml
+++ b/osci.yaml
@@ -1,13 +1,19 @@
 - project:
     templates:
-      - charm-unit-jobs
-      - charm-functional-jobs
+      - charm-unit-jobs-py38
+      - charm-unit-jobs-py39
+      - charm-xena-functional-jobs
+      - charm-yoga-functional-jobs
     check:
       jobs:
-        - focal-xena:
+        - focal-xena
+        - focal-yoga:
             voting: false
         - impish-xena:
             voting: false
+        - jammy-yoga:
+            voting: false
     vars:
       needs_charm_build: true
       charm_build_name: cinder-netapp
+      build_type: charmcraft
diff --git a/rename.sh b/rename.sh
new file mode 100755
index 0000000..d0c35c9
--- /dev/null
+++ b/rename.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+charm=$(grep "charm_build_name" osci.yaml | awk '{print $2}')
+echo "renaming ${charm}_*.charm to ${charm}.charm"
+echo -n "pwd: "
+pwd
+ls -al
+echo "Removing bad downloaded charm maybe?"
+if [[ -e "${charm}.charm" ]];
+then
+    rm "${charm}.charm"
+fi
+echo "Renaming charm here."
+mv ${charm}_*.charm ${charm}.charm
diff --git a/src/files/.gitkeep b/src/files/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/src/metadata.yaml b/src/metadata.yaml
index 2e7e354..febed29 100644
--- a/src/metadata.yaml
+++ b/src/metadata.yaml
@@ -11,10 +11,7 @@ tags:
   - file-servers
   - misc
 series:
-  - bionic
   - focal
-  - groovy
-  - hirsute
   - impish
 subordinate: true
 provides:
diff --git a/src/test-requirements.txt b/src/test-requirements.txt
index e771023..9c7afb7 100644
--- a/src/test-requirements.txt
+++ b/src/test-requirements.txt
@@ -4,6 +4,9 @@
 #     https://github.com/openstack-charmers/release-tools
 #
 
+# Need tox to be available from tox... inception yes, but its a workaround for now
+tox
+
 # Functional Test Requirements (let Zaza's dependencies solve all dependencies here!)
 git+https://github.com/openstack-charmers/zaza.git#egg=zaza
 git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack
diff --git a/src/tests/bundles/bionic-queens.yaml b/src/tests/bundles/bionic-queens.yaml
deleted file mode 100644
index c10f10e..0000000
--- a/src/tests/bundles/bionic-queens.yaml
+++ /dev/null
@@ -1,52 +0,0 @@
-series: bionic
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-  '2':
-    constraints: mem=4G root-disk=16G
-  '3':
-relations:
-- - keystone:shared-db
-  - mysql:shared-db
-- - cinder:shared-db
-  - mysql:shared-db
-- - cinder:identity-service
-  - keystone:identity-service
-- - cinder:amqp
-  - rabbitmq-server:amqp
-- - cinder:storage-backend
-  - cinder-netapp:storage-backend
-applications:
-  mysql:
-    charm: cs:~openstack-charmers-next/percona-cluster
-    num_units: 1
-    to:
-    - '0'
-  keystone:
-    charm: cs:~openstack-charmers-next/keystone
-    num_units: 1
-    to:
-    - '1'
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    num_units: 1
-    options:
-      block-device: /dev/vdb
-      overwrite: "true"
-      ephemeral-unmount: /mnt
-    to:
-    - '2'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    to:
-    - '3'
diff --git a/src/tests/bundles/bionic-rocky.yaml b/src/tests/bundles/bionic-rocky.yaml
deleted file mode 100644
index b8088af..0000000
--- a/src/tests/bundles/bionic-rocky.yaml
+++ /dev/null
@@ -1,55 +0,0 @@
-series: bionic
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-  '2':
-    constraints: mem=4G root-disk=16G
-  '3':
-relations:
-- - keystone:shared-db
-  - mysql:shared-db
-- - cinder:shared-db
-  - mysql:shared-db
-- - cinder:identity-service
-  - keystone:identity-service
-- - cinder:amqp
-  - rabbitmq-server:amqp
-- - cinder:storage-backend
-  - cinder-netapp:storage-backend
-applications:
-  mysql:
-    charm: cs:~openstack-charmers-next/percona-cluster
-    num_units: 1
-    to:
-    - '0'
-  keystone:
-    charm: cs:~openstack-charmers-next/keystone
-    options:
-      openstack-origin: cloud:bionic-rocky
-    num_units: 1
-    to:
-    - '1'
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    num_units: 1
-    options:
-      openstack-origin: cloud:bionic-rocky
-      block-device: /dev/vdb
-      overwrite: "true"
-      ephemeral-unmount: /mnt
-    to:
-    - '2'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    to:
-    - '3'
diff --git a/src/tests/bundles/bionic-stein.yaml b/src/tests/bundles/bionic-stein.yaml
deleted file mode 100644
index ad24f1c..0000000
--- a/src/tests/bundles/bionic-stein.yaml
+++ /dev/null
@@ -1,55 +0,0 @@
-series: bionic
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-  '2':
-    constraints: mem=4G root-disk=16G
-  '3':
-relations:
-- - keystone:shared-db
-  - mysql:shared-db
-- - cinder:shared-db
-  - mysql:shared-db
-- - cinder:identity-service
-  - keystone:identity-service
-- - cinder:amqp
-  - rabbitmq-server:amqp
-- - cinder:storage-backend
-  - cinder-netapp:storage-backend
-applications:
-  mysql:
-    charm: cs:~openstack-charmers-next/percona-cluster
-    num_units: 1
-    to:
-    - '0'
-  keystone:
-    charm: cs:~openstack-charmers-next/keystone
-    options:
-      openstack-origin: cloud:bionic-stein
-    num_units: 1
-    to:
-    - '1'
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    num_units: 1
-    options:
-      openstack-origin: cloud:bionic-stein
-      block-device: /dev/vdb
-      overwrite: "true"
-      ephemeral-unmount: /mnt
-    to:
-    - '2'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    to:
-    - '3'
diff --git a/src/tests/bundles/bionic-train.yaml b/src/tests/bundles/bionic-train.yaml
deleted file mode 100644
index 2de747b..0000000
--- a/src/tests/bundles/bionic-train.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
-series: bionic
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-  '2':
-    constraints: mem=4G root-disk=16G
-  '3':
-relations:
-- - keystone:shared-db
-  - mysql:shared-db
-- - cinder:shared-db
-  - mysql:shared-db
-- - cinder:identity-service
-  - keystone:identity-service
-- - cinder:amqp
-  - rabbitmq-server:amqp
-- - cinder:storage-backend
-  - cinder-netapp:storage-backend
-applications:
-  mysql:
-    charm: cs:~openstack-charmers-next/percona-cluster
-    num_units: 1
-    to:
-    - '0'
-  keystone:
-    charm: cs:~openstack-charmers-next/keystone
-    options:
-      openstack-origin: cloud:bionic-train
-    num_units: 1
-    to:
-    - '1'
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    num_units: 1
-    storage:
-      block-devices: '40G'
-    options:
-      openstack-origin: cloud:bionic-train
-      block-device: None
-      overwrite: "true"
-    to:
-    - '2'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    to:
-    - '3'
diff --git a/src/tests/bundles/bionic-ussuri.yaml b/src/tests/bundles/bionic-ussuri.yaml
deleted file mode 100644
index e4d29d5..0000000
--- a/src/tests/bundles/bionic-ussuri.yaml
+++ /dev/null
@@ -1,57 +0,0 @@
-series: bionic
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-  '2':
-    constraints: mem=4G root-disk=16G
-  '3':
-relations:
-- - keystone:shared-db
-  - mysql:shared-db
-- - cinder:shared-db
-  - mysql:shared-db
-- - cinder:identity-service
-  - keystone:identity-service
-- - cinder:amqp
-  - rabbitmq-server:amqp
-- - cinder:storage-backend
-  - cinder-netapp:storage-backend
-applications:
-  mysql:
-    charm: cs:~openstack-charmers-next/percona-cluster
-    num_units: 1
-    to:
-    - '0'
-  keystone:
-    charm: cs:~openstack-charmers-next/keystone
-    options:
-      openstack-origin: cloud:bionic-ussuri
-    num_units: 1
-    to:
-    - '1'
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    num_units: 1
-    storage:
-      block-devices: '40G'
-    options:
-      openstack-origin: cloud:bionic-ussuri
-      block-device: None
-      overwrite: "true"
-      ephemeral-unmount: /mnt
-    to:
-    - '2'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    to:
-    - '3'
diff --git a/src/tests/bundles/focal-ussuri.yaml b/src/tests/bundles/focal-ussuri.yaml
deleted file mode 100644
index 58a8fec..0000000
--- a/src/tests/bundles/focal-ussuri.yaml
+++ /dev/null
@@ -1,76 +0,0 @@
-series: focal
-variables:
-  openstack-origin: &openstack-origin distro
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-    constraints: mem=3072M
-  '2':
-    constraints: mem=3072M
-  '3':
-  '4':
-  '5':
-    constraints: mem=4G root-disk=16G
-relations:
-  - - keystone:shared-db
-    - keystone-mysql-router:shared-db
-  - - keystone-mysql-router:db-router
-    - mysql-innodb-cluster:db-router
-  - - cinder:shared-db
-    - cinder-mysql-router:shared-db
-  - - cinder-mysql-router:db-router
-    - mysql-innodb-cluster:db-router
-  - - cinder:identity-service
-    - keystone:identity-service
-  - - cinder:amqp
-    - rabbitmq-server:amqp
-  - - cinder:storage-backend
-    - cinder-netapp:storage-backend
-applications:
-  mysql-innodb-cluster:
-    charm: cs:~openstack-charmers-next/mysql-innodb-cluster
-    num_units: 3
-    options:
-      source: *openstack-origin
-    to:
-      - '0'
-      - '1'
-      - '2'
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    options:
-      source: *openstack-origin
-    to:
-      - '3'
-  keystone:
-    charm: cs:~openstack-charmers/keystone
-    options:
-      openstack-origin: *openstack-origin
-    num_units: 1
-    to:
-      - '4'
-  keystone-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    num_units: 1
-    storage:
-      block-devices: '40G'
-    options:
-      openstack-origin: *openstack-origin
-      block-device: None
-      overwrite: "true"
-    to:
-      - '5'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  cinder-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
diff --git a/src/tests/bundles/focal-victoria.yaml b/src/tests/bundles/focal-victoria.yaml
deleted file mode 100644
index c92ca56..0000000
--- a/src/tests/bundles/focal-victoria.yaml
+++ /dev/null
@@ -1,76 +0,0 @@
-series: focal
-variables:
-  openstack-origin: &openstack-origin cloud:focal-victoria
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-    constraints: mem=3072M
-  '2':
-    constraints: mem=3072M
-  '3':
-  '4':
-  '5':
-    constraints: mem=4G root-disk=16G
-relations:
-  - - keystone:shared-db
-    - keystone-mysql-router:shared-db
-  - - keystone-mysql-router:db-router
-    - mysql-innodb-cluster:db-router
-  - - cinder:shared-db
-    - cinder-mysql-router:shared-db
-  - - cinder-mysql-router:db-router
-    - mysql-innodb-cluster:db-router
-  - - cinder:identity-service
-    - keystone:identity-service
-  - - cinder:amqp
-    - rabbitmq-server:amqp
-  - - cinder:storage-backend
-    - cinder-netapp:storage-backend
-applications:
-  mysql-innodb-cluster:
-    charm: cs:~openstack-charmers-next/mysql-innodb-cluster
-    num_units: 3
-    options:
-      source: *openstack-origin
-    to:
-      - '0'
-      - '1'
-      - '2'
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    options:
-      source: *openstack-origin
-    to:
-      - '3'
-  keystone:
-    charm: cs:~openstack-charmers-next/keystone
-    options:
-      openstack-origin: *openstack-origin
-    num_units: 1
-    to:
-      - '4'
-  keystone-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    storage:
-      block-devices: '40G'
-    num_units: 1
-    options:
-      openstack-origin: *openstack-origin
-      block-device: None
-      overwrite: "true"
-    to:
-      - '5'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  cinder-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
diff --git a/src/tests/bundles/focal-xena.yaml b/src/tests/bundles/focal-xena.yaml
index 2b6d7f7..9a1c035 100644
--- a/src/tests/bundles/focal-xena.yaml
+++ b/src/tests/bundles/focal-xena.yaml
@@ -1,4 +1,6 @@
 series: focal
+local_overlay_enabled: False
+
 variables:
   openstack-origin: &openstack-origin cloud:focal-xena
 comment:
@@ -31,7 +33,7 @@ relations:
     - cinder-netapp:storage-backend
 applications:
   mysql-innodb-cluster:
-    charm: cs:~openstack-charmers-next/mysql-innodb-cluster
+    charm: ch:mysql-innodb-cluster
     num_units: 3
     options:
       source: *openstack-origin
@@ -39,24 +41,28 @@ applications:
       - '0'
       - '1'
       - '2'
+    channel: latest/edge
   rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
+    charm: ch:rabbitmq-server
     num_units: 1
     options:
       source: *openstack-origin
     to:
       - '3'
+    channel: latest/edge
   keystone:
-    charm: cs:~openstack-charmers-next/keystone
+    charm: ch:keystone
     options:
       openstack-origin: *openstack-origin
     num_units: 1
     to:
       - '4'
+    channel: latest/edge
   keystone-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
   cinder:
-    charm: cs:~openstack-charmers-next/cinder
+    charm: ch:cinder
     storage:
       block-devices: '40G'
     num_units: 1
@@ -66,11 +72,13 @@ applications:
       overwrite: "true"
     to:
       - '5'
+    channel: latest/edge
   cinder-netapp:
-    charm: cinder-netapp
+    charm: ../../../cinder-netapp.charm
     options:
       netapp-storage-family: ontap_cluster
       netapp-storage-protocol: iscsi
       volume-backend-name: NETAPP
   cinder-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
diff --git a/src/tests/bundles/focal-wallaby.yaml b/src/tests/bundles/focal-yoga.yaml
similarity index 77%
rename from src/tests/bundles/focal-wallaby.yaml
rename to src/tests/bundles/focal-yoga.yaml
index 84aaa85..5dc01b8 100644
--- a/src/tests/bundles/focal-wallaby.yaml
+++ b/src/tests/bundles/focal-yoga.yaml
@@ -1,6 +1,8 @@
 series: focal
+local_overlay_enabled: False
+
 variables:
-  openstack-origin: &openstack-origin cloud:focal-wallaby
+  openstack-origin: &openstack-origin cloud:focal-yoga
 comment:
 - 'machines section to decide order of deployment. database sooner = faster'
 machines:
@@ -31,7 +33,7 @@ relations:
     - cinder-netapp:storage-backend
 applications:
   mysql-innodb-cluster:
-    charm: cs:~openstack-charmers-next/mysql-innodb-cluster
+    charm: ch:mysql-innodb-cluster
     num_units: 3
     options:
       source: *openstack-origin
@@ -39,24 +41,28 @@ applications:
       - '0'
       - '1'
       - '2'
+    channel: latest/edge
   rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
+    charm: ch:rabbitmq-server
     num_units: 1
     options:
       source: *openstack-origin
     to:
       - '3'
+    channel: latest/edge
   keystone:
-    charm: cs:~openstack-charmers-next/keystone
+    charm: ch:keystone
     options:
       openstack-origin: *openstack-origin
     num_units: 1
     to:
       - '4'
+    channel: latest/edge
   keystone-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
   cinder:
-    charm: cs:~openstack-charmers-next/cinder
+    charm: ch:cinder
     storage:
       block-devices: '40G'
     num_units: 1
@@ -66,11 +72,13 @@ applications:
       overwrite: "true"
     to:
       - '5'
+    channel: latest/edge
   cinder-netapp:
-    charm: cinder-netapp
+    charm: ../../../cinder-netapp.charm
     options:
       netapp-storage-family: ontap_cluster
       netapp-storage-protocol: iscsi
       volume-backend-name: NETAPP
   cinder-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
diff --git a/src/tests/bundles/groovy-victoria.yaml b/src/tests/bundles/groovy-victoria.yaml
deleted file mode 100644
index 3780a82..0000000
--- a/src/tests/bundles/groovy-victoria.yaml
+++ /dev/null
@@ -1,76 +0,0 @@
-series: groovy
-variables:
-  openstack-origin: &openstack-origin distro
-comment:
-- 'machines section to decide order of deployment. database sooner = faster'
-machines:
-  '0':
-    constraints: mem=3072M
-  '1':
-    constraints: mem=3072M
-  '2':
-    constraints: mem=3072M
-  '3':
-  '4':
-  '5':
-    constraints: mem=4G root-disk=16G
-relations:
-  - - keystone:shared-db
-    - keystone-mysql-router:shared-db
-  - - keystone-mysql-router:db-router
-    - mysql-innodb-cluster:db-router
-  - - cinder:shared-db
-    - cinder-mysql-router:shared-db
-  - - cinder-mysql-router:db-router
-    - mysql-innodb-cluster:db-router
-  - - cinder:identity-service
-    - keystone:identity-service
-  - - cinder:amqp
-    - rabbitmq-server:amqp
-  - - cinder:storage-backend
-    - cinder-netapp:storage-backend
-applications:
-  mysql-innodb-cluster:
-    charm: cs:~openstack-charmers-next/mysql-innodb-cluster
-    num_units: 3
-    options:
-      source: *openstack-origin
-    to:
-      - '0'
-      - '1'
-      - '2'
-  rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
-    num_units: 1
-    options:
-      source: *openstack-origin
-    to:
-      - '3'
-  keystone:
-    charm: cs:~openstack-charmers-next/keystone
-    options:
-      openstack-origin: *openstack-origin
-    num_units: 1
-    to:
-      - '4'
-  keystone-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
-  cinder:
-    charm: cs:~openstack-charmers-next/cinder
-    storage:
-      block-devices: '40G'
-    num_units: 1
-    options:
-      openstack-origin: *openstack-origin
-      block-device: None
-      overwrite: "true"
-    to:
-      - '5'
-  cinder-netapp:
-    charm: cinder-netapp
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  cinder-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
diff --git a/src/tests/bundles/impish-xena.yaml b/src/tests/bundles/impish-xena.yaml
index 39bba6c..99e9652 100644
--- a/src/tests/bundles/impish-xena.yaml
+++ b/src/tests/bundles/impish-xena.yaml
@@ -1,4 +1,6 @@
 series: impish
+local_overlay_enabled: False
+
 variables:
   openstack-origin: &openstack-origin distro
 comment:
@@ -31,7 +33,7 @@ relations:
     - cinder-netapp:storage-backend
 applications:
   mysql-innodb-cluster:
-    charm: cs:~openstack-charmers-next/mysql-innodb-cluster
+    charm: ch:mysql-innodb-cluster
     num_units: 3
     options:
       source: *openstack-origin
@@ -39,24 +41,28 @@ applications:
       - '0'
       - '1'
       - '2'
+    channel: latest/edge
   rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
+    charm: ch:rabbitmq-server
     num_units: 1
     options:
       source: *openstack-origin
     to:
       - '3'
+    channel: latest/edge
   keystone:
-    charm: cs:~openstack-charmers-next/keystone
+    charm: ch:keystone
     options:
       openstack-origin: *openstack-origin
     num_units: 1
     to:
       - '4'
+    channel: latest/edge
   keystone-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
   cinder:
-    charm: cs:~openstack-charmers-next/cinder
+    charm: ch:cinder
     storage:
       block-devices: '40G'
     num_units: 1
@@ -66,11 +72,13 @@ applications:
       overwrite: "true"
     to:
       - '5'
+    channel: latest/edge
   cinder-netapp:
-    charm: cinder-netapp
+    charm: ../../../cinder-netapp.charm
     options:
       netapp-storage-family: ontap_cluster
       netapp-storage-protocol: iscsi
       volume-backend-name: NETAPP
   cinder-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
diff --git a/src/tests/bundles/hirsute-wallaby.yaml b/src/tests/bundles/jammy-yoga.yaml
similarity index 79%
rename from src/tests/bundles/hirsute-wallaby.yaml
rename to src/tests/bundles/jammy-yoga.yaml
index d304567..6a91caf 100644
--- a/src/tests/bundles/hirsute-wallaby.yaml
+++ b/src/tests/bundles/jammy-yoga.yaml
@@ -1,4 +1,6 @@
-series: hirsute
+series: jammy
+local_overlay_enabled: False
+
 variables:
   openstack-origin: &openstack-origin distro
 comment:
@@ -31,7 +33,7 @@ relations:
     - cinder-netapp:storage-backend
 applications:
   mysql-innodb-cluster:
-    charm: cs:~openstack-charmers-next/mysql-innodb-cluster
+    charm: ch:mysql-innodb-cluster
     num_units: 3
     options:
       source: *openstack-origin
@@ -39,24 +41,28 @@ applications:
       - '0'
       - '1'
       - '2'
+    channel: latest/edge
   rabbitmq-server:
-    charm: cs:~openstack-charmers-next/rabbitmq-server
+    charm: ch:rabbitmq-server
     num_units: 1
     options:
       source: *openstack-origin
     to:
       - '3'
+    channel: latest/edge
   keystone:
-    charm: cs:~openstack-charmers-next/keystone
+    charm: ch:keystone
     options:
       openstack-origin: *openstack-origin
     num_units: 1
     to:
       - '4'
+    channel: latest/edge
   keystone-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
   cinder:
-    charm: cs:~openstack-charmers-next/cinder
+    charm: ch:cinder
     storage:
       block-devices: '40G'
     num_units: 1
@@ -66,11 +72,13 @@ applications:
       overwrite: "true"
     to:
       - '5'
+    channel: latest/edge
   cinder-netapp:
-    charm: cinder-netapp
+    charm: ../../../cinder-netapp.charm
     options:
       netapp-storage-family: ontap_cluster
       netapp-storage-protocol: iscsi
       volume-backend-name: NETAPP
   cinder-mysql-router:
-    charm: cs:~openstack-charmers-next/mysql-router
+    charm: ch:mysql-router
+    channel: latest/edge
diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml
index 5a5fcbb..1008482 100644
--- a/src/tests/tests.yaml
+++ b/src/tests/tests.yaml
@@ -4,21 +4,14 @@ tests:
 configure:
   - zaza.openstack.charm_tests.keystone.setup.add_demo_user
 gate_bundles:
-  - bionic-queens
-  - bionic-rocky
-  - bionic-stein
-  - bionic-train
-  - bionic-ussuri
-  - focal-ussuri
-  - focal-victoria
-  - focal-wallaby
   - focal-xena
-  - groovy-victoria
-  - hirsute-wallaby
 smoke_bundles:
-  - bionic-ussuri
+  - focal-xena
 dev_bundles:
+  - focal-yoga
   - impish-xena
+  - jammy-yoga
 test_options:
   force_deploy:
     - impish-xena
+    - jammy-yoga
diff --git a/test-requirements.txt b/test-requirements.txt
index 60f8d1a..a11a7d0 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -3,9 +3,10 @@
 # choices of *requirements.txt files for OpenStack Charms:
 #     https://github.com/openstack-charmers/release-tools
 #
+pyparsing<3.0.0  # aodhclient is pinned in zaza and needs pyparsing < 3.0.0, but cffi also needs it, so pin here.
+cffi==1.14.6; python_version < '3.6'  # cffi 1.15.0 drops support for py35.
 setuptools<50.0.0  # https://github.com/pypa/setuptools/commit/04e3df22df840c6bb244e9b27bc56750c44b7c85
 
-cffi==1.14.6; python_version < '3.6'  # cffi 1.15.0 drops support for py35.
 stestr>=2.2.0
 
 # Dependency of stestr. Workaround for
@@ -50,3 +51,4 @@ pbr==5.6.0       # vault
 cryptography<3.4 # vault, keystone-saml-mellon
 lxml             # keystone-saml-mellon
 hvac             # vault, barbican-vault
+psutil           # cinder-lvm
diff --git a/tox.ini b/tox.ini
index 22159df..2d60b8a 100644
--- a/tox.ini
+++ b/tox.ini
@@ -37,11 +37,24 @@ setenv = VIRTUAL_ENV={envdir}
 passenv = http_proxy https_proxy INTERFACE_PATH LAYER_PATH JUJU_REPOSITORY
 install_command =
   {toxinidir}/pip.sh install {opts} {packages}
+allowlist_externals =
+    charmcraft
+    bash
+    tox
+    rename.sh
 deps =
     -r{toxinidir}/requirements.txt
 
 [testenv:build]
 basepython = python3
+deps = -r{toxinidir}/build-requirements.txt
+commands =
+    charmcraft clean
+    charmcraft -v build
+    {toxinidir}/rename.sh
+
+[testenv:build-reactive]
+basepython = python3
 commands =
     charm-build --log-level DEBUG --use-lock-file-branches -o {toxinidir}/build/builds src {posargs}
 
@@ -75,12 +88,29 @@ basepython = python3.8
 deps = -r{toxinidir}/test-requirements.txt
 commands = stestr run --slowest {posargs}
 
+[testenv:py39]
+basepython = python3.9
+deps = -r{toxinidir}/test-requirements.txt
+commands = stestr run --slowest {posargs}
+
 [testenv:pep8]
 basepython = python3
 deps = flake8==3.9.2
        charm-tools==2.8.3
 commands = flake8 {posargs} src unit_tests
 
+[testenv:func-target]
+# Hack to get functional tests working in the charmcraft
+# world. We should fix this.
+basepython = python3
+passenv = HOME TERM CS_* OS_* TEST_*
+deps = -r{toxinidir}/src/test-requirements.txt
+changedir = {toxinidir}/src
+commands =
+  bash -c "if [ ! -f ../*.charm ]; then echo 'Charm does not exist. Run tox -e build'; exit 1; fi"
+  tox --version
+  tox -e func-target {posargs}
+
 [testenv:cover]
 # Technique based heavily upon
 # https://github.com/openstack/nova/blob/master/tox.ini