Index: uspace/srv/hid/console/console.c
===================================================================
--- uspace/srv/hid/console/console.c	(revision 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/console/console.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2011 Martin Decky
  * All rights reserved.
@@ -89,4 +89,6 @@
 } console_t;
 
+static loc_srv_t *console_srv;
+
 /** Input server proxy */
 static input_t *input;
@@ -902,5 +904,5 @@
 	/* Register server */
 	async_set_fallback_port_handler(client_connection, NULL);
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &console_srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register server (%s)\n", NAME,
@@ -952,5 +954,6 @@
 			snprintf(vc, LOC_NAME_MAXLEN, "%s/vc%zu", NAMESPACE, i);
 
-			if (loc_service_register(vc, &consoles[i].dsid) != EOK) {
+			if (loc_service_register(console_srv, vc,
+			    &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 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/display/main.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -127,4 +127,6 @@
 	port_id_t wm_port;
 	port_id_t dc_port;
+	loc_srv_t *srv = NULL;
+	service_id_t sid = 0;
 	errno_t rc;
 
@@ -171,5 +173,5 @@
 		goto error;
 
-	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));
@@ -178,6 +180,5 @@
 	}
 
-	service_id_t sid;
-	rc = loc_service_register(SERVICE_NAME_DISPLAY, &sid);
+	rc = loc_service_register(srv, SERVICE_NAME_DISPLAY, &sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
@@ -189,4 +190,8 @@
 	return EOK;
 error:
+	if (sid != 0)
+		loc_service_unregister(srv, sid);
+	if (srv != NULL)
+		loc_server_unregister(srv);
 	// XXX destroy disp_port
 	// XXX destroy gc_port
Index: uspace/srv/hid/input/input.c
===================================================================
--- uspace/srv/hid/input/input.c	(revision 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/input/input.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2006 Josef Cejka
  * All rights reserved.
@@ -878,4 +878,5 @@
 {
 	errno_t rc;
+	loc_srv_t *srv;
 
 	if (argc < 2) {
@@ -901,5 +902,5 @@
 	async_set_fallback_port_handler(client_connection, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register server\n", NAME);
@@ -908,5 +909,5 @@
 
 	service_id_t service_id;
-	rc = loc_service_register(argv[1], &service_id);
+	rc = loc_service_register(srv, argv[1], &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 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/isdv4_tablet/main.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2012 Martin Sucha
  * All rights reserved.
@@ -184,4 +185,5 @@
 	serial_t *serial;
 	char *serial_port_name = NULL;
+	loc_srv_t *srv;
 
 	int arg = 1;
@@ -315,5 +317,5 @@
 
 	async_set_fallback_port_handler(mouse_connection, NULL);
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register driver.\n", NAME);
@@ -329,6 +331,7 @@
 	}
 
-	rc = loc_service_register(service_name, &service_id);
-	if (rc != EOK) {
+	rc = loc_service_register(srv, service_name, &service_id);
+	if (rc != EOK) {
+		loc_server_unregister(srv);
 		printf(NAME ": Unable to register service %s.\n", service_name);
 		return rc;
@@ -340,5 +343,5 @@
 		printf(NAME ": Unable to get mouse category id.\n");
 	} else {
-		rc = loc_service_add_to_cat(service_id, mouse_category);
+		rc = loc_service_add_to_cat(srv, service_id, mouse_category);
 		if (rc != EOK) {
 			printf(NAME ": Unable to add device to mouse category.\n");
Index: uspace/srv/hid/output/output.c
===================================================================
--- uspace/srv/hid/output/output.c	(revision 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/output/output.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2011 Martin Decky
  * All rights reserved.
@@ -468,4 +469,6 @@
 int main(int argc, char *argv[])
 {
+	loc_srv_t *srv;
+
 	if (argc < 2) {
 		usage(argv[0]);
@@ -477,5 +480,5 @@
 	/* Register server */
 	async_set_fallback_port_handler(client_connection, NULL);
-	errno_t rc = loc_server_register(NAME);
+	errno_t rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register driver\n", NAME);
@@ -484,6 +487,8 @@
 
 	service_id_t service_id;
-	rc = loc_service_register(argv[1], &service_id);
+	rc = loc_service_register(srv, argv[1], &service_id);
 	if (rc != EOK) {
+		loc_server_unregister(srv);
+
 		printf("%s: Unable to register service %s\n", NAME, argv[1]);
 		return rc;
Index: uspace/srv/hid/remcons/remcons.c
===================================================================
--- uspace/srv/hid/remcons/remcons.c	(revision 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/remcons/remcons.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2012 Vojtech Horky
  * All rights reserved.
@@ -110,4 +111,6 @@
 };
 
+static loc_srv_t *remcons_srv;
+
 static telnet_user_t *srv_to_user(con_srv_t *srv)
 {
@@ -301,5 +304,6 @@
 	telnet_user_add(user);
 
-	errno_t rc = loc_service_register(user->service_name, &user->service_id);
+	errno_t rc = loc_service_register(remcons_srv, user->service_name,
+	    &user->service_id);
 	if (rc != EOK) {
 		telnet_user_error(user, "Unable to register %s with loc: %s.",
@@ -332,5 +336,5 @@
 	fibril_mutex_unlock(&user->guard);
 
-	rc = loc_service_unregister(user->service_id);
+	rc = loc_service_unregister(remcons_srv, user->service_id);
 	if (rc != EOK) {
 		telnet_user_error(user,
@@ -351,5 +355,5 @@
 
 	async_set_fallback_port_handler(client_connection, NULL);
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &remcons_srv);
 	if (rc != EOK) {
 		fprintf(stderr, "%s: Unable to register server\n", NAME);
Index: uspace/srv/hid/rfb/main.c
===================================================================
--- uspace/srv/hid/rfb/main.c	(revision 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/rfb/main.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2013 Martin Sucha
  * All rights reserved.
@@ -443,4 +443,5 @@
 {
 	rfb_t rfb;
+	loc_srv_t *srv;
 
 	log_init(NAME);
@@ -482,5 +483,5 @@
 	async_set_fallback_port_handler(client_connection, &rfb);
 
-	errno_t rc = loc_server_register(NAME);
+	errno_t rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register server.\n", NAME);
@@ -497,5 +498,5 @@
 	service_id_t service_id;
 
-	rc = loc_service_register(service_name, &service_id);
+	rc = loc_service_register(srv, service_name, &service_id);
 	if (rc != EOK) {
 		printf(NAME ": Unable to register service %s.\n", service_name);
@@ -512,5 +513,5 @@
 	}
 
-	rc = loc_service_add_to_cat(service_id, ddev_cid);
+	rc = loc_service_add_to_cat(srv, service_id, ddev_cid);
 	if (rc != EOK) {
 		fprintf(stderr, NAME ": Unable to add service to display device category.\n");
Index: uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c
===================================================================
--- uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision 0b6fad98b01843ea564e7d4184663eef63f3a047)
+++ uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2010 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -81,8 +81,10 @@
 int main(int argc, char *argv[])
 {
+	loc_srv_t *srv;
+
 	printf("%s: S3C24xx touchscreen driver\n", NAME);
 
 	async_set_fallback_port_handler(s3c24xx_ts_connection, NULL);
-	errno_t rc = loc_server_register(NAME);
+	errno_t rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register driver.\n", NAME);
@@ -91,12 +93,20 @@
 
 	ts = malloc(sizeof(s3c24xx_ts_t));
-	if (ts == NULL)
+	if (ts == NULL) {
+		loc_server_unregister(srv);
 		return -1;
-
-	if (s3c24xx_ts_init(ts) != EOK)
+	}
+
+	if (s3c24xx_ts_init(ts) != EOK) {
+		free(ts);
+		loc_server_unregister(srv);
 		return -1;
-
-	rc = loc_service_register(NAMESPACE "/mouse", &ts->service_id);
+	}
+
+	rc = loc_service_register(srv, NAMESPACE "/mouse", &ts->service_id);
 	if (rc != EOK) {
+		// XXX s3c24xx_ts_fini();
+		free(ts);
+		loc_server_unregister(srv);
 		printf(NAME ": Unable to register device %s.\n",
 		    NAMESPACE "/mouse");
