Index: uspace/lib/system/include/ipc/system.h
===================================================================
--- uspace/lib/system/include/ipc/system.h	(revision a72f3b87bcdb8b8f14877d2ce9c68a09661f54c3)
+++ uspace/lib/system/include/ipc/system.h	(revision 89b5a751f120a3f82c0370607100dd9f8551399b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -45,5 +45,6 @@
 typedef enum {
 	SYSTEM_CALLBACK_CREATE = IPC_FIRST_USER_METHOD,
-	SYSTEM_SHUTDOWN
+	SYSTEM_POWEROFF,
+	SYSTEM_RESTART
 } system_request_t;
 
Index: uspace/lib/system/include/system.h
===================================================================
--- uspace/lib/system/include/system.h	(revision a72f3b87bcdb8b8f14877d2ce9c68a09661f54c3)
+++ uspace/lib/system/include/system.h	(revision 89b5a751f120a3f82c0370607100dd9f8551399b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -43,5 +43,6 @@
 extern errno_t system_open(const char *, system_cb_t *, void *, system_t **);
 extern void system_close(system_t *);
-extern errno_t system_shutdown(system_t *);
+extern errno_t system_poweroff(system_t *);
+extern errno_t system_restart(system_t *);
 
 #endif
Index: uspace/lib/system/include/system_srv.h
===================================================================
--- uspace/lib/system/include/system_srv.h	(revision a72f3b87bcdb8b8f14877d2ce9c68a09661f54c3)
+++ uspace/lib/system/include/system_srv.h	(revision 89b5a751f120a3f82c0370607100dd9f8551399b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -49,5 +49,6 @@
 
 struct system_ops {
-	errno_t (*shutdown)(void *);
+	errno_t (*poweroff)(void *);
+	errno_t (*restart)(void *);
 };
 
Index: uspace/lib/system/src/system.c
===================================================================
--- uspace/lib/system/src/system.c	(revision a72f3b87bcdb8b8f14877d2ce9c68a09661f54c3)
+++ uspace/lib/system/src/system.c	(revision 89b5a751f120a3f82c0370607100dd9f8551399b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -141,5 +141,5 @@
 }
 
-/** Shut the system down.
+/** Shut down and power the system off.
  *
  * This function is asynchronous. It returns immediately with success
@@ -151,8 +151,27 @@
  * @return EOK on succes or an error code
  */
-errno_t system_shutdown(system_t *system)
+errno_t system_poweroff(system_t *system)
 {
 	async_exch_t *exch = async_exchange_begin(system->sess);
-	errno_t rc = async_req_0_0(exch, SYSTEM_SHUTDOWN);
+	errno_t rc = async_req_0_0(exch, SYSTEM_POWEROFF);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
+/** Shut down and restart the system.
+ *
+ * This function is asynchronous. It returns immediately with success
+ * if the system started shutting down. Once shutdown is completed,
+ * the @c shutdown_complete callback is executed. If the shutdown fails,
+ * the @c shutdown_fail callback is executed.
+ *
+ * @param system System control service
+ * @return EOK on succes or an error code
+ */
+errno_t system_restart(system_t *system)
+{
+	async_exch_t *exch = async_exchange_begin(system->sess);
+	errno_t rc = async_req_0_0(exch, SYSTEM_RESTART);
 	async_exchange_end(exch);
 
Index: uspace/lib/system/src/system_srv.c
===================================================================
--- uspace/lib/system/src/system_srv.c	(revision a72f3b87bcdb8b8f14877d2ce9c68a09661f54c3)
+++ uspace/lib/system/src/system_srv.c	(revision 89b5a751f120a3f82c0370607100dd9f8551399b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -55,14 +55,27 @@
 }
 
-static void system_shutdown_srv(system_srv_t *srv, ipc_call_t *icall)
+static void system_poweroff_srv(system_srv_t *srv, ipc_call_t *icall)
 {
 	errno_t rc;
 
-	if (srv->ops->shutdown == NULL) {
+	if (srv->ops->poweroff == NULL) {
 		async_answer_0(icall, ENOTSUP);
 		return;
 	}
 
-	rc = srv->ops->shutdown(srv->arg);
+	rc = srv->ops->poweroff(srv->arg);
+	async_answer_0(icall, rc);
+}
+
+static void system_restart_srv(system_srv_t *srv, ipc_call_t *icall)
+{
+	errno_t rc;
+
+	if (srv->ops->restart == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->restart(srv->arg);
 	async_answer_0(icall, rc);
 }
@@ -89,6 +102,9 @@
 			system_callback_create_srv(srv, &call);
 			break;
-		case SYSTEM_SHUTDOWN:
-			system_shutdown_srv(srv, &call);
+		case SYSTEM_POWEROFF:
+			system_poweroff_srv(srv, &call);
+			break;
+		case SYSTEM_RESTART:
+			system_restart_srv(srv, &call);
 			break;
 		default:
Index: uspace/lib/system/test/system.c
===================================================================
--- uspace/lib/system/test/system.c	(revision a72f3b87bcdb8b8f14877d2ce9c68a09661f54c3)
+++ uspace/lib/system/test/system.c	(revision 89b5a751f120a3f82c0370607100dd9f8551399b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -46,5 +46,6 @@
 void test_system_conn(ipc_call_t *, void *);
 
-static errno_t test_shutdown(void *);
+static errno_t test_poweroff(void *);
+static errno_t test_restart(void *);
 
 static void test_sys_shutdown_complete(void *);
@@ -52,5 +53,6 @@
 
 static system_ops_t test_system_srv_ops = {
-	.shutdown = test_shutdown
+	.poweroff = test_poweroff,
+	.restart = test_restart
 };
 
@@ -66,5 +68,6 @@
 	errno_t rc;
 
-	bool shutdown_called;
+	bool poweroff_called;
+	bool restart_called;
 	bool shutdown_complete_called;
 	bool shutdown_failed_called;
@@ -103,6 +106,6 @@
 }
 
-/** system_shutdown() with server returning error response works */
-PCUT_TEST(shutdown_failure)
+/** system_poweroff() with server returning error response works */
+PCUT_TEST(poweroff_failure)
 {
 	errno_t rc;
@@ -126,8 +129,8 @@
 
 	resp.rc = ENOMEM;
-	resp.shutdown_called = false;
-
-	rc = system_shutdown(system);
-	PCUT_ASSERT_TRUE(resp.shutdown_called);
+	resp.poweroff_called = false;
+
+	rc = system_poweroff(system);
+	PCUT_ASSERT_TRUE(resp.poweroff_called);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
 
@@ -138,6 +141,6 @@
 }
 
-/** system_shutdown() with server returning success response works */
-PCUT_TEST(shutdown_success)
+/** system_poweroff() with server returning success response works */
+PCUT_TEST(poweroff_success)
 {
 	errno_t rc;
@@ -161,8 +164,78 @@
 
 	resp.rc = EOK;
-	resp.shutdown_called = false;
-
-	rc = system_shutdown(system);
-	PCUT_ASSERT_TRUE(resp.shutdown_called);
+	resp.poweroff_called = false;
+
+	rc = system_poweroff(system);
+	PCUT_ASSERT_TRUE(resp.poweroff_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+
+	system_close(system);
+	rc = loc_service_unregister(srv, sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	loc_server_unregister(srv);
+}
+
+/** system_restart() with server returning error response works */
+PCUT_TEST(restart_failure)
+{
+	errno_t rc;
+	service_id_t sid;
+	system_t *system = NULL;
+	test_response_t resp;
+	loc_srv_t *srv;
+
+	async_set_fallback_port_handler(test_system_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_system_server, &srv);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(srv, test_system_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = system_open(test_system_svc, NULL, NULL, &system);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(system);
+
+	resp.rc = ENOMEM;
+	resp.restart_called = false;
+
+	rc = system_restart(system);
+	PCUT_ASSERT_TRUE(resp.restart_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+
+	system_close(system);
+	rc = loc_service_unregister(srv, sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	loc_server_unregister(srv);
+}
+
+/** system_restart() with server returning success response works */
+PCUT_TEST(restart_success)
+{
+	errno_t rc;
+	service_id_t sid;
+	system_t *system = NULL;
+	test_response_t resp;
+	loc_srv_t *srv;
+
+	async_set_fallback_port_handler(test_system_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_system_server, &srv);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(srv, test_system_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = system_open(test_system_svc, NULL, NULL, &system);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(system);
+
+	resp.rc = EOK;
+	resp.restart_called = false;
+
+	rc = system_restart(system);
+	PCUT_ASSERT_TRUE(resp.restart_called);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
 
@@ -279,13 +352,25 @@
 }
 
-/** Test system shutdown.
+/** Test system poweroff.
  *
  * @param arg Argument (test_response_t *)
  */
-static errno_t test_shutdown(void *arg)
+static errno_t test_poweroff(void *arg)
 {
 	test_response_t *resp = (test_response_t *)arg;
 
-	resp->shutdown_called = true;
+	resp->poweroff_called = true;
+	return resp->rc;
+}
+
+/** Test system restart.
+ *
+ * @param arg Argument (test_response_t *)
+ */
+static errno_t test_restart(void *arg)
+{
+	test_response_t *resp = (test_response_t *)arg;
+
+	resp->restart_called = true;
 	return resp->rc;
 }
