diff --git a/library/ipaapi.py b/library/ipaapi.py
index 78818e7e348d3fa8870abed9f807e2b3bef1c807..95901b4ebbce815454f48ce692b50e59722f2739 100644
--- a/library/ipaapi.py
+++ b/library/ipaapi.py
@@ -72,56 +72,11 @@ subject_base:
 import os
 import sys
 import time
-import gssapi
 import tempfile
 import inspect
 
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-from ipaplatform.paths import paths
-if NUM_VERSION >= 40500 and NUM_VERSION < 40590:
-    from cryptography.hazmat.primitives import serialization
-from ipalib import api, errors, x509
-try:
-    from ipalib.install import sysrestore
-except ImportError:
-    from ipapython import sysrestore
-from ipalib.rpc import delete_persistent_client_session_data
-from ipapython import certdb
-from ipapython.ipautil import CalledProcessError, write_tmp_file, \
-    ipa_generate_password
-from ipapython.dn import DN
-ipa_client_install = None
-try:
-    from ipaclient.install.client import SECURE_PATH, disable_ra
-except ImportError:
-    # Create temporary copy of ipa-client-install script (as
-    # ipa_client_install.py) to be able to import the script easily and also
-    # to remove the global finally clause in which the generated ccache file
-    # gets removed. The ccache file will be needed in the next step.
-    # This is done in a temporary directory that gets removed right after
-    # ipa_client_install has been imported.
-    import shutil
-    temp_dir = tempfile.mkdtemp(dir="/tmp")
-    sys.path.append(temp_dir)
-    temp_file = "%s/ipa_client_install.py" % temp_dir
-
-    with open("/usr/sbin/ipa-client-install", "r") as f_in:
-        with open(temp_file, "w") as f_out:
-            for line in f_in:
-                if line.startswith("finally:"):
-                    break
-                f_out.write(line)
-    import ipa_client_install
-
-    shutil.rmtree(temp_dir, ignore_errors=True)
-    sys.path.remove(temp_dir)
-
-    SECURE_PATH = ("/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:/usr/bin:/usr/sbin")
-    disable_ra = ipa_client_install.disable_ra
-
+from ansible.module_utils.ansible_ipa_client import *
 
 def main():
     module = AnsibleModule(
diff --git a/library/ipadiscovery.py b/library/ipadiscovery.py
index 05a3bd0199c9f9c2f898205e01a480ec02622ee6..fd11544868aae79c0968fbc1693b120bdbc3b152 100644
--- a/library/ipadiscovery.py
+++ b/library/ipadiscovery.py
@@ -150,25 +150,7 @@ import socket
 
 from six.moves.configparser import RawConfigParser
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-if NUM_VERSION < 30201:
-    # See ipapython/version.py
-    IPA_MAJOR,IPA_MINOR,IPA_RELEASE = [ int(x) for x in VERSION.split(".", 2) ]
-    IPA_PYTHON_VERSION = IPA_MAJOR*10000 + IPA_MINOR*100 + IPA_RELEASE
-else:
-    IPA_PYTHON_VERSION = NUM_VERSION
-from ipaplatform.paths import paths
-try:
-    from ipaclient.install import ipadiscovery
-except ImportError:
-    from ipaclient import ipadiscovery
-try:
-    from ipalib.install.sysrestore import SYSRESTORE_STATEFILE
-except ImportError:
-    from ipapython.sysrestore import SYSRESTORE_STATEFILE
-
+from ansible.module_utils.ansible_ipa_client import *
 
 def get_cert_path(cert_path):
     """
@@ -198,7 +180,7 @@ def is_client_configured():
 
     return (os.path.isfile(paths.IPA_DEFAULT_CONF) and
             os.path.isfile(os.path.join(paths.IPA_CLIENT_SYSRESTORE,
-                                        SYSRESTORE_STATEFILE)))
+                                        sysrestore.SYSRESTORE_STATEFILE)))
 
 def get_ipa_conf():
     """
diff --git a/library/ipaextras.py b/library/ipaextras.py
index dd85c1dd84da65e99ac7843c0ecc8664d1140a79..b6792949917114597546e191e85e0f04ad8e2ae1 100644
--- a/library/ipaextras.py
+++ b/library/ipaextras.py
@@ -115,63 +115,9 @@ RETURN = '''
 '''
 
 import os
-import sys
-import tempfile
-import inspect
-import logging
 
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-try:
-    from ipalib.install import sysrestore
-except ImportError:
-    from ipapython import sysrestore
-from ipaplatform.paths import paths
-try:
-    from ipaclient.install.client import CCACHE_FILE, configure_ssh_config, \
-        configure_sshd_config, configure_automount, configure_firefox, \
-        configure_nisdomain
-except ImportError:
-    # Create temporary copy of ipa-client-install script (as
-    # ipa_client_install.py) to be able to import the script easily and also
-    # to remove the global finally clause in which the generated ccache file
-    # gets removed. The ccache file will be needed in the next step.
-    # This is done in a temporary directory that gets removed right after
-    # ipa_client_install has been imported.
-    import shutil
-    temp_dir = tempfile.mkdtemp(dir="/tmp")
-    sys.path.append(temp_dir)
-    temp_file = "%s/ipa_client_install.py" % temp_dir
-
-    with open("/usr/sbin/ipa-client-install", "r") as f_in:
-        with open(temp_file, "w") as f_out:
-            for line in f_in:
-                if line.startswith("finally:"):
-                    break
-                f_out.write(line)
-    import ipa_client_install
-
-    shutil.rmtree(temp_dir, ignore_errors=True)
-    sys.path.remove(temp_dir)
-
-    argspec = inspect.getargspec(ipa_client_install.configure_nisdomain)
-    if len(argspec.args) == 3:
-        configure_nisdomain = ipa_client_install.configure_nisdomain
-    else:
-        def configure_nisdomain(options, domain, statestore=None):
-            return ipa_client_install.configure_nisdomain(options, domain)
-
-    CCACHE_FILE = paths.IPA_DNS_CCACHE
-    configure_ssh_config = ipa_client_install.configure_ssh_config
-    configure_sshd_config = ipa_client_install.configure_sshd_config
-    configure_automount = ipa_client_install.configure_automount
-    configure_firefox = ipa_client_install.configure_firefox
-try:
-    from ipaclient.install import ntpconf
-except ImportError:
-    from ipaclient import ntpconf
+from ansible.module_utils.ansible_ipa_client import *
 
 def main():
     module = AnsibleModule(
@@ -214,13 +160,9 @@ def main():
     
     fstore = sysrestore.FileStore(paths.IPA_CLIENT_SYSRESTORE)
     statestore = sysrestore.StateFile(paths.IPA_CLIENT_SYSRESTORE)
-    logger = logging.getLogger("ipa-client-install")
 
-    os.environ['KRB5CCNAME'] = CCACHE_FILE
+    os.environ['KRB5CCNAME'] = paths.IPA_DNS_CCACHE
     
-    class Object(object):
-        pass
-    options = Object()
     options.sssd = sssd
     options.trust_sshfp = trust_sshfp
     options.location = automount_location
@@ -254,7 +196,7 @@ def main():
 
     # Cleanup: Remove CCACHE_FILE
     try:
-        os.remove(CCACHE_FILE)
+        os.remove(paths.IPA_DNS_CCACHE)
     except Exception:
         pass
 
diff --git a/library/ipafixca.py b/library/ipafixca.py
index 7499f3d8f113a140841d6eda4bcc2beeb05d6bae..030f60ebf3189fcd6973bf9fcdbac67333b7b136 100644
--- a/library/ipafixca.py
+++ b/library/ipafixca.py
@@ -64,56 +64,10 @@ EXAMPLES = '''
 RETURN = '''
 '''
 
-iclass Object(object):
-    pass
-options = Object()
-
 import os
-import sys
-import tempfile
-import inspect
 
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-from ipalib import errors
-from ipaplatform.paths import paths
-try:
-    from ipalib.install import sysrestore
-except ImportError:
-    from ipapython import sysrestore
-try:
-    from ipaclient.install.client import get_ca_certs, SECURE_PATH
-except ImportError:
-    # Create temporary copy of ipa-client-install script (as
-    # ipa_client_install.py) to be able to import the script easily and also
-    # to remove the global finally clause in which the generated ccache file
-    # gets removed. The ccache file will be needed in the next step.
-    # This is done in a temporary directory that gets removed right after
-    # ipa_client_install has been imported.
-    import shutil
-    temp_dir = tempfile.mkdtemp(dir="/tmp")
-    sys.path.append(temp_dir)
-    temp_file = "%s/ipa_client_install.py" % temp_dir
-
-    with open("/usr/sbin/ipa-client-install", "r") as f_in:
-        with open(temp_file, "w") as f_out:
-            for line in f_in:
-                if line.startswith("finally:"):
-                    break
-                f_out.write(line)
-    import ipa_client_install
-
-    shutil.rmtree(temp_dir, ignore_errors=True)
-    sys.path.remove(temp_dir)
-
-    if NUM_VERSION < 40100:
-        get_ca_cert = ipa_client_install.get_ca_cert
-    else:
-        get_ca_certs = ipa_client_install.get_ca_certs
-    SECURE_PATH = ("/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:/usr/bin:/usr/sbin")
-
+from ansible.module_utils.ansible_ipa_client import *
     
 def main():
     module = AnsibleModule(
@@ -144,12 +98,11 @@ def main():
     changed = False
     if not os.path.exists(paths.IPA_CA_CRT):
         if not allow_repair:
-            module.fail_json(msg="%s missing, enable allow_repair to fix it." % paths.IPA_CA_CRT)
-        
-        # Repair missing ca.crt file
-
-        from ipaclient.install.client import get_ca_certs
+            module.fail_json(
+                msg="%s missing, enable allow_repair to fix it." % \
+                paths.IPA_CA_CRT)
 
+        # Repair missing ca.crt file
         try:
             os.environ['KRB5_CONFIG'] = env['KRB5_CONFIG'] = "/etc/krb5.conf"
             env['KRB5CCNAME'] = os.environ['KRB5CCNAME']
diff --git a/library/ipafstore.py b/library/ipafstore.py
index 73fffc30b33827b50364518c2e3dde6ad9a4cfac..c611346c65368f90cf54cfd36b506a277f5709dd 100644
--- a/library/ipafstore.py
+++ b/library/ipafstore.py
@@ -52,14 +52,7 @@ RETURN = '''
 '''
 
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-try:
-    from ipalib.install import sysrestore
-except ImportError:
-    from ipapython import sysrestore
-from ipaplatform.paths import paths
+from ansible.module_utils.ansible_ipa_client import *
 
 def main():
     module = AnsibleModule(
diff --git a/library/ipajoin.py b/library/ipajoin.py
index 741b0c3442e135b9c69327952556f1fc902033ea..e559f3cf9c94b5719706264a762f7c539625f32d 100644
--- a/library/ipajoin.py
+++ b/library/ipajoin.py
@@ -120,81 +120,11 @@ already_joined:
   type: bool
 '''
 
-class Object(object):
-    pass
-options = Object()
-
 import os
-import sys
-import gssapi
 import tempfile
-import inspect
 
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-from ipalib import errors
-from ipaplatform.paths import paths
-try:
-    from ipalib.install import sysrestore
-except ImportError:
-    from ipapython import sysrestore
-try:
-    from ipalib.install.kinit import kinit_keytab, kinit_password
-except ImportError:
-    from ipapython.ipautil import kinit_keytab, kinit_password
-try:
-    from ipaclient.install.client import configure_krb5_conf, get_ca_certs, \
-        SECURE_PATH
-except ImportError:
-    # Create temporary copy of ipa-client-install script (as
-    # ipa_client_install.py) to be able to import the script easily
-    # and also to remove the global finally clause in which the
-    # generated ccache file gets removed. The ccache file will be
-    # needed in the next step.
-    # This is done in a temporary directory that gets removed right
-    # after ipa_client_install has been imported.
-    import shutil
-    temp_dir = tempfile.mkdtemp(dir="/tmp")
-    sys.path.append(temp_dir)
-    temp_file = "%s/ipa_client_install.py" % temp_dir
-
-    with open("/usr/sbin/ipa-client-install", "r") as f_in:
-        with open(temp_file, "w") as f_out:
-            for line in f_in:
-                if line.startswith("finally:"):
-                    break
-                f_out.write(line)
-    import ipa_client_install
-
-    shutil.rmtree(temp_dir, ignore_errors=True)
-    sys.path.remove(temp_dir)
-
-    argspec = inspect.getargspec(ipa_client_install.configure_krb5_conf)
-    if argspec.keywords is None:
-        def configure_krb5_conf(
-                cli_realm, cli_domain, cli_server, cli_kdc, dnsok,
-                filename, client_domain, client_hostname, force,
-                configure_sssd):
-            global options
-            options.force = force
-            options.sssd = configure_sssd
-            return ipa_client_install.configure_krb5_conf(
-                cli_realm, cli_domain, cli_server, cli_kdc, dnsok, options,
-                filename, client_domain, client_hostname)
-    else:
-        configure_krb5_conf = ipa_client_install.configure_krb5_conf
-    if NUM_VERSION < 40100:
-        get_ca_cert = ipa_client_install.get_ca_cert
-    else:
-        get_ca_certs = ipa_client_install.get_ca_certs
-    SECURE_PATH = ("/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:/usr/bin:/usr/sbin")
-from ipapython.ipautil import realm_to_suffix, run
-
-
-import logging
-logger = logging.getLogger("ipa-client-install")
+from ansible.module_utils.ansible_ipa_client import *
 
 def main():
     module = AnsibleModule(
@@ -295,7 +225,7 @@ def main():
                                  ccache_name,
                                  config=krb_name,
                                  attempts=kinit_attempts)
-                except gssapi.exceptions.GSSError as e:
+                except GSSError as e:
                     module.fail_json(
                         msg="Kerberos authentication failed: {}".format(e))
             else:
@@ -356,7 +286,7 @@ def main():
                          config=krb_name,
                          attempts=kinit_attempts)
             env['KRB5CCNAME'] = os.environ['KRB5CCNAME'] = paths.IPA_DNS_CCACHE
-        except gssapi.exceptions.GSSError as e:
+        except GSSError as e:
             # failure to get ticket makes it impossible to login and
             # bind from sssd to LDAP, abort installation
             module.fail_json(msg="Failed to obtain host TGT: %s" % e)
diff --git a/library/ipanss.py b/library/ipanss.py
index ab725874d5c03f0cc92c827973af1a468bd16534..31fdf80e6135993026ff299944735b978c2c9db0 100644
--- a/library/ipanss.py
+++ b/library/ipanss.py
@@ -93,79 +93,10 @@ RETURN = '''
 '''
 
 import os
-import sys
 import time
-import gssapi
-import tempfile
-import inspect
-import logging
 
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-from ipalib import api, errors, x509
-try:
-    from ipalib.install import certmonger
-except ImportError:
-    from ipapython import certmonger
-try:
-    from ipalib.install import certstore
-except ImportError:
-    from ipalib import certstore
-try:
-    from ipalib.install import sysrestore
-except ImportError:
-    from ipapython import sysrestore
-try:
-    from ipalib.install.kinit import kinit_keytab, kinit_password
-except ImportError:
-    from ipapython.ipautil import kinit_keytab, kinit_password
-from ipalib.rpc import delete_persistent_client_session_data
-from ipapython.dn import DN
-from ipaplatform import services
-from ipaplatform.paths import paths
-from ipaplatform.tasks import tasks
-from ipapython import certdb, ipautil
-from ipapython.ipautil import CalledProcessError
-from ipapython.ipa_log_manager import standard_logging_setup
-
-try:
-    from ipaclient.install.client import CCACHE_FILE, client_dns, configure_certmonger, update_ssh_keys, configure_openldap_conf, hardcode_ldap_server, get_certs_from_ldap, save_state, disable_ra, create_ipa_nssdb
-except ImportError:
-    # Create temporary copy of ipa-client-install script (as
-    # ipa_client_install.py) to be able to import the script easily and also
-    # to remove the global finally clause in which the generated ccache file
-    # gets removed. The ccache file will be needed in the next step.
-    # This is done in a temporary directory that gets removed right after
-    # ipa_client_install has been imported.
-    import shutil
-    temp_dir = tempfile.mkdtemp(dir="/tmp")
-    sys.path.append(temp_dir)
-    temp_file = "%s/ipa_client_install.py" % temp_dir
-
-    with open("/usr/sbin/ipa-client-install", "r") as f_in:
-        with open(temp_file, "w") as f_out:
-            for line in f_in:
-                if line.startswith("finally:"):
-                    break
-                f_out.write(line)
-    import ipa_client_install
-
-    shutil.rmtree(temp_dir, ignore_errors=True)
-    sys.path.remove(temp_dir)
-
-    CCACHE_FILE = paths.IPA_DNS_CCACHE
-    client_dns = ipa_client_install.client_dns
-    configure_certmonger = ipa_client_install.configure_certmonger
-    update_ssh_keys = ipa_client_install.update_ssh_keys
-    configure_openldap_conf = ipa_client_install.configure_openldap_conf
-    hardcode_ldap_server = ipa_client_install.hardcode_ldap_server
-    get_certs_from_ldap = ipa_client_install.get_certs_from_ldap
-    save_state = ipa_client_install.save_state
-    disable_ra = ipa_client_install.disable_ra
-
-    from ipapython.certdb import create_ipa_nssdb
+from ansible.module_utils.ansible_ipa_client import *
 
 def main():
     module = AnsibleModule(
@@ -198,16 +129,12 @@ def main():
 
     fstore = sysrestore.FileStore(paths.IPA_CLIENT_SYSRESTORE)
     statestore = sysrestore.StateFile(paths.IPA_CLIENT_SYSRESTORE)
-    logger = logging.getLogger("ipa-client-install")
     standard_logging_setup(
         paths.IPACLIENT_INSTALL_LOG, verbose=True, debug=False,
         filemode='a', console_format='%(message)s')
 
-    os.environ['KRB5CCNAME'] = CCACHE_FILE
+    os.environ['KRB5CCNAME'] = paths.IPA_DNS_CCACHE
     
-    class Object(object):
-        pass
-    options = Object()
     options.dns_updates = False
     options.all_ip_addresses = False
     options.ip_addresses = None
@@ -278,7 +205,7 @@ def main():
     update_ssh_keys(hostname, ssh_config_dir, options.create_sshfp)
 
     try:
-        os.remove(CCACHE_FILE)
+        os.remove(paths.IPA_DNS_CCACHE)
     except Exception:
         pass
 
diff --git a/library/ipasssd.py b/library/ipasssd.py
index 8a72711510a2c5f93589514485f6bb26338d23c8..3b2a567f1c17a7d549087ca39ecfcd6c7073f28a 100644
--- a/library/ipasssd.py
+++ b/library/ipasssd.py
@@ -112,40 +112,7 @@ import tempfile
 import SSSDConfig
 
 from ansible.module_utils.basic import AnsibleModule
-try:
-    from ipalib.install import sysrestore
-except ImportError:
-    from ipapython import sysrestore
-from ipaplatform.paths import paths
-from ipapython.ipautil import file_exists
-try:
-    from ipaclient.install.client import get_server_connection_interface, \
-        configure_nsswitch_database
-except ImportError:
-    # Create temporary copy of ipa-client-install script (as
-    # ipa_client_install.py) to be able to import the script easily and also
-    # to remove the global finally clause in which the generated ccache file
-    # gets removed. The ccache file will be needed in the next step.
-    # This is done in a temporary directory that gets removed right after
-    # ipa_client_install has been imported.
-    import shutil
-    temp_dir = tempfile.mkdtemp(dir="/tmp")
-    sys.path.append(temp_dir)
-    temp_file = "%s/ipa_client_install.py" % temp_dir
-
-    with open("/usr/sbin/ipa-client-install", "r") as f_in:
-        with open(temp_file, "w") as f_out:
-            for line in f_in:
-                if line.startswith("finally:"):
-                    break
-                f_out.write(line)
-    import ipa_client_install
-
-    shutil.rmtree(temp_dir, ignore_errors=True)
-    sys.path.remove(temp_dir)
-
-    get_server_connection_interface = ipa_client_install.get_server_connection_interface
-    configure_nsswitch_database = ipa_client_install.configure_nsswitch_database
+from ansible.module_utils.ansible_ipa_client import *
 
 def sssd_enable_service(module, sssdconfig, service):
     try:
diff --git a/library/ipatest.py b/library/ipatest.py
index 500dffb12bd7d73b85efb8f6305e3f7e2c2f4ed8..9dc5e42e2bfc2f4569b81116822fff95a6f6beed 100644
--- a/library/ipatest.py
+++ b/library/ipatest.py
@@ -105,65 +105,10 @@ class Object(object):
 options = Object()
 
 import os
-import sys
-import gssapi
 import tempfile
-import inspect
 
 from ansible.module_utils.basic import AnsibleModule
-from ipapython.version import NUM_VERSION, VERSION
-if NUM_VERSION < 40400:
-    raise Exception("freeipa version '%s' is too old" % VERSION)
-from ipaplatform.paths import paths
-try:
-    from ipalib.install.kinit import kinit_keytab
-except ImportError:
-    from ipapython.ipautil import kinit_keytab
-try:
-    from ipaclient.install.client import configure_krb5_conf, SECURE_PATH
-except ImportError:
-    # Create temporary copy of ipa-client-install script (as
-    # ipa_client_install.py) to be able to import the script easily and also
-    # to remove the global finally clause in which the generated ccache file
-    # gets removed. The ccache file will be needed in the next step.
-    # This is done in a temporary directory that gets removed right after
-    # ipa_client_install has been imported.
-    import shutil
-    temp_dir = tempfile.mkdtemp(dir="/tmp")
-    sys.path.append(temp_dir)
-    temp_file = "%s/ipa_client_install.py" % temp_dir
-
-    with open("/usr/sbin/ipa-client-install", "r") as f_in:
-        with open(temp_file, "w") as f_out:
-            for line in f_in:
-                if line.startswith("finally:"):
-                    break
-                f_out.write(line)
-    import ipa_client_install
-
-    shutil.rmtree(temp_dir, ignore_errors=True)
-    sys.path.remove(temp_dir)
-
-    argspec = inspect.getargspec(ipa_client_install.configure_krb5_conf)
-    if argspec.keywords is None:
-        def configure_krb5_conf(
-                cli_realm, cli_domain, cli_server, cli_kdc, dnsok,
-                filename, client_domain, client_hostname, force,
-                configure_sssd):
-            global options
-            options.force = force
-            options.sssd = configure_sssd
-            return ipa_client_install.configure_krb5_conf(
-                cli_realm, cli_domain, cli_server, cli_kdc, dnsok, options,
-                filename, client_domain, client_hostname)
-    else:
-        configure_krb5_conf = ipa_client_install.configure_krb5_conf
-    SECURE_PATH = ("/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:/usr/bin:/usr/sbin")
-from ipapython.ipautil import realm_to_suffix, run
-
-
-import logging
-logger = logging.getLogger("ipa-client-install")
+from ansible.module_utils.ansible_ipa_client import *
 
 def main():
     module = AnsibleModule(
@@ -218,7 +163,7 @@ def main():
                 ipa_test_ok = True
         except OSError:
             pass
-    except gssapi.exceptions.GSSError as e:
+    except GSSError as e:
         pass
 
     # Second try: Validate krb5 keytab with temporary krb5
@@ -256,7 +201,7 @@ def main():
               except OSError:
                   pass
 
-          except gssapi.exceptions.GSSError as e:
+          except GSSError as e:
               pass
 
       finally:
diff --git a/module_utils/ansible_ipa_client.py b/module_utils/ansible_ipa_client.py
new file mode 100644
index 0000000000000000000000000000000000000000..5a7798c117c4f6bf90ff24cc154f7137ddc576e2
--- /dev/null
+++ b/module_utils/ansible_ipa_client.py
@@ -0,0 +1,167 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Authors:
+#   Thomas Woerner <twoerner@redhat.com>
+#
+# Based on ipa-client-install code
+#
+# Copyright (C) 2017  Red Hat
+# see file 'COPYING' for use and warranty information
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from ipapython.version import NUM_VERSION, VERSION
+
+if NUM_VERSION < 30201:
+    # See ipapython/version.py
+    IPA_MAJOR,IPA_MINOR,IPA_RELEASE = [ int(x) for x in VERSION.split(".", 2) ]
+    IPA_PYTHON_VERSION = IPA_MAJOR*10000 + IPA_MINOR*100 + IPA_RELEASE
+else:
+    IPA_PYTHON_VERSION = NUM_VERSION
+
+class options_obj(object):
+    pass
+options = options_obj()
+
+if NUM_VERSION >= 40400:
+    # IPA version >= 4.4
+
+    import sys
+    import inspect
+    import logging
+
+    try:
+        from ipaclient.install import ipadiscovery
+    except ImportError:
+        from ipaclient import ipadiscovery
+    from ipalib import api, errors, x509
+    try:
+        from ipalib.install import sysrestore
+    except ImportError:
+        from ipapython import sysrestore
+    try:
+        from ipalib.install import certmonger
+    except ImportError:
+        from ipapython import certmonger
+    try:
+        from ipalib.install import certstore
+    except ImportError:
+        from ipalib import certstore
+    from ipalib.rpc import delete_persistent_client_session_data
+    from ipapython import certdb, ipautil
+    from ipaplatform import services
+    from ipaplatform.paths import paths
+    from ipaplatform.tasks import tasks
+    if NUM_VERSION >= 40500 and NUM_VERSION < 40590:
+        from cryptography.hazmat.primitives import serialization
+    from ipapython.ipautil import CalledProcessError, write_tmp_file, \
+        ipa_generate_password, file_exists
+    from ipapython.dn import DN
+    try:
+        from ipalib.install.kinit import kinit_keytab, kinit_password
+    except ImportError:
+        from ipapython.ipautil import kinit_keytab, kinit_password
+    from ipapython.ipa_log_manager import standard_logging_setup
+    from gssapi.exceptions import GSSError
+    try:
+        from ipaclient.install.client import configure_krb5_conf, \
+            get_ca_certs, SECURE_PATH, get_server_connection_interface, \
+            configure_nsswitch_database, disable_ra, client_dns, \
+            configure_certmonger, update_ssh_keys, configure_openldap_conf, \
+            hardcode_ldap_server, get_certs_from_ldap, save_state, \
+            create_ipa_nssdb, configure_ssh_config, configure_sshd_config, \
+            configure_automount, configure_firefox, configure_nisdomain
+    except ImportError:
+        # Create temporary copy of ipa-client-install script (as
+        # ipa_client_install.py) to be able to import the script easily
+        # and also to remove the global finally clause in which the
+        # generated ccache file gets removed. The ccache file will be
+        # needed in the next step.
+        # This is done in a temporary directory that gets removed right
+        # after ipa_client_install has been imported.
+        import shutil, tempfile
+        temp_dir = tempfile.mkdtemp(dir="/tmp")
+        sys.path.append(temp_dir)
+        temp_file = "%s/ipa_client_install.py" % temp_dir
+
+        with open("/usr/sbin/ipa-client-install", "r") as f_in:
+            with open(temp_file, "w") as f_out:
+                for line in f_in:
+                    if line.startswith("finally:"):
+                        break
+                    f_out.write(line)
+        import ipa_client_install
+
+        shutil.rmtree(temp_dir, ignore_errors=True)
+        sys.path.remove(temp_dir)
+
+        argspec = inspect.getargspec(ipa_client_install.configure_krb5_conf)
+        if argspec.keywords is None:
+            def configure_krb5_conf(
+                    cli_realm, cli_domain, cli_server, cli_kdc, dnsok,
+                    filename, client_domain, client_hostname, force=False,
+                    configure_sssd=True):
+                global options
+                options.force = force
+                options.sssd = configure_sssd
+                return ipa_client_install.configure_krb5_conf(
+                    cli_realm, cli_domain, cli_server, cli_kdc, dnsok, options,
+                    filename, client_domain, client_hostname)
+        else:
+            configure_krb5_conf = ipa_client_install.configure_krb5_conf
+        if NUM_VERSION < 40100:
+            get_ca_cert = ipa_client_install.get_ca_cert
+        else:
+            get_ca_certs = ipa_client_install.get_ca_certs
+        SECURE_PATH = ("/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:/usr/bin:/usr/sbin")
+
+        get_server_connection_interface = ipa_client_install.get_server_connection_interface
+        configure_nsswitch_database = ipa_client_install.configure_nsswitch_database
+        disable_ra = ipa_client_install.disable_ra
+        client_dns = ipa_client_install.client_dns
+        configure_certmonger = ipa_client_install.configure_certmonger
+        update_ssh_keys = ipa_client_install.update_ssh_keys
+        configure_openldap_conf = ipa_client_install.configure_openldap_conf
+        hardcode_ldap_server = ipa_client_install.hardcode_ldap_server
+        get_certs_from_ldap = ipa_client_install.get_certs_from_ldap
+        save_state = ipa_client_install.save_state
+
+        create_ipa_nssdb = certdb.create_ipa_nssdb
+
+        argspec = inspect.getargspec(ipa_client_install.configure_nisdomain)
+        if len(argspec.args) == 3:
+            configure_nisdomain = ipa_client_install.configure_nisdomain
+        else:
+            def configure_nisdomain(options, domain, statestore=None):
+                return ipa_client_install.configure_nisdomain(options, domain)
+
+        configure_ssh_config = ipa_client_install.configure_ssh_config
+        configure_sshd_config = ipa_client_install.configure_sshd_config
+        configure_automount = ipa_client_install.configure_automount
+        configure_firefox = ipa_client_install.configure_firefox
+
+    from ipapython.ipautil import realm_to_suffix, run
+
+    try:
+        from ipaclient.install import ntpconf
+    except ImportError:
+        from ipaclient import ntpconf
+
+    logger = logging.getLogger("ipa-client-install")
+
+else:
+    # IPA version < 4.4
+
+    raise Exception("freeipa version '%s' is too old" % VERSION)
diff --git a/roles/ipaclient/meta/main.yml b/roles/ipaclient/meta/main.yml
index 6e713b45d1ee39ff96be8e8e275202db0f2048c2..13f398d739db3a51986b512ed1cd3ed7be566346 100644
--- a/roles/ipaclient/meta/main.yml
+++ b/roles/ipaclient/meta/main.yml
@@ -1,5 +1,5 @@
 galaxy_info:
-  author: Florence Blanc-Renaud
+  author: Florence Blanc-Renaud, Thomas Woerner
   description: A role to join a machine to an IPA domain
   company: Red Hat, Inc
 
@@ -7,7 +7,7 @@ galaxy_info:
 
   license: GPLv3
 
-  min_ansible_version: 2.0
+  min_ansible_version: 2.3.1
 
   #github_branch: