diff --git a/src/shell-app.c b/src/shell-app.c
index 6c78d23b1..bf01a5292 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -7,6 +7,8 @@
 #include "shell-global.h"
 #include "shell-enum-types.h"
 #include "display.h"
+#include "st.h"
+#include "shell-window-tracker.h"
 
 #include <string.h>
 
@@ -733,6 +735,37 @@ _shell_app_set_starting (ShellApp        *app,
     shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
 }
 
+/**
+ * shell_app_request_quit:
+ * @app: A #ShellApp
+ *
+ * Initiate an asynchronous request to quit this application.
+ * The application may interact with the user, and the user
+ * might cancel the quit request from the application UI.
+ *
+ * This operation may not be supported for all applications.
+ *
+ * Returns: %TRUE if a quit request is supported for this application
+ */
+gboolean
+shell_app_request_quit (ShellApp   *app)
+{
+  GSList *iter;
+
+  /* TODO - check for an XSMP connection; we could probably use that */
+
+  for (iter = app->windows; iter; iter = iter->next)
+    {
+      MetaWindow *win = iter->data;
+
+      if (!shell_window_tracker_is_window_interesting (win))
+        continue;
+
+      meta_window_delete (win, shell_global_get_current_time (shell_global_get ()));
+    }
+  return TRUE;
+}
+
 static void
 shell_app_init (ShellApp *self)
 {
diff --git a/src/shell-app.h b/src/shell-app.h
index de969152f..22f612f1b 100644
--- a/src/shell-app.h
+++ b/src/shell-app.h
@@ -3,6 +3,7 @@
 #define __SHELL_APP_H__
 
 #include <clutter/clutter.h>
+#include <gio/gio.h>
 
 #include "window.h"
 
@@ -49,6 +50,8 @@ void shell_app_open_new_window (ShellApp *app);
 
 ShellAppState shell_app_get_state (ShellApp *app);
 
+gboolean shell_app_request_quit (ShellApp *app);
+
 guint shell_app_get_n_windows (ShellApp *app);
 
 GSList *shell_app_get_windows (ShellApp *app);