diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0302f602674a77a75e3305b20486cffe9d51d314..24465bc0e25c19f8350d497d54c68cb7c3cb52f4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,17 +8,48 @@
 #
 # You should have received a copy of the GNU General Public License along with the Webarchitects Apache Ansible role. If not, see <https://www.gnu.org/licenses/>.
 ---
-image: registry.git.coop/webarch/containers/images/ansible:0.23.0
 variables:
-  PY_COLORS: "1"
+  ANSIBLE_CALLBACK_RESULT_FORMAT: "yaml"
+  ANSIBLE_DISPLAY_SKIPPED_HOSTS: "0"
   ANSIBLE_FORCE_COLOR: "1"
+  ANSIBLE_REMOTE_TMP: "/tmp"
+  ANSIBLE_SHELL_ALLOW_WORLD_READABLE_TEMP: "1"
+  MOLECULE_VERBOSITY: "0"
+  PY_COLORS: "1"
 before_script:
-  - chmod 700 $(pwd)
+  - whoami
+  - pwd
+  - which ansible
+  - ansible --version
+  - which yamllint
+  - yamllint --version
+  - which molecule
+  - molecule --version
 stages:
-  - lint
-lint:
-  stage: lint
+  - trixie
+  - bookworm
+  # - bullseye
+  - jammy
+trixie:
+  image: registry.git.coop/webarch/containers/images/trixie:20230822
+  stage: trixie
+  script:
+    - molecule test --all
+bookworm:
+  image: registry.git.coop/webarch/containers/images/bookworm:20230822
+  stage: bookworm
+  script:
+    - molecule test --all
+# The Bullseye test run OK but Molecule never completes
+# https://github.com/ansible/molecule/discussions/4020
+# bullseye:
+#   image: registry.git.coop/webarch/containers/images/bullseye:20230822
+#   stage: bullseye
+#   script:
+#     - molecule test --all
+jammy:
+  image: registry.git.coop/webarch/containers/images/jammy:20230822
+  stage: jammy
   script:
-    - molecule lint
-# vim: syntax=yaml
+    - molecule test --all
 ...
diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e78a38fe432b03f170283ecc99ab86de91f3759a
--- /dev/null
+++ b/molecule/default/converge.yml
@@ -0,0 +1,38 @@
+# Copyright 2018-2023 Chris Croome
+#
+# This file is part of the Webarchitects Apache Ansible role.
+#
+# The Webarchitects Apache Ansible role is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+#
+# The Webarchitects Apache Ansible role is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with the Webarchitects Apache Ansible role. If not, see <https://www.gnu.org/licenses/>.
+---
+- name: Run as root
+  # become: true
+  connection: local
+  # gather_facts: true
+  hosts:
+    - localhost
+  vars:
+    ansible_python_interpreter: /usr/bin/python3
+  tasks:
+
+    - name: Debug ansible_effective_user_id
+      ansible.builtin.debug:
+        var: ansible_effective_user_id
+
+    - name: Debug ansible_user_id
+      ansible.builtin.debug:
+        var: ansible_user_id
+
+    - name: Debug ansible_user_dir
+      ansible.builtin.debug:
+        var: ansible_user_dir
+
+    - name: Include role as root
+      ansible.builtin.include_role:
+        name: "{{ lookup('ansible.builtin.env', 'CI_PROJECT_NAME') }}"
+      vars:  # noqa var-naming[no-role-prefix]
+        openproject: true
+...
diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml
index 612062e2a5e199cc2ec9478463167eb2b59ed9be..fb0b885a74f4b582e1d4887d750f5a46d934c98f 100644
--- a/molecule/default/molecule.yml
+++ b/molecule/default/molecule.yml
@@ -8,18 +8,14 @@
 #
 # You should have received a copy of the GNU General Public License along with the Webarchitects Apache Ansible role. If not, see <https://www.gnu.org/licenses/>.
 ---
-dependency:
+dependency: 
   name: galaxy
 platforms:
   - name: instance
-    image: registry.git.coop/webarch/containers/images/ansible:0.23.0
-    pre_build_image: true
 provisioner:
   name: ansible
-lint: |
-  set -e
-  find -type f -name '*.j2' -exec ansiblej2lint.py {} +
-  yamllint -f colored -c .yamllint .
-  ansible-lint -c .ansible-lint --force-color .
-# vim: syntax=yaml
+  options:
+    D: True
+verifier:
+  name: ansible
 ...
diff --git a/molecule/default/requirements.yml b/molecule/default/requirements.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5e352aa2fe75da22d3ea03f299a63d2b00319cde
--- /dev/null
+++ b/molecule/default/requirements.yml
@@ -0,0 +1,15 @@
+# Copyright 2018-2023 Chris Croome
+#
+# This file is part of the Webarchitects Apache Ansible role.
+#
+# The Webarchitects Apache Ansible role is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+#
+# The Webarchitects Apache Ansible role is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with the Webarchitects Apache Ansible role. If not, see <https://www.gnu.org/licenses/>.
+---
+- name: apt 
+  src: https://git.coop/webarch/apt.git
+  version: 3.0.2  # apt
+  scm: git
+...
diff --git a/molecule/default/verify.yml b/molecule/default/verify.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7a68dac5a0c680f03981f2a16d6e3bd10276a716
--- /dev/null
+++ b/molecule/default/verify.yml
@@ -0,0 +1,31 @@
+# Copyright 2018-2023 Chris Croome
+#
+# This file is part of the Webarchitects Apache Ansible role.
+#
+# The Webarchitects Apache Ansible role is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+#
+# The Webarchitects Apache Ansible role is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with the Webarchitects Apache Ansible role. If not, see <https://www.gnu.org/licenses/>.
+---
+
+- name: Verify as root
+  # become: true
+  connection: local
+  # gather_facts: true
+  hosts:
+    - localhost
+  vars:
+    ansible_python_interpreter: /usr/bin/python3
+  tasks:
+
+    - name: Check apache2ctl status
+      ansible.builtin.command: apache2ctl status
+      check_mode: false
+      changed_when: false
+      register: molecule_apache2ctl_status
+
+    - name: Debug apache2ctl status result
+      ansible.builtin.debug:
+        var: molecule_apache2ctl_status.stdout_lines
+...