diff --git a/src/modules/services/main.py b/src/modules/services/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..55d5339e30131d27457cc3be49afdb7f0cac4928
--- /dev/null
+++ b/src/modules/services/main.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+# encoding: utf-8
+# === This file is part of Calamares - <http://github.com/calamares> ===
+#
+#   Copyright 2014, Philip Müller <philm@manjaro.org>
+#   Copyright 2014, Teo Mrnjavac <teo@kde.org>
+#
+#   Calamares 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.
+#
+#   Calamares 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 Calamares. If not, see <http://www.gnu.org/licenses/>.
+
+import libcalamares
+
+
+def run():
+    """ Setup systemd services """
+
+    services = libcalamares.job.configuration['services']
+    targets = libcalamares.job.configuration['targets']
+
+    # enable services
+    for svc in services:
+        ec = libcalamares.utils.chroot_call(['systemctl',
+                                             'enable',
+                                             '{}.service'.format(svc['name'])])
+        if ec != 0:
+            if svc['mandatory']:
+                return "Cannot enable systemd service {}".format(svc['name']),\
+                       "systemctl enable call in chroot returned error code {}".format(ec)
+            else:
+                libcalamares.utils.debug(
+                    "Cannot enable systemd service {}".format(svc['name']))
+                libcalamares.utils.debug(
+                    "systemctl enable call in chroot returned error code {}".format(ec))
+
+    # enable targets
+    for tgt in targets:
+        ec = libcalamares.utils.chroot_call(['systemctl',
+                                             'enable',
+                                             '{}.target'.format(tgt['name'])])
+        if ec != 0:
+            if tgt['mandatory']:
+                return "Cannot enable systemd target {}".format(tgt['name']), \
+                       "systemctl enable call in chroot returned error code {}".format(ec)
+            else:
+                libcalamares.utils.debug(
+                    "Cannot enable systemd target {}".format(tgt['name']))
+                libcalamares.utils.debug(
+                    "systemctl enable call in chroot returned error code {}".format(ec))
+
+    return None
diff --git a/src/modules/services/module.desc b/src/modules/services/module.desc
new file mode 100644
index 0000000000000000000000000000000000000000..eff1dcc631bd8d6dfcc74bfa0dba1baf0de7719b
--- /dev/null
+++ b/src/modules/services/module.desc
@@ -0,0 +1,6 @@
+---
+type:       "job"
+name:       "services"
+interface:  "python"
+requires:   []
+script:     "main.py"
diff --git a/src/modules/services/services.conf b/src/modules/services/services.conf
new file mode 100644
index 0000000000000000000000000000000000000000..0e5c623d2fd6410c917a1c57ac533096b8f4e975
--- /dev/null
+++ b/src/modules/services/services.conf
@@ -0,0 +1,13 @@
+---
+#systemd services and targets are enabled in this precise order
+
+services:
+  - name: "NetworkManager"  #name of the service file
+    mandatory: true         #true=> if enabling fails the installer errors out and quits
+                            #false=>if enabling fails print warning to console and continue
+  - name: "cups"
+    mandatory: false
+
+targets:
+  - name: "graphical"
+    mandatory: true