Index: uspace/srv/net/dhcp/main.c
===================================================================
--- uspace/srv/net/dhcp/main.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/dhcp/main.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2013 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -54,4 +54,5 @@
 static errno_t dhcp_init(void)
 {
+	loc_srv_t *srv;
 	errno_t rc;
 
@@ -68,5 +69,5 @@
 	async_set_fallback_port_handler(dhcp_client_conn, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server: %s.", str_error(rc));
@@ -75,6 +76,7 @@
 
 	service_id_t sid;
-	rc = loc_service_register(SERVICE_NAME_DHCP, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_DHCP, &sid);
 	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
 		return EEXIST;
Index: uspace/srv/net/dnsrsrv/dnsrsrv.c
===================================================================
--- uspace/srv/net/dnsrsrv/dnsrsrv.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/dnsrsrv/dnsrsrv.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2013 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -57,4 +57,5 @@
 static errno_t dnsr_init(void)
 {
+	loc_srv_t *srv;
 	errno_t rc;
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "dnsr_init()");
@@ -68,5 +69,5 @@
 	async_set_fallback_port_handler(dnsr_client_conn, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server: %s.", str_error(rc));
@@ -76,6 +77,7 @@
 
 	service_id_t sid;
-	rc = loc_service_register(SERVICE_NAME_DNSR, &sid);
-	if (rc != EOK) {
+	rc = loc_service_register(srv, SERVICE_NAME_DNSR, &sid);
+	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
 		transport_fini();
Index: uspace/srv/net/ethip/ethip.c
===================================================================
--- uspace/srv/net/ethip/ethip.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/ethip/ethip.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -78,9 +78,11 @@
 };
 
+static loc_srv_t *ethip_srv;
+
 static errno_t ethip_init(void)
 {
 	async_set_fallback_port_handler(ethip_client_conn, NULL);
 
-	errno_t rc = loc_server_register(NAME);
+	errno_t rc = loc_server_register(NAME, &ethip_srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
@@ -115,5 +117,5 @@
 	}
 
-	rc = loc_service_register(svc_name, &sid);
+	rc = loc_service_register(ethip_srv, svc_name, &sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
@@ -129,5 +131,5 @@
 	}
 
-	rc = loc_service_add_to_cat(sid, iplink_cat);
+	rc = loc_service_add_to_cat(ethip_srv, sid, iplink_cat);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name);
Index: uspace/srv/net/inetsrv/inetsrv.c
===================================================================
--- uspace/srv/net/inetsrv/inetsrv.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/inetsrv/inetsrv.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2012 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -86,4 +86,6 @@
 static errno_t inet_init(void)
 {
+	loc_srv_t *srv;
+
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_init()");
 
@@ -104,5 +106,5 @@
 		return rc;
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server: %s.", str_error(rc));
@@ -111,6 +113,7 @@
 
 	service_id_t sid;
-	rc = loc_service_register(SERVICE_NAME_INET, &sid);
-	if (rc != EOK) {
+	rc = loc_service_register(srv, SERVICE_NAME_INET, &sid);
+	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
 		return EEXIST;
Index: uspace/srv/net/loopip/loopip.c
===================================================================
--- uspace/srv/net/loopip/loopip.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/loopip/loopip.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -103,7 +103,9 @@
 static errno_t loopip_init(void)
 {
+	loc_srv_t *srv;
+
 	async_set_fallback_port_handler(loopip_client_conn, NULL);
 
-	errno_t rc = loc_server_register(NAME);
+	errno_t rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
@@ -119,6 +121,7 @@
 	const char *svc_name = "net/loopback";
 	service_id_t sid;
-	rc = loc_service_register(svc_name, &sid);
-	if (rc != EOK) {
+	rc = loc_service_register(srv, svc_name, &sid);
+	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.",
 		    svc_name);
@@ -129,10 +132,14 @@
 	rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
 	if (rc != EOK) {
+		loc_service_unregister(srv, sid);
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed resolving category 'iplink'.");
 		return rc;
 	}
 
-	rc = loc_service_add_to_cat(sid, iplink_cat);
-	if (rc != EOK) {
+	rc = loc_service_add_to_cat(srv, sid, iplink_cat);
+	if (rc != EOK) {
+		loc_service_unregister(srv, sid);
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.",
 		    svc_name);
@@ -141,6 +148,9 @@
 
 	fid_t fid = fibril_create(loopip_recv_fibril, NULL);
-	if (fid == 0)
-		return ENOMEM;
+	if (fid == 0) {
+		loc_service_unregister(srv, sid);
+		loc_server_unregister(srv);
+		return ENOMEM;
+	}
 
 	fibril_add_ready(fid);
Index: uspace/srv/net/nconfsrv/nconfsrv.c
===================================================================
--- uspace/srv/net/nconfsrv/nconfsrv.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/nconfsrv/nconfsrv.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2013 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -59,4 +59,5 @@
 {
 	service_id_t sid;
+	loc_srv_t *srv;
 	errno_t rc;
 
@@ -79,5 +80,5 @@
 	async_set_fallback_port_handler(ncs_client_conn, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server: %s.", str_error(rc));
@@ -85,6 +86,7 @@
 	}
 
-	rc = loc_service_register(SERVICE_NAME_NETCONF, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_NETCONF, &sid);
 	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
 		return EEXIST;
@@ -92,6 +94,9 @@
 
 	rc = ncs_link_discovery_start();
-	if (rc != EOK)
+	if (rc != EOK) {
+		loc_service_unregister(srv, sid);
+		loc_server_unregister(srv);
 		return EEXIST;
+	}
 
 	return EOK;
Index: uspace/srv/net/slip/slip.c
===================================================================
--- uspace/srv/net/slip/slip.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/slip/slip.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2013 Jakub Jermar
  * All rights reserved.
@@ -307,4 +307,5 @@
 	chardev_t *chardev_out = NULL;
 	fid_t fid;
+	loc_srv_t *srv;
 	errno_t rc;
 
@@ -314,5 +315,5 @@
 	async_set_fallback_port_handler(slip_client_conn, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR,
@@ -323,4 +324,5 @@
 	rc = loc_service_get_id(svcstr, &svcid, 0);
 	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR,
 		    "Failed getting ID for service %s", svcstr);
@@ -330,4 +332,5 @@
 	rc = loc_category_get_id(CAT_IPLINK, &iplinkcid, 0);
 	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR,
 		    "Failed to get category ID for %s",
@@ -342,4 +345,5 @@
 	sess_out = loc_service_connect(svcid, INTERFACE_DDF, 0);
 	if (!sess_out) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR,
 		    "Failed to connect to service %s (ID=%d)",
@@ -350,4 +354,5 @@
 	rc = chardev_open(sess_out, &chardev_out);
 	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR,
 		    "Failed opening character device.");
@@ -373,5 +378,5 @@
 	}
 
-	rc = loc_service_register(linkstr, &linksid);
+	rc = loc_service_register(srv, linkstr, &linksid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR,
@@ -381,6 +386,7 @@
 	}
 
-	rc = loc_service_add_to_cat(linksid, iplinkcid);
-	if (rc != EOK) {
+	rc = loc_service_add_to_cat(srv, linksid, iplinkcid);
+	if (rc != EOK) {
+		loc_service_unregister(srv, linksid);
 		log_msg(LOG_DEFAULT, LVL_ERROR,
 		    "Failed to add service %d (%s) to category %d (%s).",
@@ -401,4 +407,5 @@
 
 fail:
+	loc_server_unregister(srv);
 	chardev_close(chardev_out);
 	if (sess_out)
Index: uspace/srv/net/tcp/service.c
===================================================================
--- uspace/srv/net/tcp/service.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/tcp/service.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2015 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -1242,8 +1242,9 @@
 	errno_t rc;
 	service_id_t sid;
+	loc_srv_t *srv;
 
 	async_set_fallback_port_handler(tcp_client_conn, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
@@ -1251,6 +1252,7 @@
 	}
 
-	rc = loc_service_register(SERVICE_NAME_TCP, &sid);
-	if (rc != EOK) {
+	rc = loc_service_register(srv, SERVICE_NAME_TCP, &sid);
+	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service.");
 		return EIO;
Index: uspace/srv/net/udp/service.c
===================================================================
--- uspace/srv/net/udp/service.c	(revision b7155d7afd4c423375b9108bfa861575b8eb6a04)
+++ uspace/srv/net/udp/service.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2015 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -647,8 +647,9 @@
 	errno_t rc;
 	service_id_t sid;
+	loc_srv_t *srv;
 
 	async_set_fallback_port_handler(udp_client_conn, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
@@ -656,6 +657,7 @@
 	}
 
-	rc = loc_service_register(SERVICE_NAME_UDP, &sid);
-	if (rc != EOK) {
+	rc = loc_service_register(srv, SERVICE_NAME_UDP, &sid);
+	if (rc != EOK) {
+		loc_server_unregister(srv);
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service.");
 		return EIO;
