diff --git a/xfce4-session/xfsm-systemd.c b/xfce4-session/xfsm-systemd.c
index 4076586..90e7873 100644
--- /dev/null
+++ b/xfce4-session/xfsm-systemd.c
@@ -0,0 +1,123 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2012 Christian Hesse
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <config.h>
+
+#include <gio/gio.h>
+#include <polkit/polkit.h>
+
+#include "xfsm-systemd.h"
+
+#define SYSTEMD_DBUS_NAME       "org.freedesktop.login1"
+#define SYSTEMD_DBUS_PATH       "/org/freedesktop/login1"
+#define SYSTEMD_DBUS_INTERFACE  "org.freedesktop.login1.Manager"
+#define SYSTEMD_REBOOT_ACTION   "org.freedesktop.login1.reboot"
+#define SYSTEMD_SHUTDOWN_ACTION "org.freedesktop.login1.power-off"
+
+struct _SystemdProxy {
+        PolkitAuthority *authority;
+        PolkitSubject *subject;
+};
+
+SystemdProxy *
+systemd_proxy_new (void)
+{
+        SystemdProxy *proxy;
+
+        proxy = g_new0 (SystemdProxy, 1);
+
+        proxy->authority = polkit_authority_get_sync (NULL, NULL);
+        proxy->subject = polkit_unix_process_new (getpid());
+
+        return proxy;
+}
+
+void
+systemd_proxy_free (SystemdProxy *proxy)
+{
+        g_object_unref (proxy->authority);
+        g_object_unref (proxy->subject);
+
+        g_free (proxy);
+}
+
+gboolean systemd_proxy_can_method (SystemdProxy *proxy, gboolean *can_method, const gchar *method, GError **error)
+{
+        PolkitAuthorizationResult *res;
+        GError *local_error = NULL;
+
+        *can_method = FALSE;
+        res = polkit_authority_check_authorization_sync (proxy->authority,
+                                                         proxy->subject,
+                                                         method,
+                                                         NULL,
+                                                         POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE,
+                                                         NULL,
+                                                         &local_error);
+        if (res == NULL) {
+                g_propagate_error (error, local_error);
+                return FALSE;
+        }
+
+        *can_method = polkit_authorization_result_get_is_authorized (res) ||
+                       polkit_authorization_result_get_is_challenge (res);
+
+        g_object_unref (res);
+
+        return TRUE;
+}
+
+gboolean systemd_proxy_can_restart (SystemdProxy *proxy, gboolean *can_restart, GError **error)
+{
+	return systemd_proxy_can_method(proxy, can_restart, SYSTEMD_REBOOT_ACTION, error);
+}
+
+gboolean systemd_proxy_can_shutdown (SystemdProxy *proxy, gboolean *can_shutdown, GError **error)
+{
+	return systemd_proxy_can_method(proxy, can_shutdown, SYSTEMD_SHUTDOWN_ACTION, error);
+}
+
+gboolean systemd_proxy_method (SystemdProxy *proxy, const gchar *method, GError **error)
+{
+        GDBusConnection *bus;
+
+        bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
+        g_dbus_connection_call_sync (bus,
+                                     SYSTEMD_DBUS_NAME,
+                                     SYSTEMD_DBUS_PATH,
+                                     SYSTEMD_DBUS_INTERFACE,
+                                     method,
+                                     g_variant_new ("(b)", TRUE),
+                                     NULL, 0, G_MAXINT, NULL, NULL);
+        g_object_unref (bus);
+
+        return TRUE;
+}
+
+gboolean systemd_proxy_restart (SystemdProxy *proxy, GError **error)
+{
+	return systemd_proxy_method(proxy, "Reboot", error);
+}
+
+gboolean systemd_proxy_shutdown (SystemdProxy *proxy, GError **error)
+{
+	return systemd_proxy_method(proxy, "PowerOff", error);
+}
diff --git a/xfce4-session/xfsm-systemd.h b/xfce4-session/xfsm-systemd.h
index 3fa8317..2c4d868 100644
--- /dev/null
+++ b/xfce4-session/xfsm-systemd.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2012 Christian Hesse
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __SYSTEMD_PROXY_H__
+#define __SYSTEMD_PROXY_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef struct _SystemdProxy SystemdProxy;
+
+SystemdProxy *systemd_proxy_new (void);
+void          systemd_proxy_free (SystemdProxy *proxy);
+gboolean      systemd_proxy_can_method (SystemdProxy *proxy, gboolean *can_method, const char *method, GError **error);
+gboolean      systemd_proxy_can_restart (SystemdProxy *proxy, gboolean *can_restart, GError **error);
+gboolean      systemd_proxy_can_shutdown (SystemdProxy *proxy, gboolean *can_shutdown, GError **error);
+gboolean      systemd_proxy_method (SystemdProxy *proxy, const char *method, GError **error);
+gboolean      systemd_proxy_restart (SystemdProxy *proxy, GError **error);
+gboolean      systemd_proxy_shutdown (SystemdProxy *proxy, GError **error);
+
+G_END_DECLS
+
+#endif  /* __SYSTEMD_PROXY_H__ */

commit 518a28c23f110617aad36e64c02cdab6a36adf37
Author: Christian Hesse <eworm@leda.eworm.de>
Date:   Fri Jul 27 14:21:14 2012 +0200

    ...

diff --git a/configure.in.in b/configure.in.in
index 9aa4f8f..aa0b8bb 100644
--- a/configure.in
+++ b/configure.in
@@ -96,6 +96,33 @@ XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.1.0])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.84])
 XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.9.0])

+dnl systemd integration
+AC_ARG_ENABLE([systemd],
+              AS_HELP_STRING([--enable-systemd], [Use systemd]),
+              [with_systemd=$enableval],
+              [with_systemd=auto])
+PKG_CHECK_MODULES(SYSTEMD,
+                  [libsystemd-login polkit-gobject-1],
+                  [have_systemd=yes], [have_systemd=no])
+AC_MSG_CHECKING([whether to use systemd])
+if test x$with_systemd = xauto ; then
+        if test x$have_systemd = xno ; then
+                with_systemd=no
+        else
+                with_systemd=yes
+        fi
+fi
+AC_MSG_RESULT($with_systemd)
+if test x$with_systemd = xyes; then
+        if test x$have_systemd = xno; then
+                AC_MSG_ERROR([Systemd support explicitly required, but systemd not found])
+        fi
+        AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is used for session tracking])
+fi
+AC_SUBST(SYSTEMD_CFLAGS)
+AC_SUBST(SYSTEMD_LIBS)
+AM_CONDITIONAL(WITH_SYSTEMD, [test "$with_systemd" = "yes"], [Using systemd])
+
 dnl Check for debugging support
 XDT_FEATURE_DEBUG([xfsm_debug_default])


commit f1279eba9452f027a2037be77388767437161d51
Author: Christian Hesse <eworm@leda.eworm.de>
Date:   Fri Jul 27 14:18:16 2012 +0200

    ...

diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c
index 1429abd..077cdf3 100644
--- a/xfce4-session/xfsm-shutdown.c
+++ b/xfce4-session/xfsm-shutdown.c
@@ -96,7 +96,11 @@ struct _XfsmShutdown
 {
   GObject __parent__;

+#ifdef HAVE_SYSTEMD
+  SystemdProxy   *systemd_proxy;
+#else
   XfsmConsolekit *consolekit;
+#endif
   XfsmUPower     *upower;

   /* kiosk settings */
@@ -134,7 +138,11 @@ xfsm_shutdown_init (XfsmShutdown *shutdown)
 {
   XfceKiosk *kiosk;

+#ifdef HAVE_SYSTEMD
+  shutdown->systemd_proxy = systemd_proxy_new ();
+#else
   shutdown->consolekit = xfsm_consolekit_get ();
+#endif
   shutdown->upower = xfsm_upower_get ();
   shutdown->helper_state = SUDO_NOT_INITIAZED;
   shutdown->helper_require_password = FALSE;
@@ -153,7 +161,11 @@ xfsm_shutdown_finalize (GObject *object)
 {
   XfsmShutdown *shutdown = XFSM_SHUTDOWN (object);

+#ifdef HAVE_SYSTEMD
+  systemd_proxy_free (shutdown->systemd_proxy);
+#else
   g_object_unref (G_OBJECT (shutdown->consolekit));
+#endif
   g_object_unref (G_OBJECT (shutdown->upower));

   /* close down helper */
@@ -644,7 +656,11 @@ xfsm_shutdown_try_restart (XfsmShutdown  *shutdown,
   if (shutdown->helper_state == SUDO_AVAILABLE)
     return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_RESTART, error);
   else
+#ifdef HAVE_SYSTEMD
+    return systemd_proxy_restart (shutdown->systemd_proxy, error);
+#else
     return xfsm_consolekit_try_restart (shutdown->consolekit, error);
+#endif
 }


@@ -661,7 +677,11 @@ xfsm_shutdown_try_shutdown (XfsmShutdown  *shutdown,
   if (shutdown->helper_state == SUDO_AVAILABLE)
     return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_SHUTDOWN, error);
   else
+#ifdef HAVE_SYSTEMD
+    return systemd_proxy_shutdown (shutdown->systemd_proxy, error);
+#else
     return xfsm_consolekit_try_shutdown (shutdown->consolekit, error);
+#endif
 }


@@ -701,7 +721,11 @@ xfsm_shutdown_can_restart (XfsmShutdown  *shutdown,
       return TRUE;
     }

+#ifdef HAVE_SYSTEMD
+  if (systemd_proxy_can_restart (shutdown->systemd_proxy, can_restart, error))
+#else
   if (xfsm_consolekit_can_restart (shutdown->consolekit, can_restart, error))
+#endif
     return TRUE;

   if (xfsm_shutdown_sudo_init (shutdown, error))
@@ -728,7 +752,11 @@ xfsm_shutdown_can_shutdown (XfsmShutdown  *shutdown,
       return TRUE;
     }

+#ifdef HAVE_SYSTEMD
+  if (systemd_proxy_can_shutdown (shutdown->systemd_proxy, can_shutdown, error))
+#else
   if (xfsm_consolekit_can_shutdown (shutdown->consolekit, can_shutdown, error))
+#endif
     return TRUE;

   if (xfsm_shutdown_sudo_init (shutdown, error))

commit 5aea3fb853683246a537a67423cf5b32076b8dfb
Author: Christian Hesse <eworm@leda.eworm.de>
Date:   Fri Jul 27 14:03:27 2012 +0200

    ...

diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am
index c015154..7e3b311 100644
--- a/xfce4-session/Makefile.am
+++ b/xfce4-session/Makefile.am
@@ -38,8 +38,6 @@ xfce4_session_SOURCES =							\
	xfsm-compat-gnome.h						\
	xfsm-compat-kde.c						\
	xfsm-compat-kde.h						\
-	xfsm-consolekit.c						\
-	xfsm-consolekit.h						\
	xfsm-dns.c							\
	xfsm-dns.h							\
	xfsm-error.c							\
@@ -65,6 +63,16 @@ xfce4_session_SOURCES =							\
	xfsm-upower.c							\
	xfsm-upower.h

+if WITH_SYSTEMD
+xfce4_session_SOURCES +=						\
+	xfsm-systemd.c							\
+	xfsm-systemd.h
+else
+xfce4_session_SOURCES +=						\
+	xfsm-consolekit.c						\
+	xfsm-consolekit.h
+endif
+
 xfce4_session_CFLAGS =							\
	$(LIBSM_CFLAGS)							\
	$(LIBX11_CFLAGS)						\
@@ -72,6 +80,7 @@ xfce4_session_CFLAGS =							\
	$(DBUS_CFLAGS)							\
	$(DBUS_GLIB_CFLAGS)						\
	$(LIBWNCK_CFLAGS)						\
+	$(SYSTEMD_CFLAGS)						\
	$(XFCONF_CFLAGS)						\
	$(GMODULE_CFLAGS)						\
	$(PLATFORM_CFLAGS)
@@ -91,6 +100,7 @@ xfce4_session_LDADD =							\
	$(DBUS_LIBS)							\
	$(DBUS_GLIB_LIBS)						\
	$(LIBWNCK_LIBS)							\
+	$(SYSTEMD_LIBS)							\
	$(XFCONF_LIBS)							\
	-lm

diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c
index d8757a8..1429abd 100644
--- a/xfce4-session/xfsm-shutdown.c
+++ b/xfce4-session/xfsm-shutdown.c
@@ -66,10 +66,13 @@
 #include <xfce4-session/xfsm-fadeout.h>
 #include <xfce4-session/xfsm-global.h>
 #include <xfce4-session/xfsm-legacy.h>
-#include <xfce4-session/xfsm-consolekit.h>
 #include <xfce4-session/xfsm-upower.h>

-
+#ifdef HAVE_SYSTEMD
+#include <xfce4-session/xfsm-systemd.h>
+#else
+#include <xfce4-session/xfsm-consolekit.h>
+#endif

 static void xfsm_shutdown_finalize  (GObject      *object);
 static void xfsm_shutdown_sudo_free (XfsmShutdown *shutdown);
