Index: uspace/app/shutdown-dlg/shutdown-dlg.c
===================================================================
--- uspace/app/shutdown-dlg/shutdown-dlg.c	(revision afb4025d4713e789ff8d0f4543e68d297744e702)
+++ uspace/app/shutdown-dlg/shutdown-dlg.c	(revision 2e08f2b63f3a551e5e61408809d4fbb5c54d1220)
@@ -50,5 +50,7 @@
 static errno_t bg_wnd_paint(ui_window_t *, void *);
 static void shutdown_progress_destroy(shutdown_progress_t *);
+static errno_t shutdown_confirm_msg_create(shutdown_dlg_t *);
 static errno_t shutdown_failed_msg_create(shutdown_dlg_t *);
+static errno_t shutdown_start(shutdown_dlg_t *);
 
 static ui_window_cb_t bg_window_cb = {
@@ -67,4 +69,12 @@
 	.shutdown_complete = sd_shutdown_complete,
 	.shutdown_failed = sd_shutdown_failed
+};
+
+static void shutdown_confirm_msg_button(ui_msg_dialog_t *, void *, unsigned);
+static void shutdown_confirm_msg_close(ui_msg_dialog_t *, void *);
+
+static ui_msg_dialog_cb_t shutdown_confirm_msg_cb = {
+	.button = shutdown_confirm_msg_button,
+	.close = shutdown_confirm_msg_close
 };
 
@@ -151,4 +161,30 @@
 }
 
+/** Create shutdown confirmation dialog.
+ *
+ * @param sddlg Shutdown dialog
+ * @return EOK on success or an error code
+ */
+static errno_t shutdown_confirm_msg_create(shutdown_dlg_t *sddlg)
+{
+	ui_msg_dialog_params_t params;
+	ui_msg_dialog_t *dialog;
+	errno_t rc;
+
+	ui_msg_dialog_params_init(&params);
+	params.caption = "Shutdown";
+	params.text = "Do you want to shut the system down?";
+	params.choice = umdc_ok_cancel;
+	params.flags |= umdf_topmost | umdf_center;
+
+	rc = ui_msg_dialog_create(sddlg->ui, &params, &dialog);
+	if (rc != EOK)
+		return rc;
+
+	ui_msg_dialog_set_cb(dialog, &shutdown_confirm_msg_cb, sddlg);
+
+	return EOK;
+}
+
 /** Create 'shutdown failed' message dialog.
  *
@@ -175,5 +211,5 @@
 }
 
-/** Shutdown failed message dialog button press.
+/** Shutdown confirm message dialog button press.
  *
  * @param dialog Message dialog
@@ -181,4 +217,36 @@
  * @param bnum Button number
  */
+static void shutdown_confirm_msg_button(ui_msg_dialog_t *dialog,
+    void *arg, unsigned bnum)
+{
+	shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
+
+	ui_msg_dialog_destroy(dialog);
+
+	if (bnum == 0)
+		shutdown_start(sddlg);
+	else
+		ui_quit(sddlg->ui);
+}
+
+/** Shutdown confirm message dialog close request.
+ *
+ * @param dialog Message dialog
+ * @param arg Argument (ui_demo_t *)
+ */
+static void shutdown_confirm_msg_close(ui_msg_dialog_t *dialog, void *arg)
+{
+	shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
+
+	ui_msg_dialog_destroy(dialog);
+	ui_quit(sddlg->ui);
+}
+
+/** Shutdown faield message dialog button press.
+ *
+ * @param dialog Message dialog
+ * @param arg Argument (ui_demo_t *)
+ * @param bnum Button number
+ */
 static void shutdown_failed_msg_button(ui_msg_dialog_t *dialog,
     void *arg, unsigned bnum)
@@ -190,5 +258,5 @@
 }
 
-/** Message dialog close request.
+/** Shutdown failed message dialog close request.
  *
  * @param dialog Message dialog
@@ -318,10 +386,35 @@
 }
 
+static errno_t shutdown_start(shutdown_dlg_t *sddlg)
+{
+	errno_t rc;
+
+	rc = shutdown_progress_create(sddlg, &sddlg->progress);
+	if (rc != EOK)
+		return rc;
+
+	rc = system_open(SYSTEM_DEFAULT, &sd_system_cb, sddlg, &sddlg->system);
+	if (rc != EOK) {
+		printf("Failed opening system control service.\n");
+		goto error;
+	}
+
+	rc = system_shutdown(sddlg->system);
+	if (rc != EOK) {
+		printf("Failed requesting system shutdown.\n");
+		goto error;
+	}
+
+	return EOK;
+error:
+	return rc;
+}
+
 /** Run shutdown dialog on display. */
 static errno_t shutdown_dlg(const char *display_spec)
 {
 	ui_t *ui = NULL;
+	shutdown_dlg_t sddlg;
 	ui_wnd_params_t params;
-	shutdown_dlg_t sddlg;
 	errno_t rc;
 
@@ -333,4 +426,6 @@
 		goto error;
 	}
+
+	sddlg.ui = ui;
 
 	ui_wnd_params_init(&params);
@@ -339,5 +434,5 @@
 	params.placement = ui_wnd_place_full_screen;
 	params.flags |= ui_wndf_topmost | ui_wndf_nofocus;
-	if (ui_is_textmode(ui)) {
+	if (ui_is_textmode(sddlg.ui)) {
 		params.rect.p0.x = 0;
 		params.rect.p0.y = 0;
@@ -351,7 +446,5 @@
 	}
 
-	sddlg.ui = ui;
-
-	rc = ui_window_create(ui, &params, &sddlg.bgwindow);
+	rc = ui_window_create(sddlg.ui, &params, &sddlg.bgwindow);
 	if (rc != EOK) {
 		printf("Error creating window.\n");
@@ -359,5 +452,5 @@
 	}
 
-	ui_window_set_cb(sddlg.bgwindow, &bg_window_cb, (void *) &sddlg);
+	ui_window_set_cb(sddlg.bgwindow, &bg_window_cb, (void *)&sddlg);
 
 	rc = gfx_color_new_rgb_i16(0x8000, 0xc800, 0xffff, &sddlg.bg_color);
@@ -373,19 +466,5 @@
 	}
 
-	rc = shutdown_progress_create(&sddlg, &sddlg.progress);
-	if (rc != EOK)
-		return rc;
-
-	rc = system_open(SYSTEM_DEFAULT, &sd_system_cb, &sddlg, &sddlg.system);
-	if (rc != EOK) {
-		printf("Failed opening system control service.\n");
-		goto error;
-	}
-
-	rc = system_shutdown(sddlg.system);
-	if (rc != EOK) {
-		printf("Failed requesting system shutdown.\n");
-		goto error;
-	}
+	(void)shutdown_confirm_msg_create(&sddlg);
 
 	ui_run(ui);
@@ -394,5 +473,6 @@
 	if (sddlg.bgwindow != NULL)
 		ui_window_destroy(sddlg.bgwindow);
-	system_close(sddlg.system);
+	if (sddlg.system != NULL)
+		system_close(sddlg.system);
 	gfx_color_delete(sddlg.bg_color);
 	ui_destroy(ui);
