diff --git a/.ansible-lint b/.ansible-lint
index 67136a0371f56022170446945fb1ffc8b5854bfd..28fc3ac24fc2f4f95996e327b2547025425bcf35 100644
--- a/.ansible-lint
+++ b/.ansible-lint
@@ -7,7 +7,6 @@ exclude_paths:
   - .tox/
   - .venv/
   - .yamllint
-  - molecule/
   - tests/azure/
   - meta/runtime.yml
   - requirements-docker.yml
diff --git a/tests/azure/azure-pipelines.yml b/infra/azure/azure-pipelines.yml
similarity index 64%
rename from tests/azure/azure-pipelines.yml
rename to infra/azure/azure-pipelines.yml
index ab28bb1108453eaa3ab0b193b24855b9ec36a8ab..7456b62eb4b8eb79da26553d08b6989cafdb9354 100644
--- a/tests/azure/azure-pipelines.yml
+++ b/infra/azure/azure-pipelines.yml
@@ -15,8 +15,9 @@ stages:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
+      distro: fedora-latest
       ansible_version: "-core"
+      skip_git_test: true
 
 # Fedora
 
@@ -26,8 +27,9 @@ stages:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core <2.14"
+      distro: fedora-latest
+      ansible_version: "-core <2.16"
+      skip_git_test: true
 
 # Fedora
 
@@ -37,19 +39,22 @@ stages:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.14,<2.15"
+      distro: fedora-latest
+      skip_git_test: true
+      ansible_version: "-core >=2.16,<2.17"
 
 # Galaxy on Fedora
 
 - stage: Galaxy_Fedora_Latest
   dependsOn: []
   jobs:
-  - template: templates/galaxy_tests.yml
+  - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.14,<2.15"
+      distro: fedora-latest
+      ansible_version: "-core >=2.16,<2.17"
+      skip_git_test: true
+      test_galaxy: true
 
 # CentOS 9 Stream
 
@@ -59,8 +64,9 @@ stages:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
-      scenario: c9s
-      ansible_version: "-core >=2.14,<2.15"
+      distro: c9s
+      ansible_version: "-core >=2.16,<2.17"
+      skip_git_test: true
 
 # CentOS 8 Stream
 
@@ -70,16 +76,6 @@ stages:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
-      scenario: c8s
-      ansible_version: "-core >=2.14,<2.15"
-
-# CentOS 7
-
-- stage: CentOS_7
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: centos-7
-      ansible_version: "-core >=2.14,<2.15"
+      distro: c8s
+      ansible_version: "-core <2.17"
+      skip_git_test: true
diff --git a/tests/azure/build-containers.yml b/infra/azure/build-containers.yml
similarity index 78%
rename from tests/azure/build-containers.yml
rename to infra/azure/build-containers.yml
index 75c3853909d2fefd13cf40a15703d412d560b377..a98b2e1100580848f9172c211dd320df86f473ea 100644
--- a/tests/azure/build-containers.yml
+++ b/infra/azure/build-containers.yml
@@ -11,20 +11,10 @@ schedules:
 trigger: none
 
 pool:
-  vmImage: 'ubuntu-22.04'
+  vmImage: 'ubuntu-24.04'
 
 stages:
 
-# Currently, it's not possible to use CentOS container
-#
-# - stage: CentOS_7
-#   dependsOn: []
-#   jobs:
-#   - template: templates/build_container.yml
-#     parameters:
-#       job_name_suffix: Centos7
-#       distro: centos-7
-
 - stage: CentOS_8_Stream
   dependsOn: []
   jobs:
@@ -43,6 +33,14 @@ stages:
       job_name_suffix: C9S
       distro: c9s
 
+- stage: CentOS_10_Stream
+  dependsOn: []
+  jobs:
+  - template: templates/build_container.yml
+    parameters:
+      job_name_suffix: C10S
+      distro: c10s
+
 - stage: Fedora_Latest
   dependsOn: []
   jobs:
diff --git a/infra/azure/nightly.yml b/infra/azure/nightly.yml
new file mode 100644
index 0000000000000000000000000000000000000000..671571a04a14d41428cbe21d41047ae9568201f3
--- /dev/null
+++ b/infra/azure/nightly.yml
@@ -0,0 +1,126 @@
+---
+schedules:
+- cron: "0 19 * * *"
+  displayName: Nightly Builds
+  branches:
+    include:
+    - master
+  always: true
+
+trigger: none
+
+pool:
+  vmImage: 'ubuntu-20.04'
+
+stages:
+
+# Fedora
+
+- stage: fedora_latest_Ansible_Core_2_15
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: fedora-latest
+      ansible_version: "-core >=2.15,<2.16"
+      skip_git_test: true
+
+- stage: fedora_latest_Ansible_Core_2_16
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: fedora-latest
+      ansible_version: ""
+      skip_git_test: true
+
+- stage: fedora_latest_Ansible_Core_2_17
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: fedora-latest
+      ansible_version: "-core >=2.17"
+      skip_git_test: true
+
+# Galaxy on Fedora
+
+- stage: Galaxy_fedora_latest_Ansible_Core_2_17
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: fedora-latest
+      ansible_version: "-core >=2.17,<2.18"
+      skip_git_test: true
+      test_galaxy: true
+
+# Fedora Rawhide
+
+- stage: fedora_rawhide_Ansible_Core_2_17
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: fedora-rawhide
+      ansible_version: "-core >=2.17,<2.18"
+      skip_git_test: true
+
+# CentoOS 9 Stream
+
+- stage: c9s_Ansible_Core_2_15
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: c9s
+      ansible_version: "-core >=2.15,<2.16"
+      skip_git_test: true
+
+- stage: c9s_Ansible_Core_2_16
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: c9s
+      ansible_version: "-core >=2.16,<2.17"
+      skip_git_test: true
+
+- stage: c9s_Ansible_Core_2_17
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: c9s
+      ansible_version: "-core >=2.17,<2.18"
+      skip_git_test: true
+
+# CentOS 8 Stream only works up to ansible-core 2.16.z
+
+- stage: c8s_Ansible_Core_2_15
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: c8s
+      ansible_version: "-core >=2.15,<2.16"
+      skip_git_test: true
+
+- stage: c8s_Ansible_Core_2_16
+  dependsOn: []
+  jobs:
+  - template: templates/group_tests.yml
+    parameters:
+      build_number: $(Build.BuildNumber)
+      distro: c8s
+      ansible_version: "-core >=2.16,<2.17"
+      skip_git_test: true
diff --git a/tests/azure/pr-pipeline.yml b/infra/azure/pr-pipeline.yml
similarity index 64%
rename from tests/azure/pr-pipeline.yml
rename to infra/azure/pr-pipeline.yml
index 40d78a9b10429cf19d14d8d7c79a4bffa6cae15d..bc6e0830b8b678a421c9b3380ff073cdbb864580 100644
--- a/tests/azure/pr-pipeline.yml
+++ b/infra/azure/pr-pipeline.yml
@@ -12,67 +12,58 @@ stages:
 - stage: Fedora_Latest
   dependsOn: []
   jobs:
-  - template: templates/fast_tests.yml
+  - template: templates/run_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
       ansible_version: "-core >=2.15,<2.16"
+      skip_git_test: false
 
 # Galaxy on Fedora
 
 - stage: Galaxy_Fedora_Latest
   dependsOn: []
   jobs:
-  - template: templates/fast_tests.yml
+  - template: templates/run_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
       ansible_version: "-core >=2.15,<2.16"
+      skip_git_test: false
+      test_galaxy: true
 
 # CentOS 9 Stream
 
 - stage: CentOS_9_Stream
   dependsOn: []
   jobs:
-  - template: templates/fast_tests.yml
+  - template: templates/run_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: c9s
       ansible_version: "-core >=2.15,<2.16"
+      skip_git_test: false
 
 # CentOS 8 Stream
 
 - stage: CentOS_8_Stream
   dependsOn: []
   jobs:
-  - template: templates/fast_tests.yml
+  - template: templates/run_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: c8s
       ansible_version: "-core >=2.15,<2.16"
-      target_python: "/usr/libexec/platform-python"
-
-# CentOS 7 cannot be used with current systemd
-#
-# CentOS 7
-#
-# - stage: CentOS_7
-#   dependsOn: []
-#   jobs:
-#   - template: templates/fast_tests.yml
-#     parameters:
-#       build_number: $(Build.BuildNumber)
-#       distro: centos-7
-#       ansible_version: "-core >=2.15,<2.16"
-#       target_python: "/usr/bin/python2"
+      skip_git_test: false
 
 # Rawhide
 
 - stage: Fedora_Rawhide
   dependsOn: []
   jobs:
-  - template: templates/fast_tests.yml
+  - template: templates/run_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-rawhide
       ansible_version: "-core >=2.15,<2.16"
+      skip_git_test: false
diff --git a/tests/azure/templates/build_container.yml b/infra/azure/templates/build_container.yml
similarity index 86%
rename from tests/azure/templates/build_container.yml
rename to infra/azure/templates/build_container.yml
index f93881ce2f73d713df3b72f8fd12c8794c16368a..49d2f7310897dc8968fa400518bf49c8f30d41b8 100644
--- a/tests/azure/templates/build_container.yml
+++ b/infra/azure/templates/build_container.yml
@@ -22,18 +22,15 @@ jobs:
     retryCountOnTaskFailure: 5
     displayName: Install tools
 
-  - script: |
-      rm -rf ~/.ansible
-      mkdir -p ~/.ansible
-      ln -snf $(readlink -f roles) ~/.ansible/roles
-      ln -snf $(readlink -f plugins) ~/.ansible/plugins
-    displayName: Setup ansible-freeipa using Git repository
-
   - script: ansible-galaxy collection install containers.podman
     displayName: Install Ansible Galaxy collections
 
   - script: infra/image/build.sh -s ${{ parameters.distro }}
     displayName: Build ${{ parameters.distro }} base image
+    env:
+      ANSIBLE_ROLES_PATH: "${PWD}/roles"
+      ANSIBLE_LIBRARY: "${PWD}/plugins/modules"
+      ANSIBLE_MODULE_UTILS: "${PWD}/plugins/module_utils"
 
   - script: podman login -u="$QUAY_ROBOT_USERNAME" -p="$QUAY_ROBOT_TOKEN" quay.io
     displayName: Registry login
diff --git a/infra/azure/templates/group_tests.yml b/infra/azure/templates/group_tests.yml
new file mode 100644
index 0000000000000000000000000000000000000000..da18c2e3fbd4cdffb49faf1c91b9eeb3b157989e
--- /dev/null
+++ b/infra/azure/templates/group_tests.yml
@@ -0,0 +1,30 @@
+---
+parameters:
+  - name: distro
+    type: string
+    default: fedora-latest
+  - name: build_number
+    type: string
+  - name: ansible_version
+    type: string
+    default: ""
+  - name: skip_git_test
+    type: boolean
+    default: false
+  - name: test_galaxy
+    type: boolean
+    default: false
+
+jobs:
+
+- ${{ each group in split('1,2,3', ',') }}:
+  - template: run_tests.yml
+    parameters:
+      group_number: ${{ group }}
+      number_of_groups: 3
+      build_number: ${{ parameters.build_number }}
+      distro: ${{ parameters.distro }}
+      ansible_version: ${{ parameters.ansible_version }}
+      python_version: '< 3.12'
+      skip_git_test: ${{ parameters.skip_git_test }}
+      test_galaxy: ${{ parameters.test_galaxy }}
diff --git a/infra/azure/templates/prepare_environment.yaml b/infra/azure/templates/prepare_environment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..077d40528e13dd7659ea45fe92913ab6ff7870a6
--- /dev/null
+++ b/infra/azure/templates/prepare_environment.yaml
@@ -0,0 +1,30 @@
+---
+parameters:
+  - name: distro
+    type: string
+    default: fedora-latest
+  - name: ansible_version
+    type: string
+    default: ""
+  - name: python_version
+    type: string
+    default: 3.x
+  - name: build_number
+    type: string
+
+steps:
+  - task: UsePythonVersion@0
+    inputs:
+      versionSpec: '${{ parameters.python_version }}'
+
+  - script: |
+      pip install "ansible${{ parameters.ansible_version }}" -r requirements-tests.txt
+    retryCountOnTaskFailure: 5
+    displayName: Install test dependencies
+
+  - script: ansible-galaxy collection install -r requirements-podman.yml
+    retryCountOnTaskFailure: 5
+    displayName: Install Ansible collections
+
+  - script: infra/image/start.sh ${{ parameters.distro }}-server
+    displayName: Setup target container for ${{ parameters.distro }}
diff --git a/infra/azure/templates/run_tests.yml b/infra/azure/templates/run_tests.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1cc00030bf597ebf39ee03b1916ce7ae99b656c2
--- /dev/null
+++ b/infra/azure/templates/run_tests.yml
@@ -0,0 +1,98 @@
+---
+parameters:
+  - name: group_number
+    type: number
+    default: 1
+  - name: number_of_groups
+    type: number
+    default: 1
+  - name: distro
+    type: string
+    default: fedora-latest
+  - name: ansible_version
+    type: string
+    default: ""
+  - name: python_version
+    type: string
+    default: 3.x
+  - name: build_number
+    type: string
+  - name: skip_git_test
+    type: boolean
+    default: true
+  - name: test_type
+    type: string
+    default: "playbook"
+  - name: test_galaxy
+    type: boolean
+    default: false
+
+jobs:
+- job: Test_Group${{ parameters.group_number }}
+  displayName: Run playbook tests ${{ parameters.distro }} (${{ parameters.group_number }}/${{ parameters.number_of_groups }})
+  timeoutInMinutes: 360
+  variables:
+  - template: variables.yaml
+  - template: variables_${{ parameters.distro }}.yaml
+  steps:
+  - template: prepare_environment.yaml
+    parameters:
+      build_number: ${{ parameters.build_number }}
+      distro: ${{ parameters.distro }}
+      ansible_version: ${{ parameters.ansible_version }}
+      python_version: ${{ parameters.python_version }}
+
+  - bash: echo "##vso[task.setvariable variable=TOPDIR]${PWD}"
+    displayName: Set repo rootdir
+
+  - script: |
+      . "${TOPDIR}/utils/set_test_modules"
+      python3 utils/check_test_configuration.py ${{ parameters.distro }}
+    displayName: Check test configuration
+    env:
+       SKIP_GIT_TEST: ${{ parameters.skip_git_test }}
+
+  - script: |
+      git fetch --unshallow
+      utils/build-galaxy-release.sh -i
+    retryCountOnTaskFailure: 5
+    displayName: Build Galaxy release
+    condition: ${{ parameters.test_galaxy }}
+
+  - script: |
+      echo "PWD: ${PWD}"
+      echo "TOPDIR: ${TOPDIR}"
+      echo "ROLES: ${ANSIBLE_ROLES_PATH}"
+      echo "LIBRARY: ${ANSIBLE_LIBRARY}"
+      echo "MODULE_UTILS: ${ANSIBLE_MODULE_UTILS}"
+      . "${TOPDIR}/utils/set_test_modules"
+      [ "${{ parameters.test_galaxy }}" == "True"  ] && cd ~/.ansible/collections/ansible_collections/freeipa/ansible_freeipa
+      pytest \
+          -m "${{ parameters.test_type }}" \
+          --verbose \
+          --color=yes \
+          --splits=${{ parameters.number_of_groups }} \
+          --group=${{ parameters.group_number }} \
+          --randomly-seed=$(date "+%Y%m%d") \
+          --suppress-no-test-exit-code \
+          --junit-xml=TEST-results-pr-check.xml
+    displayName: Run playbook tests
+    env:
+      SKIP_GIT_TEST: ${{ parameters.skip_git_test }}
+      ${{ if not(parameters.test_galaxy)  }}:
+        ANSIBLE_ROLES_PATH: "${PWD}/roles"
+        ANSIBLE_LIBRARY: "${PWD}/plugins"
+        ANSIBLE_MODULE_UTILS: "${PWD}/plugins/module_utils"
+      IPA_SERVER_HOST: ansible-freeipa-tests
+      RUN_TESTS_IN_DOCKER: podman
+      IPA_DISABLED_MODULES: ${{ variables.ipa_disabled_modules }}
+      IPA_DISABLED_TESTS: ${{ variables.ipa_disabled_tests }}
+      IPA_ENABLED_MODULES: ${{ variables.ipa_enabled_modules }}
+      IPA_ENABLED_TESTS: ${{ variables.ipa_enabled_tests }}
+      IPA_VERBOSITY: "-vvv"
+
+  - task: PublishTestResults@2
+    inputs:
+      mergeTestResults: true
+      testRunTitle: PlaybookTests-Build${{ parameters.build_number }}
+    condition: succeededOrFailed()
diff --git a/tests/azure/templates/variables.yaml b/infra/azure/templates/variables.yaml
similarity index 100%
rename from tests/azure/templates/variables.yaml
rename to infra/azure/templates/variables.yaml
diff --git a/tests/azure/templates/variables_c8s.yaml b/infra/azure/templates/variables_c8s.yaml
similarity index 100%
rename from tests/azure/templates/variables_c8s.yaml
rename to infra/azure/templates/variables_c8s.yaml
diff --git a/tests/azure/templates/variables_c9s.yaml b/infra/azure/templates/variables_c9s.yaml
similarity index 100%
rename from tests/azure/templates/variables_c9s.yaml
rename to infra/azure/templates/variables_c9s.yaml
diff --git a/tests/azure/templates/variables_centos-7.yaml b/infra/azure/templates/variables_centos-7.yaml
similarity index 100%
rename from tests/azure/templates/variables_centos-7.yaml
rename to infra/azure/templates/variables_centos-7.yaml
diff --git a/tests/azure/templates/variables_fedora-latest.yaml b/infra/azure/templates/variables_fedora-latest.yaml
similarity index 100%
rename from tests/azure/templates/variables_fedora-latest.yaml
rename to infra/azure/templates/variables_fedora-latest.yaml
diff --git a/tests/azure/templates/variables_fedora-rawhide.yaml b/infra/azure/templates/variables_fedora-rawhide.yaml
similarity index 100%
rename from tests/azure/templates/variables_fedora-rawhide.yaml
rename to infra/azure/templates/variables_fedora-rawhide.yaml
diff --git a/infra/image/build.sh b/infra/image/build.sh
index 6da8179191b519aad1bda828b347b428bdb3c6b1..8a2491c881a8afb6a8188d8a2b787459b604cb0f 100755
--- a/infra/image/build.sh
+++ b/infra/image/build.sh
@@ -15,7 +15,7 @@ valid_distro() {
 usage() {
     local prog="${0##*/}"
     cat << EOF
-usage: ${prog} [-h] [-s] distro
+usage: ${prog} [-h] [-p] [-c HOSTNAME] [-s] distro
     ${prog} build a container image to test ansible-freeipa.
 EOF
 }
@@ -29,23 +29,26 @@ positional arguments:
 
 optional arguments:
 
-    -s  Deploy IPA server
-
+    -c HOSTNAME   Container hostname
+    -p            Give extended privileges to the container
+    -s            Deploy IPA server
 EOF
 }
 
 name="ansible-freeipa-image-builder"
 hostname="ipaserver.test.local"
-# Number of cpus is not available in usptream CI (Ubuntu 22.04).
-# cpus="2"
+cpus="2"
 memory="3g"
 quayname="quay.io/ansible-freeipa/upstream-tests"
 deploy_server="N"
+privileged=""
 
-while getopts ":hs" option
+while getopts ":hc:ps" option
 do
     case "${option}" in
         h) help && exit 0 ;;
+        c) hostname="${OPTARG}" ;;
+        p) privileged="privileged" ;;
         s) deploy_server="Y" ;;
         *) die -u "Invalid option: ${option}" ;;
     esac
@@ -82,13 +85,28 @@ container_remove_image_if_exists "${tag}"
     container_remove_image_if_exists "${server_tag}"
 
 container_build "${tag}" "${BASEDIR}/dockerfile/${distro}" "${BASEDIR}"
-container_create "${name}" "${tag}" "${hostname}" "${memory}"
+container_create "${name}" "${tag}" \
+    "hostname=${hostname}" \
+    "memory=${memory}" \
+    "cpus=${cpus}" \
+    "${privileged}"
 container_commit "${name}" "${quayname}:${tag}"
 
 if [ "${deploy_server}" == "Y" ]
 then
     deployed=false
 
+    # Set path to ansible-freeipa roles
+    [ -z "${ANSIBLE_ROLES_PATH:-""}" ] && export ANSIBLE_ROLES_PATH="${TOPDIR}/roles"
+
+    # Install collection containers.podman if not available
+    if [ -z "$(ansible-galaxy collection list containers.podman)" ]
+    then
+        tmpdir="$(mktemp -d)"
+        export ANSIBLE_COLLECTIONS_PATH="${tmpdir}"
+        ansible-galaxy collection install -p "${tmpdir}" containers.podman
+    fi
+
     [ "${container_state}" != "running" ] && container_start "${name}"
 
     container_wait_for_journald "${name}"
diff --git a/infra/image/shcontainer b/infra/image/shcontainer
index 6f4e8a85272b91c51394cc3f222c23c0e3ebdd59..0bc3326acc03ba6d246c4a9c77d5f10b1e8c7f36 100644
--- a/infra/image/shcontainer
+++ b/infra/image/shcontainer
@@ -9,24 +9,35 @@ TOPDIR="$(readlink -f "${SCRIPTDIR}/../..")"
 container_create() {
     local name=${1}
     local image=${2}
-    local hostname=${3}
-    local memory=${4:-"3g"}
-    local cpus=${5:-"2"}
+    shift 2
+    declare -a extra_opts=()
+    for opt in "$@"
+    do
+        [ -z "${opt}" ] && continue
+        case "${opt}" in
+            hostname=*) extra_opts+=("--${opt}") ;;
+            cpus=*) extra_opts+=("--${opt}") ;;
+            memory=*) extra_opts+=("--${opt}") ;;
+            privileged) extra_opts+=("--${opt}") ;;
+            *) log error "container_create: Invalid option: ${opt}" ;;
+        esac
+    done
 
-    [ -n "${hostname}" ] || die "No hostname given"
+    # ensure default values are set
+    [[ " ${extra_opts[*]} " =~ " --cpus=" ]] || extra_opts+=("--cpus=2")
+    [[ " ${extra_opts[*]} " =~ " --hostname=" ]] \
+        || extra_opts+=("--hostname=ipaserver.test.local")
 
     log info "= Creating ${name} ="
     podman create \
            --security-opt label=disable \
-           --name "${name}" \
-           --hostname "${hostname}" \
            --network bridge:interface_name=eth0 \
            --systemd true \
-           --cpus "${cpus}" \
-           --memory "${memory}" \
+           --name "${name}" \
            --memory-swap -1 \
            --no-hosts \
            --replace \
+           "${extra_opts[@]}" \
            "${image}"
     echo
 }
diff --git a/infra/image/start.sh b/infra/image/start.sh
index c5a7a342863cd882f62d3b6dca313568b8ce7606..0f17189d363c3e46dcbc9d5882f6de8a689c49cf 100755
--- a/infra/image/start.sh
+++ b/infra/image/start.sh
@@ -11,7 +11,7 @@ TOPDIR="$(readlink -f "${BASEDIR}/../..")"
 usage() {
     local prog="${0##*/}"
     cat << EOF
-usage: ${prog} [-h] [-l] image
+usage: ${prog} [-h] [-l] [-n HOSTNAME ] image
     ${prog} start a prebuilt ansible-freeipa test container image.
 EOF
 }
@@ -24,7 +24,14 @@ positional arguments:
 
 optional arguments:
 
-    -l    Try to use local image first, if not found download.
+    -h            Show this message
+    -l            Try to use local image first, if not found download.
+    -n HOSTNAME   Set container hostname
+
+NOTE:
+    - The hostname must be the same as the hostname of the container
+      when FreeIPA was deployed. Use only if you built the image and
+      defined its hostname.
 
 EOF
 }
@@ -45,11 +52,12 @@ name="ansible-freeipa-tests"
 hostname="ipaserver.test.local"
 try_local_first="N"
 
-while getopts ":hl" option
+while getopts ":hln:" option
 do
     case "${option}" in
         h) help && exit 0 ;;
         l) try_local_first="Y" ;;
+        n) hostname="${OPTARG}" ;;
         *) die -u "Invalid option: ${option}" ;;
     esac
 done
@@ -79,7 +87,7 @@ fi
 
 [ -z "${local_image}" ] && die "Image '${image}' is not valid"
 
-container_create "${name}" "${local_image}" "${hostname}"
+container_create "${name}" "${local_image}" "hostname=${hostname}"
 container_start "${name}"
 container_wait_for_journald "${name}"
 container_wait_up "${name}"
diff --git a/molecule/c8s-build/Dockerfile b/molecule/c8s-build/Dockerfile
deleted file mode 100644
index 7bdc1764715ddabb87fb0bdbb13204ad72144cdc..0000000000000000000000000000000000000000
--- a/molecule/c8s-build/Dockerfile
+++ /dev/null
@@ -1,30 +0,0 @@
-FROM quay.io/centos/centos:stream8
-ENV container=docker
-
-RUN rm -fv /var/cache/dnf/metadata_lock.pid; \
-dnf makecache; \
-dnf --assumeyes install \
-    /usr/bin/python3 \
-    /usr/bin/python3-config \
-    /usr/bin/dnf-3 \
-    sudo \
-    bash \
-    systemd \
-    procps-ng \
-    iproute && \
-dnf clean all; \
-(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
-rm -f /lib/systemd/system/multi-user.target.wants/*;\
-rm -f /etc/systemd/system/*.wants/*;\
-rm -f /lib/systemd/system/local-fs.target.wants/*; \
-rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
-rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
-rm -f /lib/systemd/system/basic.target.wants/*;\
-rm -f /lib/systemd/system/anaconda.target.wants/*; \
-rm -rf /var/cache/dnf/;
-
-STOPSIGNAL RTMIN+3
-
-VOLUME ["/sys/fs/cgroup"]
-
-CMD ["/usr/sbin/init"]
diff --git a/molecule/c8s-build/molecule.yml b/molecule/c8s-build/molecule.yml
deleted file mode 100644
index 8855215190e13f2f6f7b535385cc07b4284d46e9..0000000000000000000000000000000000000000
--- a/molecule/c8s-build/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: c8s-build
-    image: "quay.io/centos/centos:stream8"
-    dockerfile: Dockerfile
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 8.8.8.8
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare-build.yml
-prerun: false
diff --git a/molecule/c8s/molecule.yml b/molecule/c8s/molecule.yml
deleted file mode 100644
index 79f35c547a21e4ff869e66f1c17d054b3b39d9d6..0000000000000000000000000000000000000000
--- a/molecule/c8s/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: c8s
-    image: quay.io/ansible-freeipa/upstream-tests:c8s
-    pre_build_image: true
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 127.0.0.1
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare.yml
-prerun: false
diff --git a/molecule/c9s-build/Dockerfile b/molecule/c9s-build/Dockerfile
deleted file mode 100644
index 2bb39a10f9ce1595b6fef9e3139ee4d5e4d2377f..0000000000000000000000000000000000000000
--- a/molecule/c9s-build/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM quay.io/centos/centos:stream9
-ENV container=docker
-
-RUN rm -fv /var/cache/dnf/metadata_lock.pid; \
-dnf makecache; \
-dnf --assumeyes install \
-    /usr/bin/python3 \
-    /usr/bin/dnf-3 \
-    sudo \
-    bash \
-    systemd \
-    procps-ng \
-    iproute && \
-dnf clean all; \
-(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
-rm -f /lib/systemd/system/multi-user.target.wants/*;\
-rm -f /etc/systemd/system/*.wants/*;\
-rm -f /lib/systemd/system/local-fs.target.wants/*; \
-rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
-rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
-rm -f /lib/systemd/system/basic.target.wants/*;\
-rm -f /lib/systemd/system/anaconda.target.wants/*; \
-rm -rf /var/cache/dnf/;
-
-STOPSIGNAL RTMIN+3
-
-VOLUME ["/sys/fs/cgroup"]
-
-CMD ["/usr/sbin/init"]
diff --git a/molecule/c9s-build/molecule.yml b/molecule/c9s-build/molecule.yml
deleted file mode 100644
index dfa654804578e69905903a8726141e4ac1b87c00..0000000000000000000000000000000000000000
--- a/molecule/c9s-build/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: c9s-build
-    image: "quay.io/centos/centos:stream9"
-    dockerfile: Dockerfile
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 8.8.8.8
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare-build.yml
-prerun: false
diff --git a/molecule/c9s/molecule.yml b/molecule/c9s/molecule.yml
deleted file mode 100644
index 7aba52252912d9709c9ce604911c6554ce406347..0000000000000000000000000000000000000000
--- a/molecule/c9s/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: c9s
-    image: quay.io/ansible-freeipa/upstream-tests:c9s
-    pre_build_image: true
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 127.0.0.1
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare.yml
-prerun: false
diff --git a/molecule/centos-7-build/molecule.yml b/molecule/centos-7-build/molecule.yml
deleted file mode 100644
index e88e1208ad5886e5b19faf177f722c83dde32f4d..0000000000000000000000000000000000000000
--- a/molecule/centos-7-build/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: centos-7-build
-    image: centos/systemd
-    pre_build_image: true
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 8.8.8.8
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare-build.yml
-prerun: false
diff --git a/molecule/centos-7/molecule.yml b/molecule/centos-7/molecule.yml
deleted file mode 100644
index 5cb077e233de02558c88012c75c25288366da761..0000000000000000000000000000000000000000
--- a/molecule/centos-7/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: centos-7
-    image: quay.io/ansible-freeipa/upstream-tests:centos-7
-    pre_build_image: true
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 127.0.0.1
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare.yml
-prerun: false
diff --git a/molecule/default b/molecule/default
deleted file mode 120000
index 768be926fb77dacebb0865765fcfed2e64b5643a..0000000000000000000000000000000000000000
--- a/molecule/default
+++ /dev/null
@@ -1 +0,0 @@
-fedora-latest
\ No newline at end of file
diff --git a/molecule/fedora-latest-build/Dockerfile b/molecule/fedora-latest-build/Dockerfile
deleted file mode 100644
index f3c2ef6281d6bd7a1abd6641191c91c71f3e04c8..0000000000000000000000000000000000000000
--- a/molecule/fedora-latest-build/Dockerfile
+++ /dev/null
@@ -1,30 +0,0 @@
-FROM fedora:latest
-ENV container=docker
-
-RUN rm -fv /var/cache/dnf/metadata_lock.pid; \
-dnf makecache; \
-dnf --assumeyes install \
-    /usr/bin/python3 \
-    /usr/bin/python3-config \
-    /usr/bin/dnf-3 \
-    sudo \
-    bash \
-    systemd \
-    procps-ng \
-    iproute && \
-dnf clean all; \
-(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
-rm -f /lib/systemd/system/multi-user.target.wants/*;\
-rm -f /etc/systemd/system/*.wants/*;\
-rm -f /lib/systemd/system/local-fs.target.wants/*; \
-rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
-rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
-rm -f /lib/systemd/system/basic.target.wants/*;\
-rm -f /lib/systemd/system/anaconda.target.wants/*; \
-rm -rf /var/cache/dnf/;
-
-STOPSIGNAL RTMIN+3
-
-VOLUME ["/sys/fs/cgroup"]
-
-CMD ["/usr/sbin/init"]
diff --git a/molecule/fedora-latest-build/molecule.yml b/molecule/fedora-latest-build/molecule.yml
deleted file mode 100644
index 10635d3a8112126cde7264c250ba5cb69095a6cf..0000000000000000000000000000000000000000
--- a/molecule/fedora-latest-build/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: fedora-latest-build
-    image: "fedora:latest"
-    dockerfile: Dockerfile
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 8.8.8.8
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare-build.yml
-prerun: false
diff --git a/molecule/fedora-latest/molecule.yml b/molecule/fedora-latest/molecule.yml
deleted file mode 100644
index 94c4fc4a0cf72c4fe42aa7f09d9a2b2cac13d0c2..0000000000000000000000000000000000000000
--- a/molecule/fedora-latest/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: fedora-latest
-    image: quay.io/ansible-freeipa/upstream-tests:fedora-latest
-    pre_build_image: true
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 127.0.0.1
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare.yml
-prerun: false
diff --git a/molecule/fedora-rawhide-build/Dockerfile b/molecule/fedora-rawhide-build/Dockerfile
deleted file mode 100644
index f1a1c124d30d845a480b0b3cd841670eb95e96a0..0000000000000000000000000000000000000000
--- a/molecule/fedora-rawhide-build/Dockerfile
+++ /dev/null
@@ -1,30 +0,0 @@
-FROM fedora:rawhide
-ENV container=docker
-
-RUN rm -fv /var/cache/dnf/metadata_lock.pid; \
-dnf makecache; \
-dnf --assumeyes install \
-    /usr/bin/python3 \
-    /usr/bin/python3-config \
-    /usr/bin/dnf-3 \
-    sudo \
-    bash \
-    systemd \
-    procps-ng \
-    iproute && \
-dnf clean all; \
-(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
-rm -f /lib/systemd/system/multi-user.target.wants/*;\
-rm -f /etc/systemd/system/*.wants/*;\
-rm -f /lib/systemd/system/local-fs.target.wants/*; \
-rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
-rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
-rm -f /lib/systemd/system/basic.target.wants/*;\
-rm -f /lib/systemd/system/anaconda.target.wants/*; \
-rm -rf /var/cache/dnf/;
-
-STOPSIGNAL RTMIN+3
-
-VOLUME ["/sys/fs/cgroup"]
-
-CMD ["/usr/sbin/init"]
diff --git a/molecule/fedora-rawhide-build/molecule.yml b/molecule/fedora-rawhide-build/molecule.yml
deleted file mode 100644
index c8afa32964ab8ee7bdae8d471e59e9c44b6a053a..0000000000000000000000000000000000000000
--- a/molecule/fedora-rawhide-build/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: fedora-rawhide-build
-    image: "fedora:rawhide"
-    dockerfile: Dockerfile
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 8.8.8.8
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare-build.yml
-prerun: false
diff --git a/molecule/fedora-rawhide/molecule.yml b/molecule/fedora-rawhide/molecule.yml
deleted file mode 100644
index 6ff53e9b4e6b890b12d26903abc9296f35367141..0000000000000000000000000000000000000000
--- a/molecule/fedora-rawhide/molecule.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-driver:
-  name: docker
-platforms:
-  - name: fedora-rawhide
-    image: quay.io/ansible-freeipa/upstream-tests:fedora-rawhide
-    pre_build_image: true
-    hostname: ipaserver.test.local
-    dns_servers:
-      - 127.0.0.1
-    volumes:
-      - /sys/fs/cgroup:/sys/fs/cgroup:ro
-    command: /usr/sbin/init
-    privileged: true
-provisioner:
-  name: ansible
-  playbooks:
-    prepare: ../resources/playbooks/prepare.yml
-prerun: false
diff --git a/molecule/resources/playbooks/library b/molecule/resources/playbooks/library
deleted file mode 120000
index 0140dc6d3e793348663e9b0e959189b9ec1e6b9f..0000000000000000000000000000000000000000
--- a/molecule/resources/playbooks/library
+++ /dev/null
@@ -1 +0,0 @@
-../../../plugins/modules/
\ No newline at end of file
diff --git a/molecule/resources/playbooks/module_utils b/molecule/resources/playbooks/module_utils
deleted file mode 120000
index 2b1d4840b33b6d90bad753345c96c360561c64e6..0000000000000000000000000000000000000000
--- a/molecule/resources/playbooks/module_utils
+++ /dev/null
@@ -1 +0,0 @@
-../../../plugins/module_utils/
\ No newline at end of file
diff --git a/molecule/resources/playbooks/prepare-build.yml b/molecule/resources/playbooks/prepare-build.yml
deleted file mode 100644
index 5e8e5a92e152d1f59a4f49d83697302dfb1f93bf..0000000000000000000000000000000000000000
--- a/molecule/resources/playbooks/prepare-build.yml
+++ /dev/null
@@ -1,28 +0,0 @@
----
-- name: Converge
-  hosts: all
-  tasks:
-  - include_tasks: prepare-common.yml
-
-  - name: Ensure sudo package is installed
-    package:
-      name: sudo
-
-  - name: Ensure nss package is updated
-    package:
-      name: nss
-      state: latest  # noqa 403
-
-  - include_role:
-      name: ipaserver
-    vars:
-      ipaserver_setup_dns: yes
-      ipaserver_setup_kra: yes
-      ipaserver_auto_forwarders: yes
-      ipaserver_no_dnssec_validation: yes
-      ipaserver_auto_reverse: yes
-      ipaadmin_password: SomeADMINpassword
-      ipadm_password: SomeDMpassword
-      ipaserver_domain: test.local
-      ipaserver_realm: TEST.LOCAL
-      ipaclient_no_ntp: yes
diff --git a/molecule/resources/playbooks/prepare-common.yml b/molecule/resources/playbooks/prepare-common.yml
deleted file mode 100644
index 1e1a60227d7283b5c61a15a6a22481a482320649..0000000000000000000000000000000000000000
--- a/molecule/resources/playbooks/prepare-common.yml
+++ /dev/null
@@ -1,33 +0,0 @@
----
-# IPA depends on IPv6 and without it dirsrv service won't start.
-- name: Ensure IPv6 is ENABLED
-  ansible.posix.sysctl:
-    name: "{{ item.name }}"
-    value: "{{ item.value }}"
-    sysctl_set: yes
-    state: present
-    reload: yes
-  with_items:
-    - name: net.ipv6.conf.all.disable_ipv6
-      value: 0
-    - name: net.ipv6.conf.lo.disable_ipv6
-      value: 0
-    - name: net.ipv6.conf.eth0.disable_ipv6
-      value: 1
-
-# Set fs.protected_regular to 0
-#   This is needed in some IPA versions in order to get KRA enabled.
-#   See https://pagure.io/freeipa/issue/7906 for more information.
-- name: stat protected_regular
-  ansible.builtin.stat:
-    path: /proc/sys/fs/protected_regular
-  register: result
-
-- name: Ensure fs.protected_regular is disabled
-  ansible.posix.sysctl:
-    name: fs.protected_regular
-    value: 0
-    sysctl_set: yes
-    state: present
-    reload: yes
-  when: result.stat.exists
diff --git a/molecule/resources/playbooks/prepare.yml b/molecule/resources/playbooks/prepare.yml
deleted file mode 100644
index deaa092b3318a5c288e7525932e1000ba453a3eb..0000000000000000000000000000000000000000
--- a/molecule/resources/playbooks/prepare.yml
+++ /dev/null
@@ -1,48 +0,0 @@
----
-- name: Converge
-  hosts: all
-  tasks:
-  - include_tasks: prepare-common.yml
-
-  # In some distros DS won't start up after reboot
-  #   This is due to a problem in 389-ds. See tickets:
-  #   * https://pagure.io/389-ds-base/issue/47429
-  #   * https://pagure.io/389-ds-base/issue/51039
-  #
-  # To avoid this problem we create the directories before starting IPA.
-  - name: Ensure lock dirs for DS exists
-    ansible.builtin.file:
-      state: directory
-      owner: dirsrv
-      group: dirsrv
-      path: "{{ item }}"
-      mode: 0770
-    loop:
-      - /var/lock/dirsrv/
-      - /var/lock/dirsrv/slapd-TEST-LOCAL/
-
-  - name: Ensure IPA server is up an running
-    ansible.builtin.service:
-      name: ipa
-      state: started
-
-  - name: Wait for krb5dkc to be running
-    ansible.builtin.service_facts:
-    no_log: True
-    register: result
-    until: "'krb5kdc.service' in result.ansible_facts.services and \
-            result.ansible_facts.services['krb5kdc.service'].state == 'running'"
-    retries: 30
-    delay: 5
-
-  - name: Check if TGT is available for admin.
-    ansible.builtin.shell:
-      cmd: echo SomeADMINpassword | kinit -c ansible_freeipa_cache admin
-    register: result
-    until: not result.failed
-    retries: 30
-    delay: 5
-
-  - name: Cleanup TGT.
-    ansible.builtin.shell:
-      cmd: kdestroy -c ansible_freeipa_cache -A
diff --git a/molecule/resources/playbooks/roles b/molecule/resources/playbooks/roles
deleted file mode 120000
index e2b799b9d705b8545e7242a920921d8221791d4b..0000000000000000000000000000000000000000
--- a/molecule/resources/playbooks/roles
+++ /dev/null
@@ -1 +0,0 @@
-../../../roles/
\ No newline at end of file
diff --git a/tests/README.md b/tests/README.md
index 1e9d4e4a194d47b99e2fa94d02202678d3765288..298078b8681f5e650001ae07801512a344c75468 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -102,48 +102,16 @@ The pytests are tests that will execute small playbooks and then will verify the
 To select only these tests on a test execution use the option `-m "not playbook"`.
 
 
-## Running tests in a docker container
+## Running tests in a container
 
-It's also possible to run the tests in a container.
-
-### Creating a container to run the tests
-
-Before setting up a container you will need to install molecule framework:
-
-```
-pip install molecule-plugins[docker]
-```
-
-Now you can start a test container using the following command:
-```
-molecule create -s c8s
-```
-
-Note: Currently the containers available for running the tests are:
- * fedora-latest
- * centos-7
- * c8s
- * c9s
-
-### Running the tests inside the container
+It's also possible to run the tests in a container. Use the script `infra/image/start.sh` to start a container.
 
 To run the tests you will use pytest (works the same as for VMs).
 
 ```
-RUN_TESTS_IN_DOCKER=1 IPA_SERVER_HOST=c8s pytest
+RUN_TESTS_IN_DOCKER=podman IPA_SERVER_HOST=ansbile-freeipa-tests pytest -m "playbook"
 ```
 
-### Cleaning up after tests
-
-After running the tests you should probably destroy the test container using:
-
-```
-molecule destroy -s c8s
-```
-
-See [Running the tests](#running-the-tests) section for more information on available options.
-
-
 ## Running local tests with upstream CI images
 
 To run tests locally using the same images used by upstream CI use `utils/run-tests.sh`.
@@ -172,8 +140,6 @@ By default the tests are executed against the latest version of the Fedora image
 utils/run-tests.sh -i c9s tests/host/test_host.yml
 ```
 
-
 ## Upcoming/desired improvements:
 
-* A script to pre-config the complete test environment using virsh.
-* A test matrix to run tests against different distros in parallel (probably using tox).
+* A test matrix to run tests against different distros in parallel.
diff --git a/tests/azure/nightly.yml b/tests/azure/nightly.yml
deleted file mode 100644
index 89914f8e4b9e84d0b5e637ad568a7154ff09af73..0000000000000000000000000000000000000000
--- a/tests/azure/nightly.yml
+++ /dev/null
@@ -1,243 +0,0 @@
----
-schedules:
-- cron: "0 19 * * *"
-  displayName: Nightly Builds
-  branches:
-    include:
-    - master
-  always: true
-
-trigger: none
-
-pool:
-  vmImage: 'ubuntu-20.04'
-
-stages:
-
-# Fedora
-
-- stage: FedoraLatest_Ansible_Core_2_13
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.13,<2.14"
-
-- stage: FedoraLatest_Ansible_Core_2_14
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.14,<2.15"
-
-- stage: FedoraLatest_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
-
-- stage: FedoraLatest_Ansible_latest
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: ""
-
-# Galaxy on Fedora
-
-- stage: Galaxy_FedoraLatest_Ansible_Core_2_13
-  dependsOn: []
-  jobs:
-  - template: templates/galaxy_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.13,<2.14"
-
-- stage: Galaxy_FedoraLatest_Ansible_Core_2_14
-  dependsOn: []
-  jobs:
-  - template: templates/galaxy_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.14,<2.15"
-
-- stage: Galaxy_FedoraLatest_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/galaxy_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
-
-- stage: Galaxy_FedoraLatest_Ansible_latest
-  dependsOn: []
-  jobs:
-  - template: templates/galaxy_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-latest
-      ansible_version: ""
-
-# Fedora Rawhide
-
-- stage: FedoraRawhide_Ansible_Core_2_13
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-rawhide
-      ansible_version: "-core >=2.13,<2.14"
-
-- stage: FedoraRawhide_Ansible_Core_2_14
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-rawhide
-      ansible_version: "-core >=2.14,<2.15"
-
-- stage: FedoraRawhide_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-rawhide
-      ansible_version: "-core >=2.15,<2.16"
-
-- stage: FedoraRawhide_Ansible_latest
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: fedora-rawhide
-      ansible_version: ""
-
-# CentoOS 9 Stream
-
-- stage: c9s_Ansible_Core_2_13
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c9s
-      ansible_version: "-core >=2.13,<2.14"
-
-- stage: c9s_Ansible_Core_2_14
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c9s
-      ansible_version: "-core >=2.14,<2.15"
-
-- stage: c9s_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c9s
-      ansible_version: "-core >=2.15,<2.16"
-
-- stage: c9s_Ansible_latest
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c9s
-      ansible_version: ""
-
-# CentOS 8 Stream
-
-- stage: c8s_Ansible_Core_2_13
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c8s
-      ansible_version: "-core >=2.13,<2.14"
-
-- stage: c8s_Ansible_Core_2_14
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c8s
-      ansible_version: "-core >=2.14,<2.15"
-
-- stage: c8s_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c8s
-      ansible_version: "-core >=2.15,<2.16"
-
-- stage: c8s_Ansible_latest
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: c8s
-      ansible_version: ""
-
-# CentOS 7
-
-- stage: CentOS7_Ansible_Core_2_13
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: centos-7
-      ansible_version: "-core >=2.13,<2.14"
-
-- stage: CentOS7_Ansible_Core_2_14
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: centos-7
-      ansible_version: "-core >=2.14,<2.15"
-
-- stage: CentOS7_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: centos-7
-      ansible_version: "-core >=2.15,<2.16"
-
-- stage: CentOS7_Ansible_latest
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      scenario: centos-7
-      ansible_version: ""
diff --git a/tests/azure/templates/fast_tests.yml b/tests/azure/templates/fast_tests.yml
deleted file mode 100644
index ac26ce8f0bb19ee5ffd1af63771174ad273e0004..0000000000000000000000000000000000000000
--- a/tests/azure/templates/fast_tests.yml
+++ /dev/null
@@ -1,31 +0,0 @@
----
-parameters:
-  - name: distro
-    type: string
-    default: fedora-latest
-  - name: build_number
-    type: string
-  - name: ansible_version
-    type: string
-    default: ""
-  - name: target_python
-    type: string
-    default: "/usr/bin/python3"
-
-jobs:
-- template: playbook_fast.yml
-  parameters:
-    group_number: 1
-    number_of_groups: 1
-    build_number: ${{ parameters.build_number }}
-    distro: ${{ parameters.distro }}
-    ansible_version: ${{ parameters.ansible_version }}
-    python_version: '< 3.12'
-    target_python: ${{ parameters.target_python }}
-
-# - template: pytest_tests.yml
-#   parameters:
-#     build_number: ${{ parameters.build_number }}
-#     distro: ${{ parameters.distro }}
-#     ansible_version: ${{ parameters.ansible_version }}
-#     python_version: '< 3.12'
diff --git a/tests/azure/templates/galaxy_pytest_script.yml b/tests/azure/templates/galaxy_pytest_script.yml
deleted file mode 100644
index 3b164169617bf76b8959316c79ce86ce35da4ebf..0000000000000000000000000000000000000000
--- a/tests/azure/templates/galaxy_pytest_script.yml
+++ /dev/null
@@ -1,65 +0,0 @@
----
-parameters:
-  - name: build_number
-    type: string
-  - name: scenario
-    type: string
-    default: fedora-latest
-  - name: ansible_version
-    type: string
-    default: ""
-  - name: python_version
-    type: string
-    default: 3.x
-
-jobs:
-- job: Test_PyTests
-  displayName: Run pytests on ${{ parameters.scenario }}
-  timeoutInMinutes: 240
-  steps:
-  - task: UsePythonVersion@0
-    inputs:
-      versionSpec: '${{ parameters.python_version }}'
-
-  - script: |
-      pip install \
-        "molecule-plugins[docker]" \
-        "requests<2.29" \
-        "ansible${{ parameters.ansible_version }}"
-    retryCountOnTaskFailure: 5
-    displayName: Install molecule and Ansible
-
-  - script: ansible-galaxy collection install community.docker ansible.posix
-    retryCountOnTaskFailure: 5
-    displayName: Install Ansible collections
-
-  - script: pip install -r requirements-tests.txt
-    retryCountOnTaskFailure: 5
-    displayName: Install dependencies
-
-  - script: |
-      utils/build-galaxy-release.sh -i
-      molecule create -s ${{ parameters.scenario }}
-    retryCountOnTaskFailure: 5
-    displayName: Setup test container
-    env:
-      ANSIBLE_LIBRARY: ./molecule
-
-  - script: |
-      cd ~/.ansible/collections/ansible_collections/freeipa/ansible_freeipa
-      pytest \
-        -m "not playbook" \
-        --verbose \
-        --color=yes \
-        --junit-xml=TEST-results-pytests.xml
-    displayName: Run tests
-    env:
-      IPA_SERVER_HOST: ${{ parameters.scenario }}
-      RUN_TESTS_IN_DOCKER: true
-      IPA_VERBOSITY: "-vvv"
-
-  - task: PublishTestResults@2
-    inputs:
-      mergeTestResults: true
-      testRunTitle: PlaybookTests-Build${{ parameters.build_number }}
-    condition: succeededOrFailed()
diff --git a/tests/azure/templates/galaxy_script.yml b/tests/azure/templates/galaxy_script.yml
deleted file mode 100644
index a00dd0a55fec435f986df7164ad128b9650d789e..0000000000000000000000000000000000000000
--- a/tests/azure/templates/galaxy_script.yml
+++ /dev/null
@@ -1,86 +0,0 @@
----
-parameters:
-  - name: group_number
-    type: number
-    default: 1
-  - name: number_of_groups
-    type: number
-    default: 1
-  - name: scenario
-    type: string
-    default: fedora-latest
-  - name: ansible_version
-    type: string
-    default: ""
-  - name: python_version
-    type: string
-    default: 3.x
-  - name: build_number
-    type: string
-
-
-jobs:
-- job: Test_Group${{ parameters.group_number }}
-  displayName: Run playbook tests ${{ parameters.scenario }} (${{ parameters.group_number }}/${{ parameters.number_of_groups }})
-  timeoutInMinutes: 240
-  variables:
-  - template: variables.yaml
-  - template: variables_${{ parameters.scenario }}.yaml
-  steps:
-  - task: UsePythonVersion@0
-    inputs:
-      versionSpec: '${{ parameters.python_version }}'
-
-  - script: |
-      pip install \
-        "molecule-plugins[docker]" \
-        "requests<2.29" \
-        "ansible${{ parameters.ansible_version }}"
-    retryCountOnTaskFailure: 5
-    displayName: Install molecule and Ansible
-
-  - script: ansible-galaxy collection install community.docker ansible.posix
-    retryCountOnTaskFailure: 5
-    displayName: Install Ansible collections
-
-  - script: pip install -r requirements-tests.txt
-    retryCountOnTaskFailure: 5
-    displayName: Install dependencies
-
-  - script: |
-      utils/build-galaxy-release.sh -i
-      molecule create -s ${{ parameters.scenario }}
-    retryCountOnTaskFailure: 5
-    displayName: Setup test container
-    env:
-      ANSIBLE_LIBRARY: ./molecule
-
-  - script: |
-      python utils/check_test_configuration.py ${{ parameters.scenario }}
-    displayName: Check scenario test configuration
-
-  - script: |
-      cd ~/.ansible/collections/ansible_collections/freeipa/ansible_freeipa
-      pytest \
-        -m "playbook" \
-        --verbose \
-        --color=yes \
-        --splits=${{ parameters.number_of_groups }} \
-        --group=${{ parameters.group_number }} \
-        --randomly-seed=$(date "+%Y%m%d") \
-        --junit-xml=TEST-results-group-${{ parameters.group_number }}.xml
-    displayName: Run playbook tests
-    env:
-      IPA_SERVER_HOST: ${{ parameters.scenario }}
-      RUN_TESTS_IN_DOCKER: true
-      IPA_DISABLED_MODULES: ${{ variables.ipa_disabled_modules }}
-      IPA_DISABLED_TESTS: ${{ variables.ipa_disabled_tests }}
-      IPA_ENABLED_MODULES: ${{ variables.ipa_enabled_modules }}
-      IPA_ENABLED_TESTS: ${{ variables.ipa_enabled_tests }}
-      IPA_VERBOSITY: "-vvv"
-
-  - task: PublishTestResults@2
-    inputs:
-      mergeTestResults: true
-      testRunTitle: PlaybookTests-Build${{ parameters.build_number }}
-    condition: succeededOrFailed()
diff --git a/tests/azure/templates/galaxy_tests.yml b/tests/azure/templates/galaxy_tests.yml
deleted file mode 100644
index 465097de2e59caf02dd3fbf6672d1685fa8e592b..0000000000000000000000000000000000000000
--- a/tests/azure/templates/galaxy_tests.yml
+++ /dev/null
@@ -1,46 +0,0 @@
----
-parameters:
-  - name: scenario
-    type: string
-    default: fedora-latest
-  - name: build_number
-    type: string
-  - name: ansible_version
-    type: string
-    default: ""
-
-jobs:
-- template: galaxy_script.yml
-  parameters:
-    group_number: 1
-    number_of_groups: 3
-    build_number: ${{ parameters.build_number }}
-    scenario: ${{ parameters.scenario }}
-    ansible_version: ${{ parameters.ansible_version }}
-    python_version: '< 3.12'
-
-- template: galaxy_script.yml
-  parameters:
-    group_number: 2
-    number_of_groups: 3
-    build_number: ${{ parameters.build_number }}
-    scenario: ${{ parameters.scenario }}
-    ansible_version: ${{ parameters.ansible_version }}
-    python_version: '< 3.12'
-
-- template: galaxy_script.yml
-  parameters:
-    group_number: 3
-    number_of_groups: 3
-    build_number: ${{ parameters.build_number }}
-    scenario: ${{ parameters.scenario }}
-    ansible_version: ${{ parameters.ansible_version }}
-    python_version: '< 3.12'
-
-# Temporarily disable due to issues with ansible docker plugin.
-#- template: galaxy_pytest_script.yml
-#  parameters:
-#    build_number: ${{ parameters.build_number }}
-#    scenario: ${{ parameters.scenario }}
-#    ansible_version: ${{ parameters.ansible_version }}
-#    python_version: '< 3.12'
diff --git a/tests/azure/templates/group_tests.yml b/tests/azure/templates/group_tests.yml
deleted file mode 100644
index 38f183dd97171a2880e1febf55416b7f7549153c..0000000000000000000000000000000000000000
--- a/tests/azure/templates/group_tests.yml
+++ /dev/null
@@ -1,46 +0,0 @@
----
-parameters:
-  - name: scenario
-    type: string
-    default: fedora-latest
-  - name: build_number
-    type: string
-  - name: ansible_version
-    type: string
-    default: ""
-
-jobs:
-- template: playbook_tests.yml
-  parameters:
-    group_number: 1
-    number_of_groups: 3
-    build_number: ${{ parameters.build_number }}
-    scenario: ${{ parameters.scenario }}
-    ansible_version: ${{ parameters.ansible_version }}
-    python_version: '< 3.12'
-
-- template: playbook_tests.yml
-  parameters:
-    group_number: 2
-    number_of_groups: 3
-    build_number: ${{ parameters.build_number }}
-    scenario: ${{ parameters.scenario }}
-    ansible_version: ${{ parameters.ansible_version }}
-    python_version: '< 3.12'
-
-- template: playbook_tests.yml
-  parameters:
-    group_number: 3
-    number_of_groups: 3
-    build_number: ${{ parameters.build_number }}
-    scenario: ${{ parameters.scenario }}
-    ansible_version: ${{ parameters.ansible_version }}
-    python_version: '< 3.12'
-
-# Temporarily disabled due to ansible docker plugin issue.
-#- template: pytest_tests.yml
-#  parameters:
-#    build_number: ${{ parameters.build_number }}
-#    scenario: ${{ parameters.scenario }}
-#    ansible_version: ${{ parameters.ansible_version }}
-#    python_version: '< 3.12'
diff --git a/tests/azure/templates/playbook_fast.yml b/tests/azure/templates/playbook_fast.yml
deleted file mode 100644
index a00a7875dca1ef99ff1d4e8a8fcbbe6e891e3bfd..0000000000000000000000000000000000000000
--- a/tests/azure/templates/playbook_fast.yml
+++ /dev/null
@@ -1,84 +0,0 @@
----
-parameters:
-  - name: group_number
-    type: number
-    default: 1
-  - name: number_of_groups
-    type: number
-    default: 1
-  - name: distro
-    type: string
-    default: fedora-latest
-  - name: ansible_version
-    type: string
-    default: ""
-  - name: python_version
-    type: string
-    default: 3.x
-  - name: build_number
-    type: string
-  - name: target_python
-    type: string
-    default: "/usr/bin/python3"
-
-jobs:
-- job: Test_Group${{ parameters.group_number }}
-  displayName: Run playbook tests ${{ parameters.distro }} (${{ parameters.group_number }}/${{ parameters.number_of_groups }})
-  timeoutInMinutes: 360
-  variables:
-  - template: variables.yaml
-  - template: variables_${{ parameters.distro }}.yaml
-  steps:
-  - task: UsePythonVersion@0
-    inputs:
-      versionSpec: '${{ parameters.python_version }}'
-
-  - script: |
-      pip install "ansible${{ parameters.ansible_version }}"
-    retryCountOnTaskFailure: 5
-    displayName: Install Ansible
-
-  - script: ansible-galaxy collection install containers.podman
-    retryCountOnTaskFailure: 5
-    displayName: Install Ansible collections
-
-  - script: pip install -r requirements-tests.txt
-    retryCountOnTaskFailure: 5
-    displayName: Install dependencies
-
-  - script: |
-      . utils/set_test_modules
-      python3 utils/check_test_configuration.py ${{ parameters.distro }}
-    displayName: Check test configuration
-
-  - script: |
-      utils/setup_test_container.sh \
-        -e podman \
-        -a \
-        -m 4 \
-        -n "ipaserver.test.local" \
-        -p ${{ parameters.target_python }} \
-        -i ${{ parameters.distro }}-server \
-        ${{ parameters.distro }}-test
-    displayName: Setup target container
-
-  - script: |
-      . utils/set_test_modules
-      pytest -m "playbook" --verbose --color=yes --suppress-no-test-exit-code --junit-xml=TEST-results-pr-check.xml
-    displayName: Run playbook tests
-    env:
-      ANSIBLE_ROLES_PATH: "${PWD}/roles"
-      ANSIBLE_LIBRARY: "${PWD}/plugins"
-      ANSIBLE_MODULE_UTILS: "${PWD}/plugins/module_utils"
-      IPA_SERVER_HOST: ${{ parameters.distro }}-test
-      RUN_TESTS_IN_DOCKER: podman
-      IPA_DISABLED_MODULES: ${{ variables.ipa_disabled_modules }}
-      IPA_DISABLED_TESTS: ${{ variables.ipa_disabled_tests }}
-      IPA_VERBOSITY: "-vvv"
-      IPA_PYTHON_PATH: ${{ parameters.target_python }}
-
-  - task: PublishTestResults@2
-    inputs:
-      mergeTestResults: true
-      testRunTitle: PlaybookTests-Build${{ parameters.build_number }}
-    condition: succeededOrFailed()
diff --git a/tests/azure/templates/playbook_tests.yml b/tests/azure/templates/playbook_tests.yml
deleted file mode 100644
index c65c955fb1082006ac727282a382162d89e3c651..0000000000000000000000000000000000000000
--- a/tests/azure/templates/playbook_tests.yml
+++ /dev/null
@@ -1,88 +0,0 @@
----
-parameters:
-  - name: group_number
-    type: number
-    default: 1
-  - name: number_of_groups
-    type: number
-    default: 1
-  - name: scenario
-    type: string
-    default: fedora-latest
-  - name: ansible_version
-    type: string
-    default: ""
-  - name: python_version
-    type: string
-    default: 3.x
-  - name: build_number
-    type: string
-
-jobs:
-- job: Test_Group${{ parameters.group_number }}
-  displayName: Run playbook tests ${{ parameters.scenario }} (${{ parameters.group_number }}/${{ parameters.number_of_groups }})
-  timeoutInMinutes: 240
-  variables:
-  - template: variables.yaml
-  - template: variables_${{ parameters.scenario }}.yaml
-  steps:
-  - task: UsePythonVersion@0
-    inputs:
-      versionSpec: '${{ parameters.python_version }}'
-
-  - script: |
-      pip install \
-        "molecule-plugins[docker]" \
-        "requests<2.29" \
-        "ansible${{ parameters.ansible_version }}"
-    retryCountOnTaskFailure: 5
-    displayName: Install molecule and Ansible
-
-  - script: ansible-galaxy collection install community.docker ansible.posix
-    retryCountOnTaskFailure: 5
-    displayName: Install Ansible collections
-
-  - script: pip install -r requirements-tests.txt
-    retryCountOnTaskFailure: 5
-    displayName: Install dependencies
-
-  - script: |
-      rm -rf ~/ansible
-      mkdir -p ~/.ansible/roles ~/.ansible/library ~/.ansible/module_utils
-      cp -a roles/* ~/.ansible/roles
-      cp -a plugins/modules/* ~/.ansible/library
-      cp -a plugins/module_utils/* ~/.ansible/module_utils
-      molecule create -s ${{ parameters.scenario }}
-    retryCountOnTaskFailure: 5
-    displayName: Setup test container
-    env:
-      ANSIBLE_LIBRARY: ./molecule
-
-  - script: |
-      python utils/check_test_configuration.py ${{ parameters.scenario }}
-    displayName: Check scenario test configuration
-
-  - script: |
-      pytest \
-        -m "playbook" \
-        --verbose \
-        --color=yes \
-        --splits=${{ parameters.number_of_groups }} \
-        --group=${{ parameters.group_number }} \
-        --randomly-seed=$(date "+%Y%m%d") \
-        --junit-xml=TEST-results-group-${{ parameters.group_number }}.xml
-    displayName: Run playbook tests
-    env:
-      IPA_SERVER_HOST: ${{ parameters.scenario }}
-      RUN_TESTS_IN_DOCKER: true
-      IPA_DISABLED_MODULES: ${{ variables.ipa_disabled_modules }}
-      IPA_DISABLED_TESTS: ${{ variables.ipa_disabled_tests }}
-      IPA_ENABLED_MODULES: ${{ variables.ipa_enabled_modules }}
-      IPA_ENABLED_TESTS: ${{ variables.ipa_enabled_tests }}
-      IPA_VERBOSITY: "-vvv"
-
-  - task: PublishTestResults@2
-    inputs:
-      mergeTestResults: true
-      testRunTitle: PlaybookTests-Build${{ parameters.build_number }}
-    condition: succeededOrFailed()
diff --git a/tests/azure/templates/pytest_tests.yml b/tests/azure/templates/pytest_tests.yml
deleted file mode 100644
index a7b12110e52a19b0a83aad76b1d8488072db3dc6..0000000000000000000000000000000000000000
--- a/tests/azure/templates/pytest_tests.yml
+++ /dev/null
@@ -1,75 +0,0 @@
----
-parameters:
-  - name: build_number
-    type: string
-  - name: scenario
-    type: string
-    default: fedora-latest
-  - name: ansible_version
-    type: string
-    default: ""
-  - name: python_version
-    type: string
-    default: 3.x
-
-jobs:
-- job: Test_PyTests
-  displayName: Run pytests on ${{ parameters.scenario }}
-  timeoutInMinutes: 240
-  variables:
-  - template: variables.yaml
-  - template: variables_${{ parameters.scenario }}.yaml
-  steps:
-  - task: UsePythonVersion@0
-    inputs:
-      versionSpec: '${{ parameters.python_version }}'
-
-  - script: |
-      pip install \
-        "molecule-plugins[docker]" \
-        "requests<2.29" \
-        "ansible${{ parameters.ansible_version }}"
-    retryCountOnTaskFailure: 5
-    displayName: Install molecule and Ansible
-
-  - script: ansible-galaxy collection install community.docker ansible.posix
-    retryCountOnTaskFailure: 5
-    displayName: Install Ansible collections
-
-  - script: pip install -r requirements-tests.txt
-    retryCountOnTaskFailure: 5
-    displayName: Install dependencies
-
-  - script: |
-      rm -rf ~/.ansible
-      mkdir -p ~/.ansible/roles ~/.ansible/library ~/.ansible/module_utils
-      cp -a roles/* ~/.ansible/roles
-      cp -a plugins/modules/* ~/.ansible/library
-      cp -a plugins/module_utils/* ~/.ansible/module_utils
-      molecule create -s ${{ parameters.scenario }}
-    retryCountOnTaskFailure: 5
-    displayName: Setup test container
-    env:
-      ANSIBLE_LIBRARY: ./molecule
-
-  - script: |
-      pytest \
-        -m "not playbook" \
-        --verbose \
-        --color=yes \
-        --junit-xml=TEST-results-pytests.xml
-    displayName: Run tests
-    env:
-      IPA_SERVER_HOST: ${{ parameters.scenario }}
-      RUN_TESTS_IN_DOCKER: true
-      IPA_DISABLED_MODULES: ${{ variables.ipa_disabled_modules }}
-      IPA_DISABLED_TESTS: ${{ variables.ipa_disabled_tests }}
-      IPA_ENABLED_MODULES: ${{ variables.ipa_enabled_modules }}
-      IPA_ENABLED_TESTS: ${{ variables.ipa_enabled_tests }}
-      IPA_VERBOSITY: "-vvv"
-
-  - task: PublishTestResults@2
-    inputs:
-      mergeTestResults: true
-      testRunTitle: PlaybookTests-Build${{ parameters.build_number }}
-    condition: succeededOrFailed()
diff --git a/utils/lint_check.sh b/utils/lint_check.sh
index 25d4f8878c0b4cd551daaf370961c08bcabe8de6..76c8c2ace182b2862342d3d5fdd6510928fa52dd 100755
--- a/utils/lint_check.sh
+++ b/utils/lint_check.sh
@@ -35,7 +35,6 @@ echo -e "${INFO}Running 'yamllint'...${RST}"
 yaml_dirs=(
     "tests"
     "playbooks"
-    "molecule"
     "roles"
 )
 yamllint -f colored "${yaml_dirs[@]}"
diff --git a/utils/set_test_modules b/utils/set_test_modules
index daa47dcf55d3b7e3459be44d4c6db94224e27e75..f9f1d91e4a1effb9376598f2859f0b5ad9cff930 100644
--- a/utils/set_test_modules
+++ b/utils/set_test_modules
@@ -1,8 +1,7 @@
 #!/bin/bash -eu
 # This file shoud be source'd (. set_test_modules) rather than executed.
-
 #
-# Set "BASE_BRANCH" to a different branch to compare. 
+# Set SKIP_GIT_TEST="True" or use -a to prevent git modification comparison.
 #
 
 RED="\033[31;1m"
@@ -18,27 +17,45 @@ TOPDIR="$(dirname "${BASH_SOURCE[0]}")/.."
 
 pushd "${TOPDIR}" >/dev/null 2>&1 || die "Failed to change directory."
 
+SKIP_GIT_TEST=${SKIP_GIT_TEST:-"False"}
+
+while getopts ":a" opt
+do
+    case "${opt}" in
+        a) SKIP_GIT_TEST="True" ;;
+        *) ;; # ignore other options
+    esac
+done
+
 files_list=$(mktemp)
 
-remote="$(basename $(mktemp -u remote_XXXXXX))"
-git remote add ${remote} https://github.com/freeipa/ansible-freeipa
-git fetch --prune --no-tags --quiet ${remote}
-git diff "${remote}/master" --name-only > "${files_list}"
-git remote remove ${remote}
+enabled_modules="None"
+enabled_tests="None"
 
-# Get all modules that should have tests executed
-enabled_modules="$(${python} utils/get_test_modules.py $(cat "${files_list}"))"
-[ -z "${enabled_modules}" ] && enabled_modules="None"
+if [ "${SKIP_GIT_TEST}" != "True" ]
+then
+    remote="$(basename "$(mktemp -u remote_XXXXXX)")"
+    git remote add "${remote}" https://github.com/freeipa/ansible-freeipa
+    git fetch --prune --no-tags --quiet "${remote}"
+    git diff "${remote}/master" --name-only > "${files_list}"
+    git remote remove "${remote}"
 
-# Get individual tests that should be executed
-mapfile -t tests < <(sed -n "s#.*/\(test_[^/]*\).yml#\1#p" "${files_list}" | tr -d " ")
-[ ${#tests[@]} -gt 0 ] && enabled_tests=$(IFS=, ; echo "${tests[*]}")
-[ -z "${enabled_tests}" ] && enabled_tests="None"
+    # shellcheck disable=SC2046
+    enabled_modules="$(${python} utils/get_test_modules.py $(cat "${files_list}"))"
+    [ -z "${enabled_modules}" ] && enabled_modules="None"
 
-[ -n "${enabled_tests}" ] && IPA_ENABLED_TESTS="${enabled_tests},${IPA_ENABLED_TESTS}"
-[ -n "${enabled_modules}" ] && IPA_ENABLED_MODULES="${enabled_modules},${IPA_ENABLED_MODULES}"
+    # Get individual tests that should be executed
+    mapfile -t tests < <(sed -n 's#.*/\(test_[^/]*\).yml#\1#p' "${files_list}" | tr -d " ")
+    [ ${#tests[@]} -gt 0 ] && enabled_tests=$(IFS=, ; echo "${tests[*]}")
+    [ -z "${enabled_tests}" ] && enabled_tests="None"
 
-rm -f "${files_list}"
+    [ -n "${enabled_tests}" ] && IPA_ENABLED_TESTS="${enabled_tests},${IPA_ENABLED_TESTS}"
+    [ -n "${enabled_modules}" ] && IPA_ENABLED_MODULES="${enabled_modules},${IPA_ENABLED_MODULES}"
+
+    rm -f "${files_list}"
+fi
+
+# Get all modules that should have tests executed
 
 export IPA_ENABLED_MODULES
 export IPA_ENABLED_TESTS