diff --git a/plugins/modules/ipadnsforwardzone.py b/plugins/modules/ipadnsforwardzone.py
index a729197b2309a995ccc678c3d0497f8db7bfdc16..1f1e85ec0e2853c07c8a449e460fa07a1f2305f7 100644
--- a/plugins/modules/ipadnsforwardzone.py
+++ b/plugins/modules/ipadnsforwardzone.py
@@ -217,10 +217,20 @@ def main():
     else:
         operation = "add"
 
-    if state == "disabled":
-        wants_enable = False
-    else:
-        wants_enable = True
+    if state in ["enabled", "disabled"]:
+        if action == "member":
+            ansible_module.fail_json(
+                msg="Action `member` cannot be used with state `%s`"
+                    % (state))
+        invalid = [
+            "forwarders", "forwardpolicy", "skip_overlap_check", "permission"
+        ]
+        for x in invalid:
+            if vars()[x] is not None:
+                ansible_module.fail_json(
+                    msg="Argument '%s' can not be used with action "
+                    "'%s', state `%s`" % (x, action, state))
+        wants_enable = (state == "enabled")
 
     if operation == "del":
         invalid = [
@@ -230,7 +240,7 @@ def main():
             if vars()[x] is not None:
                 ansible_module.fail_json(
                     msg="Argument '%s' can not be used with action "
-                    "'%s'" % (x, action))
+                    "'%s', state `%s`" % (x, action, state))
 
     changed = False
     exit_args = {}
@@ -262,7 +272,27 @@ def main():
                 if existing_resource is None and not forwarders:
                     ansible_module.fail_json(msg='No forwarders specified.')
 
-            if existing_resource is not None:
+            if existing_resource is None:
+                if operation == "add":
+                    # does not exist but should be present
+                    # determine args
+                    args = gen_args(forwarders, forwardpolicy,
+                                    skip_overlap_check)
+                    # set command
+                    command = "dnsforwardzone_add"
+                    # enabled or disabled?
+
+                elif operation == "update":
+                    # does not exist and is updating
+                    # trying to update something that doesn't exist, so error
+                    ansible_module.fail_json(
+                        msg="dnsforwardzone '%s' not found." % (name))
+
+                elif operation == "del":
+                    # there's nothnig to do.
+                    continue
+
+            else:   # existing_resource is not None
                 if state != "absent":
                     if forwarders:
                         forwarders = list(
@@ -274,66 +304,51 @@ def main():
                             set(existing_resource["idnsforwarders"])
                             - set(forwarders))
 
-            if existing_resource is None and operation == "update":
-                # does not exist and is updating
-                # trying to update something that doesn't exist, so error
-                ansible_module.fail_json(msg="""dnsforwardzone '%s' is not
-                                                         valid""" % (name))
-            elif existing_resource is None and operation == "del":
-                # does not exists and should be absent
-                # enabled or disabled?
-                is_enabled = "IGNORE"
-            elif existing_resource is not None and operation == "del":
-                # exists but should be absent
-                # set command
-                command = "dnsforwardzone_del"
-                args = {}
-                # enabled or disabled?
-                is_enabled = "IGNORE"
-            elif forwarders is None:
-                # forwarders are not defined its not a delete, update state?
-                # enabled or disabled?
+                if operation == "add":
+                    # exists and should be present, has it changed?
+                    # determine args
+                    args = gen_args(
+                        forwarders, forwardpolicy, skip_overlap_check)
+                    if 'skip_overlap_check' in args:
+                        del args['skip_overlap_check']
+
+                    # set command
+                    if not compare_args_ipa(
+                            ansible_module, args, existing_resource):
+                        command = "dnsforwardzone_mod"
+
+                elif operation == "del":
+                    # exists but should be absent
+                    # set command
+                    command = "dnsforwardzone_del"
+                    args = {}
+
+                elif operation == "update":
+                    # exists and is updating
+                    # calculate the new forwarders and mod
+                    args = gen_args(
+                        forwarders, forwardpolicy, skip_overlap_check)
+                    if "skip_overlap_check" in args:
+                        del args['skip_overlap_check']
+
+                    # command
+                    if not compare_args_ipa(
+                            ansible_module, args, existing_resource):
+                        command = "dnsforwardzone_mod"
+
+            if state in ['enabled', 'disabled']:
                 if existing_resource is not None:
                     is_enabled = existing_resource["idnszoneactive"][0]
                 else:
-                    is_enabled = "IGNORE"
-            elif existing_resource is not None and operation == "update":
-                # exists and is updating
-                # calculate the new forwarders and mod
-                args = gen_args(forwarders, forwardpolicy, skip_overlap_check)
-                if "skip_overlap_check" in args:
-                    del args['skip_overlap_check']
-
-                # command
-                if not compare_args_ipa(ansible_module, args, existing_resource):
-                    command = "dnsforwardzone_mod"
-
-                # enabled or disabled?
-                is_enabled = existing_resource["idnszoneactive"][0]
-
-            elif existing_resource is None and operation == "add":
-                # does not exist but should be present
-                # determine args
-                args = gen_args(forwarders, forwardpolicy,
-                                skip_overlap_check)
-                # set command
-                command = "dnsforwardzone_add"
-                # enabled or disabled?
-                is_enabled = "TRUE"
-
-            elif existing_resource is not None and operation == "add":
-                # exists and should be present, has it changed?
-                # determine args
-                args = gen_args(forwarders, forwardpolicy, skip_overlap_check)
-                if 'skip_overlap_check' in args:
-                    del args['skip_overlap_check']
-
-                # set command
-                if not compare_args_ipa(ansible_module, args, existing_resource):
-                    command = "dnsforwardzone_mod"
-
-                # enabled or disabled?
-                is_enabled = existing_resource["idnszoneactive"][0]
+                    ansible_module.fail_json(
+                        msg="dnsforwardzone '%s' not found." % (name))
+
+            # does the enabled state match what we want (if we care)
+            if is_enabled != "IGNORE":
+                if wants_enable and is_enabled != "TRUE":
+                    commands.append([name, "dnsforwardzone_enable", {}])
+                elif not wants_enable and is_enabled != "FALSE":
+                    commands.append([name, "dnsforwardzone_disable", {}])
 
             # if command is set...
             if command is not None:
@@ -354,20 +369,9 @@ def main():
                     )
 
             for name, command, args in commands:
-                result = api_command(ansible_module, command, name, args)
+                api_command(ansible_module, command, name, args)
                 changed = True
 
-            # does the enabled state match what we want (if we care)
-            if is_enabled != "IGNORE":
-                if wants_enable and is_enabled != "TRUE":
-                    api_command(ansible_module, "dnsforwardzone_enable",
-                                name, {})
-                    changed = True
-                elif not wants_enable and is_enabled != "FALSE":
-                    api_command(ansible_module, "dnsforwardzone_disable",
-                                name, {})
-                    changed = True
-
     except Exception as e:
         ansible_module.fail_json(msg=str(e))
 
diff --git a/tests/dnsforwardzone/test_dnsforwardzone.yml b/tests/dnsforwardzone/test_dnsforwardzone.yml
index 0386bd48032670051c96a877e925b584f922a8ac..223cf3d090b5e44192bd7e8f0476aba3350a339f 100644
--- a/tests/dnsforwardzone/test_dnsforwardzone.yml
+++ b/tests/dnsforwardzone/test_dnsforwardzone.yml
@@ -106,6 +106,22 @@
     register: result
     failed_when: not result.changed
 
+  - name: change zone forward policy
+    ipadnsforwardzone:
+      ipaadmin_password: SomeADMINpassword
+      name: example.com
+      forwardpolicy: first
+    register: result
+    failed_when: not result.changed
+
+  - name: change zone forward policy, again
+    ipadnsforwardzone:
+      ipaadmin_password: SomeADMINpassword
+      name: example.com
+      forwardpolicy: first
+    register: result
+    failed_when: result.changed
+
   - name: ensure forwardzone example.com is absent.
     ipadnsforwardzone:
       ipaadmin_password: SomeADMINpassword
@@ -256,27 +272,15 @@
       action: member
       skip_overlap_check: true
     register: result
-    failed_when: result.changed
+    failed_when: not result.failed or "not found" not in result.msg
 
   - name: try to create a new forwarder with disabled state
-    ipadnsforwardzone:
-      ipaadmin_password: SomeADMINpassword
-      state: disabled
-      name: example.com
-      forwarders:
-        - ip_address: 4.4.4.4
-          port: 8053
-      skip_overlap_check: yes
-    register: result
-    failed_when: not result.changed
-
-  - name: ensure it stays disabled
     ipadnsforwardzone:
       ipaadmin_password: SomeADMINpassword
       name: example.com
       state: disabled
     register: result
-    failed_when: result.changed
+    failed_when: not result.failed or "not found" not in result.msg
 
   - name: Ensure forwardzone is not added without forwarders, with correct message.
     ipadnsforwardzone: