Index: uspace/app/shutdown-dlg/shutdown-dlg.c
===================================================================
--- uspace/app/shutdown-dlg/shutdown-dlg.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/app/shutdown-dlg/shutdown-dlg.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -41,6 +41,8 @@
 #include <ui/fixed.h>
 #include <ui/label.h>
+#include <ui/list.h>
 #include <ui/msgdialog.h>
 #include <ui/resource.h>
+#include <ui/selectdialog.h>
 #include <ui/ui.h>
 #include <ui/window.h>
@@ -50,7 +52,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_confirm_create(shutdown_dlg_t *);
 static errno_t shutdown_failed_msg_create(shutdown_dlg_t *);
-static errno_t shutdown_start(shutdown_dlg_t *);
+static errno_t shutdown_start(shutdown_dlg_t *, sd_action_t);
 
 static ui_window_cb_t bg_window_cb = {
@@ -71,10 +73,12 @@
 };
 
-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
+static void shutdown_confirm_bok(ui_select_dialog_t *, void *, void *);
+static void shutdown_confirm_bcancel(ui_select_dialog_t *, void *);
+static void shutdown_confirm_close(ui_select_dialog_t *, void *);
+
+static ui_select_dialog_cb_t shutdown_confirm_cb = {
+	.bok = shutdown_confirm_bok,
+	.bcancel = shutdown_confirm_bcancel,
+	.close = shutdown_confirm_close
 };
 
@@ -166,23 +170,43 @@
  * @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);
+static errno_t shutdown_confirm_create(shutdown_dlg_t *sddlg)
+{
+	ui_select_dialog_params_t params;
+	ui_select_dialog_t *dialog;
+	ui_list_entry_attr_t attr;
+	errno_t rc;
+
+	ui_select_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);
+	params.prompt = "Do you want to shut the system down?";
+	params.flags |= usdf_topmost | usdf_center;
+
+	rc = ui_select_dialog_create(sddlg->ui, &params, &dialog);
 	if (rc != EOK)
 		return rc;
 
-	ui_msg_dialog_set_cb(dialog, &shutdown_confirm_msg_cb, sddlg);
+	/* Need an entry to select */
+	ui_list_entry_attr_init(&attr);
+
+	attr.caption = "Power off";
+	attr.arg = (void *)sd_poweroff;
+	rc = ui_select_dialog_append(dialog, &attr);
+	if (rc != EOK)
+		goto error;
+
+	attr.caption = "Restart";
+	attr.arg = (void *)sd_restart;
+	rc = ui_select_dialog_append(dialog, &attr);
+	if (rc != EOK)
+		goto error;
+
+	ui_select_dialog_set_cb(dialog, &shutdown_confirm_cb, sddlg);
+
+	(void)ui_select_dialog_paint(dialog);
 
 	return EOK;
+error:
+	ui_select_dialog_destroy(dialog);
+	return rc;
 }
 
@@ -211,33 +235,43 @@
 }
 
-/** Shutdown confirm message dialog button press.
+/** Shutdown confirm dialog OK button press.
  *
  * @param dialog Message dialog
  * @param arg Argument (ui_demo_t *)
- * @param bnum Button number
- */
-static void shutdown_confirm_msg_button(ui_msg_dialog_t *dialog,
-    void *arg, unsigned bnum)
+ * @param earg Entry argument
+ */
+static void shutdown_confirm_bok(ui_select_dialog_t *dialog, void *arg,
+    void *earg)
 {
 	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.
+	ui_select_dialog_destroy(dialog);
+
+	shutdown_start(sddlg, (sd_action_t)earg);
+}
+
+/** Shutdown confirm dialog Cancel button press.
  *
  * @param dialog Message dialog
  * @param arg Argument (ui_demo_t *)
  */
-static void shutdown_confirm_msg_close(ui_msg_dialog_t *dialog, void *arg)
+static void shutdown_confirm_bcancel(ui_select_dialog_t *dialog, void *arg)
 {
 	shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
 
-	ui_msg_dialog_destroy(dialog);
+	ui_select_dialog_destroy(dialog);
+	ui_quit(sddlg->ui);
+}
+
+/** Shutdown confirm message dialog close request.
+ *
+ * @param dialog Message dialog
+ * @param arg Argument (ui_demo_t *)
+ */
+static void shutdown_confirm_close(ui_select_dialog_t *dialog, void *arg)
+{
+	shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
+
+	ui_select_dialog_destroy(dialog);
 	ui_quit(sddlg->ui);
 }
@@ -386,5 +420,11 @@
 }
 
-static errno_t shutdown_start(shutdown_dlg_t *sddlg)
+/** Start shutdown.
+ *
+ * @param sddlg Shutdown dialog
+ * @param action Shutdown actin
+ * @return EOK on success or an error code
+ */
+static errno_t shutdown_start(shutdown_dlg_t *sddlg, sd_action_t action)
 {
 	errno_t rc;
@@ -400,5 +440,15 @@
 	}
 
-	rc = system_poweroff(sddlg->system);
+	rc = EINVAL;
+
+	switch (action) {
+	case sd_poweroff:
+		rc = system_poweroff(sddlg->system);
+		break;
+	case sd_restart:
+		rc = system_restart(sddlg->system);
+		break;
+	}
+
 	if (rc != EOK) {
 		printf("Failed requesting system shutdown.\n");
@@ -469,5 +519,5 @@
 	}
 
-	(void)shutdown_confirm_msg_create(&sddlg);
+	(void)shutdown_confirm_create(&sddlg);
 
 	ui_run(ui);
Index: uspace/app/shutdown-dlg/shutdown-dlg.h
===================================================================
--- uspace/app/shutdown-dlg/shutdown-dlg.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/app/shutdown-dlg/shutdown-dlg.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -60,4 +60,10 @@
 } shutdown_dlg_t;
 
+/** Shutdown action */
+typedef enum {
+	sd_poweroff = 1,
+	sd_restart
+} sd_action_t;
+
 #endif
 
Index: uspace/drv/block/isa-ide/isa-ide.c
===================================================================
--- uspace/drv/block/isa-ide/isa-ide.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/isa-ide/isa-ide.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -101,5 +101,5 @@
 	ata_params_t params;
 
-	ddf_msg(LVL_DEBUG, "isa_ide_ctrl_init()");
+	ddf_msg(LVL_DEBUG, "isa_ide_channel_init()");
 
 	memset(&params, 0, sizeof(params));
@@ -135,5 +135,5 @@
 	irq_inited = true;
 
-	ddf_msg(LVL_DEBUG, "isa_ide_ctrl_init(): Initialize IDE channel");
+	ddf_msg(LVL_DEBUG, "isa_ide_channel_init(): Initialize IDE channel");
 
 	params.arg = (void *)chan;
@@ -163,5 +163,5 @@
 		goto error;
 
-	ddf_msg(LVL_DEBUG, "isa_ide_ctrl_init: DONE");
+	ddf_msg(LVL_DEBUG, "isa_ide_channel_init: DONE");
 	return EOK;
 error:
@@ -181,5 +181,5 @@
 	errno_t rc;
 
-	ddf_msg(LVL_DEBUG, ": isa_ide_ctrl_remove()");
+	ddf_msg(LVL_DEBUG, ": isa_ide_channel_fini()");
 
 	fibril_mutex_lock(&chan->lock);
@@ -196,4 +196,14 @@
 
 	return EOK;
+}
+
+/** Quiesce ISA IDE channel. */
+void isa_ide_channel_quiesce(isa_ide_channel_t *chan)
+{
+	ddf_msg(LVL_DEBUG, ": isa_ide_channel_quiesce()");
+
+	fibril_mutex_lock(&chan->lock);
+	ata_channel_quiesce(chan->channel);
+	fibril_mutex_unlock(&chan->lock);
 }
 
Index: uspace/drv/block/isa-ide/isa-ide.h
===================================================================
--- uspace/drv/block/isa-ide/isa-ide.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/isa-ide/isa-ide.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -104,4 +104,5 @@
     unsigned, isa_ide_hwres_t *);
 extern errno_t isa_ide_channel_fini(isa_ide_channel_t *);
+extern void isa_ide_channel_quiesce(isa_ide_channel_t *);
 
 #endif
Index: uspace/drv/block/isa-ide/main.c
===================================================================
--- uspace/drv/block/isa-ide/main.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/isa-ide/main.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -49,4 +49,5 @@
 static errno_t isa_ide_dev_remove(ddf_dev_t *dev);
 static errno_t isa_ide_dev_gone(ddf_dev_t *dev);
+static errno_t isa_ide_dev_quiesce(ddf_dev_t *dev);
 static errno_t isa_ide_fun_online(ddf_fun_t *fun);
 static errno_t isa_ide_fun_offline(ddf_fun_t *fun);
@@ -55,9 +56,10 @@
 
 static driver_ops_t driver_ops = {
-	.dev_add = &isa_ide_dev_add,
-	.dev_remove = &isa_ide_dev_remove,
-	.dev_gone = &isa_ide_dev_gone,
-	.fun_online = &isa_ide_fun_online,
-	.fun_offline = &isa_ide_fun_offline
+	.dev_add = isa_ide_dev_add,
+	.dev_remove = isa_ide_dev_remove,
+	.dev_gone = isa_ide_dev_gone,
+	.dev_quiesce = isa_ide_dev_quiesce,
+	.fun_online = isa_ide_fun_online,
+	.fun_offline = isa_ide_fun_offline
 };
 
@@ -379,4 +381,15 @@
 }
 
+static errno_t isa_ide_dev_quiesce(ddf_dev_t *dev)
+{
+	isa_ide_ctrl_t *ctrl = (isa_ide_ctrl_t *)ddf_dev_data_get(dev);
+
+	ddf_msg(LVL_DEBUG, "isa_ide_dev_quiesce(%p)", dev);
+
+	isa_ide_channel_quiesce(&ctrl->channel[0]);
+	isa_ide_channel_quiesce(&ctrl->channel[1]);
+	return EOK;
+}
+
 static errno_t isa_ide_fun_online(ddf_fun_t *fun)
 {
Index: uspace/drv/block/pc-floppy/main.c
===================================================================
--- uspace/drv/block/pc-floppy/main.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/pc-floppy/main.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -47,13 +47,15 @@
 static errno_t pc_fdc_dev_remove(ddf_dev_t *dev);
 static errno_t pc_fdc_dev_gone(ddf_dev_t *dev);
+static errno_t pc_fdc_dev_quiesce(ddf_dev_t *dev);
 static errno_t pc_fdc_fun_online(ddf_fun_t *fun);
 static errno_t pc_fdc_fun_offline(ddf_fun_t *fun);
 
 static driver_ops_t driver_ops = {
-	.dev_add = &pc_fdc_dev_add,
-	.dev_remove = &pc_fdc_dev_remove,
-	.dev_gone = &pc_fdc_dev_gone,
-	.fun_online = &pc_fdc_fun_online,
-	.fun_offline = &pc_fdc_fun_offline
+	.dev_add = pc_fdc_dev_add,
+	.dev_remove = pc_fdc_dev_remove,
+	.dev_gone = pc_fdc_dev_gone,
+	.dev_quiesce = pc_fdc_dev_quiesce,
+	.fun_online = pc_fdc_fun_online,
+	.fun_offline = pc_fdc_fun_offline
 };
 
@@ -183,4 +185,16 @@
 }
 
+/** Quiesce FDC device.
+ *
+ * @param dev Device
+ * @return EOK on success or an error code
+ */
+static errno_t pc_fdc_dev_quiesce(ddf_dev_t *dev)
+{
+	pc_fdc_t *fdc = (pc_fdc_t *)ddf_dev_data_get(dev);
+	pc_fdc_quiesce(fdc);
+	return EOK;
+}
+
 /** Online FDC function.
  *
Index: uspace/drv/block/pc-floppy/pc-floppy.c
===================================================================
--- uspace/drv/block/pc-floppy/pc-floppy.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/pc-floppy/pc-floppy.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -256,4 +256,13 @@
 }
 
+/** Quiesce floppy controller.
+ *
+ * @param fdc Floppy controller
+ */
+void pc_fdc_quiesce(pc_fdc_t *fdc)
+{
+	(void)pc_fdc_reset(fdc);
+}
+
 /** Enable device I/O.
  *
Index: uspace/drv/block/pc-floppy/pc-floppy.h
===================================================================
--- uspace/drv/block/pc-floppy/pc-floppy.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/pc-floppy/pc-floppy.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -97,4 +97,5 @@
 
 extern errno_t pc_fdc_create(ddf_dev_t *, pc_fdc_hwres_t *, pc_fdc_t **);
+extern void pc_fdc_quiesce(pc_fdc_t *);
 extern errno_t pc_fdc_destroy(pc_fdc_t *);
 
Index: uspace/drv/block/pci-ide/main.c
===================================================================
--- uspace/drv/block/pci-ide/main.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/pci-ide/main.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -49,4 +49,5 @@
 static errno_t pci_ide_dev_remove(ddf_dev_t *dev);
 static errno_t pci_ide_dev_gone(ddf_dev_t *dev);
+static errno_t pci_ide_dev_quiesce(ddf_dev_t *dev);
 static errno_t pci_ide_fun_online(ddf_fun_t *fun);
 static errno_t pci_ide_fun_offline(ddf_fun_t *fun);
@@ -55,9 +56,10 @@
 
 static driver_ops_t driver_ops = {
-	.dev_add = &pci_ide_dev_add,
-	.dev_remove = &pci_ide_dev_remove,
-	.dev_gone = &pci_ide_dev_gone,
-	.fun_online = &pci_ide_fun_online,
-	.fun_offline = &pci_ide_fun_offline
+	.dev_add = pci_ide_dev_add,
+	.dev_remove = pci_ide_dev_remove,
+	.dev_gone = pci_ide_dev_gone,
+	.dev_quiesce = pci_ide_dev_quiesce,
+	.fun_online = pci_ide_fun_online,
+	.fun_offline = pci_ide_fun_offline
 };
 
@@ -367,4 +369,16 @@
 }
 
+static errno_t pci_ide_dev_quiesce(ddf_dev_t *dev)
+{
+	pci_ide_ctrl_t *ctrl = (pci_ide_ctrl_t *)ddf_dev_data_get(dev);
+
+	ddf_msg(LVL_DEBUG, "pci_ide_dev_quiesce(%p)", dev);
+
+	pci_ide_channel_quiesce(&ctrl->channel[0]);
+	pci_ide_channel_quiesce(&ctrl->channel[1]);
+
+	return EOK;
+}
+
 static errno_t pci_ide_fun_online(ddf_fun_t *fun)
 {
Index: uspace/drv/block/pci-ide/pci-ide.c
===================================================================
--- uspace/drv/block/pci-ide/pci-ide.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/pci-ide/pci-ide.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -331,4 +331,14 @@
 }
 
+/** Quiesce PCI IDE channel. */
+void pci_ide_channel_quiesce(pci_ide_channel_t *chan)
+{
+	ddf_msg(LVL_DEBUG, ": pci_ide_channel_quiesce()");
+
+	fibril_mutex_lock(&chan->lock);
+	ata_channel_quiesce(chan->channel);
+	fibril_mutex_unlock(&chan->lock);
+}
+
 /** Enable device I/O. */
 static errno_t pci_ide_init_io(pci_ide_channel_t *chan)
Index: uspace/drv/block/pci-ide/pci-ide.h
===================================================================
--- uspace/drv/block/pci-ide/pci-ide.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/block/pci-ide/pci-ide.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -129,4 +129,5 @@
     unsigned, pci_ide_hwres_t *);
 extern errno_t pci_ide_channel_fini(pci_ide_channel_t *);
+extern void pci_ide_channel_quiesce(pci_ide_channel_t *);
 
 #endif
Index: uspace/drv/bus/usb/ohci/hw_struct/completion_codes.h
===================================================================
--- uspace/drv/bus/usb/ohci/hw_struct/completion_codes.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/bus/usb/ohci/hw_struct/completion_codes.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -54,5 +55,5 @@
 };
 
-inline static errno_t cc_to_rc(unsigned int cc)
+static inline errno_t cc_to_rc(unsigned int cc)
 {
 	switch (cc) {
Index: uspace/drv/bus/usb/ohci/hw_struct/transfer_descriptor.h
===================================================================
--- uspace/drv/bus/usb/ohci/hw_struct/transfer_descriptor.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/bus/usb/ohci/hw_struct/transfer_descriptor.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -103,5 +104,5 @@
  * @return true if the TD was accessed and processed by hw, false otherwise.
  */
-inline static bool td_is_finished(const td_t *instance)
+static inline bool td_is_finished(const td_t *instance)
 {
 	assert(instance);
Index: uspace/drv/char/i8042/i8042.c
===================================================================
--- uspace/drv/char/i8042/i8042.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/char/i8042/i8042.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,6 +1,6 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2001-2004 Jakub Jermar
  * Copyright (c) 2006 Josef Cejka
- * Copyright (c) 2021 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -346,4 +346,17 @@
 }
 
+/** Quiesce i8042.
+ *
+ * @param dev i8042 instance.
+ */
+void i8042_quiesce(i8042_t *dev)
+{
+	/* Disable port interrupts. */
+	wait_ready(dev);
+	pio_write_8(&dev->regs->status, i8042_CMD_WRITE_CMDB);
+	wait_ready(dev);
+	pio_write_8(&dev->regs->data, i8042_KBD_TRANSLATE);
+}
+
 /** Write data to i8042 port.
  *
Index: uspace/drv/char/i8042/i8042.h
===================================================================
--- uspace/drv/char/i8042/i8042.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/char/i8042/i8042.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2006 Josef Cejka
  * Copyright (c) 2011 Jan Vesely
@@ -95,4 +95,5 @@
 
 extern errno_t i8042_init(i8042_t *, addr_range_t *, int, int, ddf_dev_t *);
+extern void i8042_quiesce(i8042_t *);
 
 #endif
Index: uspace/drv/char/i8042/main.c
===================================================================
--- uspace/drv/char/i8042/main.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/char/i8042/main.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * All rights reserved.
@@ -135,7 +136,26 @@
 }
 
+/** Initialize a new ddf driver instance of i8042 driver
+ *
+ * @param[in] device DDF instance of the device to initialize.
+ *
+ * @return Error code.
+ *
+ */
+static errno_t i8042_dev_quiesce(ddf_dev_t *device)
+{
+	i8042_t *i8042;
+
+	ddf_msg(LVL_DEBUG, "i8042_dev_quiesce()");
+
+	i8042 = (i8042_t *)ddf_dev_data_get(device);
+	i8042_quiesce(i8042);
+	return EOK;
+}
+
 /** DDF driver operations. */
 static driver_ops_t i8042_driver_ops = {
 	.dev_add = i8042_dev_add,
+	.dev_quiesce = i8042_dev_quiesce
 };
 
Index: uspace/drv/char/ns8250/ns8250.c
===================================================================
--- uspace/drv/char/ns8250/ns8250.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/char/ns8250/ns8250.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,5 +1,5 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2010 Lenka Trochtova
- * Copyright (c) 2017 Jiri Svoboda
  * All rights reserved.
  *
@@ -327,4 +327,5 @@
 
 static errno_t ns8250_dev_add(ddf_dev_t *dev);
+static errno_t ns8250_dev_quiesce(ddf_dev_t *dev);
 static errno_t ns8250_dev_remove(ddf_dev_t *dev);
 
@@ -332,5 +333,6 @@
 static driver_ops_t ns8250_ops = {
 	.dev_add = &ns8250_dev_add,
-	.dev_remove = &ns8250_dev_remove
+	.dev_remove = &ns8250_dev_remove,
+	.dev_quiesce = &ns8250_dev_quiesce
 };
 
@@ -966,4 +968,12 @@
 }
 
+static errno_t ns8250_dev_quiesce(ddf_dev_t *dev)
+{
+	ns8250_t *ns = dev_ns8250(dev);
+
+	ns8250_port_interrupts_disable(ns->regs);
+	return EOK;
+}
+
 /** Open the device.
  *
Index: uspace/drv/char/pc-lpt/main.c
===================================================================
--- uspace/drv/char/pc-lpt/main.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/char/pc-lpt/main.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2018 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -46,4 +46,5 @@
 static errno_t pc_lpt_dev_remove(ddf_dev_t *dev);
 static errno_t pc_lpt_dev_gone(ddf_dev_t *dev);
+static errno_t pc_lpt_dev_quiesce(ddf_dev_t *dev);
 static errno_t pc_lpt_fun_online(ddf_fun_t *fun);
 static errno_t pc_lpt_fun_offline(ddf_fun_t *fun);
@@ -53,4 +54,5 @@
 	.dev_remove = pc_lpt_dev_remove,
 	.dev_gone = pc_lpt_dev_gone,
+	.dev_quiesce = pc_lpt_dev_quiesce,
 	.fun_online = pc_lpt_fun_online,
 	.fun_offline = pc_lpt_fun_offline
@@ -140,4 +142,14 @@
 }
 
+static errno_t pc_lpt_dev_quiesce(ddf_dev_t *dev)
+{
+	pc_lpt_t *pc_lpt = (pc_lpt_t *)ddf_dev_data_get(dev);
+
+	ddf_msg(LVL_DEBUG, "pc_lpt_dev_quiesce(%p)", dev);
+
+	pc_lpt_quiesce(pc_lpt);
+	return EOK;
+}
+
 static errno_t pc_lpt_fun_online(ddf_fun_t *fun)
 {
Index: uspace/drv/char/pc-lpt/pc-lpt.c
===================================================================
--- uspace/drv/char/pc-lpt/pc-lpt.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/char/pc-lpt/pc-lpt.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2018 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -196,4 +196,13 @@
 }
 
+/** Quiesce pc-lpt device */
+void pc_lpt_quiesce(pc_lpt_t *lpt)
+{
+	uint8_t control;
+
+	control = 0; /* nINIT=0, IRQ_ENABLE=0 */
+	pio_write_8(&lpt->regs->control, control);
+}
+
 /** Write a single byte to the parallel port.
  *
Index: uspace/drv/char/pc-lpt/pc-lpt.h
===================================================================
--- uspace/drv/char/pc-lpt/pc-lpt.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/char/pc-lpt/pc-lpt.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2018 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -74,4 +74,5 @@
 extern errno_t pc_lpt_remove(pc_lpt_t *);
 extern errno_t pc_lpt_gone(pc_lpt_t *);
+extern void pc_lpt_quiesce(pc_lpt_t *);
 
 #endif
Index: uspace/drv/nic/e1k/e1k.c
===================================================================
--- uspace/drv/nic/e1k/e1k.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/nic/e1k/e1k.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1272,5 +1272,5 @@
  *
  */
-inline static errno_t e1000_register_int_handler(nic_t *nic,
+static errno_t e1000_register_int_handler(nic_t *nic,
     cap_irq_handle_t *handle)
 {
@@ -1921,5 +1921,5 @@
  *
  */
-inline static void e1000_delete_dev_data(ddf_dev_t *dev)
+static void e1000_delete_dev_data(ddf_dev_t *dev)
 {
 	assert(dev);
Index: uspace/drv/nic/ne2k/dp8390.c
===================================================================
--- uspace/drv/nic/ne2k/dp8390.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/nic/ne2k/dp8390.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2009 Lukas Mejdrech
  * Copyright (c) 2011 Martin Decky
@@ -182,4 +183,13 @@
 			break;
 	}
+}
+
+/** Quiesce NE2000.
+ *
+ * @param ne2k NE2000
+ */
+void ne2k_quiesce(ne2k_t *ne2k)
+{
+	ne2k_init(ne2k);
 }
 
Index: uspace/drv/nic/ne2k/dp8390.h
===================================================================
--- uspace/drv/nic/ne2k/dp8390.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/nic/ne2k/dp8390.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2009 Lukas Mejdrech
  * Copyright (c) 2011 Martin Decky
@@ -267,4 +268,5 @@
 extern errno_t ne2k_probe(ne2k_t *);
 extern errno_t ne2k_up(ne2k_t *);
+extern void ne2k_quiesce(ne2k_t *);
 extern void ne2k_down(ne2k_t *);
 extern void ne2k_send(nic_t *, void *, size_t);
Index: uspace/drv/nic/ne2k/ne2k.c
===================================================================
--- uspace/drv/nic/ne2k/ne2k.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/nic/ne2k/ne2k.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Martin Decky
  * Copyright (c) 2011 Radim Vansa
@@ -459,4 +460,17 @@
 }
 
+static errno_t ne2k_dev_quiesce(ddf_dev_t *dev)
+{
+	nic_t *nic;
+	ne2k_t *ne2k;
+
+	nic = nic_get_from_ddf_dev(dev);
+
+	ne2k = (ne2k_t *)nic_get_specific(nic);
+	ne2k_quiesce(ne2k);
+
+	return EOK;
+}
+
 static nic_iface_t ne2k_nic_iface = {
 	.set_address = ne2k_set_address,
@@ -467,5 +481,6 @@
 
 static driver_ops_t ne2k_driver_ops = {
-	.dev_add = ne2k_dev_add
+	.dev_add = ne2k_dev_add,
+	.dev_quiesce = ne2k_dev_quiesce
 };
 
Index: uspace/drv/nic/rtl8139/driver.c
===================================================================
--- uspace/drv/nic/rtl8139/driver.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/nic/rtl8139/driver.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jiri Michalec
  * All rights reserved.
@@ -74,5 +75,5 @@
  *
  */
-inline static void rtl8139_lock_all(rtl8139_t *rtl8139)
+static void rtl8139_lock_all(rtl8139_t *rtl8139)
 {
 	assert(rtl8139);
@@ -86,5 +87,5 @@
  *
  */
-inline static void rtl8139_unlock_all(rtl8139_t *rtl8139)
+static void rtl8139_unlock_all(rtl8139_t *rtl8139)
 {
 	assert(rtl8139);
@@ -127,5 +128,5 @@
  *  @param rtl8139  The card private structure
  */
-inline static void rtl8139_hw_int_set(rtl8139_t *rtl8139)
+static void rtl8139_hw_int_set(rtl8139_t *rtl8139)
 {
 	pio_write_16(rtl8139->io_port + IMR, rtl8139->int_mask);
@@ -138,5 +139,5 @@
  *  @return Nonzero if empty, zero otherwise
  */
-inline static int rtl8139_hw_buffer_empty(rtl8139_t *rtl8139)
+static int rtl8139_hw_buffer_empty(rtl8139_t *rtl8139)
 {
 	return pio_read_16(rtl8139->io_port + CR) & CR_BUFE;
@@ -166,5 +167,5 @@
  *  @param mask     The mask to set
  */
-inline static void rtl8139_hw_set_mcast_mask(rtl8139_t *rtl8139,
+static void rtl8139_hw_set_mcast_mask(rtl8139_t *rtl8139,
     uint64_t mask)
 {
@@ -180,5 +181,5 @@
  *  @param bit_val  If bit_val is zero pmen is set to 0, otherwise pmen is set to 1
  */
-inline static void rtl8139_hw_pmen_set(rtl8139_t *rtl8139, uint8_t bit_val)
+static void rtl8139_hw_pmen_set(rtl8139_t *rtl8139, uint8_t bit_val)
 {
 	uint8_t config1 = pio_read_8(rtl8139->io_port + CONFIG1);
@@ -222,5 +223,5 @@
  *  @return EOK if succeed, error code otherwise
  */
-inline static void rtl8139_hw_get_addr(rtl8139_t *rtl8139,
+static void rtl8139_hw_get_addr(rtl8139_t *rtl8139,
     nic_address_t *addr)
 {
@@ -261,5 +262,5 @@
  *   @param bits_add    The value to or
  */
-inline static void rtl8139_hw_reg_add_8(rtl8139_t *rtl8139, size_t reg_offset,
+static void rtl8139_hw_reg_add_8(rtl8139_t *rtl8139, size_t reg_offset,
     uint8_t bits_add)
 {
@@ -275,5 +276,5 @@
  *   @param bits_add    The mask of bits to remove
  */
-inline static void rtl8139_hw_reg_rem_8(rtl8139_t *rtl8139, size_t reg_offset,
+static void rtl8139_hw_reg_rem_8(rtl8139_t *rtl8139, size_t reg_offset,
     uint8_t bits_add)
 {
@@ -338,8 +339,10 @@
 
 static errno_t rtl8139_dev_add(ddf_dev_t *dev);
+static errno_t rtl8139_dev_quiesce(ddf_dev_t *dev);
 
 /** Basic driver operations for RTL8139 driver */
 static driver_ops_t rtl8139_driver_ops = {
 	.dev_add = &rtl8139_dev_add,
+	.dev_quiesce = &rtl8139_dev_quiesce
 };
 
@@ -432,5 +435,5 @@
  *  @param io_base  The address of the i/o port mapping start
  */
-inline static void rtl8139_hw_soft_reset(void *io_base)
+static void rtl8139_hw_soft_reset(void *io_base)
 {
 	pio_write_8(io_base + CR, CR_RST);
@@ -845,5 +848,5 @@
  *  @return An error code otherwise.
  */
-inline static errno_t rtl8139_register_int_handler(nic_t *nic_data,
+static errno_t rtl8139_register_int_handler(nic_t *nic_data,
     cap_irq_handle_t *handle)
 {
@@ -872,5 +875,5 @@
  * @param rtl8139  The card private data
  */
-inline static void rtl8139_card_up(rtl8139_t *rtl8139)
+static void rtl8139_card_up(rtl8139_t *rtl8139)
 {
 	void *io_base = rtl8139->io_port;
@@ -1245,4 +1248,9 @@
 		}
 	}
+}
+
+static void rtl8139_quiesce(rtl8139_t *rtl8139)
+{
+	rtl8139_hw_soft_reset(rtl8139->io_port);
 }
 
@@ -1328,4 +1336,24 @@
 	rtl8139_dev_cleanup(dev);
 	return rc;
+}
+
+/** Quiesce RTL8139.
+ *
+ * @param dev RTL8139 device.
+ * @return EOK on sucess, or an error code.
+ */
+errno_t rtl8139_dev_quiesce(ddf_dev_t *dev)
+{
+	nic_t *nic;
+	rtl8139_t *rtl8139;
+
+	ddf_msg(LVL_NOTE, "RTL8139_dev_quiesce %s (handle = %zu)",
+	    ddf_dev_get_name(dev), ddf_dev_get_handle(dev));
+
+	nic = nic_get_from_ddf_dev(dev);
+	rtl8139 = nic_get_specific(nic);
+
+	rtl8139_quiesce(rtl8139);
+	return EOK;
 }
 
@@ -1766,5 +1794,5 @@
  *  @param was_promisc  Sign if the promiscuous mode was active before disabling
  */
-inline static void rtl8139_rcx_promics_rem(nic_t *nic_data,
+static void rtl8139_rcx_promics_rem(nic_t *nic_data,
     nic_multicast_mode_t mcast_mode, uint8_t was_promisc)
 {
Index: uspace/drv/nic/rtl8169/driver.c
===================================================================
--- uspace/drv/nic/rtl8169/driver.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/drv/nic/rtl8169/driver.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2014 Agnieszka Tabaka
  * All rights reserved.
@@ -164,8 +165,10 @@
 
 static errno_t rtl8169_dev_add(ddf_dev_t *dev);
+static errno_t rtl8169_dev_quiesce(ddf_dev_t *dev);
 
 /** Basic driver operations for RTL8169 driver */
 static driver_ops_t rtl8169_driver_ops = {
 	.dev_add = &rtl8169_dev_add,
+	.dev_quiesce = &rtl8169_dev_quiesce
 };
 
@@ -362,5 +365,5 @@
 }
 
-inline static errno_t rtl8169_register_int_handler(nic_t *nic_data,
+static errno_t rtl8169_register_int_handler(nic_t *nic_data,
     cap_irq_handle_t *handle)
 {
@@ -484,4 +487,22 @@
 }
 
+static errno_t rtl8169_dev_quiesce(ddf_dev_t *dev)
+{
+	nic_t *nic;
+	rtl8169_t *rtl8169;
+
+	ddf_msg(LVL_NOTE, "RTL8169_dev_quiesce %s (handle = %zu)",
+	    ddf_dev_get_name(dev), ddf_dev_get_handle(dev));
+
+	nic = nic_get_from_ddf_dev(dev);
+	rtl8169 = nic_get_specific(nic);
+
+	/* Reset card */
+	pio_write_8(rtl8169->regs + CONFIG0, 0);
+	rtl8169_reset(rtl8169);
+
+	return EOK;
+}
+
 static errno_t rtl8169_set_addr(ddf_fun_t *fun, const nic_address_t *addr)
 {
@@ -762,5 +783,5 @@
 }
 
-inline static void rtl8169_reset(rtl8169_t *rtl8169)
+static void rtl8169_reset(rtl8169_t *rtl8169)
 {
 	pio_write_8(rtl8169->regs + CR, CR_RST);
@@ -807,5 +828,5 @@
  *  @param was_promisc  Sign if the promiscuous mode was active before disabling
  */
-inline static void rtl8169_rcx_promics_rem(nic_t *nic_data,
+static void rtl8169_rcx_promics_rem(nic_t *nic_data,
     nic_multicast_mode_t mcast_mode, uint8_t was_promisc)
 {
Index: uspace/lib/ata/include/ata/ata.h
===================================================================
--- uspace/lib/ata/include/ata/ata.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/lib/ata/include/ata/ata.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -201,4 +201,5 @@
 extern errno_t ata_channel_initialize(ata_channel_t *);
 extern errno_t ata_channel_destroy(ata_channel_t *);
+extern void ata_channel_quiesce(ata_channel_t *);
 extern void ata_channel_irq(ata_channel_t *, uint8_t);
 extern void ata_connection(ipc_call_t *, ata_device_t *);
Index: uspace/lib/ata/include/ata/ata_hw.h
===================================================================
--- uspace/lib/ata/include/ata/ata_hw.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/lib/ata/include/ata/ata_hw.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -106,4 +106,5 @@
 #define REG_COMMAND offsetof(ata_cmd_t, command)
 #define REG_FEATURES offsetof(ata_cmd_t, features)
+#define REG_DEVCTL offsetof(ata_ctl_t, device_control)
 
 enum devctl_bits {
Index: uspace/lib/ata/src/ata.c
===================================================================
--- uspace/lib/ata/src/ata.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/lib/ata/src/ata.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -84,4 +84,5 @@
 static uint8_t ata_read_cmd_8(ata_channel_t *, uint16_t);
 static void ata_write_cmd_8(ata_channel_t *, uint16_t, uint8_t);
+static void ata_write_ctl_8(ata_channel_t *, uint16_t, uint8_t);
 
 static errno_t ata_bd_init_irq(ata_channel_t *);
@@ -279,4 +280,14 @@
 }
 
+/** Quiesce ATA channel. */
+void ata_channel_quiesce(ata_channel_t *chan)
+{
+	ata_msg_debug(chan, ": ata_channel_quiesce()");
+
+	fibril_mutex_lock(&chan->lock);
+	ata_write_ctl_8(chan, REG_DEVCTL, DCR_SRST | DCR_nIEN);
+	fibril_mutex_unlock(&chan->lock);
+}
+
 /** Add ATA device.
  *
@@ -348,4 +359,15 @@
 {
 	return chan->params.write_cmd_8(chan->params.arg, port, value);
+}
+
+/** Write 8 bits to 8-bit control port.
+ *
+ * @param chan ATA channel
+ * @param port Port number
+ * @param value Register value
+ */
+static void ata_write_ctl_8(ata_channel_t *chan, uint16_t port, uint8_t value)
+{
+	return chan->params.write_ctl_8(chan->params.arg, port, value);
 }
 
Index: uspace/lib/ui/include/types/ui/selectdialog.h
===================================================================
--- uspace/lib/ui/include/types/ui/selectdialog.h	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/lib/ui/include/types/ui/selectdialog.h	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -44,4 +44,12 @@
 typedef struct ui_select_dialog ui_select_dialog_t;
 
+/** Select dialog flags */
+typedef enum {
+	/** Topmost window */
+	usdf_topmost = 0x1,
+	/** Place to the center of the screen */
+	usdf_center = 0x2
+} ui_select_dialog_flags_t;
+
 /** Select dialog parameters */
 typedef struct {
@@ -50,4 +58,6 @@
 	/** Prompt text */
 	const char *prompt;
+	/** Flags */
+	ui_select_dialog_flags_t flags;
 } ui_select_dialog_params_t;
 
Index: uspace/lib/ui/src/selectdialog.c
===================================================================
--- uspace/lib/ui/src/selectdialog.c	(revision 98743e252b3fa43cef96b1ea3617304534b2fcc8)
+++ uspace/lib/ui/src/selectdialog.c	(revision c8680be48730d6ee289190619f4cab137c5fe57c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -114,4 +114,9 @@
 	ui_wnd_params_init(&wparams);
 	wparams.caption = params->caption;
+
+	if ((params->flags & usdf_topmost) != 0)
+		wparams.flags |= wndf_topmost;
+	if ((params->flags & usdf_center) != 0)
+		wparams.placement = ui_wnd_place_center;
 
 	/* FIXME: Auto layout */
