diff --git a/defaults/main.yml b/defaults/main.yml
index 154d3302b5f918b507b5edbeab8788079384d134..e45c34971f1e7d90b9ff30f00e89f67571769663 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -6,7 +6,6 @@ php_versions:
   '8.1':
     state: present
     packages_absent:
-      - php8.1-apcu
       - libapache2-mod-php8.1
       - php8.1-phpdbg
     packages_present:
@@ -31,8 +30,84 @@ php_versions:
         state: absent
       cli:
         state: present
+        modules_disabled: []
+        modules_enabled:
+          - apcu
+          - bcmath
+          - bz2
+          - calendar
+          - ctype
+          - curl
+          - dom
+          - exif
+          - ffi
+          - fileinfo
+          - ftp
+          - gettext
+          - iconv
+          - imap
+          - intl
+          - ldap
+          - mbstring
+          - opcache
+          - pdo
+          - pdo_sqlite
+          - phar
+          - posix
+          - readline
+          - shmop
+          - simplexml
+          - sockets
+          - sqlite3
+          - sysvmsg
+          - sysvsem
+          - sysvshm
+          - tokenizer
+          - uploadprogress
+          - xml
+          - xmlreader
+          - xmlwriter
+          - xsl
       fpm:
         state: present
+        modules_disabled: []
+        modules_enabled:
+          - apcu
+          - bcmath
+          - bz2
+          - calendar
+          - ctype
+          - curl
+          - dom
+          - exif
+          - ffi
+          - fileinfo
+          - ftp
+          - gettext
+          - iconv
+          - imap
+          - intl
+          - ldap
+          - mbstring
+          - opcache
+          - pdo
+          - pdo_sqlite
+          - phar
+          - posix
+          - readline
+          - shmop
+          - simplexml
+          - sockets
+          - sqlite3
+          - sysvmsg
+          - sysvsem
+          - sysvshm
+          - tokenizer
+          - uploadprogress
+          - xml
+          - xmlreader
+          - xmlwriter
+          - xsl
       phpdbg:
         state: absent
   '8.0':
@@ -62,8 +137,82 @@ php_versions:
         state: absent
       cli:
         state: present
+        modules_disabled: []
+        modules_enabled:
+          - apcu
+          - bcmath
+          - bz2
+          - calendar
+          - ctype
+          - curl
+          - dom
+          - exif
+          - ffi
+          - fileinfo
+          - ftp
+          - gettext
+          - iconv
+          - imap
+          - intl
+          - ldap
+          - opcache
+          - pdo
+          - pdo_sqlite
+          - phar
+          - posix
+          - readline
+          - shmop
+          - simplexml
+          - sockets
+          - sqlite3
+          - sysvmsg
+          - sysvsem
+          - sysvshm
+          - tokenizer
+          - uploadprogress
+          - xml
+          - xmlreader
+          - xmlwriter
+          - xsl
       fpm:
         state: present
+        modules_disabled: []
+        modules_enabled:
+          - apcu
+          - bcmath
+          - bz2
+          - calendar
+          - ctype
+          - curl
+          - dom
+          - exif
+          - ffi
+          - fileinfo
+          - ftp
+          - gettext
+          - iconv
+          - imap
+          - intl
+          - ldap
+          - opcache
+          - pdo
+          - pdo_sqlite
+          - phar
+          - posix
+          - readline
+          - shmop
+          - simplexml
+          - sockets
+          - sqlite3
+          - sysvmsg
+          - sysvsem
+          - sysvshm
+          - tokenizer
+          - uploadprogress
+          - xml
+          - xmlreader
+          - xmlwriter
+          - xsl
       phpdbg:
         state: absent
   '7.4':
@@ -96,8 +245,108 @@ php_versions:
         state: absent
       cli:
         state: present
+        modules_disabled: []
+        modules_enabled:
+          - apcu
+          - apcu_bc
+          - bcmath
+          - bz2
+          - calendar
+          - ctype
+          - curl
+          - dom
+          - exif
+          - ffi
+          - fileinfo
+          - ftp
+          - gd
+          - geoip
+          - gettext
+          - gmp
+          - iconv
+          - imagick
+          - imap
+          - intl
+          - json
+          - ldap
+          - mbstring
+          - mysqli
+          - mysqlnd
+          - opcache
+          - pdo
+          - pdo_mysql
+          - pdo_sqlite
+          - phar
+          - posix
+          - readline
+          - shmop
+          - simplexml
+          - soap
+          - sockets
+          - sqlite3
+          - sysvmsg
+          - sysvsem
+          - sysvshm
+          - tokenizer
+          - uploadprogress
+          - xml
+          - xmlreader
+          - xmlrpc
+          - xmlwriter
+          - xsl
+          - zip
       fpm:
         state: present
+        modules_disabled: []
+        modules_enabled:
+          - apcu
+          - apcu_bc
+          - bcmath
+          - bz2
+          - calendar
+          - ctype
+          - curl
+          - dom
+          - exif
+          - ffi
+          - fileinfo
+          - ftp
+          - gd
+          - geoip
+          - gettext
+          - gmp
+          - iconv
+          - imagick
+          - imap
+          - intl
+          - json
+          - ldap
+          - mbstring
+          - mysqli
+          - mysqlnd
+          - opcache
+          - pdo
+          - pdo_mysql
+          - pdo_sqlite
+          - phar
+          - posix
+          - readline
+          - shmop
+          - simplexml
+          - soap
+          - sockets
+          - sqlite3
+          - sysvmsg
+          - sysvsem
+          - sysvshm
+          - tokenizer
+          - uploadprogress
+          - xml
+          - xmlreader
+          - xmlrpc
+          - xmlwriter
+          - xsl
+          - zip
       phpdbg:
         state: absent
   '7.3':
diff --git a/tasks/checks.yml b/tasks/checks.yml
index 8f19521ca97dc2429f078732935014ee7e97ea62..92d062dcafe406d5ec413a17d5bb8efcfc95e1eb 100644
--- a/tasks/checks.yml
+++ b/tasks/checks.yml
@@ -51,7 +51,7 @@
         var: php_versions_proposed
         verbosity: 2
 
-    - name: Check that for each proposed version of PHP there are not packages due to be absent and present at the same time
+    - name: Check that for each proposed version of PHP there are not packages due to be present and absent at the same time
       include_tasks: pkg_checks.yml
       loop: "{{ php_versions_proposed }}"
       loop_control:
@@ -99,13 +99,15 @@
         label: "{{ version }}"
       when: ( php_versions_absent is defined ) and ( php_versions_absent != [] )
 
-    # - name: Include SAPI checks for PHP proposed versions
-    #   include_tasks: sapi_checks.yml
-    #   loop: "{{ php_versions_proposed }}"
-    #   loop_control:
-    #     loop_var: version
-    #     label: "{{ version }}"
-    #   when: ( php_versions_proposed is defined ) and ( php_versions_proposed != [] )
+    - name: Include SAPI checks for PHP proposed versions
+      include_tasks: sapi_checks.yml
+      loop: "{{ php_versions_proposed }}"
+      loop_control:
+        loop_var: version
+        label: "{{ version }}"
+      when:
+        - ( php_versions[version].sapis is defined )
+        - ( php_versions_proposed is defined ) and ( php_versions_proposed != [] )
 
     # - name: Debug fail
     #   fail:
diff --git a/tasks/sapi_checks.yml b/tasks/sapi_checks.yml
index 61f634600e191fa4e38d54d896b1e89c4126f746..2d934fe55650ea859a8f8e7f9947ad1f9c51ad9c 100644
--- a/tasks/sapi_checks.yml
+++ b/tasks/sapi_checks.yml
@@ -11,82 +11,17 @@
       loop_control:
         loop_var: sapi
         label: "{{ sapi.key }}"
-      when: php_versions[version].sapis is defined
 
-#    - name: "Include PHP {{ version }} SAPI state checks"
-#      include_tasks: sapi_state_checks.yml
-#      loop: "{{ php_versions[version].sapis | dict2items }}"
-#      loop_control:
-#        loop_var: sapi
-#        label: "{{ sapi.key }}"
-#      when:
-#        - php_versions[version].sapis is defined
-    #     - php_versions[version].sapis.sapi is defined
-    #     - php_versions[version].sapis.sapi.state is defined
-
-    # - name: "Debug PHP {{ version }} SAPI state"
-    #   debug:
-    #     var: sapi.value.state
-    #     verbosity: 2
-    #   loop: "{{ php_versions[version].sapis | dict2items }}"
-    #   loop_control:
-    #     loop_var: sapi
-    #     label: "{{ sapi.key }}"
-    #   when:
-    #     - php_versions[version].sapis is defined
-    #     - php_versions[version].sapis.sapi is defined
-    #     - php_versions[version].sapis.sapi.state is defined
-
-    # - name: "Check that no SAPI is set to be present when PHP {{ version }} is set to be removed"
-    #   assert:
-    #     that:
-    #       - sapi.value.state != "present"
-    #   loop: "{{ php_versions[version].sapis | dict2items }}"
-    #   loop_control:
-    #     loop_var: sapi
-    #     label: "{{ sapi.key }}"
-    #   when:
-    #     - php_versions[version].sapis is defined
-    #     - php_versions[version].sapis.sapi is defined
-    #     - php_versions[version].sapis.sapi.state is defined
-
-    # - name: Fail
-    #   fail:
-
-    # - name: "Debug existing SAPIs for PHP {{ version }}"
-    #   debug:
-    #     var: ansible_local.phpquery.versions[version].sapis
-    #     verbosity: 3
-    #   when: ansible_local.phpquery.versions[version].sapis is defined
-
-    # - name: "Set an array for the existing SAPIs for PHP {{ version }}"
-    #   set_fact:
-    #     php_existing_sapis: "{{ php_existing_sapis | default([]) }} + [ '{{ existing_sapi.key }}' ]"
-    #   when:
-    #     - ansible_local.phpquery.versions[version].sapis is defined
-    #     - existing_sapi.value.state == "present"
-    #   loop: "{{ ansible_local.phpquery.versions[version].sapis | dict2items }}"
-    #   loop_control:
-    #     loop_var: existing_sapi
-    #     label: "{{ existing_sapi.key }}"
-
-    # - name: "Debug existing SAPIs for PHP {{ version }}"
-    #   debug:
-    #     var: php_existing_sapis
-
-    # - name: Generate an array of proposed PHP SAPIs
-    #   set_fact:
-    #     php_proposed_sapis: "{{ php_proposed_sapis | default([]) }} + [ '{{ proposed_sapi.key }}' ]"
-    #   when: ( proposed_sapi.value.state is defined ) and ( proposed_sapi.value.state == "present" )
-    #   loop: "{{ sapis }}"
-    #   loop_control:
-    #     loop_var: proposed_sapi
-    #     label: "{{ proposed_sapi.key }}"
-
-    # - name: Debug proposed PHP SAPIs
-    #   debug:
-    #     var: php_proposed_sapis
-    #   when: php_proposed_sapis is defined
+    - name: "Check that no SAPI modules are set to be enabled and disabled at the same time for PHP {{ version }}"
+      include_tasks: sapi_module_checks.yml
+      loop: "{{ php_versions[version].sapis | dict2items }}"
+      loop_control:
+        loop_var: sapi
+        label: "{{ sapi.key }}"
+      when:
+        - ( sapi.value.state is defined ) and ( sapi.value.state == "present" )
+        - ( sapi.value.modules_enabled is defined ) and ( sapi.value.modules_enabled != [] )
+        - ( sapi.value.modules_disabled is defined ) and ( sapi.value.modules_disabled != [] )
 
   tags:
     - php
diff --git a/tasks/sapi_module_checks.yml b/tasks/sapi_module_checks.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0bf56f4949a64ccedbe287af6414019c7535b445
--- /dev/null
+++ b/tasks/sapi_module_checks.yml
@@ -0,0 +1,19 @@
+---
+- name: Check that no SAPI modules are set to be enabled and disabled at the same time
+  block:
+
+    - name: "Loop through the modules_enabled for SAPI {{ sapi.key }} for PHP {{ version }} to check that none are also set to be disabled"
+      assert:
+        that:
+          - mod not in sapi.value.modules_disabled
+      loop: "{{ sapi.value.modules_enabled }}"
+      loop_control:
+        loop_var: mod
+        label: "{{ mod }}"
+      when:
+        - ( sapi.value.modules_enabled is defined ) and ( sapi.value.modules_enabled != [] )
+        - ( sapi.value.modules_disabled is defined ) and ( sapi.value.modules_disabled != [] )
+
+  tags:
+    - php
+...