diff --git a/libdbus/Makefile.am b/libdbus/Makefile.am
index a7e1e98437528d53112d261f71c72c7566bd1367..83911b30cd4e311a3998aa1bf8142ba25b68ef29 100644
--- a/libdbus/Makefile.am
+++ b/libdbus/Makefile.am
@@ -6,8 +6,6 @@ libxfpmdbus_la_SOURCES =		\
 	xfpm-dbus.h			\
 	xfpm-dbus-monitor.c		\
 	xfpm-dbus-monitor.h		\
-	xfpm-unique.c			\
-	xfpm-unique.h			\
 	xfpm-dbus-marshal.c		\
 	xfpm-dbus-marshal.h		\
 	org.xfce.unique.h
diff --git a/libdbus/xfpm-unique.c b/libdbus/xfpm-unique.c
deleted file mode 100644
index 971bae02f588558357b90da69ae4f8c280cf3678..0000000000000000000000000000000000000000
--- a/libdbus/xfpm-unique.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * * Copyright (C) 2010-2011 Ali <aliov@xfce.org>
- *
- * 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
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "xfpm-unique.h"
-#include "xfpm-dbus.h"
-
-static void xfpm_unique_dbus_class_init 	(XfpmUniqueClass *klass);
-static void xfpm_unique_dbus_init		(XfpmUnique *unique);
-
-static void xfpm_unique_finalize   		(GObject *object);
-
-#define XFPM_UNIQUE_GET_PRIVATE(o) \
-(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFPM_TYPE_UNIQUE, XfpmUniquePrivate))
-
-struct XfpmUniquePrivate
-{
-    DBusGConnection *bus;
-    
-    gchar *name;
-};
-
-enum
-{
-    PROP_0,
-    PROP_NAME
-};
-
-enum
-{
-    PING_RECEIVED,
-    LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (XfpmUnique, xfpm_unique, G_TYPE_OBJECT)
-
-static void xfpm_unique_get_property (GObject *object,
-				      guint prop_id,
-                                      GValue *value,
-                                      GParamSpec *pspec)
-{
-    XfpmUnique *unique;
-    unique = XFPM_UNIQUE (object);
-    
-    switch (prop_id)
-    {
-	case PROP_NAME:
-	    g_value_set_string (value, unique->priv->name);
-	    break;
-	default:
-            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-
-}
-
-static void xfpm_unique_set_property (GObject *object,
-				      guint prop_id,
-                                      const GValue *value,
-                                      GParamSpec *pspec)
-{
-    
-    XfpmUnique *unique;
-    unique = XFPM_UNIQUE (object);
-    
-    switch (prop_id)
-    {
-	case PROP_NAME:
-	    unique->priv->name = g_value_dup_string (value);
-	    break;
-	default:
-            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
-xfpm_unique_class_init (XfpmUniqueClass *klass)
-{
-    GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-    object_class->finalize = xfpm_unique_finalize;
-    
-    object_class->set_property = xfpm_unique_set_property;
-    object_class->get_property = xfpm_unique_get_property;
-
-    signals [PING_RECEIVED] = 
-        g_signal_new ("ping-received",
-                      XFPM_TYPE_UNIQUE,
-                      G_SIGNAL_RUN_LAST,
-                      G_STRUCT_OFFSET (XfpmUniqueClass, ping_received),
-                      NULL, NULL,
-                      g_cclosure_marshal_VOID__VOID,
-                      G_TYPE_NONE, 0, G_TYPE_NONE);
-
-    g_object_class_install_property (object_class,
-                                     PROP_NAME,
-                                     g_param_spec_string  ("name",
-                                                           NULL, NULL,
-                                                           NULL,
-                                                           G_PARAM_READWRITE|
-							   G_PARAM_CONSTRUCT_ONLY));
-
-    g_type_class_add_private (klass, sizeof (XfpmUniquePrivate));
-    
-    xfpm_unique_dbus_class_init (klass);
-}
-
-static void
-xfpm_unique_init (XfpmUnique *unique)
-{
-    GError *error = NULL;
-    
-    unique->priv = XFPM_UNIQUE_GET_PRIVATE (unique);
-    
-    unique->priv->name = NULL;
-    
-    unique->priv->bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-    
-    if ( error )
-	g_error ("Failed to connect to the session bus : %s", error->message);
-	
-    xfpm_unique_dbus_init (unique);
-}
-
-static void
-xfpm_unique_finalize (GObject *object)
-{
-    XfpmUnique *unique;
-
-    unique = XFPM_UNIQUE (object);
-    
-    xfpm_dbus_release_name (dbus_g_connection_get_connection (unique->priv->bus),
-			    unique->priv->name);
-    
-    dbus_g_connection_unref (unique->priv->bus);
-    g_free (unique->priv->name);
-
-    G_OBJECT_CLASS (xfpm_unique_parent_class)->finalize (object);
-}
-
-XfpmUnique *
-xfpm_unique_new (const gchar *name)
-{
-    XfpmUnique *unique = NULL;
-    
-    unique = g_object_new (XFPM_TYPE_UNIQUE, "name", name, NULL);
-    
-    return unique;
-}
-
-gboolean xfpm_unique_app_is_running (XfpmUnique *unique)
-{
-    g_return_val_if_fail (XFPM_IS_UNIQUE (unique), FALSE);
-    
-    if (xfpm_dbus_name_has_owner (dbus_g_connection_get_connection (unique->priv->bus),
-				  unique->priv->name))
-    {
-	DBusGProxy *proxy;
-	GError *error = NULL;
-	
-	proxy = dbus_g_proxy_new_for_name (unique->priv->bus,
-					   unique->priv->name,
-					   "/org/xfce/unique",
-					   "org.xfce.unique");
-	
-	/*Shoudln't happen, but check anyway*/
-	if ( !proxy )
-	{
-	    g_critical ("Unable to create proxy for %s", unique->priv->name);
-	    return FALSE;
-	}
-	
-	dbus_g_proxy_call (proxy, "Ping", &error,
-			   G_TYPE_INVALID,
-			   G_TYPE_INVALID);
-			   
-	if ( error )
-	{
-	    g_warning ("Failed to 'Ping' %s", unique->priv->name);
-	    
-	}
-	
-	g_object_unref (proxy);
-	return TRUE;
-    }
-    
-    xfpm_dbus_register_name (dbus_g_connection_get_connection (unique->priv->bus),
-			     unique->priv->name);
-    
-    return FALSE;
-}
-
-static gboolean xfce_unique_ping (XfpmUnique *unique,
-				  GError *error);	
-
-#include "org.xfce.unique.h"
-
-static void xfpm_unique_dbus_class_init (XfpmUniqueClass *klass)
-{
-    dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-                                     &dbus_glib_xfce_unique_object_info);
-}
-
-static void xfpm_unique_dbus_init (XfpmUnique *unique)
-{
-    dbus_g_connection_register_g_object (unique->priv->bus,
-                                         "/org/xfce/unique",
-                                         G_OBJECT (unique));
-}
-
-static gboolean xfce_unique_ping (XfpmUnique *unique,
-				  GError *error)
-{
-    g_signal_emit (unique, signals[PING_RECEIVED], 0);
-    return TRUE;
-}
diff --git a/libdbus/xfpm-unique.h b/libdbus/xfpm-unique.h
deleted file mode 100644
index 5cc6c2f1a56d40317c9cc707f4db71476abf89f3..0000000000000000000000000000000000000000
--- a/libdbus/xfpm-unique.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * * Copyright (C) 2010-2011 Ali <aliov@xfce.org>
- *
- * 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 __XFPM_UNIQUE_H
-#define __XFPM_UNIQUE_H
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define XFPM_TYPE_UNIQUE        (xfpm_unique_get_type () )
-#define XFPM_UNIQUE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), XFPM_TYPE_UNIQUE, XfpmUnique))
-#define XFPM_IS_UNIQUE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), XFPM_TYPE_UNIQUE))
-
-typedef struct XfpmUniquePrivate XfpmUniquePrivate;
-
-typedef struct
-{
-    GObject         	   parent;
-    XfpmUniquePrivate     *priv;
-    
-} XfpmUnique;
-
-typedef struct
-{
-    GObjectClass	   parent_class;
-    
-    void		  (*ping_received)	       (XfpmUnique *unique);
-    
-} XfpmUniqueClass;
-
-GType        		   xfpm_unique_get_type        (void) G_GNUC_CONST;
-
-XfpmUnique                *xfpm_unique_new             (const gchar *name);
-
-gboolean		   xfpm_unique_app_is_running  (XfpmUnique *unique);
-
-G_END_DECLS
-
-#endif /* __XFPM_UNIQUE_H */
diff --git a/settings/Makefile.am b/settings/Makefile.am
index 8116b07d9e3833189d165ff5f6e5ce7430b171df..8efa681b83a7f50f0fa7ccadcd6f9bd03a5a057e 100644
--- a/settings/Makefile.am
+++ b/settings/Makefile.am
@@ -1,8 +1,11 @@
 bin_PROGRAMS = xfce4-power-manager-settings
 
 xfce4_power_manager_settings_SOURCES = 				\
-	xfce-power-manager-dbus-client.h			\
+	xfce-power-manager-dbus.h			\
+	xfce-power-manager-dbus.c			\
 	xfpm-settings-main.c					\
+	xfpm-settings-app.c					\
+	xfpm-settings-app.h					\
 	xfpm-settings.c						\
 	xfpm-settings.h						\
 	$(top_srcdir)/common/xfpm-config.h				\
diff --git a/settings/xfpm-settings-app.c b/settings/xfpm-settings-app.c
new file mode 100644
index 0000000000000000000000000000000000000000..1bc7c80886403c3638593ffb7e2749565f2cd505
--- /dev/null
+++ b/settings/xfpm-settings-app.c
@@ -0,0 +1,206 @@
+/* -*- c-basic-offset: 4 -*- vi:set ts=4 sts=4 sw=4:
+ * * Copyright (C) 2015 Xfce Development Team <xfce4-dev@xfce.org>
+ *
+ * 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
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <gtk/gtkx.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <xfconf/xfconf.h>
+#include <libxfce4util/libxfce4util.h>
+#include <libxfce4ui/libxfce4ui.h>
+
+#include "xfpm-settings-app.h"
+#include "xfpm-settings.h"
+#include "xfpm-debug.h"
+#include "xfpm-config.h"
+
+
+struct _XfpmSettingsAppPrivate
+{
+    XfpmPowerManager *manager;
+    XfconfChannel    *channel;
+    gboolean          debug;
+    Window            socket_id;
+    gchar            *device_id;
+};
+
+static void xfpm_settings_app_class_init (XfpmSettingsAppClass *class);
+static void xfpm_settings_app_init       (XfpmSettingsApp *app);
+static void xfpm_settings_app_activate   (GApplication *app);
+
+
+G_DEFINE_TYPE(XfpmSettingsApp, xfpm_settings_app, GTK_TYPE_APPLICATION);
+
+
+#define XFPM_SETTINGS_APP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFPM_TYPE_SETTINGS_APP, XfpmSettingsAppPrivate))
+
+
+static void
+xfpm_settings_app_init (XfpmSettingsApp *app)
+{
+    XfpmSettingsAppPrivate *priv = XFPM_SETTINGS_APP_GET_PRIVATE (app);
+
+    const GOptionEntry option_entries[] = {
+      { "socket-id", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &priv->socket_id, N_("Settings manager socket"), N_("SOCKET ID") },
+      { "device-id", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &priv->device_id, N_("Display a specific device by UpDevice object path"), N_("UpDevice object path") },
+      { "debug",    '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &priv->debug, N_("Enable debugging"), NULL },
+      { NULL, },
+    };
+
+    g_application_add_main_option_entries (G_APPLICATION (app), option_entries);
+}
+
+static void
+xfpm_settings_app_activate (GApplication *app)
+{
+    XfpmSettingsAppPrivate *priv = XFPM_SETTINGS_APP_GET_PRIVATE (app);
+
+    GError           *error = NULL;
+    GtkWidget        *dialog;
+    GHashTable       *hash;
+    GVariant         *config;
+    GVariantIter     *iter;
+    gchar            *key, *value;
+
+    gboolean has_battery;
+    gboolean auth_suspend;
+    gboolean auth_hibernate;
+    gboolean can_suspend;
+    gboolean can_hibernate;
+    gboolean can_shutdown;
+    gboolean has_lcd_brightness;
+    gboolean has_sleep_button;
+    gboolean has_hibernate_button;
+    gboolean has_power_button;
+    gboolean has_lid;
+    gboolean start_xfpm_if_not_running;
+
+    priv->manager = xfpm_power_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+                                                               G_BUS_NAME_OWNER_FLAGS_NONE,
+                                                               "org.xfce.PowerManager",
+                                                               "/org/xfce/PowerManager",
+                                                               NULL,
+                                                               &error);
+
+    if (error != NULL)
+    {
+        g_critical("xfpm_power_manager_proxy_new_sync failed: %s\n", error->message);
+        xfce_dialog_show_warning (NULL,
+                                 _("Xfce Power Manager"),
+                                 "%s",
+                                 _("Failed to connect to power manager"));
+        g_clear_error (&error);
+        return;
+    }
+
+
+    while ( !xfpm_power_manager_call_get_config_sync (priv->manager, &config, NULL, NULL) )
+    {
+        GtkWidget *startw;
+
+        startw = gtk_message_dialog_new (NULL,
+                                         GTK_DIALOG_MODAL,
+                                         GTK_MESSAGE_QUESTION,
+                                         GTK_BUTTONS_YES_NO,
+                                         _("Xfce4 Power Manager is not running, do you want to launch it now?"));
+        start_xfpm_if_not_running = gtk_dialog_run (GTK_DIALOG (startw));
+        gtk_widget_destroy (startw);
+
+        if ( start_xfpm_if_not_running ) 
+        {
+            g_spawn_command_line_async("xfce4-power-manager",NULL);
+            /* wait 2 seconds for xfpm to startup */
+            g_usleep ( 2 * 1000000 );
+        }
+        else
+        {
+            /* continue without starting xfpm, this will probably error out */
+            break;
+        }
+    }
+
+    if ( !xfconf_init(&error) )
+    {
+        g_critical("xfconf init failed: %s using default settings\n", error->message);
+        xfce_dialog_show_warning (NULL,
+                                  _("Xfce Power Manager"),
+                                  "%s",
+                                  _("Failed to load power manager configuration, using defaults"));
+        g_clear_error (&error);
+    }
+
+
+    priv->channel = xfconf_channel_new(XFPM_CHANNEL_CFG);
+
+    xfpm_debug_init (priv->debug);
+
+    hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+    g_variant_get (config, "a{ss}", &iter);
+    while (g_variant_iter_next (iter, "{ss}", &key, &value))
+    {
+        g_hash_table_insert (hash, key, value);
+    }
+    g_variant_iter_free (iter);
+    g_variant_unref (config);
+
+
+    has_battery = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-battery"));
+    has_lid = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-lid"));
+    can_suspend = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-suspend"));
+    can_hibernate = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-hibernate"));
+    auth_suspend = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-suspend"));
+    auth_hibernate = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-hibernate"));
+    has_lcd_brightness = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-brightness"));
+    has_sleep_button = xfpm_string_to_bool (g_hash_table_lookup (hash, "sleep-button"));
+    has_power_button = xfpm_string_to_bool (g_hash_table_lookup (hash, "power-button"));
+    has_hibernate_button = xfpm_string_to_bool (g_hash_table_lookup (hash, "hibernate-button"));
+    can_shutdown = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-shutdown"));
+
+    dialog = xfpm_settings_dialog_new (priv->channel, auth_suspend, auth_hibernate,
+                                       can_suspend, can_hibernate, can_shutdown, has_battery, has_lcd_brightness,
+                                       has_lid, has_sleep_button, has_hibernate_button, has_power_button,
+                                       priv->socket_id, priv->device_id);
+
+    g_hash_table_destroy (hash);
+
+    gtk_application_add_window (GTK_APPLICATION (app), GTK_WINDOW (dialog));
+}
+
+static void
+xfpm_settings_app_class_init (XfpmSettingsAppClass *class)
+{
+    G_APPLICATION_CLASS (class)->activate = xfpm_settings_app_activate;
+
+    g_type_class_add_private (class, sizeof (XfpmSettingsAppPrivate));
+}
+
+XfpmSettingsApp *
+xfpm_settings_app_new ()
+{
+    return g_object_new (XFPM_TYPE_SETTINGS_APP,
+                         "application-id", "org.xfce.PowerManager.Settings",
+                         "flags", G_APPLICATION_FLAGS_NONE,
+                         NULL);
+}
diff --git a/settings/xfpm-settings-app.h b/settings/xfpm-settings-app.h
new file mode 100644
index 0000000000000000000000000000000000000000..b6517d395aa70965f6d892d40ca4f0c62244a9c3
--- /dev/null
+++ b/settings/xfpm-settings-app.h
@@ -0,0 +1,61 @@
+/* -*- c-basic-offset: 4 -*- vi:set ts=4 sts=4 sw=4:
+ * * Copyright (C) 2015 Xfce Development Team <xfce4-dev@xfce.org>
+ *
+ * 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 <gtk/gtk.h>
+
+#include "xfce-power-manager-dbus.h"
+
+
+#ifndef __XFPM_SETTINGS_APP_H
+#define __XFPM_SETTINGS_APP_H
+
+G_BEGIN_DECLS
+
+
+#define XFPM_TYPE_SETTINGS_APP            (xfpm_settings_app_get_type())
+#define XFPM_SETTINGS_APP(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), XFPM_TYPE_SETTINGS_APP, XfpmSettingsApp))
+#define XFPM_SETTINGS_APP_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), XFPM_TYPE_SETTINGS_APP, XfpmSettingsAppClass))
+#define XFPM_IS_SETTINGS_APP(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), XFPM_TYPE_SETTINGS_APP))
+#define XFPM_SETTINGS_APP_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), XFPM_TYPE_SETTINGS_APP, XfpmSettingsAppClass))
+
+typedef struct _XfpmSettingsApp         XfpmSettingsApp;
+typedef struct _XfpmSettingsAppClass    XfpmSettingsAppClass;
+typedef struct _XfpmSettingsAppPrivate  XfpmSettingsAppPrivate;
+
+struct _XfpmSettingsApp
+{
+    GtkApplication               parent;
+    XfpmSettingsAppPrivate      *priv;
+};
+
+struct _XfpmSettingsAppClass
+{
+    GtkApplicationClass    parent_class;
+};
+
+
+GType                xfpm_settings_app_get_type        (void) G_GNUC_CONST;
+
+XfpmSettingsApp     *xfpm_settings_app_new             (void);
+
+
+G_END_DECLS
+
+#endif /* __XFPM_SETTINGS_APP_H */
diff --git a/settings/xfpm-settings-main.c b/settings/xfpm-settings-main.c
index 70f379f1f1ea85400d78d45be2f59f48be77a6a0..88c71c84c956dbc8443761694806df06bd43f00c 100644
--- a/settings/xfpm-settings-main.c
+++ b/settings/xfpm-settings-main.c
@@ -1,5 +1,6 @@
-/*
+/* -*- c-basic-offset: 4 -*- vi:set ts=4 sts=4 sw=4:
  * * Copyright (C) 2008-2011 Ali <aliov@xfce.org>
+ * * Copyright (C) 2015 Xfce Development Team <xfce4-dev@xfce.org>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -33,175 +34,12 @@
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
 
-#include <xfconf/xfconf.h>
-
-#include "common/xfpm-common.h"
-
-#include "xfce-power-manager-dbus-client.h"
-#include "xfpm-settings.h"
-#include "xfpm-config.h"
-#include "xfpm-dbus.h"
-#include "xfpm-debug.h"
-#include "xfpm-unique.h"
+#include "xfpm-settings-app.h"
 
 int main (int argc, char **argv)
 {
-    GtkWidget *dialog;
-    XfpmUnique *unique;
-
-    GError *error = NULL;
-    DBusGConnection *bus;
-    GHashTable *config_hash;
-    
-    gboolean has_battery;
-    gboolean auth_suspend;
-    gboolean auth_hibernate;
-    gboolean can_suspend;
-    gboolean can_hibernate;
-    gboolean can_shutdown;
-    gboolean has_lcd_brightness;
-    gboolean has_sleep_button;
-    gboolean has_hibernate_button;
-    gboolean has_power_button;
-    gboolean has_lid;
-    gboolean start_xfpm_if_not_running;
-    gboolean debug = FALSE;
-
-    Window socket_id = 0;
-    gchar *device_id = NULL;
-
-    XfconfChannel *channel;
-    DBusGProxy *proxy;
-    
-    GOptionEntry option_entries[] = 
-    {
-	{ "socket-id", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &socket_id, N_("Settings manager socket"), N_("SOCKET ID") },
-	{ "device-id", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device_id, N_("Display a specific device by UpDevice object path"), N_("UpDevice object path") },
-	{ "debug",    '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &debug, N_("Enable debugging"), NULL },
-	{ NULL, },
-    };
 
     xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
-    
-    if( !gtk_init_with_args (&argc, &argv, (gchar *)"", option_entries, (gchar *)PACKAGE, &error)) 
-    {
-        if( error) 
-        {
-            g_printerr("%s: %s.\n", G_LOG_DOMAIN, error->message);
-            g_printerr(_("Type '%s --help' for usage."), G_LOG_DOMAIN);
-            g_printerr("\n");
-            g_error_free(error);
-        }
-        else
-        {
-            g_error("Unable to open display.");
-	}
-        return EXIT_FAILURE;
-    }
-    
-    bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
-    
-    if ( error )
-    {
-	g_error ("%s\n",error->message);
-    }
-
-    while ( !xfpm_dbus_name_has_owner (dbus_g_connection_get_connection(bus), "org.xfce.PowerManager") )
-    {
-	GtkWidget *startw;
-
-	startw = gtk_message_dialog_new (NULL,
-                                         GTK_DIALOG_MODAL,
-                                         GTK_MESSAGE_QUESTION,
-                                         GTK_BUTTONS_YES_NO,
-                                         _("Xfce4 Power Manager is not running, do you want to launch it now?"));
-	start_xfpm_if_not_running = gtk_dialog_run (GTK_DIALOG (startw));
-	gtk_widget_destroy (startw);
-
-	if ( start_xfpm_if_not_running ) 
-	{
-	    g_spawn_command_line_async("xfce4-power-manager",NULL);
-	    /* wait 2 seconds for xfpm to startup */
-	    g_usleep ( 2 * 1000000 );
-	}
-	else
-	{
-	    /* continue without starting xfpm, this will probably error out */
-	    break;
-	}
-    }
-
-    unique = xfpm_unique_new ("org.xfce.PowerManager.Config");
-
-    if ( !xfpm_unique_app_is_running (unique) )
-    {
-	if ( !xfconf_init(&error) )
-	{
-	    g_critical("xfconf init failed: %s using default settings\n", error->message);
-	    xfce_dialog_show_warning (NULL,
-				      _("Xfce Power Manager"),
-				      "%s",
-				      _("Failed to load power manager configuration, using defaults"));
-	    g_error_free (error);
-	    error = NULL;
-	    return EXIT_FAILURE;
-	}
-
-	dbus_g_thread_init ();
-
-	channel = xfconf_channel_new(XFPM_CHANNEL_CFG);
-
-	proxy = dbus_g_proxy_new_for_name(bus,
-					   "org.xfce.PowerManager",
-					   "/org/xfce/PowerManager",
-					   "org.xfce.Power.Manager");
-
-	xfpm_manager_dbus_client_get_config (proxy,
-					     &config_hash,
-					     &error);
-
-	if ( error )
-	{
-	    g_critical ("Unable to get configuration information from xfce power manager: %s", error->message);
-	    xfce_dialog_show_error (NULL, error, "%s", _("Unable to connect to Xfce Power Manager"));
-	    g_error_free (error);
-	    return EXIT_FAILURE;
-	}
-
-	xfpm_debug_init (debug);
-
-	has_battery = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "has-battery"));
-	has_lid = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "has-lid"));
-	can_suspend = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-suspend"));
-	can_hibernate = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-hibernate"));
-	auth_suspend = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "auth-suspend"));
-	auth_hibernate = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "auth-hibernate"));
-	has_lcd_brightness = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "has-brightness"));
-	has_sleep_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "sleep-button"));
-	has_power_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "power-button"));
-	has_hibernate_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "hibernate-button"));
-	can_shutdown = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-shutdown"));
-
-	g_hash_table_destroy (config_hash);
-
-	dialog = xfpm_settings_dialog_new (channel, auth_suspend, auth_hibernate,
-					   can_suspend, can_hibernate, can_shutdown, has_battery, has_lcd_brightness,
-					   has_lid, has_sleep_button, has_hibernate_button, has_power_button,
-					   socket_id, device_id);
-
-	g_signal_connect_swapped (unique, "ping-received",
-				  G_CALLBACK (gtk_window_present), dialog);
-
-	gtk_main();
-
-	xfpm_dbus_release_name(dbus_g_connection_get_connection(bus), "org.xfce.PowerManager.Config");
-	dbus_g_connection_unref (bus);
-	g_object_unref (proxy);
-
-	g_object_unref (unique);
 
-	return EXIT_SUCCESS;
-    }
-    
-    return EXIT_SUCCESS;
+    return g_application_run (G_APPLICATION (xfpm_settings_app_new ()), argc, argv);
 }
diff --git a/settings/xfpm-settings.h b/settings/xfpm-settings.h
index 2b54c16a0299a7dd3f87cd42a7e6c6b5939343d9..b063b8ce8a9be1222e8e3029288ed3a8bcd8483c 100644
--- a/settings/xfpm-settings.h
+++ b/settings/xfpm-settings.h
@@ -22,6 +22,7 @@
 #define __XFPM_SETTINGS_H
 
 #include <gtk/gtkx.h>
+#include <xfconf/xfconf.h>
 
 GtkWidget *xfpm_settings_dialog_new (XfconfChannel *channel,
                                      gboolean auth_suspend,