diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
index 98f7949..2b1e9db 100644
--- a/gnome-session/gsm-manager.c
+++ b/gnome-session/gsm-manager.c
@@ -114,6 +114,7 @@ typedef enum
 {
         GSM_MANAGER_LOGOUT_NONE,
         GSM_MANAGER_LOGOUT_LOGOUT,
+        GSM_MANAGER_LOGOUT_RESTART,
         GSM_MANAGER_LOGOUT_REBOOT,
         GSM_MANAGER_LOGOUT_REBOOT_INTERACT,
         GSM_MANAGER_LOGOUT_REBOOT_GDM,
@@ -483,12 +484,26 @@ phase_num_to_name (guint phase)
 static void start_phase (GsmManager *manager);
 
 static void
+do_restart (void)
+{
+  char * const argv[2] = { "gnome-session", NULL };
+  char * const *envp;
+
+  envp = (char * const *)g_get_environ ();
+
+  execve ("/usr/bin/gnome-session", argv, envp);
+}
+
+static void
 gsm_manager_quit (GsmManager *manager)
 {
         /* See the comment in request_reboot() for some more details about how
          * this works. */
 
         switch (manager->priv->logout_type) {
+        case GSM_MANAGER_LOGOUT_RESTART:
+                do_restart ();
+                break;
         case GSM_MANAGER_LOGOUT_LOGOUT:
                 gtk_main_quit ();
                 break;
@@ -1247,6 +1262,7 @@ end_session_or_show_fallback_dialog (GsmManager *manager)
         }
 
         switch (manager->priv->logout_type) {
+        case GSM_MANAGER_LOGOUT_RESTART:
         case GSM_MANAGER_LOGOUT_LOGOUT:
                 action = GSM_LOGOUT_ACTION_LOGOUT;
                 break;
@@ -1290,6 +1306,7 @@ end_session_or_show_shell_dialog (GsmManager *manager)
         gboolean logout_inhibited;
 
         switch (manager->priv->logout_type) {
+        case GSM_MANAGER_LOGOUT_RESTART:
         case GSM_MANAGER_LOGOUT_LOGOUT:
                 type = GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT;
                 break;
@@ -3110,6 +3127,15 @@ request_logout (GsmManager           *manager,
 }
 
 static void
+request_restart (GsmManager           *manager)
+{
+        g_debug ("GsmManager: requesting restart");
+
+        manager->priv->logout_type = GSM_MANAGER_LOGOUT_RESTART;
+        end_phase (manager);
+}
+
+static void
 request_switch_user (GdkDisplay *display,
                      GsmManager *manager)
 {
@@ -3318,7 +3344,7 @@ static void
 on_shell_end_session_dialog_confirmed_logout (GsmShell   *shell,
                                               GsmManager *manager)
 {
-        _handle_end_session_dialog_response (manager, GSM_MANAGER_LOGOUT_LOGOUT);
+        _handle_end_session_dialog_response (manager, manager->priv->logout_type);
         disconnect_shell_dialog_signals (manager);
 }
 
@@ -3585,6 +3611,27 @@ gsm_manager_logout (GsmManager *manager,
 }
 
 gboolean
+gsm_manager_restart (GsmManager  *manager,
+                     GError     **error)
+{
+        g_debug ("GsmManager: Restart called");
+
+        g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
+
+        if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING) {
+                g_set_error (error,
+                             GSM_MANAGER_ERROR,
+                             GSM_MANAGER_ERROR_NOT_IN_RUNNING,
+                             "Restart interface is only available during the Running phase");
+                return FALSE;
+        }
+
+        request_restart (manager);
+
+        return TRUE;
+}
+
+gboolean
 gsm_manager_register_client (GsmManager            *manager,
                              const char            *app_id,
                              const char            *startup_id,
@@ -4202,6 +4249,7 @@ do_query_end_session_exit (GsmManager *manager)
         int action;
 
         switch (manager->priv->logout_type) {
+        case GSM_MANAGER_LOGOUT_RESTART:
         case GSM_MANAGER_LOGOUT_LOGOUT:
                 action = GSM_LOGOUT_ACTION_LOGOUT;
                 break;
diff --git a/gnome-session/gsm-manager.h b/gnome-session/gsm-manager.h
index f9632d7..64bef59 100644
--- a/gnome-session/gsm-manager.h
+++ b/gnome-session/gsm-manager.h
@@ -167,6 +167,9 @@ gboolean            gsm_manager_can_shutdown                   (GsmManager     *
 gboolean            gsm_manager_logout                         (GsmManager     *manager,
                                                                 guint           logout_mode,
                                                                 GError        **error);
+gboolean            gsm_manager_restart                        (GsmManager     *manager,
+                                                                GError        **error);
+
 
 gboolean            gsm_manager_setenv                         (GsmManager     *manager,
                                                                 const char     *variable,
diff --git a/gnome-session/org.gnome.SessionManager.xml b/gnome-session/org.gnome.SessionManager.xml
index eb69180..bba5989 100644
--- a/gnome-session/org.gnome.SessionManager.xml
+++ b/gnome-session/org.gnome.SessionManager.xml
@@ -331,6 +331,14 @@
       </doc:doc>
     </method>
 
+    <method name="Restart">
+      <doc:doc>
+        <doc:description>
+          <doc:para>Restart the session</doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
     <method name="IsSessionRunning">
       <arg name="running" direction="out" type="b">
         <doc:doc>
