diff --git a/tests/env_freeipa_facts.yml b/tests/env_freeipa_facts.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7a664c1c928c9e8f369a1fe2dd15ff075081d255
--- /dev/null
+++ b/tests/env_freeipa_facts.yml
@@ -0,0 +1,18 @@
+# This playbook should be included with `include_tasks` as the first task
+# of a test playbook that requires FreeIPA information.
+#
+# Available Facts:
+#
+# ipa_version: The installed FreeIPA version.
+# ipa_api_version: The installed FreeIPA API version.
+#
+---
+- name: Retrieving FreeIPA version.
+  shell:
+    cmd: 'ipa --version | sed -n "s/VERSION: \([^,]*\).*API_VERSION: \([^,]*\).*/\1\\n\2/p"'
+  register: ipa_cmd_version
+
+- name: Set FreeIPA facts.
+  set_fact:
+    ipa_version: "{{ ipa_cmd_version.stdout_lines[0] }}"
+    ipa_api_version: "{{ ipa_cmd_version.stdout_lines[1] }}"
diff --git a/tests/hostgroup/test_hostgroup_membermanager.yml b/tests/hostgroup/test_hostgroup_membermanager.yml
index c0f65460e634aea22632d728c8f7b577e6ec3ae8..2af8445de9e54719a5ed3fe5bea146a97c68d16c 100644
--- a/tests/hostgroup/test_hostgroup_membermanager.yml
+++ b/tests/hostgroup/test_hostgroup_membermanager.yml
@@ -5,215 +5,220 @@
   gather_facts: false
 
   tasks:
-  - name: Ensure host-group testhostgroup is absent
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name:
-      - testhostgroup
-      state: absent
-
-  - name: Ensure user manangeruser1 and manageruser2 is absent
-    ipauser:
-      ipaadmin_password: SomeADMINpassword
-      name: manageruser1,manageruser2,unknown_user
-      state: absent
-
-  - name: Ensure group managergroup1 and managergroup2 are absent
-    ipagroup:
-      ipaadmin_password: SomeADMINpassword
-      name: managergroup1,managergroup2
-      state: absent
-
-  - name: Ensure host-group testhostgroup is present
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name:
-      - testhostgroup
-
-  - name: Ensure user manageruser1 and manageruser2 are present
-    ipauser:
-      ipaadmin_password: SomeADMINpassword
-      users:
-      - name: manageruser1
-        first: manageruser1
-        last: Last1
-      - name: manageruser2
-        first: manageruser2
-        last: Last2
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure managergroup1 is present
-    ipagroup:
-      ipaadmin_password: SomeADMINpassword
-      name: managergroup1
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure managergroup2 is present
-    ipagroup:
-      ipaadmin_password: SomeADMINpassword
-      name: managergroup2
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure membermanager user1 is present for testhostgroup
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure membermanager user1 is present for testhostgroup again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure membermanager group1 is present for testhostgroup
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_group: managergroup1
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure membermanager group1 is present for testhostgroup again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_group: managergroup1
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure membermanager user2 and group2 members are present for testhostgroup
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser2
-      membermanager_group: managergroup2
-      action: member
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure membermanager user2 and group2 members are present for testhostgroup again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser2
-      membermanager_group: managergroup2
-      action: member
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure membermanager user and group members are present for testhostgroup again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1,manageruser2
-      membermanager_group: managergroup1,managergroup2
-      action: member
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure membermanager user1 and group1 members are absent for testhostgroup
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1
-      membermanager_group: managergroup1
-      action: member
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure membermanager user1 and group1 members are absent for testhostgroup again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1
-      membermanager_group: managergroup1
-      action: member
-      state: absent
-    register: result
-    failed_when: result.changed
-
-
-  - name: Ensure membermanager user1 and group1 members are present for testhostgroup
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1
-      membermanager_group: managergroup1
-      action: member
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure membermanager user1 and group1 members are present for testhostgroup again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1
-      membermanager_group: managergroup1
-      action: member
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure membermanager user and group members are absent for testhostgroup
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1,manageruser2
-      membermanager_group: managergroup1,managergroup2
-      action: member
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure membermanager user and group members are absent for testhostgroup again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: manageruser1,manageruser2
-      membermanager_group: managergroup1,managergroup2
-      action: member
-      state: absent
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure user manangeruser1 and manageruser2 is absent
-    ipauser:
-      ipaadmin_password: SomeADMINpassword
-      name: manageruser1,manageruser2
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure group managergroup1 and managergroup2 are absent
-    ipagroup:
-      ipaadmin_password: SomeADMINpassword
-      name: managergroup1,managergroup2
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure unknown membermanager_user member failure
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: testhostgroup
-      membermanager_user: unknown_user
-      action: member
-    register: result
-    failed_when: result.changed or "no such entry" not in result.msg
-
-  - name: Ensure host-group testhostgroup is absent
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name:
-      - testhostgroup
-      state: absent
-    register: result
-    failed_when: not result.changed
+  - include_tasks: ../env_freeipa_facts.yml
+
+  - name: Tests requiring IPA version 4.8.4+
+    block:
+      - name: Ensure host-group testhostgroup is absent
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - testhostgroup
+          state: absent
+
+      - name: Ensure user manangeruser1 and manageruser2 is absent
+        ipauser:
+          ipaadmin_password: SomeADMINpassword
+          name: manageruser1,manageruser2,unknown_user
+          state: absent
+
+      - name: Ensure group managergroup1 and managergroup2 are absent
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name: managergroup1,managergroup2
+          state: absent
+
+      - name: Ensure host-group testhostgroup is present
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - testhostgroup
+
+      - name: Ensure user manageruser1 and manageruser2 are present
+        ipauser:
+          ipaadmin_password: SomeADMINpassword
+          users:
+          - name: manageruser1
+            first: manageruser1
+            last: Last1
+          - name: manageruser2
+            first: manageruser2
+            last: Last2
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure managergroup1 is present
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name: managergroup1
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure managergroup2 is present
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name: managergroup2
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure membermanager user1 is present for testhostgroup
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure membermanager user1 is present for testhostgroup again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure membermanager group1 is present for testhostgroup
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_group: managergroup1
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure membermanager group1 is present for testhostgroup again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_group: managergroup1
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure membermanager user2 and group2 members are present for testhostgroup
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser2
+          membermanager_group: managergroup2
+          action: member
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure membermanager user2 and group2 members are present for testhostgroup again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser2
+          membermanager_group: managergroup2
+          action: member
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure membermanager user and group members are present for testhostgroup again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1,manageruser2
+          membermanager_group: managergroup1,managergroup2
+          action: member
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure membermanager user1 and group1 members are absent for testhostgroup
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1
+          membermanager_group: managergroup1
+          action: member
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure membermanager user1 and group1 members are absent for testhostgroup again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1
+          membermanager_group: managergroup1
+          action: member
+          state: absent
+        register: result
+        failed_when: result.changed
+
+
+      - name: Ensure membermanager user1 and group1 members are present for testhostgroup
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1
+          membermanager_group: managergroup1
+          action: member
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure membermanager user1 and group1 members are present for testhostgroup again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1
+          membermanager_group: managergroup1
+          action: member
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure membermanager user and group members are absent for testhostgroup
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1,manageruser2
+          membermanager_group: managergroup1,managergroup2
+          action: member
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure membermanager user and group members are absent for testhostgroup again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: manageruser1,manageruser2
+          membermanager_group: managergroup1,managergroup2
+          action: member
+          state: absent
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure user manangeruser1 and manageruser2 is absent
+        ipauser:
+          ipaadmin_password: SomeADMINpassword
+          name: manageruser1,manageruser2
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure group managergroup1 and managergroup2 are absent
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name: managergroup1,managergroup2
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure unknown membermanager_user member failure
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: testhostgroup
+          membermanager_user: unknown_user
+          action: member
+        register: result
+        failed_when: result.changed or "no such entry" not in result.msg
+
+      - name: Ensure host-group testhostgroup is absent
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - testhostgroup
+          state: absent
+        register: result
+        failed_when: not result.changed
+    when: ipa_version is version('4.8.4', '>=')
diff --git a/tests/hostgroup/test_hostgroup_rename.yml b/tests/hostgroup/test_hostgroup_rename.yml
index 8d13338fa5a907f6738518d1af741e3f0c9b70cd..98007175a6a64e0542bf43d4003feb8bd149b1b0 100644
--- a/tests/hostgroup/test_hostgroup_rename.yml
+++ b/tests/hostgroup/test_hostgroup_rename.yml
@@ -5,101 +5,107 @@
   gather_facts: false
 
   tasks:
-  - name: Ensure testing host-group are absent
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name:
-      - databases
-      - datalake
-      - inexistenthostgroup
-      state: absent
+  - include_tasks: ../env_freeipa_facts.yml
 
-  - name: Ensure host-group databases is present
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: databases
-      state: present
-    register: result
-    failed_when: not result.changed
+  - name: Tests requiring IPA version 4.8.7+
+    block:
+      - name: Ensure testing host-group are absent
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - databases
+          - datalake
+          - inexistenthostgroup
+          state: absent
 
-  - name: Rename host-group from `databases` to `datalake`
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: databases
-      rename: datalake
-      state: renamed
-    register: result
-    failed_when: not result.changed
+      - name: Ensure host-group databases is present
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: databases
+          state: present
+        register: result
+        failed_when: not result.changed
 
-  - name: Ensure host-group database was already absent
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: database
-      state: absent
-    register: result
-    failed_when: result.changed
+      - name: Rename host-group from `databases` to `datalake`
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: databases
+          rename: datalake
+          state: renamed
+        register: result
+        failed_when: not result.changed
 
-  - name: Rename host-group from `databases` to `datalake`, again
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: databases
-      rename: datalake
-      state: renamed
-    register: result
-    failed_when: result.changed or result.failed
+      - name: Ensure host-group database was already absent
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: database
+          state: absent
+        register: result
+        failed_when: result.changed
 
-  - name: Rename host-group with same name.
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: datalake
-      rename: datalake
-      state: renamed
-    register: result
-    failed_when: result.changed
+      - name: Rename host-group from `databases` to `datalake`, again
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: databases
+          rename: datalake
+          state: renamed
+        register: result
+        failed_when: result.changed or result.failed
 
-  - name: Ensure testing hostgroups do not exist.
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: inexistenthostgroup,alsoinexistent
-      state: absent
+      - name: Rename host-group with same name.
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: datalake
+          rename: datalake
+          state: renamed
+        register: result
+        failed_when: result.changed
 
-  - name: Rename inexistent host-group to an existing one.
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: inexistenthostgroup
-      rename: datalake
-      state: renamed
-    register: result
-    failed_when: result.changed or result.failed
+      - name: Ensure testing hostgroups do not exist.
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: inexistenthostgroup,alsoinexistent
+          state: absent
 
-  - name: Rename inexistent host-group to a non-existing one.
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: inexistenthostgroup
-      rename: alsoinexistent
-      state: renamed
-    register: result
-    failed_when: not result.failed or "Attribute `rename` can not be used, unless hostgroup exists." not in result.msg
+      - name: Rename inexistent host-group to an existing one.
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: inexistenthostgroup
+          rename: datalake
+          state: renamed
+        register: result
+        failed_when: result.changed or result.failed
 
-  - name: Ensure host-group databases is present
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: databases
-      state: present
+      - name: Rename inexistent host-group to a non-existing one.
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: inexistenthostgroup
+          rename: alsoinexistent
+          state: renamed
+        register: result
+        failed_when: not result.failed or "Attribute `rename` can not be used, unless hostgroup exists." not in result.msg
 
-  - name: Rename host-group to an existing one.
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name: databases
-      rename: datalake
-      state: renamed
-    register: result
-    failed_when: not result.failed or "This entry already exists" not in result.msg
+      - name: Ensure host-group databases is present
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: databases
+          state: present
 
-  - name: Ensure host-group databases and datalake are absent
-    ipahostgroup:
-      ipaadmin_password: SomeADMINpassword
-      name:
-      - databases
-      - datalake
-      state: absent
+      - name: Rename host-group to an existing one.
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: databases
+          rename: datalake
+          state: renamed
+        register: result
+        failed_when: not result.failed or "This entry already exists" not in result.msg
+
+      - name: Ensure host-group databases and datalake are absent
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - databases
+          - datalake
+          state: absent
+
+    when: ipa_version is version('4.8.7', '>=')
diff --git a/tests/service/test_service_without_skip_host_check.yml b/tests/service/test_service_without_skip_host_check.yml
index 0f89cc7247de62f29295e1fb453f8c1a5e745b40..2b627256bf927fc637acd8a7bed1d695c745cd2a 100644
--- a/tests/service/test_service_without_skip_host_check.yml
+++ b/tests/service/test_service_without_skip_host_check.yml
@@ -4,344 +4,478 @@
   become: yes
 
   tasks:
-  # setup
-  - name: Setup test environment
-    include_tasks: env_setup.yml
-
-  # tests
-  - name: Ensure service is present
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      pac_type:
-        - MS-PAC
-        - PAD
-      auth_ind: otp
-      force: no
-      requires_pre_auth: yes
-      ok_as_delegate: no
-      ok_to_auth_as_delegate: no
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure service is present, again
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      pac_type:
-        - MS_PAC
-        - PAD
-      auth_ind: otp
-      force: no
-      requires_pre_auth: yes
-      ok_as_delegate: no
-      ok_to_auth_as_delegate: no
-    register: result
-    failed_when: result.changed
-
-  - name: Modify service.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      pac_type: NONE
-      ok_as_delegate: yes
-      ok_to_auth_as_delegate: yes
-    register: result
-    failed_when: not result.changed
-
-  - name: Modify service, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      pac_type: NONE
-      ok_as_delegate: yes
-      ok_to_auth_as_delegate: yes
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure service is present, with host not in DNS.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: HTTP/svc.ihavenodns.info
-      force: yes
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure service is present, with host not in DNS, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: HTTP/svc.ihavenodns.info
-      force: yes
-    register: result
-    failed_when: result.changed
-
-  - name: Principal host/test.example.com present in service.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      principal:
-        - host/test.example.com
-      action: member
-    register: result
-    failed_when: not result.changed
-
-  - name: Principal host/test.exabple.com present in service, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      principal:
-        - host/test.example.com
-      action: member
-    register: result
-    failed_when: result.changed
-
-  - name: Principal host/test.example.com absent in service.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      principal:
-        - host/test.example.com
-      action: member
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Principal host/test.example.com absent in service, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      principal:
-        - host/test.example.com
-      action: member
-      state: absent
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure host can manage service.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      action: member
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure host can manage service, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      host: "{{ host1_fqdn }}"
-      action: member
-    register: result
-    failed_when: result.changed
-
-  - name: Ensure host cannot manage service.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      action: member
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure host cannot manage service, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      action: member
-      state: absent
-    register: result
-    failed_when: result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab present for users, groups, hosts and hostgroups.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_create_keytab_user:
-      - user01
-      - user02
-      allow_create_keytab_group:
-      - group01
-      - group02
-      allow_create_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_create_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-    register: result
-    failed_when: not result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab present for users, groups, hosts and hostgroups, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_create_keytab_user:
-      - user01
-      - user02
-      allow_create_keytab_group:
-      - group01
-      - group02
-      allow_create_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_create_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-    register: result
-    failed_when: result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab absent for users, groups, hosts and hostgroups.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_create_keytab_user:
-      - user01
-      - user02
-      allow_create_keytab_group:
-      - group01
-      - group02
-      allow_create_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_create_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab absent for users, groups, hosts and hostgroups, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_create_keytab_user:
-      - user01
-      - user02
-      allow_create_keytab_group:
-      - group01
-      - group02
-      allow_create_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_create_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-      state: absent
-    register: result
-    failed_when: result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab present for users, groups, hosts and hostgroups
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_retrieve_keytab_user:
-      - user01
-      - user02
-      allow_retrieve_keytab_group:
-      - group01
-      - group02
-      allow_retrieve_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_retrieve_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-    register: result
-    failed_when: not result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab present for users, groups, hosts and hostgroups, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_retrieve_keytab_user:
-      - user01
-      - user02
-      allow_retrieve_keytab_group:
-      - group01
-      - group02
-      allow_retrieve_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_retrieve_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-    register: result
-    failed_when: result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab absent for users, groups, hosts and hostgroups.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_retrieve_keytab_user:
-      - user01
-      - user02
-      allow_retrieve_keytab_group:
-      - group01
-      - group02
-      allow_retrieve_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_retrieve_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab absent for users, groups, hosts and hostgroups, again.
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      allow_retrieve_keytab_user:
-      - user01
-      - user02
-      allow_retrieve_keytab_group:
-      - group01
-      - group02
-      allow_retrieve_keytab_host:
-      - "{{ host1_fqdn }}"
-      - "{{ host2_fqdn }}"
-      allow_retrieve_keytab_hostgroup:
-      - hostgroup01
-      - hostgroup02
-      action: member
-      state: absent
-    register: result
-    failed_when: result.changed
-
-  #
-  - name: Ensure service is absent
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      state: absent
-    register: result
-    failed_when: not result.changed
-
-  - name: Ensure service is absent, again
-    ipaservice:
-      ipaadmin_password: SomeADMINpassword
-      name: "HTTP/{{ svc_fqdn }}"
-      state: absent
-    register: result
-    failed_when: result.changed
-
-  # cleanup
-  - name: Cleanup test environment
-    include_tasks: env_cleanup.yml
+  - include_tasks: ../env_freeipa_facts.yml
+
+  - name: Tests requiring IPA version 4.7.0+
+    block:
+      # setup
+      - name: Get Domain from server name
+        set_fact:
+          ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
+        when: ipaserver_domain is not defined
+
+      - name: Set host1, host2 and svc hosts fqdn
+        set_fact:
+          host1_fqdn: "{{ 'host1.' + ipaserver_domain }}"
+          host2_fqdn: "{{ 'host2.' + ipaserver_domain }}"
+          svc_fqdn: "{{ 'svc.' + ipaserver_domain }}"
+
+      - name: Host absent
+        ipahost:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - svc.ihavenodns.info
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          - "{{ svc_fqdn }}"
+          update_dns: yes
+          state: absent
+
+      - name: Get IPv4 address prefix from server node
+        set_fact:
+          ipv4_prefix: "{{ ansible_default_ipv4.address.split('.')[:-1] |
+                           join('.') }}"
+
+      - name: Add hosts for tests.
+        ipahost:
+          ipaadmin_password: SomeADMINpassword
+          hosts:
+          - name: "{{ host1_fqdn }}"
+            ip_address: "{{ ipv4_prefix + '.201' }}"
+            update_dns: yes
+          - name: "{{ host2_fqdn }}"
+            ip_address: "{{ ipv4_prefix + '.202' }}"
+            update_dns: yes
+          - name: "{{ svc_fqdn }}"
+            ip_address: "{{ ipv4_prefix + '.203' }}"
+            update_dns: yes
+          - name: svc.ihavenodns.info
+            update_dns: no
+            force: yes
+
+      - name: Ensure testing user user01 is present.
+        ipauser:
+          ipaadmin_password: SomeADMINpassword
+          name: user01
+          first: user01
+          last: last
+
+      - name: Ensure testing user user02 is present.
+        ipauser:
+          ipaadmin_password: SomeADMINpassword
+          name: user02
+          first: user02
+          last: last
+
+      - name: Ensure testing group group01 is present.
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name: group01
+
+      - name: Ensure testing group group02 is present.
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name: group02
+
+      - name: Ensure testing hostgroup hostgroup01 is present.
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: hostgroup01
+
+      - name: Ensure testing hostgroup hostgroup02 is present.
+        ipahostgroup:
+          ipaadmin_password: SomeADMINpassword
+          name: hostgroup02
+
+      - name: Ensure services are absent.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - "HTTP/{{ svc_fqdn }}"
+          - HTTP/svc.ihavenodns.info
+          state: absent
+
+      # tests
+      - name: Ensure service is present
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          pac_type:
+            - MS-PAC
+            - PAD
+          auth_ind: otp
+          force: no
+          requires_pre_auth: yes
+          ok_as_delegate: no
+          ok_to_auth_as_delegate: no
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure service is present, again
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          pac_type:
+            - MS_PAC
+            - PAD
+          auth_ind: otp
+          force: no
+          requires_pre_auth: yes
+          ok_as_delegate: no
+          ok_to_auth_as_delegate: no
+        register: result
+        failed_when: result.changed
+
+      - name: Modify service.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          pac_type: NONE
+          ok_as_delegate: yes
+          ok_to_auth_as_delegate: yes
+        register: result
+        failed_when: not result.changed
+
+      - name: Modify service, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          pac_type: NONE
+          ok_as_delegate: yes
+          ok_to_auth_as_delegate: yes
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure service is present, with host not in DNS.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: HTTP/svc.ihavenodns.info
+          force: yes
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure service is present, with host not in DNS, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: HTTP/svc.ihavenodns.info
+          force: yes
+        register: result
+        failed_when: result.changed
+
+      - name: Principal host/test.example.com present in service.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          principal:
+            - host/test.example.com
+          action: member
+        register: result
+        failed_when: not result.changed
+
+      - name: Principal host/test.exabple.com present in service, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          principal:
+            - host/test.example.com
+          action: member
+        register: result
+        failed_when: result.changed
+
+      - name: Principal host/test.example.com absent in service.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          principal:
+            - host/test.example.com
+          action: member
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Principal host/test.example.com absent in service, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          principal:
+            - host/test.example.com
+          action: member
+          state: absent
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure host can manage service.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          action: member
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure host can manage service, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          host: "{{ host1_fqdn }}"
+          action: member
+        register: result
+        failed_when: result.changed
+
+      - name: Ensure host cannot manage service.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          action: member
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure host cannot manage service, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          action: member
+          state: absent
+        register: result
+        failed_when: result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab present for users, groups, hosts and hostgroups.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_create_keytab_user:
+          - user01
+          - user02
+          allow_create_keytab_group:
+          - group01
+          - group02
+          allow_create_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_create_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+        register: result
+        failed_when: not result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab present for users, groups, hosts and hostgroups, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_create_keytab_user:
+          - user01
+          - user02
+          allow_create_keytab_group:
+          - group01
+          - group02
+          allow_create_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_create_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+        register: result
+        failed_when: result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab absent for users, groups, hosts and hostgroups.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_create_keytab_user:
+          - user01
+          - user02
+          allow_create_keytab_group:
+          - group01
+          - group02
+          allow_create_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_create_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_create_keytab absent for users, groups, hosts and hostgroups, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_create_keytab_user:
+          - user01
+          - user02
+          allow_create_keytab_group:
+          - group01
+          - group02
+          allow_create_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_create_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+          state: absent
+        register: result
+        failed_when: result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab present for users, groups, hosts and hostgroups
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_retrieve_keytab_user:
+          - user01
+          - user02
+          allow_retrieve_keytab_group:
+          - group01
+          - group02
+          allow_retrieve_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_retrieve_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+        register: result
+        failed_when: not result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab present for users, groups, hosts and hostgroups, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_retrieve_keytab_user:
+          - user01
+          - user02
+          allow_retrieve_keytab_group:
+          - group01
+          - group02
+          allow_retrieve_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_retrieve_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+        register: result
+        failed_when: result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab absent for users, groups, hosts and hostgroups.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_retrieve_keytab_user:
+          - user01
+          - user02
+          allow_retrieve_keytab_group:
+          - group01
+          - group02
+          allow_retrieve_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_retrieve_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Service "HTTP/{{ svc_fqdn }}" members allow_retrieve_keytab absent for users, groups, hosts and hostgroups, again.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          allow_retrieve_keytab_user:
+          - user01
+          - user02
+          allow_retrieve_keytab_group:
+          - group01
+          - group02
+          allow_retrieve_keytab_host:
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          allow_retrieve_keytab_hostgroup:
+          - hostgroup01
+          - hostgroup02
+          action: member
+          state: absent
+        register: result
+        failed_when: result.changed
+
+      #
+      - name: Ensure service is absent
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          state: absent
+        register: result
+        failed_when: not result.changed
+
+      - name: Ensure service is absent, again
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name: "HTTP/{{ svc_fqdn }}"
+          state: absent
+        register: result
+        failed_when: result.changed
+
+      # cleanup
+
+      - name: Ensure services are absent.
+        ipaservice:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - "HTTP/{{ svc_fqdn }}"
+          - HTTP/svc.ihavenodns.info
+          state: absent
+
+      - name: Ensure host is absent
+        ipahost:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - "{{ svc_fqdn }}"
+          - "{{ host1_fqdn }}"
+          - "{{ host2_fqdn }}"
+          - svc.ihavenodns.info
+          state: absent
+
+      - name: Ensure testing users are absent.
+        ipauser:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - user01
+          - user02
+          state: absent
+
+      - name: Ensure testing groups are absent.
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - group01
+          - group02
+          state: absent
+
+      - name: Ensure testing hostgroup hostgroup01 is absent.
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - hostgroup01
+          state: absent
+
+      - name: Ensure testing hostgroup hostgroup02 is absent.
+        ipagroup:
+          ipaadmin_password: SomeADMINpassword
+          name:
+          - hostgroup02
+          state: absent
+    when: ipa_version is version('4.7.0', '>=')