diff --git a/Makefile b/Makefile
index 14292de4..f78789ee 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@ PUSH_IMAGE        ?= false
 # use this variable for image labels added in internal build process
 LABEL             ?= org.airshipit.build=community
 COMMIT            ?= $(shell git rev-parse HEAD)
-DISTRO            ?= ubuntu_focal
+DISTRO            ?= ubuntu_jammy
 PYTHON            = python3
 CHARTS            := $(filter-out deps, $(patsubst charts/%/.,%,$(wildcard charts/*/.)))
 IMAGE             := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${IMAGE_NAME}:${IMAGE_TAG}-${DISTRO}
diff --git a/images/promenade/Dockerfile.ubuntu_jammy b/images/promenade/Dockerfile.ubuntu_jammy
new file mode 100644
index 00000000..e50fca92
--- /dev/null
+++ b/images/promenade/Dockerfile.ubuntu_jammy
@@ -0,0 +1,97 @@
+# Copyright 2017 AT&T Intellectual Property.  All other rights reserved.
+#
+# 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.
+
+ARG FROM=ubuntu:jammy
+FROM ${FROM}
+
+LABEL org.opencontainers.image.authors='airship-discuss@lists.airshipit.org, irc://#airshipit@freenode' \
+      org.opencontainers.image.url='https://airshipit.org' \
+      org.opencontainers.image.documentation='https://airship-promenade.readthedocs.org' \
+      org.opencontainers.image.source='https://opendev.org/airship/promenade' \
+      org.opencontainers.image.vendor='The Airship Authors' \
+      org.opencontainers.image.licenses='Apache-2.0'
+
+VOLUME /etc/promenade
+VOLUME /target
+
+RUN mkdir /opt/promenade
+WORKDIR /opt/promenade
+
+ENV PORT 9000
+EXPOSE $PORT
+
+ENV LANG=C.UTF-8
+ENV LC_ALL=C.UTF-8
+
+ARG DEBIAN_FRONTEND=noninteractive
+ENV TZ=Etc/UTC
+
+ENTRYPOINT ["/opt/promenade/entrypoint.sh"]
+
+RUN set -ex \
+    && apt update -qq \
+    && apt upgrade -y \
+    && apt-get install --no-install-recommends -y \
+        automake \
+        ca-certificates \
+        curl \
+        dnsutils \
+        gcc \
+        git \
+        gpg \
+        gpg-agent \
+        libpcre3-dev \
+        libtool \
+        libpq-dev \
+        make \
+        python3-dev \
+        python3-pip \
+        python3-setuptools \
+        rsync \
+    && ln -s /usr/bin/python3 /usr/bin/python \
+    && curl -Lo /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 \
+    && chmod 555 /usr/local/bin/cfssl \
+    && python3 -m pip install -U pip \
+    && apt-get autoremove -yqq --purge \
+    && apt-get clean \
+    && useradd -u 1000 -g users -d /opt/promenade promenade \
+    && rm -rf /var/lib/apt/lists/*
+
+# Install LibYAML
+ENV LD_LIBRARY_PATH=/usr/local/lib
+
+ARG LIBYAML_VERSION=0.2.5
+RUN set -ex \
+    && git clone https://github.com/yaml/libyaml.git \
+    && cd libyaml \
+    && git checkout $LIBYAML_VERSION \
+    && ./bootstrap \
+    && ./configure \
+    && make \
+    && make install \
+    && cd .. \
+    && rm -fr libyaml
+
+COPY requirements-frozen.txt /opt/promenade
+RUN pip3 install --no-cache-dir -r requirements-frozen.txt
+
+# Setting promenade version for BPR
+ENV PBR_VERSION 0.9.0
+
+COPY . /opt/promenade
+RUN pip3 install --verbose --editable /opt/promenade \
+    && echo "/opt/promenade" \
+        > /usr/local/lib/python3.10/dist-packages/promenade.pth
+
+USER promenade
diff --git a/requirements-direct.txt b/requirements-direct.txt
index 6a49d6cb..e3f90f25 100644
--- a/requirements-direct.txt
+++ b/requirements-direct.txt
@@ -1,4 +1,4 @@
-Deckhand @ git+https://opendev.org/airship/deckhand.git@32e9950db405b5d1eb74da0c4e8df344a8638eff#egg=deckhand
+Deckhand @ git+https://opendev.org/airship/deckhand.git@be9f97b846b1edc6b74777e5e639aa9edce8cfa6#egg=deckhand
 Beaker
 click
 falcon
diff --git a/requirements-frozen.txt b/requirements-frozen.txt
index ec228624..1d60cf45 100644
--- a/requirements-frozen.txt
+++ b/requirements-frozen.txt
@@ -1,59 +1,56 @@
-alembic==1.13.1
+alembic==1.13.2
 amqp==5.2.0
-attrs==23.2.0
+attrs==24.2.0
 autopage==0.5.2
-backports.zoneinfo==0.2.1
 barbican==16.0.0
-bcrypt==4.1.2
-Beaker==1.12.1
-cachetools==5.3.2
-castellan==4.4.0
-certifi==2024.2.2
-cffi==1.16.0
+bcrypt==4.2.0
+Beaker==1.13.0
+cachetools==5.5.0
+castellan==5.1.1
+certifi==2024.8.30
+cffi==1.17.1
 charset-normalizer==3.3.2
 click==8.1.7
-cliff==4.6.0
+cliff==4.7.0
 cmd2==2.4.3
-cryptography==41.0.7
+cryptography==42.0.8
 debtcollector==3.0.0
-Deckhand @ git+https://opendev.org/airship/deckhand.git@fd58230f6e31ede4925bab0325105eb5b05ad1a8
+Deckhand @ git+https://opendev.org/airship/deckhand.git@be9f97b846b1edc6b74777e5e639aa9edce8cfa6
 decorator==5.1.1
-deepdiff==6.7.1
+deepdiff==8.0.1
 dnspython==2.6.1
-dogpile.cache==1.3.2
-eventlet==0.35.2
+dogpile.cache==1.3.3
+eventlet==0.37.0
 falcon==3.1.3
 fasteners==0.19
 fixtures==4.1.0
 futurist==3.0.0
-google-auth==2.28.1
-greenlet==3.0.3
+google-auth==2.34.0
+greenlet==3.1.0
 html5lib==0.9999999
 httpexceptor==1.4.0
-idna==3.6
-importlib-metadata==6.11.0
-importlib-resources==5.13.0
+idna==3.10
 iso8601==2.1.0
-Jinja2==3.1.3
+Jinja2==3.1.4
 jsonpath-ng==1.6.1
-jsonpickle==3.0.3
-jsonschema==4.21.1
+jsonpickle==3.3.0
+jsonschema==4.23.0
 jsonschema-specifications==2023.12.1
 keystoneauth1==5.1.2
 keystonemiddleware==10.2.0
-kombu==5.3.5
-kubernetes==29.0.0
+kombu==5.4.1
+kubernetes==30.1.0
 ldap3==2.9.1
 logutils==0.3.5
-Mako==1.3.2
+Mako==1.3.5
 MarkupSafe==2.1.5
-microversion-parse==1.0.1
-msgpack==1.0.7
-netaddr==1.2.1
+microversion-parse==2.0.0
+msgpack==1.1.0
+netaddr==1.3.0
 netifaces==0.11.0
-networkx==3.1
+networkx==3.3
 oauthlib==3.2.2
-ordered-set==4.1.0
+orderly-set==5.2.2
 os-service-types==1.7.0
 oslo.cache==3.3.1
 oslo.concurrency==5.1.1
@@ -71,67 +68,64 @@ oslo.service==3.1.1
 oslo.upgradecheck==2.1.1
 oslo.utils==6.1.0
 oslo.versionedobjects==3.1.0
-packaging==23.2
-Paste==3.7.1
+packaging==24.1
+Paste==3.10.1
 PasteDeploy==3.1.0
-PasteScript==3.4.0
-pbr==6.0.0
+PasteScript==3.6.0
+pbr==6.1.0
 pecan==1.5.1
-pip==23.2.1
-pkgutil_resolve_name==1.3.10
+pip==24.1
 ply==3.11
-prettytable==3.10.0
+prettytable==3.11.0
 prometheus_client==0.20.0
 psycopg2-binary==2.9.9
-pyasn1==0.5.1
-pyasn1-modules==0.3.0
+pyasn1==0.6.1
+pyasn1_modules==0.4.0
 pycadf==3.1.1
-pycparser==2.21
+pycparser==2.22
 pylibyaml==0.1.0
-pyOpenSSL==24.0.0
-pyparsing==3.1.1
-pyperclip==1.8.2
+pyOpenSSL==24.2.1
+pyparsing==3.1.4
+pyperclip==1.9.0
 python-barbicanclient==5.5.0
-python-dateutil==2.8.2
+python-dateutil==2.9.0.post0
 python-keystoneclient==5.1.0
 python-memcached==1.62
-python-mimeparse==1.6.0
-pytz==2024.1
-PyYAML==6.0.1
-referencing==0.33.0
+python-mimeparse==2.0.0
+pytz==2024.2
+PyYAML==6.0.2
+referencing==0.35.1
 repoze.lru==0.7
-requests==2.31.0
+requests==2.32.3
 requests-oauthlib==1.3.1
 resolver==0.2.1
-rfc3986==1.5.0
+rfc3986==2.0.0
 Routes==2.5.1
-rpds-py==0.18.0
+rpds-py==0.20.0
 rsa==4.9
 selector==0.10.1
-setuptools==68.2.2
-simplejson==3.19.2
+setuptools==70.1.0
+simplejson==3.19.3
 six==1.16.0
-SQLAlchemy==1.4.51
+SQLAlchemy==1.4.54
 sqlalchemy-migrate==0.13.0
-sqlparse==0.4.4
+sqlparse==0.5.1
 statsd==4.0.1
-stevedore==5.2.0
+stevedore==5.3.0
 Tempita==0.5.2
 testresources==2.0.1
 testscenarios==0.5.0
-testtools==2.7.1
+testtools==2.7.2
 tiddlyweb==2.4.3
-typing_extensions==4.9.0
-tzdata==2024.1
-urllib3==1.26.18
-uWSGI==2.0.24
+typing_extensions==4.12.2
+urllib3==2.2.2
+uWSGI==2.0.27
 vine==5.1.0
 wcwidth==0.2.13
-WebOb==1.8.7
-websocket-client==1.7.0
+WebOb==1.8.8
+websocket-client==1.8.0
 Werkzeug==2.2.3
-wheel==0.41.2
+wheel==0.43.0
 wrapt==1.16.0
 xattr==0.10.1
 yappi==1.6.0
-zipp==3.17.0
diff --git a/tox.ini b/tox.ini
index bd41e12b..176ad957 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = pep8,py38,docs
+envlist = pep8,py310,docs
 
 [testenv]
 basepython=python3
@@ -27,10 +27,10 @@ commands =
 [testenv:venv]
 commands = {posargs}
 
-[testenv:py38]
+[testenv:py310]
 allowlist_externals =
     pytest
-basepython=python3.8
+basepython=python3.10
 commands =
     pytest {posargs}
 
@@ -77,7 +77,7 @@ allowlist_externals=
   sh
 deps=
   -r{toxinidir}/requirements-direct.txt
-  -c https://raw.githubusercontent.com/apache/airflow/constraints-2.8.2/constraints-3.8.txt
+  -c https://raw.githubusercontent.com/apache/airflow/constraints-2.10.2/constraints-3.10.txt
 commands=
   rm -f requirements-frozen.txt
   sh -c "pip freeze --all | grep -vE 'promenade|pyinotify|pkg-resources' > requirements-frozen.txt"
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 37a4356b..9da07b09 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -14,30 +14,30 @@
 # limitations under the License.
 
 - job:
-    name: airship-promenade-openstack-tox-docs-focal
+    name: airship-promenade-openstack-tox-docs-jammy
     parent: openstack-tox-docs
-    description: Runs docs job on focal
-    nodeset: airship-promenade-single-node-focal
+    description: Runs docs job on jammy
+    nodeset: airship-promenade-single-node-jammy
 
 - job:
-    name: airship-promenade-openstack-tox-cover-focal
+    name: airship-promenade-openstack-tox-cover-jammy
     parent: openstack-tox-cover
-    description: Runs cover job on focal
-    nodeset: airship-promenade-single-node-focal
+    description: Runs cover job on jammy
+    nodeset: airship-promenade-single-node-jammy
     pre-run: tools/zuul/playbooks/install-deps.yaml
 
 - job:
-    name: airship-promenade-openstack-tox-py38-focal
-    parent: openstack-tox-py38
-    description: Runs cover job on focal
-    nodeset: airship-promenade-single-node-focal
+    name: airship-promenade-openstack-tox-py310-jammy
+    parent: openstack-tox-py310
+    description: Runs cover job on jammy
+    nodeset: airship-promenade-single-node-jammy
     pre-run: tools/zuul/playbooks/install-deps.yaml
 
 - job:
-    name: airship-promenade-openstack-tox-pep8-focal
+    name: airship-promenade-openstack-tox-pep8-jammy
     parent: openstack-tox-pep8
-    description: Runs pep8 job on focal
-    nodeset: airship-promenade-single-node-focal
+    description: Runs pep8 job on jammy
+    nodeset: airship-promenade-single-node-jammy
 
 - job:
     name: airship-promenade-genesis-containerd-gate
@@ -48,9 +48,9 @@
     required-projects:
       - openstack/openstack-helm-infra
     timeout: 9600
-    nodeset: airship-promenade-single-node-focal
+    nodeset: airship-promenade-single-node-jammy
     vars:
-      distro: ubuntu_focal
+      distro: ubuntu_jammy
 
 - job:
     name: airship-promenade-chart-build-gate
@@ -58,9 +58,9 @@
       Lints charts using pinned HTK
     run: tools/zuul/playbooks/helm-linter.yaml
     timeout: 900
-    nodeset: airship-promenade-single-node-focal
+    nodeset: airship-promenade-single-node-jammy
     vars:
-      HTK_COMMIT: 51c70e48dff173281a77d374d87af2c49caa6348
+      HTK_COMMIT: 43fd7143481b6ddda0dbd2f26bf6ec39a417b15b
 
 - job:
     name: airship-promenade-chart-build-gate-latest-htk
@@ -68,7 +68,7 @@
       Lints charts using latest HTK
     run: tools/zuul/playbooks/helm-linter.yaml
     timeout: 900
-    nodeset: airship-promenade-single-node-focal
+    nodeset: airship-promenade-single-node-jammy
     vars:
       HTK_COMMIT: master
 
@@ -79,19 +79,19 @@
     voting: true
     run: tools/zuul/playbooks/helm-linter.yaml
     timeout: 900
-    nodeset: airship-promenade-single-node-focal
+    nodeset: airship-promenade-single-node-jammy
     vars:
       HTK_COMMIT: master
 
 - job:
-    name: airship-promenade-docker-build-gate-ubuntu_focal
+    name: airship-promenade-docker-build-gate-ubuntu_jammy
     voting: true
     run: tools/zuul/playbooks/docker-image-build.yaml
     timeout: 3600
-    nodeset: airship-promenade-single-node-focal
+    nodeset: airship-promenade-single-node-jammy
     vars:
       publish: false
-      distro: ubuntu_focal
+      distro: ubuntu_jammy
       tags:
         dynamic:
           patch_set: true
@@ -102,23 +102,23 @@
       - ^tools/.*$
 
 - job:
-    name: airship-promenade-docker-publish_ubuntu_focal
+    name: airship-promenade-docker-publish_ubuntu_jammy
     voting: false
     run: tools/zuul/playbooks/docker-image-build.yaml
     timeout: 3600
-    nodeset: airship-promenade-single-node-focal
+    nodeset: airship-promenade-single-node-jammy
     secrets:
       - airship_promenade_quay_creds
     vars:
       publish: true
-      distro: ubuntu_focal
+      distro: ubuntu_jammy
       tags:
         dynamic:
           branch: true
           commit: true
         static:
           - latest
-          - airflow_2.8.2
+          - airflow_2.10.2
     irrelevant-files:
       - ^charts/.*$
       - ^etc/.*$
diff --git a/zuul.d/nodesets.yaml b/zuul.d/nodesets.yaml
index 713e69a2..c778c404 100644
--- a/zuul.d/nodesets.yaml
+++ b/zuul.d/nodesets.yaml
@@ -12,17 +12,12 @@
 # limitations under the License.
 
 - nodeset:
-    name: airship-promenade-single-node-focal
+    name: airship-promenade-single-node-jammy
     nodes:
       - name: primary
-        label: ubuntu-focal
+        label: ubuntu-jammy
     groups:
       - name: primary
         nodes:
           - primary
 
-- nodeset:
-    name: airship-promenade-single-node-bionic
-    nodes:
-      - name: primary
-        label: ubuntu-bionic
\ No newline at end of file
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index e4989d07..5512660f 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -22,29 +22,29 @@
       rtd_project_name: 'airship-promenade'
     check:
       jobs:
-        - airship-promenade-openstack-tox-cover-focal
-        - airship-promenade-openstack-tox-pep8-focal
-        - airship-promenade-openstack-tox-py38-focal
-        - airship-promenade-openstack-tox-docs-focal
-        - airship-promenade-docker-build-gate-ubuntu_focal
+        - airship-promenade-openstack-tox-cover-jammy
+        - airship-promenade-openstack-tox-pep8-jammy
+        - airship-promenade-openstack-tox-py310-jammy
+        - airship-promenade-openstack-tox-docs-jammy
+        - airship-promenade-docker-build-gate-ubuntu_jammy
         - airship-promenade-chart-build-gate
         - airship-promenade-chart-build-latest-htk
         - airship-promenade-genesis-containerd-gate
 
     gate:
       jobs:
-        - airship-promenade-openstack-tox-cover-focal
-        - airship-promenade-openstack-tox-pep8-focal
-        - airship-promenade-openstack-tox-py38-focal
-        - airship-promenade-openstack-tox-docs-focal
-        - airship-promenade-docker-build-gate-ubuntu_focal
+        - airship-promenade-openstack-tox-cover-jammy
+        - airship-promenade-openstack-tox-pep8-jammy
+        - airship-promenade-openstack-tox-py310-jammy
+        - airship-promenade-openstack-tox-docs-jammy
+        - airship-promenade-docker-build-gate-ubuntu_jammy
         - airship-promenade-chart-build-gate
         - airship-promenade-chart-build-latest-htk
         - airship-promenade-genesis-containerd-gate
         #- trigger-readthedocs-webhook
     post:
       jobs:
-        - airship-promenade-docker-publish_ubuntu_focal
+        - airship-promenade-docker-publish_ubuntu_jammy
         - promenade-upload-git-mirror
         #- trigger-readthedocs-webhook
     pre-release: