diff --git a/.zuul.yaml b/.zuul.yaml
index 5b72f5a..23bf5f6 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -1,5 +1,4 @@
 - project:
     templates:
-      - python35-charm-jobs
-      - openstack-python3-charm-yoga-jobs
+      - openstack-python3-charm-zed-jobs
       - openstack-cover-jobs
diff --git a/bindep.txt b/bindep.txt
new file mode 100644
index 0000000..17575d9
--- /dev/null
+++ b/bindep.txt
@@ -0,0 +1,4 @@
+libffi-dev [platform:dpkg]
+libpq-dev [platform:dpkg]
+libxml2-dev [platform:dpkg]
+libxslt1-dev [platform:dpkg]
diff --git a/charmcraft.yaml b/charmcraft.yaml
index c9a0ed7..0604425 100644
--- a/charmcraft.yaml
+++ b/charmcraft.yaml
@@ -2,32 +2,24 @@ 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/* .
+    source: src/
+    plugin: reactive
+    build-snaps:
+      - charm
+    build-environment:
+      - CHARM_INTERFACES_DIR: /root/project/interfaces/
+      - CHARM_LAYERS_DIR: /root/project/layers/
 
 bases:
   - build-on:
       - name: ubuntu
-        channel: "20.04"
+        channel: "22.04"
         architectures:
           - amd64
     run-on:
-      - name: ubuntu
-        channel: "20.04"
-        architectures: [amd64, s390x, ppc64el, arm64]
       - name: ubuntu
         channel: "22.04"
         architectures: [amd64, s390x, ppc64el, arm64]
+      - name: ubuntu
+        channel: "22.10"
+        architectures: [amd64, s390x, ppc64el, arm64]
diff --git a/osci.yaml b/osci.yaml
index 8d616ac..35db547 100644
--- a/osci.yaml
+++ b/osci.yaml
@@ -1,16 +1,9 @@
 - project:
     templates:
-      - charm-unit-jobs-py38
       - charm-unit-jobs-py310
-      - charm-xena-functional-jobs
-      - charm-yoga-functional-jobs
-    check:
-      jobs:
-        - focal-xena
-        - focal-yoga
-        - jammy-yoga:
-            voting: false
+      - charm-zed-functional-jobs
     vars:
       needs_charm_build: true
       charm_build_name: cinder-netapp
       build_type: charmcraft
+      charmcraft_channel: 2.0/stable
diff --git a/requirements.txt b/requirements.txt
index 7755b95..b3dc23f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -15,16 +15,6 @@ setuptools<50.0.0  # https://github.com/pypa/setuptools/commit/04e3df22df840c6bb
 #
 cryptography<3.4
 
-# Build requirements
-cffi==1.14.6; python_version < '3.6'  # cffi 1.15.0 drops support for py35.
-git+https://github.com/juju/charm-tools#egg=charm-tools
+git+https://github.com/juju/charm-tools.git
 
 simplejson
-
-# Newer versions use keywords that didn't exist in python 3.5 yet (e.g.
-# "ModuleNotFoundError")
-# NOTE(lourot): This might look like a duplication of test-requirements.txt but
-# some tox targets use only test-requirements.txt whereas charm-build uses only
-# requirements.txt
-importlib-metadata<3.0.0; python_version < '3.6'
-importlib-resources<3.0.0; python_version < '3.6'
diff --git a/src/metadata.yaml b/src/metadata.yaml
index c353009..271bca7 100644
--- a/src/metadata.yaml
+++ b/src/metadata.yaml
@@ -11,8 +11,8 @@ tags:
   - file-servers
   - misc
 series:
-  - focal
   - jammy
+  - kinetic
 subordinate: true
 provides:
   storage-backend:
diff --git a/src/tests/bundles/focal-xena.yaml b/src/tests/bundles/focal-xena.yaml
deleted file mode 100644
index f797169..0000000
--- a/src/tests/bundles/focal-xena.yaml
+++ /dev/null
@@ -1,85 +0,0 @@
-series: focal
-local_overlay_enabled: False
-
-variables:
-  # Use proposed until https://pad.lv/1948507 is fix released
-  openstack-origin: &openstack-origin cloud:focal-xena/proposed
-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: ch:mysql-innodb-cluster
-    num_units: 3
-    options:
-      source: *openstack-origin
-    to:
-      - '0'
-      - '1'
-      - '2'
-    channel: latest/edge
-  rabbitmq-server:
-    charm: ch:rabbitmq-server
-    num_units: 1
-    options:
-      source: *openstack-origin
-    to:
-      - '3'
-    channel: latest/edge
-  keystone:
-    charm: ch:keystone
-    options:
-      openstack-origin: *openstack-origin
-    num_units: 1
-    to:
-      - '4'
-    channel: latest/edge
-  keystone-mysql-router:
-    charm: ch:mysql-router
-    channel: latest/edge
-  cinder:
-    charm: ch:cinder
-    storage:
-      block-devices: '40G'
-    num_units: 1
-    options:
-      openstack-origin: *openstack-origin
-      block-device: None
-      overwrite: "true"
-    to:
-      - '5'
-    channel: latest/edge
-  cinder-netapp:
-    charm: ../../../cinder-netapp.charm
-    options:
-      netapp-storage-family: ontap_cluster
-      netapp-storage-protocol: iscsi
-      volume-backend-name: NETAPP
-  cinder-mysql-router:
-    charm: ch:mysql-router
-    channel: latest/edge
diff --git a/src/tests/bundles/focal-yoga.yaml b/src/tests/bundles/jammy-zed.yaml
similarity index 96%
rename from src/tests/bundles/focal-yoga.yaml
rename to src/tests/bundles/jammy-zed.yaml
index 5dc01b8..f2f9a2f 100644
--- a/src/tests/bundles/focal-yoga.yaml
+++ b/src/tests/bundles/jammy-zed.yaml
@@ -1,8 +1,8 @@
-series: focal
+series: jammy
 local_overlay_enabled: False
 
 variables:
-  openstack-origin: &openstack-origin cloud:focal-yoga
+  openstack-origin: &openstack-origin cloud:jammy-zed
 comment:
 - 'machines section to decide order of deployment. database sooner = faster'
 machines:
diff --git a/src/tests/bundles/impish-xena.yaml b/src/tests/bundles/kinetic-zed.yaml
similarity index 99%
rename from src/tests/bundles/impish-xena.yaml
rename to src/tests/bundles/kinetic-zed.yaml
index 99e9652..e41c821 100644
--- a/src/tests/bundles/impish-xena.yaml
+++ b/src/tests/bundles/kinetic-zed.yaml
@@ -1,4 +1,4 @@
-series: impish
+series: kinetic
 local_overlay_enabled: False
 
 variables:
diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml
index 1008482..4eccc42 100644
--- a/src/tests/tests.yaml
+++ b/src/tests/tests.yaml
@@ -4,14 +4,13 @@ tests:
 configure:
   - zaza.openstack.charm_tests.keystone.setup.add_demo_user
 gate_bundles:
-  - focal-xena
-smoke_bundles:
-  - focal-xena
-dev_bundles:
-  - focal-yoga
-  - impish-xena
   - jammy-yoga
+smoke_bundles:
+  - jammy-yoga
+dev_bundles:
+  - jammy-yoga
+  - jammy-zed
+  - kinetic-zed
 test_options:
   force_deploy:
-    - impish-xena
-    - jammy-yoga
+    - kinetic-zed
diff --git a/test-requirements.txt b/test-requirements.txt
index a11a7d0..a7936e6 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -4,7 +4,6 @@
 #     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
 
 stestr>=2.2.0
@@ -13,25 +12,10 @@ stestr>=2.2.0
 # https://github.com/mtreinish/stestr/issues/145
 cliff<3.0.0
 
-# Dependencies of stestr. Newer versions use keywords that didn't exist in
-# python 3.5 yet (e.g. "ModuleNotFoundError")
-importlib-metadata<3.0.0; python_version < '3.6'
-importlib-resources<3.0.0; python_version < '3.6'
-
-# Some Zuul nodes sometimes pull newer versions of these dependencies which
-# dropped support for python 3.5:
-osprofiler<2.7.0;python_version<'3.6'
-stevedore<1.31.0;python_version<'3.6'
-debtcollector<1.22.0;python_version<'3.6'
-oslo.utils<=3.41.0;python_version<'3.6'
-
 requests>=2.18.4
 charms.reactive
 
-# Newer mock seems to have some syntax which is newer than python3.5 (e.g.
-# f'{something}'
-mock>=1.2,<4.0.0; python_version < '3.6'
-mock>=1.2; python_version >= '3.6'
+mock>=1.2
 
 nose>=1.3.7
 coverage>=3.6
diff --git a/tox.ini b/tox.ini
index e22fe48..bdde110 100644
--- a/tox.ini
+++ b/tox.ini
@@ -31,10 +31,8 @@ minversion = 3.18.0
 setenv = VIRTUAL_ENV={envdir}
          PYTHONHASHSEED=0
          TERM=linux
-         LAYER_PATH={toxinidir}/layers
-         INTERFACE_PATH={toxinidir}/interfaces
          JUJU_REPOSITORY={toxinidir}/build
-passenv = http_proxy https_proxy INTERFACE_PATH LAYER_PATH JUJU_REPOSITORY
+passenv = no_proxy http_proxy https_proxy JUJU_REPOSITORY
 install_command =
   {toxinidir}/pip.sh install {opts} {packages}
 allowlist_externals =
@@ -50,7 +48,7 @@ basepython = python3
 deps = -r{toxinidir}/build-requirements.txt
 commands =
     charmcraft clean
-    charmcraft -v build
+    charmcraft -v pack
     {toxinidir}/rename.sh
 
 [testenv:build-reactive]
@@ -68,21 +66,6 @@ basepython = python3
 deps = -r{toxinidir}/test-requirements.txt
 commands = stestr run --slowest {posargs}
 
-[testenv:py36]
-basepython = python3.6
-deps = -r{toxinidir}/test-requirements.txt
-commands = stestr run --slowest {posargs}
-
-[testenv:py38]
-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:py310]
 basepython = python3.10
 deps = -r{toxinidir}/test-requirements.txt
@@ -91,7 +74,7 @@ commands = stestr run --slowest {posargs}
 [testenv:pep8]
 basepython = python3
 deps = flake8==3.9.2
-       charm-tools==2.8.3
+       git+https://github.com/juju/charm-tools.git
 commands = flake8 {posargs} src unit_tests
 
 [testenv:func-target]