diff --git a/roles/ipaclient/library/ipaclient_set_hostname.py b/roles/ipaclient/library/ipaclient_set_hostname.py
new file mode 100644
index 0000000000000000000000000000000000000000..aed2df594b3c099264e7c4173e73b5c121f63a95
--- /dev/null
+++ b/roles/ipaclient/library/ipaclient_set_hostname.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Authors:
+#   Thomas Woerner <twoerner@redhat.com>
+#
+# Based on ipa-client-install code
+#
+# Copyright (C) 2018  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/>.
+
+ANSIBLE_METADATA = {
+    'metadata_version': '1.0',
+    'supported_by': 'community',
+    'status': ['preview'],
+}
+
+DOCUMENTATION = '''
+---
+module: ipaclient_set_hostname
+short description: Backup and set hostname
+description:
+  Backup and set hostname
+options:
+  hostname:
+    description: The hostname of the machine to join (FQDN).
+    required: true
+author:
+    - Thomas Woerner
+'''
+
+EXAMPLES = '''
+# Backup and set hostname
+- name: Backup and set hostname
+  ipaclient_set_hostname:
+    hostname: client1.example.com
+'''
+
+RETURN = '''
+'''
+
+import os
+import tempfile
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.ansible_ipa_client import *
+
+def main():
+    module = AnsibleModule(
+        argument_spec = dict(
+            hostname=dict(required=True),
+        ),
+        supports_check_mode = True,
+    )
+
+    module._ansible_debug = True
+    hostname = module.params.get('hostname')
+
+    fstore = sysrestore.FileStore(paths.IPA_CLIENT_SYSRESTORE)
+    statestore = sysrestore.StateFile(paths.IPA_CLIENT_SYSRESTORE)
+
+    tasks.backup_hostname(fstore, statestore)
+    tasks.set_hostname(hostname)
+
+    module.exit_json(changed=True)
+
+if __name__ == '__main__':
+    main()
diff --git a/roles/ipaclient/tasks/install.yml b/roles/ipaclient/tasks/install.yml
index 6b78cb948a5aa26441885958400a7a8ee470eb1e..62d9365b9e55199b8ab758999407c11693d57e64 100644
--- a/roles/ipaclient/tasks/install.yml
+++ b/roles/ipaclient/tasks/install.yml
@@ -131,6 +131,11 @@
     failed_when: iparmkeytab.rc != 0 and iparmkeytab.rc != 3 and iparmkeytab.rc != 5
     when: ipaclient_use_otp | bool or ipaclient_force_join | bool
 
+  - name: Install - Backup and set hostname
+    ipaclient_set_hostname:
+      hostname: "{{ ipadiscovery.hostname }}"
+    when: not ipaclient_on_master | bool
+
   - name: Install - Join IPA
     ipajoin:
       servers: "{{ ipadiscovery.servers }}"