diff --git a/Makefile.am b/Makefile.am
index 7f075a253..21ce6b6b6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -64,6 +64,7 @@ include app/Makefile.am.inc
include lib/Makefile.am.inc
include builder/Makefile.am.inc
include session-helper/Makefile.am.inc
+include system-helper/Makefile.am.inc
include dbus-proxy/Makefile.am.inc
include document-portal/Makefile.am.inc
include Makefile.gtester
diff --git a/configure.ac b/configure.ac
index c531a27a4..369cf6b52 100644
--- a/configure.ac
+++ b/configure.ac
@@ -77,6 +77,15 @@ AC_ARG_WITH([systemduserunitdir],
[with_systemduserunitdir='${prefix}/lib/systemd/user'])
AC_SUBST([systemduserunitdir], [$with_systemduserunitdir])
+AC_ARG_WITH([systemdsystemunitdir],
+ [AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
+ [Directory for systemd system service files (default=PREFIX/lib/systemd/system)])],
+ [],
+ dnl This is deliberately not ${libdir}: systemd units always go in
+ dnl .../lib, never .../lib64 or .../lib/x86_64-linux-gnu
+ [with_systemdsystemunitdir='${prefix}/lib/systemd/system'])
+AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
+
AC_ARG_WITH(system_fonts_dir,
AS_HELP_STRING([--with-system-fonts-dir=PATH],[Directory where system fonts are, [default=/usr/share/fonts]]),
with_system_fonts_dir="$withval", with_system_fonts_dir=/usr/share/fonts)
diff --git a/data/org.freedesktop.XdgApp.xml b/data/org.freedesktop.XdgApp.xml
index 9d3b7e2ec..6f77efc6a 100644
--- a/data/org.freedesktop.XdgApp.xml
+++ b/data/org.freedesktop.XdgApp.xml
@@ -82,4 +82,10 @@
+
+
+
+
+
+
diff --git a/system-helper/Makefile.am.inc b/system-helper/Makefile.am.inc
new file mode 100644
index 000000000..0bd2c6c57
--- /dev/null
+++ b/system-helper/Makefile.am.inc
@@ -0,0 +1,34 @@
+system_helper_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/system-helper/xdg-app.gresource.xml)
+
+libexec_PROGRAMS += \
+ xdg-app-system-helper \
+ $(NULL)
+
+system-helper/xdg-app-resources.h: system-helper/xdg-app.gresource.xml
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< \
+ --target=$@ --sourcedir=$(srcdir) --c-name _gtk --generate-header
+
+system-helper/xdg-app-resources.c: system-helper/xdg-app.gresource.xml $(system_helper_resource_files)
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< \
+ --target=$@ --sourcedir=$(srcdir) --c-name _gtk --generate-source
+
+dbussystemservicedir = $(datadir)/dbus-1/system-services
+service_in_files += system-helper/org.freedesktop.XdgApp.SystemHelper.service.in
+dbussystemservice_DATA = system-helper/org.freedesktop.XdgApp.SystemHelper.service
+
+dbusconfdir = ${sysconfdir}/dbus-1/system.d
+dbusconf_DATA = system-helper/org.freedesktop.XdgApp.SystemHelper.conf
+
+service_in_files += system-helper/xdg-app-system-helper.service.in
+systemdsystemunit_DATA = system-helper/xdg-app-system-helper.service
+
+EXTRA_DIST += system-helper/xdg-app.gresource.xml
+
+xdg_app_system_helper_SOURCES = \
+ system-helper/xdg-app-system-helper.c \
+ system-helper/xdg-app-resources.h \
+ system-helper/xdg-app-resources.c \
+ $(NULL)
+
+xdg_app_system_helper_LDADD = $(BASE_LIBS) libxdgapp-common.la
+xdg_app_system_helper_CFLAGS = $(BASE_CFLAGS)
diff --git a/system-helper/org.freedesktop.XdgApp.SystemHelper.conf b/system-helper/org.freedesktop.XdgApp.SystemHelper.conf
new file mode 100644
index 000000000..6b6a64671
--- /dev/null
+++ b/system-helper/org.freedesktop.XdgApp.SystemHelper.conf
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/system-helper/org.freedesktop.XdgApp.SystemHelper.service.in b/system-helper/org.freedesktop.XdgApp.SystemHelper.service.in
new file mode 100644
index 000000000..c6ef62721
--- /dev/null
+++ b/system-helper/org.freedesktop.XdgApp.SystemHelper.service.in
@@ -0,0 +1,4 @@
+[D-BUS Service]
+Name=org.freedesktop.XdgApp.SystemHelper
+Exec=@libexecdir@/xdg-app-system-helper
+SystemdService=xdg-app-system-helper.service
diff --git a/system-helper/xdg-app-system-helper.c b/system-helper/xdg-app-system-helper.c
new file mode 100644
index 000000000..8f17a49d8
--- /dev/null
+++ b/system-helper/xdg-app-system-helper.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2014 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Authors:
+ * Alexander Larsson
+ */
+
+#include "config.h"
+
+#include
+#include
+#include
+#include
+
+#include "xdg-app-dbus.h"
+
+static GDBusNodeInfo *introspection_data = NULL;
+
+void
+handle_deploy (void)
+{
+ g_print ("deploy!");
+}
+
+static void
+on_bus_acquired (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ XdgAppSystemHelper *helper;
+ GError *error = NULL;
+
+ helper = xdg_app_system_helper_skeleton_new ();
+
+ g_signal_connect (helper, "handle-deploy", G_CALLBACK (handle_deploy), NULL);
+
+ if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (helper),
+ connection,
+ "/org/freedesktop/XdgApp/SystemHelper",
+ &error))
+ {
+ g_warning ("error: %s\n", error->message);
+ g_error_free (error);
+ }
+}
+
+static void
+on_name_acquired (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+}
+
+static void
+on_name_lost (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ exit (1);
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ guint owner_id;
+ GMainLoop *loop;
+ GBytes *introspection_bytes;
+
+ setlocale (LC_ALL, "");
+
+ g_setenv ("GIO_USE_VFS", "local", TRUE);
+
+ g_set_prgname (argv[0]);
+
+ introspection_bytes = g_resources_lookup_data ("/org/freedesktop/XdgApp/org.freedesktop.XdgApp.xml", 0, NULL);
+ g_assert (introspection_bytes != NULL);
+
+ introspection_data = g_dbus_node_info_new_for_xml (g_bytes_get_data (introspection_bytes, NULL), NULL);
+
+ owner_id = g_bus_own_name (G_BUS_TYPE_SYSTEM,
+ "org.freedesktop.XdgApp.SystemHelper",
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ on_bus_acquired,
+ on_name_acquired,
+ on_name_lost,
+ NULL,
+ NULL);
+
+ loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (loop);
+
+ g_bus_unown_name (owner_id);
+
+ g_dbus_node_info_unref (introspection_data);
+
+ return 0;
+}
diff --git a/system-helper/xdg-app-system-helper.service.in b/system-helper/xdg-app-system-helper.service.in
new file mode 100644
index 000000000..5f1e6ced0
--- /dev/null
+++ b/system-helper/xdg-app-system-helper.service.in
@@ -0,0 +1,7 @@
+[Unit]
+Description=xdg-app system helper
+
+[Service]
+BusName=org.freedesktop.XdgApp.SystemHelper
+ExecStart=@libexecdir@/xdg-app-system-helper
+Type=dbus
diff --git a/system-helper/xdg-app.gresource.xml b/system-helper/xdg-app.gresource.xml
new file mode 100644
index 000000000..492189a3d
--- /dev/null
+++ b/system-helper/xdg-app.gresource.xml
@@ -0,0 +1,6 @@
+
+
+
+ data/org.freedesktop.XdgApp.xml
+
+