diff --git a/cdist/conf/type/__service/explorer/service-manager b/cdist/conf/type/__service/explorer/service-manager
new file mode 100755
index 00000000..55a873fa
--- /dev/null
+++ b/cdist/conf/type/__service/explorer/service-manager
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# Assume systemd if systemctl is in PATH.
+if [ "$(command -v systemctl)" ]; then
+	printf "systemd"
+else
+	printf "unknown"
+fi
diff --git a/cdist/conf/type/__service/gencode-remote b/cdist/conf/type/__service/gencode-remote
new file mode 100755
index 00000000..ac62e05f
--- /dev/null
+++ b/cdist/conf/type/__service/gencode-remote
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+manager="$(cat "$__object/explorer/service-manager")"
+name=$__object_id
+action="$(cat "$__object/parameter/action")"
+
+if [ "$manager" = "unknown" ]; then
+	echo "service '$name' '$action'"
+fi
diff --git a/cdist/conf/type/__service/man.rst b/cdist/conf/type/__service/man.rst
new file mode 100644
index 00000000..f9b23d5b
--- /dev/null
+++ b/cdist/conf/type/__service/man.rst
@@ -0,0 +1,51 @@
+cdist-type__service(7)
+======================
+
+NAME
+----
+cdist-type__service - Run action on a system service
+
+
+DESCRIPTION
+-----------
+This type allows you to run an action against a system service.
+
+
+REQUIRED PARAMETERS
+-------------------
+action
+  Arbitrary parameter passed as action. Usually 'start', 'stop', 'reload' or 'restart'.
+
+OPTIONAL PARAMETERS
+-------------------
+None.
+
+
+BOOLEAN PARAMETERS
+------------------
+None.
+
+
+EXAMPLES
+--------
+
+.. code-block:: sh
+
+    # Restart nginx service.
+    __service nginx --action restart
+
+    # Stop postfix service.
+    __service postfix --action stop
+
+
+AUTHORS
+-------
+Timothée Floure <timothee.floure@ungleich.ch>
+
+
+COPYING
+-------
+Copyright \(C) 2019 Timothée Floure. 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.
diff --git a/cdist/conf/type/__service/manifest b/cdist/conf/type/__service/manifest
new file mode 100644
index 00000000..cb5af234
--- /dev/null
+++ b/cdist/conf/type/__service/manifest
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+manager="$(cat "$__object/explorer/service-manager")"
+
+name=$__object_id
+action="$(cat "$__object/parameter/action")"
+
+case "$manager" in
+	systemd)
+		__systemd_service "$name" --action "$action"
+	;;
+	*)
+		# Unknown: handled by `service $NAME $action` in gencode-remote.
+	;;
+esac
diff --git a/cdist/conf/type/__service/parameter/required b/cdist/conf/type/__service/parameter/required
new file mode 100644
index 00000000..a9f84d41
--- /dev/null
+++ b/cdist/conf/type/__service/parameter/required
@@ -0,0 +1 @@
+action