diff --git a/manifests/serial/login.pp b/manifests/serial/login.pp
new file mode 100644
index 0000000000000000000000000000000000000000..2dabdb9e8b1d4717c73e949ff9e0fc636d78563a
--- /dev/null
+++ b/manifests/serial/login.pp
@@ -0,0 +1,99 @@
+# Copyright © 2018   Thomas Bellman, Linköping, Sweden
+# Licensed under the GNU LGPL v3+; see the README file for more information.
+
+
+/*
+ * Manage login (getty) on serial ports.
+ *
+ * Parameters:
+ *  - name		Name of serial port device (without /dev/ prefix).
+ *  - ensure		One of 'enabled' (the default) or 'disabled'.
+ *  - speeds		(List of) speeds in bits/second.
+ *  - termtype  	Default terminal type connected to the port.
+ *  - rootlogin		To 'allow' or 'forbid' root to login on the port.
+ *			Default is to make no changes to /etc/securetty.
+ */
+# FIXME: Currently only supports systemd
+
+define console::serial::login(
+	$ensure='enabled',
+	$speeds=[115200,38400,9600],
+	$termtype='vt100',
+	$rootlogin=undef,
+)
+{
+    case $ensure {
+	'enabled', 'disabled': { }
+	default: {
+	    fail("Console::Serial::Login[${title}]: ",
+		 "Bad value for parameter ensure, ``${ensure}''")
+	}
+    }
+
+    case "${::initsystem}::${::operatingsystem}-${::operatingsystemrelease}"
+    {
+	/systemd::.*/: {
+	    console::serial::login::systemd {
+		$name:
+		    ensure => $ensure,
+		    speeds => $speeds, termtype => $termtype;
+	    }
+	}
+
+	default: {
+	    fail("Console::Serial::Login[${title}]: ",
+		 "Unsupported operating system/init system")
+	}
+    }
+
+    if ($rootlogin != undef  and  $rootlogin != false)
+    {
+	console::rootlogin {
+	    $name:
+		ensure => $rootlogin;
+	}
+    }
+}
+
+
+
+# Internal helper definition
+#
+define console::serial::login::systemd(
+	$ensure,
+	$speeds,
+	$termtype,
+)
+{
+    $svcdir = "/etc/systemd/system/serial-getty@${name}.service.d"
+    file {
+	$svcdir:
+	    ensure => $ensure ? {
+		'enabled' => directory, 'disabled' => undef,
+	    },
+	    owner => 'root', group => 'root', mode => '0755';
+
+	"${svcdir}/param.conf":
+	    ensure => $ensure ? {
+		'enabled' => file, 'disabled' => absent,
+	    },
+	    content => inline_template(
+		"[Service]\n",
+		"ExecStart=\n",
+		"ExecStart=-/sbin/agetty --keep-baud <%= [@speeds].flatten.join(',') %> %I <%= @termtype %>\n"
+	    ),
+	    owner => 'root', group => 'root', mode => '0444',
+	    notify => Service["serial-getty@${name}"];
+    }
+
+    service {
+	"serial-getty@${name}":
+	    ensure => $ensure ? {
+		'enabled' => running, 'disabled' => stopped,
+	    },
+	    enable => $ensure ? {
+		'enabled' => true, 'disabled' => false,
+	    },
+	    ;
+    }
+}