diff --git a/plugins/modules/iparole.py b/plugins/modules/iparole.py
index d5b13491b84d303bbc3a55cf48f789f30ea03843..0f2a08054c05bb71c9eac64131223a920c5b3f9e 100644
--- a/plugins/modules/iparole.py
+++ b/plugins/modules/iparole.py
@@ -103,10 +103,10 @@ EXAMPLES = """
 # pylint: disable=no-name-in-module
 from ansible.module_utils._text import to_text
 from ansible.module_utils.ansible_freeipa_module import \
-    IPAAnsibleModule, gen_add_del_lists, compare_args_ipa
+    IPAAnsibleModule, gen_add_del_lists, compare_args_ipa, \
+    gen_intersection_list, ensure_fqdn
 from ansible.module_utils import six
 
-
 if six.PY3:
     unicode = str
 
@@ -170,30 +170,6 @@ def check_parameters(module):
     module.params_fail_used_invalid(invalid, state, action)
 
 
-def member_intersect(module, attr, memberof, res_find):
-    """Filter member arguments from role found by intersection."""
-    params = module.params_get(attr)
-    if not res_find:
-        return params
-    filtered = []
-    if params:
-        existing = res_find.get(memberof, [])
-        filtered = list(set(params) & set(existing))
-    return filtered
-
-
-def member_difference(module, attr, memberof, res_find):
-    """Filter member arguments from role found by difference."""
-    params = module.params_get(attr)
-    if not res_find:
-        return params
-    filtered = []
-    if params:
-        existing = res_find.get(memberof, [])
-        filtered = list(set(params) - set(existing))
-    return filtered
-
-
 def ensure_absent_state(module, name, action, res_find):
     """Define commands to ensure absent state."""
     commands = []
@@ -203,16 +179,20 @@ def ensure_absent_state(module, name, action, res_find):
 
     if action == "member":
 
-        members = member_intersect(
-            module, 'privilege', 'memberof_privilege', res_find)
+        members = gen_intersection_list(
+            module.params_get("privilege"),
+            res_find.get("memberof_privilege")
+        )
         if members:
             commands.append([name, "role_remove_privilege",
                              {"privilege": members}])
 
         member_args = {}
         for key in ['user', 'group', 'host', 'hostgroup']:
-            items = member_intersect(
-                module, key, 'member_%s' % key, res_find)
+            items = gen_intersection_list(
+                module.params_get(key),
+                res_find.get("member_%s" % key)
+            )
             if items:
                 member_args[key] = items
 
@@ -298,24 +278,6 @@ def ensure_role_with_members_is_present(module, name, res_find, action):
     return commands
 
 
-# pylint: disable=unused-argument
-def result_handler(module, result, command, name, args, errors):
-    """Process the result of a command, looking for errors."""
-    # Get all errors
-    # All "already a member" and "not a member" failures in the
-    # result are ignored. All others are reported.
-    if "failed" in result and len(result["failed"]) > 0:
-        for item in result["failed"]:
-            failed_item = result["failed"][item]
-            for member_type in failed_item:
-                for member, failure in failed_item[member_type]:
-                    if "already a member" in failure \
-                       or "not a member" in failure:
-                        continue
-                    errors.append("%s: %s %s: %s" % (
-                        command, member_type, member, failure))
-
-
 def role_commands_for_name(module, state, action, name):
     """Define commands for the Role module."""
     commands = []
@@ -414,7 +376,8 @@ def main():
 
         # Execute commands
 
-        changed = ansible_module.execute_ipa_commands(commands, result_handler)
+        changed = ansible_module.execute_ipa_commands(
+            commands, fail_on_member_errors=True)
 
     # Done
     ansible_module.exit_json(changed=changed, **exit_args)