Index: uspace/app/display-cfg/test/seats.c
===================================================================
--- uspace/app/display-cfg/test/seats.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/app/display-cfg/test/seats.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -102,5 +102,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/app/taskbar-cfg/test/startmenu.c
===================================================================
--- uspace/app/taskbar-cfg/test/startmenu.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/app/taskbar-cfg/test/startmenu.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -102,5 +102,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/app/taskbar/test/wndlist.c
===================================================================
--- uspace/app/taskbar/test/wndlist.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/app/taskbar/test/wndlist.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -149,5 +149,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/app/terminal/terminal.c
===================================================================
--- uspace/app/terminal/terminal.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/app/terminal/terminal.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2012 Petr Koupy
  * All rights reserved.
@@ -1115,5 +1115,5 @@
 	    task_get_id());
 
-	rc = loc_service_register(term->srv, vc, &term->dsid);
+	rc = loc_service_register(term->srv, vc, fallback_port_id, &term->dsid);
 	if (rc != EOK) {
 		printf("Error registering service.\n");
Index: uspace/lib/c/generic/async/ports.c
===================================================================
--- uspace/lib/c/generic/async/ports.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/c/generic/async/ports.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -197,4 +197,21 @@
 }
 
+static bool destroy_if(ht_link_t *link, void *arg)
+{
+	port_t *port = (port_t *)arg;
+
+	hash_table_remove_item(&port->interface_hash_table, link);
+	return false;
+}
+
+static void async_delete_port(port_t *port)
+{
+	/* Destroy interfaces */
+	hash_table_apply(&port->interface_hash_table, destroy_if, NULL);
+
+	hash_table_destroy(&port->interface_hash_table);
+	free(port);
+}
+
 errno_t async_create_port_internal(iface_t iface, async_port_handler_t handler,
     void *data, port_id_t *port_id)
@@ -212,5 +229,5 @@
 	interface = async_new_interface(port, iface, handler, data);
 	if (interface == NULL) {
-		// XXX delete port
+		async_delete_port(port);
 		fibril_rmutex_unlock(&port_mutex);
 		return ENOMEM;
@@ -218,4 +235,26 @@
 
 	*port_id = port->id;
+	fibril_rmutex_unlock(&port_mutex);
+	return EOK;
+}
+
+errno_t async_port_create_interface(port_id_t port_id, iface_t iface,
+    async_port_handler_t handler, void *data)
+{
+	ht_link_t *link;
+	port_t *port;
+	interface_t *interface;
+
+	fibril_rmutex_lock(&port_mutex);
+	link = hash_table_find(&port_hash_table, &port_id);
+	assert(link != NULL);
+	port = hash_table_get_inst(link, port_t, link);
+
+	interface = async_new_interface(port, iface, handler, data);
+	if (interface == NULL) {
+		fibril_rmutex_unlock(&port_mutex);
+		return ENOMEM;
+	}
+
 	fibril_rmutex_unlock(&port_mutex);
 	return EOK;
@@ -306,4 +345,17 @@
 }
 
+void async_port_destroy(port_id_t port_id)
+{
+	ht_link_t *link;
+	port_t *port;
+
+	fibril_rmutex_lock(&port_mutex);
+	link = hash_table_find(&port_hash_table, &port_id);
+	assert(link != NULL);
+	port = hash_table_get_inst(link, port_t, link);
+	async_delete_port(port);
+	fibril_rmutex_unlock(&port_mutex);
+}
+
 /** Initialize the async framework ports.
  *
Index: uspace/lib/c/generic/loc.c
===================================================================
--- uspace/lib/c/generic/loc.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/c/generic/loc.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2007 Josef Cejka
  * All rights reserved.
@@ -258,13 +258,14 @@
  * @param srv Server object
  * @param fqsn Fully qualified service name
+ * @param portid ID of port providing the service
  * @param sid  Service ID of new service
  *
  */
 errno_t loc_service_register(loc_srv_t *srv, const char *fqsn,
-    service_id_t *sid)
+    port_id_t portid, service_id_t *sid)
 {
 	async_exch_t *exch = async_exchange_begin(srv->sess);
 	ipc_call_t answer;
-	aid_t req = async_send_0(exch, LOC_SERVICE_REGISTER, &answer);
+	aid_t req = async_send_1(exch, LOC_SERVICE_REGISTER, portid, &answer);
 	errno_t retval = async_data_write_start(exch, fqsn, str_size(fqsn));
 
Index: uspace/lib/c/generic/ns.c
===================================================================
--- uspace/lib/c/generic/ns.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/c/generic/ns.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Martin Decky
  * All rights reserved.
@@ -68,4 +69,5 @@
 
 	if (rc != EOK) {
+		async_port_destroy(port);
 		async_forget(req);
 		return rc;
@@ -74,4 +76,7 @@
 	errno_t retval;
 	async_wait_for(req, &retval);
+
+	if (rc != EOK)
+		async_port_destroy(port);
 	return rc;
 }
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/c/include/async.h	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2006 Ondrej Palkovsky
  * All rights reserved.
@@ -99,4 +100,8 @@
 } exch_mgmt_t;
 
+enum {
+	fallback_port_id = 0
+};
+
 /** Forward declarations */
 struct async_exch;
@@ -134,4 +139,7 @@
 extern errno_t async_create_port(iface_t, async_port_handler_t, void *,
     port_id_t *);
+extern void async_port_destroy(port_id_t);
+extern errno_t async_port_create_interface(port_id_t, iface_t,
+    async_port_handler_t, void *);
 extern void async_set_fallback_port_handler(async_port_handler_t, void *);
 extern errno_t async_create_callback_port(async_exch_t *, iface_t, sysarg_t,
Index: uspace/lib/c/include/loc.h
===================================================================
--- uspace/lib/c/include/loc.h	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/c/include/loc.h	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -49,5 +49,6 @@
 extern errno_t loc_server_register(const char *, loc_srv_t **);
 extern void loc_server_unregister(loc_srv_t *);
-extern errno_t loc_service_register(loc_srv_t *, const char *, service_id_t *);
+extern errno_t loc_service_register(loc_srv_t *, const char *, port_id_t,
+    service_id_t *);
 extern errno_t loc_service_unregister(loc_srv_t *, service_id_t);
 extern errno_t loc_service_add_to_cat(loc_srv_t *, service_id_t, category_id_t);
Index: uspace/lib/c/test/loc.c
===================================================================
--- uspace/lib/c/test/loc.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/c/test/loc.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -51,9 +51,11 @@
 
 	// XXX Without a unique name this is not reentrant
-	rc = loc_service_register(sa, "test/libc-service-a", &svca);
+	rc = loc_service_register(sa, "test/libc-service-a",
+	    fallback_port_id, &svca);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
 	// XXX Without a unique name this is not reentrant
-	rc = loc_service_register(sb, "test/libc-service-b", &svcb);
+	rc = loc_service_register(sb, "test/libc-service-b",
+	    fallback_port_id, &svcb);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/lib/ddev/test/ddev.c
===================================================================
--- uspace/lib/ddev/test/ddev.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/ddev/test/ddev.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -86,5 +86,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ddev_svc, &sid);
+	rc = loc_service_register(srv, test_ddev_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -115,5 +115,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ddev_svc, &sid);
+	rc = loc_service_register(srv, test_ddev_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -151,5 +151,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ddev_svc, &sid);
+	rc = loc_service_register(srv, test_ddev_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -196,5 +196,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ddev_svc, &sid);
+	rc = loc_service_register(srv, test_ddev_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -229,5 +229,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ddev_svc, &sid);
+	rc = loc_service_register(srv, test_ddev_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/lib/dispcfg/test/dispcfg.c
===================================================================
--- uspace/lib/dispcfg/test/dispcfg.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/dispcfg/test/dispcfg.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -60,5 +60,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -89,5 +90,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -125,5 +127,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -174,5 +177,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -213,5 +217,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -258,5 +263,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -298,5 +304,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -338,5 +345,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -376,5 +384,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -415,5 +424,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -456,5 +466,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -496,5 +507,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -534,5 +546,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -573,5 +586,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -612,5 +626,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -661,5 +676,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -710,5 +726,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_dispcfg_svc, &sid);
+	rc = loc_service_register(srv, test_dispcfg_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/lib/display/test/display.c
===================================================================
--- uspace/lib/display/test/display.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/display/test/display.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -194,5 +194,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -224,5 +225,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -282,5 +284,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -339,5 +342,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -402,5 +406,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -462,5 +467,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -521,5 +527,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -577,5 +584,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -633,5 +641,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -690,5 +699,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -749,5 +759,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -810,5 +821,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -877,5 +889,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -940,5 +953,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1002,5 +1016,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1067,5 +1082,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1129,5 +1145,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1179,5 +1196,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1229,5 +1247,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1279,5 +1298,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1329,5 +1349,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1381,5 +1402,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1434,5 +1456,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1490,5 +1513,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1546,5 +1570,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1601,5 +1626,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1662,5 +1688,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1729,5 +1756,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1799,5 +1827,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1878,5 +1907,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1957,5 +1987,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -2026,5 +2057,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -2062,5 +2094,6 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_display_svc, &sid);
+	rc = loc_service_register(srv, test_display_svc, fallback_port_id,
+	    &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/lib/drv/generic/driver.c
===================================================================
--- uspace/lib/drv/generic/driver.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/drv/generic/driver.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1046,4 +1046,7 @@
 errno_t ddf_driver_main(const driver_t *drv)
 {
+	port_id_t drv_port;
+	port_id_t devman_port;
+
 	/*
 	 * Remember the driver structure - driver_ops will be called by generic
@@ -1056,7 +1059,6 @@
 	 * incoming connections.
 	 */
-	port_id_t port;
-	errno_t rc = async_create_port(INTERFACE_DDF_DRIVER, driver_connection_driver,
-	    NULL, &port);
+	errno_t rc = async_create_port(INTERFACE_DDF_DRIVER,
+	    driver_connection_driver, NULL, &drv_port);
 	if (rc != EOK) {
 		printf("Error: Failed to create driver port.\n");
@@ -1065,7 +1067,8 @@
 
 	rc = async_create_port(INTERFACE_DDF_DEVMAN, driver_connection_devman,
-	    NULL, &port);
+	    NULL, &devman_port);
 	if (rc != EOK) {
 		printf("Error: Failed to create devman port.\n");
+		async_port_destroy(drv_port);
 		return rc;
 	}
@@ -1078,5 +1081,6 @@
 		    "(%s).\n", (rc == EEXIST) ? "driver already started" :
 		    str_error(rc));
-
+		async_port_destroy(devman_port);
+		async_port_destroy(drv_port);
 		return rc;
 	}
@@ -1086,4 +1090,7 @@
 	if (rc != EOK) {
 		printf("Error: Failed returning task value.\n");
+		// XXX devman_driver_unregister
+		async_port_destroy(devman_port);
+		async_port_destroy(drv_port);
 		return rc;
 	}
Index: uspace/lib/hound/src/protocol.c
===================================================================
--- uspace/lib/hound/src/protocol.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/hound/src/protocol.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2012 Jan Vesely
  * All rights reserved.
@@ -746,5 +746,6 @@
 		return rc;
 
-	rc = loc_service_register(hound_srv, HOUND_SERVICE, id);
+	rc = loc_service_register(hound_srv, HOUND_SERVICE,
+	    fallback_port_id, id);
 	if (rc != EOK) {
 		loc_server_unregister(hound_srv);
Index: uspace/lib/ipcgfx/test/ipcgfx.c
===================================================================
--- uspace/lib/ipcgfx/test/ipcgfx.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/ipcgfx/test/ipcgfx.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -128,5 +128,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -180,5 +180,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -232,5 +232,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -278,5 +278,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -330,5 +330,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -382,5 +382,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -434,5 +434,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -485,5 +485,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -528,5 +528,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -573,5 +573,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -634,5 +634,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -700,5 +700,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -755,5 +755,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -817,5 +817,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -886,5 +886,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -956,5 +956,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -1025,5 +1025,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_ipcgfx_svc, &sid);
+	rc = loc_service_register(srv, test_ipcgfx_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/lib/system/test/system.c
===================================================================
--- uspace/lib/system/test/system.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/system/test/system.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -93,5 +93,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_system_svc, &sid);
+	rc = loc_service_register(srv, test_system_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -121,5 +121,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_system_svc, &sid);
+	rc = loc_service_register(srv, test_system_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -156,5 +156,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_system_svc, &sid);
+	rc = loc_service_register(srv, test_system_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -191,5 +191,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_system_svc, &sid);
+	rc = loc_service_register(srv, test_system_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -226,5 +226,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_system_svc, &sid);
+	rc = loc_service_register(srv, test_system_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -263,5 +263,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_system_svc, &sid);
+	rc = loc_service_register(srv, test_system_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -307,5 +307,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_system_svc, &sid);
+	rc = loc_service_register(srv, test_system_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/lib/tbarcfg/src/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/src/tbarcfg.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/tbarcfg/src/tbarcfg.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -639,5 +639,5 @@
 	char *svcname = NULL;
 	category_id_t catid;
-	port_id_t port;
+	port_id_t port = 0;
 	int rv;
 	errno_t rc;
@@ -667,5 +667,5 @@
 	}
 
-	rc = loc_service_register(srv, svcname, &svcid);
+	rc = loc_service_register(srv, svcname, port, &svcid);
 	if (rc != EOK)
 		goto error;
@@ -688,4 +688,6 @@
 	if (svcname != NULL)
 		free(svcname);
+	if (port != 0)
+		async_port_destroy(port);
 	return rc;
 }
Index: uspace/lib/wndmgt/test/wndmgt.c
===================================================================
--- uspace/lib/wndmgt/test/wndmgt.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/lib/wndmgt/test/wndmgt.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -125,5 +125,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -154,5 +154,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -190,5 +190,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -239,5 +239,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -278,5 +278,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -328,5 +328,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -369,5 +369,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -409,5 +409,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -447,5 +447,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -484,5 +484,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -533,5 +533,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -582,5 +582,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = loc_service_register(srv, test_wndmgt_svc, &sid);
+	rc = loc_service_register(srv, test_wndmgt_svc, fallback_port_id, &sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/srv/bd/file_bd/file_bd.c
===================================================================
--- uspace/srv/bd/file_bd/file_bd.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/bd/file_bd/file_bd.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -138,5 +138,6 @@
 		return -1;
 
-	rc = loc_service_register(srv, device_name, &service_id);
+	rc = loc_service_register(srv, device_name, fallback_port_id,
+	    &service_id);
 	if (rc != EOK) {
 		printf("%s: Unable to register device '%s': %s.\n",
Index: uspace/srv/bd/rd/rd.c
===================================================================
--- uspace/srv/bd/rd/rd.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/bd/rd/rd.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2007 Michal Konopa
  * Copyright (c) 2007 Martin Jelen
@@ -187,5 +187,6 @@
 
 	service_id_t service_id;
-	ret = loc_service_register(srv, "bd/initrd", &service_id);
+	ret = loc_service_register(srv, "bd/initrd", fallback_port_id,
+	    &service_id);
 	if (ret != EOK) {
 		printf("%s: Unable to register device service\n", NAME);
Index: uspace/srv/bd/vbd/disk.c
===================================================================
--- uspace/srv/bd/vbd/disk.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/bd/vbd/disk.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1165,5 +1165,5 @@
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "loc_service_register('%s')",
 	    name);
-	rc = loc_service_register(vbds_srv, name, &psid);
+	rc = loc_service_register(vbds_srv, name, fallback_port_id, &psid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering "
Index: uspace/srv/bd/vbd/vbd.c
===================================================================
--- uspace/srv/bd/vbd/vbd.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/bd/vbd/vbd.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -74,5 +74,6 @@
 	}
 
-	rc = loc_service_register(vbds_srv, SERVICE_NAME_VBD, &ctl_sid);
+	rc = loc_service_register(vbds_srv, SERVICE_NAME_VBD,
+	    fallback_port_id, &ctl_sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
Index: uspace/srv/clipboard/clipboard.c
===================================================================
--- uspace/srv/clipboard/clipboard.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/clipboard/clipboard.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2009 Martin Decky
  * All rights reserved.
@@ -197,5 +197,6 @@
 	}
 
-	rc = loc_service_register(srv, SERVICE_NAME_CLIPBOARD, &svc_id);
+	rc = loc_service_register(srv, SERVICE_NAME_CLIPBOARD,
+	    fallback_port_id, &svc_id);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/devman/loc.c
===================================================================
--- uspace/srv/devman/loc.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/devman/loc.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2010 Lenka Trochtova
  * All rights reserved.
@@ -61,5 +61,6 @@
 	}
 
-	loc_service_register(devman_srv, loc_pathname, &fun->service_id);
+	loc_service_register(devman_srv, loc_pathname, fallback_port_id,
+	    &fun->service_id);
 
 	tree_add_loc_function(tree, fun);
Index: uspace/srv/hid/console/console.c
===================================================================
--- uspace/srv/hid/console/console.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/console/console.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Martin Decky
  * All rights reserved.
@@ -963,5 +963,5 @@
 
 			if (loc_service_register(console_srv, vc,
-			    &consoles[i].dsid) != EOK) {
+			    fallback_port_id, &consoles[i].dsid) != EOK) {
 				printf("%s: Unable to register device %s\n", NAME, vc);
 				return false;
Index: uspace/srv/hid/display/main.c
===================================================================
--- uspace/srv/hid/display/main.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/display/main.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -126,8 +126,5 @@
 	ds_output_t *output = NULL;
 	gfx_context_t *gc = NULL;
-	port_id_t disp_port;
-	port_id_t gc_port;
-	port_id_t wm_port;
-	port_id_t dc_port;
+	port_id_t port = 0;
 	loc_srv_t *srv = NULL;
 	service_id_t sid = 0;
@@ -169,19 +166,20 @@
 
 	rc = async_create_port(INTERFACE_DISPLAY, display_client_conn, disp,
-	    &disp_port);
-	if (rc != EOK)
-		goto error;
-
-	rc = async_create_port(INTERFACE_GC, display_gc_conn, disp, &gc_port);
-	if (rc != EOK)
-		goto error;
-
-	rc = async_create_port(INTERFACE_WNDMGT, display_wndmgt_conn, disp,
-	    &wm_port);
-	if (rc != EOK)
-		goto error;
-
-	rc = async_create_port(INTERFACE_DISPCFG, display_dispcfg_conn, disp,
-	    &dc_port);
+	    &port);
+	if (rc != EOK)
+		goto error;
+
+	rc = async_port_create_interface(port, INTERFACE_GC, display_gc_conn,
+	    disp);
+	if (rc != EOK)
+		goto error;
+
+	rc = async_port_create_interface(port, INTERFACE_WNDMGT,
+	    display_wndmgt_conn, disp);
+	if (rc != EOK)
+		goto error;
+
+	rc = async_port_create_interface(port, INTERFACE_DISPCFG,
+	    display_dispcfg_conn, disp);
 	if (rc != EOK)
 		goto error;
@@ -194,5 +192,5 @@
 	}
 
-	rc = loc_service_register(srv, SERVICE_NAME_DISPLAY, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_DISPLAY, port, &sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
@@ -208,8 +206,6 @@
 	if (srv != NULL)
 		loc_server_unregister(srv);
-	// XXX destroy disp_port
-	// XXX destroy gc_port
-	// XXX destroy wm_port
-	// XXX destroy dc_port
+	if (port != 0)
+		async_port_destroy(port);
 #if 0
 	if (disp->input != NULL)
Index: uspace/srv/hid/input/input.c
===================================================================
--- uspace/srv/hid/input/input.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/input/input.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2006 Josef Cejka
  * All rights reserved.
@@ -909,5 +909,5 @@
 
 	service_id_t service_id;
-	rc = loc_service_register(srv, argv[1], &service_id);
+	rc = loc_service_register(srv, argv[1], fallback_port_id, &service_id);
 	if (rc != EOK) {
 		printf("%s: Unable to register service %s\n", NAME, argv[1]);
Index: uspace/srv/hid/isdv4_tablet/main.c
===================================================================
--- uspace/srv/hid/isdv4_tablet/main.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/isdv4_tablet/main.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2012 Martin Sucha
  * All rights reserved.
@@ -331,5 +331,6 @@
 	}
 
-	rc = loc_service_register(srv, service_name, &service_id);
+	rc = loc_service_register(srv, service_name, fallback_port_id,
+	    &service_id);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/hid/output/output.c
===================================================================
--- uspace/srv/hid/output/output.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/output/output.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Martin Decky
  * All rights reserved.
@@ -488,5 +488,5 @@
 
 	service_id_t service_id;
-	rc = loc_service_register(srv, argv[1], &service_id);
+	rc = loc_service_register(srv, argv[1], fallback_port_id, &service_id);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/hid/remcons/remcons.c
===================================================================
--- uspace/srv/hid/remcons/remcons.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/remcons/remcons.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2012 Vojtech Horky
  * All rights reserved.
@@ -757,5 +757,5 @@
 
 	errno_t rc = loc_service_register(remcons_srv, user->service_name,
-	    &user->service_id);
+	    fallback_port_id, &user->service_id);
 	if (rc != EOK) {
 		telnet_user_error(user, "Unable to register %s with loc: %s.",
Index: uspace/srv/hid/rfb/main.c
===================================================================
--- uspace/srv/hid/rfb/main.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/rfb/main.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2013 Martin Sucha
  * All rights reserved.
@@ -498,5 +498,6 @@
 	service_id_t service_id;
 
-	rc = loc_service_register(srv, service_name, &service_id);
+	rc = loc_service_register(srv, service_name, fallback_port_id,
+	    &service_id);
 	if (rc != EOK) {
 		printf(NAME ": Unable to register service %s.\n", service_name);
Index: uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c
===================================================================
--- uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -103,5 +103,6 @@
 	}
 
-	rc = loc_service_register(srv, NAMESPACE "/mouse", &ts->service_id);
+	rc = loc_service_register(srv, NAMESPACE "/mouse", fallback_port_id,
+	    &ts->service_id);
 	if (rc != EOK) {
 		// XXX s3c24xx_ts_fini();
Index: uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c
===================================================================
--- uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -103,5 +103,6 @@
 	}
 
-	rc = loc_service_register(srv, NAMESPACE "/" NAME, &uart->service_id);
+	rc = loc_service_register(srv, NAMESPACE "/" NAME, fallback_port_id,
+	    &uart->service_id);
 	if (rc != EOK) {
 		// XXX s3c24xx_uart_fini(uart);
Index: uspace/srv/net/dhcp/main.c
===================================================================
--- uspace/srv/net/dhcp/main.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/dhcp/main.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -69,5 +69,6 @@
 
 	service_id_t sid;
-	rc = loc_service_register(srv, SERVICE_NAME_DHCP, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_DHCP, fallback_port_id,
+	    &sid);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/net/dnsrsrv/dnsrsrv.c
===================================================================
--- uspace/srv/net/dnsrsrv/dnsrsrv.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/dnsrsrv/dnsrsrv.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -77,5 +77,6 @@
 
 	service_id_t sid;
-	rc = loc_service_register(srv, SERVICE_NAME_DNSR, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_DNSR, fallback_port_id,
+	    &sid);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/net/ethip/ethip.c
===================================================================
--- uspace/srv/net/ethip/ethip.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/ethip/ethip.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -117,5 +117,5 @@
 	}
 
-	rc = loc_service_register(ethip_srv, svc_name, &sid);
+	rc = loc_service_register(ethip_srv, svc_name, fallback_port_id, &sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
Index: uspace/srv/net/inetsrv/inetsrv.c
===================================================================
--- uspace/srv/net/inetsrv/inetsrv.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/inetsrv/inetsrv.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -108,16 +108,21 @@
 		return rc;
 
-	rc = async_create_port(INTERFACE_INETCFG,
-	    inet_cfg_conn, NULL, &port);
-	if (rc != EOK)
-		return rc;
-
-	rc = async_create_port(INTERFACE_INETPING,
-	    inetping_conn, NULL, &port);
-	if (rc != EOK)
-		return rc;
+	rc = async_port_create_interface(port, INTERFACE_INETCFG,
+	    inet_cfg_conn, NULL);
+	if (rc != EOK) {
+		async_port_destroy(port);
+		return rc;
+	}
+
+	rc = async_port_create_interface(port, INTERFACE_INETPING,
+	    inetping_conn, NULL);
+	if (rc != EOK) {
+		async_port_destroy(port);
+		return rc;
+	}
 
 	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
+		async_port_destroy(port);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server: %s.", str_error(rc));
 		return EEXIST;
@@ -125,6 +130,7 @@
 
 	service_id_t sid;
-	rc = loc_service_register(srv, SERVICE_NAME_INET, &sid);
-	if (rc != EOK) {
+	rc = loc_service_register(srv, SERVICE_NAME_INET, port, &sid);
+	if (rc != EOK) {
+		async_port_destroy(port);
 		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
Index: uspace/srv/net/loopip/loopip.c
===================================================================
--- uspace/srv/net/loopip/loopip.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/loopip/loopip.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -121,5 +121,5 @@
 	const char *svc_name = "net/loopback";
 	service_id_t sid;
-	rc = loc_service_register(srv, svc_name, &sid);
+	rc = loc_service_register(srv, svc_name, fallback_port_id, &sid);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/net/slip/slip.c
===================================================================
--- uspace/srv/net/slip/slip.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/slip/slip.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2013 Jakub Jermar
  * All rights reserved.
@@ -378,5 +378,5 @@
 	}
 
-	rc = loc_service_register(srv, linkstr, &linksid);
+	rc = loc_service_register(srv, linkstr, fallback_port_id, &linksid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR,
Index: uspace/srv/net/tcp/service.c
===================================================================
--- uspace/srv/net/tcp/service.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/tcp/service.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -1252,5 +1252,6 @@
 	}
 
-	rc = loc_service_register(srv, SERVICE_NAME_TCP, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_TCP, fallback_port_id,
+	    &sid);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/net/udp/service.c
===================================================================
--- uspace/srv/net/udp/service.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/net/udp/service.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -657,5 +657,6 @@
 	}
 
-	rc = loc_service_register(srv, SERVICE_NAME_UDP, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_UDP, fallback_port_id,
+	    &sid);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/system/system.c
===================================================================
--- uspace/srv/system/system.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/system/system.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -572,5 +572,5 @@
 static errno_t system_srv_init(sys_srv_t *syssrv)
 {
-	port_id_t port;
+	port_id_t port = 0;
 	loc_srv_t *srv = NULL;
 	service_id_t sid = 0;
@@ -594,5 +594,5 @@
 	}
 
-	rc = loc_service_register(srv, SYSTEM_DEFAULT, &sid);
+	rc = loc_service_register(srv, SYSTEM_DEFAULT, port, &sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR,
@@ -608,5 +608,6 @@
 	if (srv != NULL)
 		loc_server_unregister(srv);
-	// XXX destroy port
+	if (port != 0)
+		async_port_destroy(port);
 	return rc;
 }
Index: uspace/srv/taskmon/taskmon.c
===================================================================
--- uspace/srv/taskmon/taskmon.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/taskmon/taskmon.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -258,5 +258,6 @@
 
 	service_id_t sid;
-	rc = loc_service_register(srv, SERVICE_NAME_CORECFG, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_CORECFG,
+	    fallback_port_id, &sid);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/test/chardev-test/main.c
===================================================================
--- uspace/srv/test/chardev-test/main.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/test/chardev-test/main.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -142,5 +142,5 @@
 
 	rc = loc_service_register(srv, SERVICE_NAME_CHARDEV_TEST_SMALLX,
-	    &smallx_svc_id);
+	    fallback_port_id, &smallx_svc_id);
 	if (rc != EOK) {
 		printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
@@ -149,5 +149,5 @@
 
 	rc = loc_service_register(srv, SERVICE_NAME_CHARDEV_TEST_LARGEX,
-	    &largex_svc_id);
+	    fallback_port_id, &largex_svc_id);
 	if (rc != EOK) {
 		printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
@@ -156,5 +156,5 @@
 
 	rc = loc_service_register(srv, SERVICE_NAME_CHARDEV_TEST_PARTIALX,
-	    &partialx_svc_id);
+	    fallback_port_id, &partialx_svc_id);
 	if (rc != EOK) {
 		printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
Index: uspace/srv/test/ipc-test/main.c
===================================================================
--- uspace/srv/test/ipc-test/main.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/test/ipc-test/main.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -361,5 +361,6 @@
 	}
 
-	rc = loc_service_register(srv, SERVICE_NAME_IPC_TEST, &svc_id);
+	rc = loc_service_register(srv, SERVICE_NAME_IPC_TEST, fallback_port_id,
+	    &svc_id);
 	if (rc != EOK) {
 		loc_server_unregister(srv);
Index: uspace/srv/volsrv/volsrv.c
===================================================================
--- uspace/srv/volsrv/volsrv.c	(revision 3951046e0c17eba3d4999c6eca8b8eeda7a55fe5)
+++ uspace/srv/volsrv/volsrv.c	(revision ca48672c28630656df768752aa9bc313ce9ad11c)
@@ -88,5 +88,6 @@
 
 	service_id_t sid;
-	rc = loc_service_register(srv, SERVICE_NAME_VOLSRV, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_VOLSRV, fallback_port_id,
+	    &sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
