diff -uNrb tdebase-orig/cmake/modules/FindSystemd.cmake tdebase/cmake/modules/FindSystemd.cmake
--- tdebase-orig/cmake/modules/FindSystemd.cmake	1969-12-31 18:00:00.000000000 -0600
+++ tdebase/cmake/modules/FindSystemd.cmake	2014-02-25 21:59:05.661435238 -0600
@@ -0,0 +1,39 @@
+# Finds systemd and its libraries
+# Not a huge module but sufficient for now
+# Uses the same semantics as pkg_check_modules, i.e. ${LIB}{_FOUND,_INCLUDE_DIR,_LIBRARIES}
+# where ${LIB} can be one of the following:
+#     LIBSYSTEMD_JOURNAL, SYSTEMD, LIBSYSTEMD_DAEMON, LIBSYSTEMD_LOGIN, LIBSYSTEMD_ID128
+#
+# Copyright: Red Hat, Inc. 2013
+# Author: Martin Briza <mbriza@redhat.com>
+#
+# Distributed under the BSD license. See COPYING-CMAKE-SCRIPTS for details.
+
+#defining any of these disables systemd support
+if (NOT LIBSYSTEMD_JOURNAL_FOUND AND
+    NOT SYSTEMD_FOUND AND
+    NOT LIBSYSTEMD_DAEMON_FOUND AND
+    NOT LIBSYSTEMD_LOGIN_FOUND AND
+    NOT LIBSYSTEMD_ID128_FOUND)
+find_package(PkgConfig)
+if (PKG_CONFIG_FOUND)
+    pkg_check_modules(LIBSYSTEMD_JOURNAL QUIET "libsystemd-journal")
+    pkg_check_modules(SYSTEMD QUIET "systemd")
+    pkg_check_modules(LIBSYSTEMD_DAEMON QUIET "libsystemd-daemon")
+    pkg_check_modules(LIBSYSTEMD_LOGIN QUIET "libsystemd-login")
+    pkg_check_modules(LIBSYSTEMD_ID128 QUIET "libsystemd-id128")
+endif (PKG_CONFIG_FOUND)
+
+if (SYSTEMD_FOUND)
+    message(STATUS "Found systemd")
+endif(SYSTEMD_FOUND)
+
+mark_as_advanced(LIBSYSTEMD_JOURNAL_FOUND       SYSTEMD_FOUND       LIBSYSTEMD_DAEMON_FOUND       LIBSYSTEMD_LOGIN_FOUND       LIBSYSTEMD_ID128_FOUND)
+mark_as_advanced(LIBSYSTEMD_JOURNAL_INCLUDE_DIR SYSTEMD_INCLUDE_DIR LIBSYSTEMD_DAEMON_INCLUDE_DIR LIBSYSTEMD_LOGIN_INCLUDE_DIR LIBSYSTEMD_ID128_INCLUDE_DIR)
+mark_as_advanced(LIBSYSTEMD_JOURNAL_LIBRARIES   SYSTEMD_LIBRARIES   LIBSYSTEMD_DAEMON_LIBRARIES   LIBSYSTEMD_LOGIN_LIBRARIES   LIBSYSTEMD_ID128_LIBRARIES)
+
+endif (NOT LIBSYSTEMD_JOURNAL_FOUND AND
+       NOT SYSTEMD_FOUND AND
+       NOT LIBSYSTEMD_DAEMON_FOUND AND
+       NOT LIBSYSTEMD_LOGIN_FOUND AND
+       NOT LIBSYSTEMD_ID128_FOUND)
diff -uNrb tdebase-orig/CMakeLists.txt tdebase/CMakeLists.txt
--- tdebase-orig/CMakeLists.txt	2014-02-05 09:05:00.000000000 -0600
+++ tdebase/CMakeLists.txt	2014-02-25 23:19:37.410026853 -0600
@@ -298,6 +298,14 @@
   set( KICKOFF_DIST_CONFIG_SHORTCUT2 "/usr/share/applications/rpmdrake.desktop" )
 endif()
 
+##### check if systemd is installed #############
+find_package(Systemd)
+# set_package_properties(Systemd PROPERTIES DESCRIPTION "Init and service manager for Linux"
+#   URL "http://www.freedesktop.org/wiki/Software/systemd"
+#   TYPE OPTIONAL
+#   PURPOSE "Provides automatic multi-seat, session and power management features"
+#   )
+
 ##### write configure files #####################
 
 configure_file( config.h.cmake config.h @ONLY )
diff -uNrb tdebase-orig/tdm/backend/client.c tdebase/tdm/backend/client.c
--- tdebase-orig/tdm/backend/client.c	2014-02-05 09:05:00.000000000 -0600
+++ tdebase/tdm/backend/client.c	2014-02-25 22:13:24.421272352 -0600
@@ -1313,6 +1313,14 @@
 #endif
 	userEnviron = inheritEnv( env, envvars );
 	env = systemEnv( p->pw_name );
+#ifdef WITH_SYSTEMD
+	if (td->systemdSeat) {
+	    char *envbuf;
+	    ASPrintf(&envbuf, "XDG_SEAT=%s", td->systemdSeat);
+	    pam_putenv(pamh, envbuf);
+	    env = setEnv(env, "XDG_SEAT", td->systemdSeat);
+	}
+#endif
 	systemEnviron = setEnv( env, "HOME", p->pw_dir );
 	Debug( "user environment:\n%[|''>'\n's"
 	       "system environment:\n%[|''>'\n's"
diff -uNrb tdebase-orig/tdm/backend/CMakeLists.txt tdebase/tdm/backend/CMakeLists.txt
--- tdebase-orig/tdm/backend/CMakeLists.txt	2014-02-05 09:05:00.000000000 -0600
+++ tdebase/tdm/backend/CMakeLists.txt	2014-02-25 22:08:14.823002225 -0600
@@ -11,10 +11,17 @@
 
 # FIXME this is far from complete!!!
 
+## systemd libraries
+if(LIBSYSTEMD_LOGIN_FOUND AND LIBSYSTEMD_DAEMON_FOUND)
+    add_definitions( -DWITH_SYSTEMD=1 )
+    set(TDM_SYSTEMD_LIBRARIES ${LIBSYSTEMD_DAEMON_LIBRARIES} ${LIBSYSTEMD_LOGIN_LIBRARIES} )
+endif(LIBSYSTEMD_LOGIN_FOUND AND LIBSYSTEMD_DAEMON_FOUND)
+
 include_directories(
   ${CMAKE_CURRENT_BINARY_DIR}
   ${CMAKE_BINARY_DIR}
   ${DBUS_INCLUDE_DIRS}
+  ${TDM_SYSTEMD_LIBRARIES}
 )
 
 link_directories(
diff -uNrb tdebase-orig/tdm/backend/dm.c tdebase/tdm/backend/dm.c
--- tdebase-orig/tdm/backend/dm.c	2012-02-27 10:09:46.000000000 -0600
+++ tdebase/tdm/backend/dm.c	2014-02-25 23:53:04.810115879 -0600
@@ -51,6 +51,23 @@
 # include <sys/vt.h>
 #endif
 
+#ifdef WITH_SYSTEMD
+# include <systemd/sd-login.h>
+# include <systemd/sd-daemon.h>
+
+#define SYSTEMD_FAILURE_LIMIT 25
+
+static int systemdMonitorInit(void);
+static void systemdMonitorDeinit();
+static int systemdStartDisplay(char *);
+static void systemdCheckAdded(char **);
+static void systemdCheckRemoved(char **);
+static void systemdHandleChange();
+
+sd_login_monitor *systemdMonitor = NULL;
+int systemdMonitorFd = -1;
+#endif
+
 static void SigHandler( int n );
 static int ScanConfigs( int force );
 static void StartDisplays( void );
@@ -277,8 +294,17 @@
 #ifdef XDMCP
 	UpdateListenSockets();
 #endif
+
+#ifdef WITH_SYSTEMD
+	if (systemdMonitorInit())
+	    systemdHandleChange();
+#endif
+
 	openCtrl( 0 );
 	MainLoop();
+#ifdef WITH_SYSTEMD
+	systemdMonitorDeinit();
+#endif
 	closeCtrl( 0 );
 	if (sdRec.how) {
 		commitBootOption();
@@ -1189,6 +1215,13 @@
 				}
 				continue;
 			}
+#ifdef WITH_SYSTEMD
+			if (systemdMonitorFd >= 0 && FD_ISSET(systemdMonitorFd, &reads)) {
+			    systemdHandleChange();
+			    sd_login_monitor_flush(systemdMonitor);
+			    continue;
+			}
+#endif
 #ifdef XDMCP
 			if (ProcessListenSockets( &reads ))
 				continue;
@@ -1213,6 +1246,151 @@
 	}
 }
 
+#ifdef WITH_SYSTEMD
+static int
+systemdMonitorInit(void)
+{
+    if (sd_booted() <= 0) {
+        logError("Didn't boot with systemd, automatic multiseat won't be enabled\n");
+        return False;
+    }
+
+    int check = sd_login_monitor_new("seat", &systemdMonitor);
+    if (check < 0) {
+        logError("Can't get systemd monitor: %d, automatic multiseat won't be enabled\n", check);
+        return False;
+    }
+
+    systemdMonitorFd = sd_login_monitor_get_fd(systemdMonitor);
+    if (systemdMonitorFd < 0) {
+        logError("Can't retrieve file descriptor from the systemd monitor: %d, automatic multiseat won't be enabled\n", systemdMonitorFd);
+        sd_login_monitor_unref(systemdMonitor);
+        systemdMonitorFd = -1;
+        return False;
+    }
+
+    registerInput(systemdMonitorFd);
+    return True;
+}
+
+static void
+systemdMonitorDeinit(void)
+{
+    if (systemdMonitor) {
+        sd_login_monitor_unref(systemdMonitor);
+    }
+    systemdMonitorFd = -1;
+}
+
+static int
+systemdStartDisplay(char *seat)
+{
+    struct display *link = NULL;
+    for (link = displays; link; link = link-> next) {
+        if (link->status == reserve)
+            break;
+    }
+    if (!link) {
+        logError("There's not enough reserve displays for all your seats/sessions");
+        return False;
+    }
+    if (!strDup((&link->systemdSeat), seat)) {
+        return False;
+    }
+#ifdef HAVE_VTS
+    link->serverVT = 0;
+#endif
+    link->status = notRunning;
+    link->stillThere = True;
+    link->authorize = True;
+    link->displayType = dLocal | dPermanent;
+    link->reqSrvVT = -1;
+    link->serverPid = -1;
+    return True;
+}
+
+static void
+systemdCheckAdded(char **seat_names)
+{
+    char **iter_name;
+    struct display *link;
+    for (iter_name = seat_names; *iter_name; iter_name++) {
+        if (strcmp(*iter_name, "seat0") == 0)
+            continue; /* ignore the main seat */
+        int can_graphical = sd_seat_can_graphical(*iter_name);
+        for (link = displays; link; link = link->next) {
+            if (!link->systemdSeat)
+                continue;
+            /* see if the can_graphical property didn't change */
+            if (0 == strcmp(*iter_name, link->systemdSeat)) {
+                if (!can_graphical) {
+                    free(link->systemdSeat);
+                    link->systemdSeat = NULL;
+                    rStopDisplay(link, DS_RESERVE);
+                }
+                break;
+            }
+        }
+        /* the display wasn't found */
+        if (!link) {
+            if (can_graphical) {
+                /* if starting the display failed, skip this round until the next change */
+                if (!systemdStartDisplay(*iter_name))
+                    break;
+            }
+        }
+    }
+}
+
+static void
+systemdCheckRemoved(char **seat_names)
+{
+    char **iter_name;
+    struct display *link;
+    for (link = displays; link; link = link->next) {
+        for (iter_name = seat_names; *iter_name; iter_name++) {
+            if (strcmp(*iter_name, "seat0") == 0)
+                continue; /* ignore the main seat */
+            if (link->systemdSeat && strcmp(*iter_name, link->systemdSeat) == 0)
+                break;
+        }
+        if (!(*iter_name) && link->systemdSeat) { /* was not found, stop this one */
+            free(link->systemdSeat);
+            link->systemdSeat = NULL;
+            rStopDisplay(link, DS_RESERVE);
+        }
+    }
+}
+
+static void
+systemdHandleChange(void)
+{
+    static int failures = 0;
+    char **seat_names;
+    char **iter_name;
+    int check;
+    if ((check = sd_get_seats(&seat_names)) < 0) {
+        logError("Can't obtain systemd seats, error %d\n", -check);
+        failures++;
+        if (failures >= SYSTEMD_FAILURE_LIMIT) {
+            logError("%u failed calls to sd_get_seats, disabling systemd multi-seat support\n", SYSTEMD_FAILURE_LIMIT);
+            systemdMonitorDeinit();
+        }
+        return;
+    }
+
+    if (!check)
+        return;
+
+    systemdCheckAdded(seat_names);
+    systemdCheckRemoved(seat_names);
+
+    for (iter_name = seat_names; *iter_name; iter_name++)
+        free(*iter_name);
+    free(seat_names);
+}
+#endif WITH_SYSTEMD
+
 static void
 CheckDisplayStatus( struct display *d )
 {
diff -uNrb tdebase-orig/tdm/backend/dm.h tdebase/tdm/backend/dm.h
--- tdebase-orig/tdm/backend/dm.h	2012-02-16 11:56:11.000000000 -0600
+++ tdebase/tdm/backend/dm.h	2014-02-25 22:14:37.441282372 -0600
@@ -283,6 +283,9 @@
 	Xauth **authorizations;     /* authorization data */
 	int authNum;                /* number of authorizations */
 	char *authFile;             /* file to store authorization in */
+#ifdef WITH_SYSTEMD
+	char *systemdSeat;
+#endif
 };
 
 typedef struct {
diff -uNrb tdebase-orig/tdm/backend/server.c tdebase/tdm/backend/server.c
--- tdebase-orig/tdm/backend/server.c	2012-02-16 11:56:11.000000000 -0600
+++ tdebase/tdm/backend/server.c	2014-02-25 22:34:28.787844609 -0600
@@ -66,6 +66,25 @@
 	                        sprintf( vtstr, "vt%d", d->serverVT ) )))
 		exit( 47 );
 #endif
+#ifdef WITH_SYSTEMD
+	if (d->systemdSeat) {
+	    if (!(argv = parseArgs(argv, "-seat")))
+		exit(47);
+	    if (!(argv = parseArgs(argv, d->systemdSeat)))
+		exit(47);
+	    if (!(argv = parseArgs(argv, "-layout")))
+		exit(47);
+	    if (!(argv = parseArgs(argv, d->systemdSeat)))
+		exit(47);
+	}
+	else {
+	    if (!(argv = parseArgs(argv, "-seat")))
+		exit(47);
+	    if (!(argv = parseArgs(argv, "seat0")))
+		exit(47);
+	}
+#endif
+
 	return argv;
 }
 
diff -uNrb tdebase-orig/tdm/backend/session.c tdebase/tdm/backend/session.c
--- tdebase-orig/tdm/backend/session.c	2012-02-16 11:56:11.000000000 -0600
+++ tdebase/tdm/backend/session.c	2014-02-25 22:35:42.893874947 -0600
@@ -438,6 +438,10 @@
 
 	grttalk.pipe = &grtproc.pipe;
 	env = systemEnv( (char *)0 );
+#ifdef WITH_SYSTEMD
+	if (td->systemdSeat)
+	    env = setEnv(env, "XDG_SEAT", td->systemdSeat);
+#endif
 	if (GOpen( &grtproc, (char **)0, "_greet", env, name, &td->gpipe ))
 		SessionExit( EX_UNMANAGE_DPY );
 	freeStrArr( env );
