Index: uspace/srv/bd/file_bd/file_bd.c
===================================================================
--- uspace/srv/bd/file_bd/file_bd.c	(revision 5fc82448bbd01f2950b893989095ed4c1b1c99b3)
+++ uspace/srv/bd/file_bd/file_bd.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2009 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -61,4 +61,5 @@
 static aoff64_t num_blocks;
 static FILE *img;
+static loc_srv_t *srv;
 
 static service_id_t service_id;
@@ -137,5 +138,5 @@
 		return -1;
 
-	rc = loc_service_register(device_name, &service_id);
+	rc = loc_service_register(srv, device_name, &service_id);
 	if (rc != EOK) {
 		printf("%s: Unable to register device '%s': %s.\n",
@@ -150,5 +151,5 @@
 	}
 
-	rc = loc_service_add_to_cat(service_id, disk_cat);
+	rc = loc_service_add_to_cat(srv, service_id, disk_cat);
 	if (rc != EOK) {
 		printf("%s: Failed adding %s to category: %s",
@@ -176,5 +177,5 @@
 
 	async_set_fallback_port_handler(file_bd_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);
@@ -183,23 +184,37 @@
 
 	img = fopen(fname, "rb+");
-	if (img == NULL)
-		return EINVAL;
+	if (img == NULL) {
+		rc = EINVAL;
+		goto error;
+	}
 
 	if (fseek(img, 0, SEEK_END) != 0) {
-		fclose(img);
-		return EIO;
+		rc = EIO;
+		goto error;
 	}
 
 	off64_t img_size = ftell(img);
 	if (img_size < 0) {
+		rc = EIO;
+		goto error;
+	}
+
+	num_blocks = img_size / block_size;
+
+	fibril_mutex_initialize(&dev_lock);
+
+	return EOK;
+error:
+	if (img != NULL) {
 		fclose(img);
-		return EIO;
-	}
-
-	num_blocks = img_size / block_size;
-
-	fibril_mutex_initialize(&dev_lock);
-
-	return EOK;
+		img = NULL;
+	}
+
+	if (srv != NULL) {
+		loc_server_unregister(srv);
+		srv = NULL;
+	}
+
+	return rc;
 }
 
Index: uspace/srv/bd/rd/rd.c
===================================================================
--- uspace/srv/bd/rd/rd.c	(revision 5fc82448bbd01f2950b893989095ed4c1b1c99b3)
+++ uspace/srv/bd/rd/rd.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2007 Michal Konopa
  * Copyright (c) 2007 Martin Jelen
@@ -93,4 +94,5 @@
 
 static bd_srvs_t bd_srvs;
+static loc_srv_t *srv;
 
 static void rd_client_conn(ipc_call_t *icall, void *arg)
@@ -178,5 +180,5 @@
 
 	async_set_fallback_port_handler(rd_client_conn, NULL);
-	ret = loc_server_register(NAME);
+	ret = loc_server_register(NAME, &srv);
 	if (ret != EOK) {
 		printf("%s: Unable to register driver: %s\n", NAME, str_error(ret));
@@ -185,5 +187,5 @@
 
 	service_id_t service_id;
-	ret = loc_service_register("bd/initrd", &service_id);
+	ret = loc_service_register(srv, "bd/initrd", &service_id);
 	if (ret != EOK) {
 		printf("%s: Unable to register device service\n", NAME);
Index: uspace/srv/bd/sata_bd/sata_bd.c
===================================================================
--- uspace/srv/bd/sata_bd/sata_bd.c	(revision 5fc82448bbd01f2950b893989095ed4c1b1c99b3)
+++ uspace/srv/bd/sata_bd/sata_bd.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2012 Petr Jerman
  * All rights reserved.
@@ -57,4 +58,5 @@
 #define MAXDISKS  256
 
+static loc_srv_t *srv;
 static sata_bd_dev_t disk[MAXDISKS];
 static int disk_count;
@@ -249,5 +251,5 @@
 
 	async_set_fallback_port_handler(sata_bd_connection, NULL);
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf(NAME ": Unable to register driver: %s.\n", str_error(rc));
@@ -270,5 +272,5 @@
 		char name[1024];
 		snprintf(name, 1024, "%s/%s", NAMESPACE, disk[i].dev_name);
-		rc = loc_service_register(name, &disk[i].service_id);
+		rc = loc_service_register(srv, name, &disk[i].service_id);
 		if (rc != EOK) {
 			printf(NAME ": Unable to register device %s: %s\n", name, str_error(rc));
@@ -276,5 +278,5 @@
 		}
 
-		rc = loc_service_add_to_cat(disk[i].service_id, disk_cat);
+		rc = loc_service_add_to_cat(srv, disk[i].service_id, disk_cat);
 		if (rc != EOK) {
 			printf("%s: Failed adding %s to category: %s.",
Index: uspace/srv/bd/vbd/disk.c
===================================================================
--- uspace/srv/bd/vbd/disk.c	(revision 5fc82448bbd01f2950b893989095ed4c1b1c99b3)
+++ uspace/srv/bd/vbd/disk.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2016 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -51,4 +51,6 @@
 #include "types/vbd.h"
 
+loc_srv_t *vbds_srv;
+
 static fibril_mutex_t vbds_disks_lock;
 static list_t vbds_disks; /* of vbds_disk_t */
@@ -1122,5 +1124,5 @@
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "loc_service_register('%s')",
 	    name);
-	rc = loc_service_register(name, &psid);
+	rc = loc_service_register(vbds_srv, name, &psid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering "
@@ -1131,5 +1133,5 @@
 	}
 
-	rc = loc_service_add_to_cat(psid, part_cid);
+	rc = loc_service_add_to_cat(vbds_srv, psid, part_cid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failled adding partition "
@@ -1138,5 +1140,5 @@
 		free(part);
 
-		rc = loc_service_unregister(psid);
+		rc = loc_service_unregister(vbds_srv, psid);
 		if (rc != EOK) {
 			log_msg(LOG_DEFAULT, LVL_ERROR, "Error unregistering "
@@ -1160,5 +1162,5 @@
 	    "disk->svc_name='%s', id=%zu)", part->disk->svc_name, part->svc_id);
 
-	rc = loc_service_unregister(part->svc_id);
+	rc = loc_service_unregister(vbds_srv, part->svc_id);
 	if (rc != EOK)
 		return EIO;
Index: uspace/srv/bd/vbd/disk.h
===================================================================
--- uspace/srv/bd/vbd/disk.h	(revision 5fc82448bbd01f2950b893989095ed4c1b1c99b3)
+++ uspace/srv/bd/vbd/disk.h	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2015 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -57,4 +57,6 @@
 extern void vbds_bd_conn(ipc_call_t *, void *);
 
+extern loc_srv_t *vbds_srv;
+
 #endif
 
Index: uspace/srv/bd/vbd/vbd.c
===================================================================
--- uspace/srv/bd/vbd/vbd.c	(revision 5fc82448bbd01f2950b893989095ed4c1b1c99b3)
+++ uspace/srv/bd/vbd/vbd.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2015 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -68,5 +68,5 @@
 	async_set_fallback_port_handler(vbds_client_conn, NULL);
 
-	rc = loc_server_register(NAME);
+	rc = loc_server_register(NAME, &vbds_srv);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server: %s.", str_error(rc));
@@ -74,5 +74,5 @@
 	}
 
-	rc = loc_service_register(SERVICE_NAME_VBD, &ctl_sid);
+	rc = loc_service_register(vbds_srv, SERVICE_NAME_VBD, &ctl_sid);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service: %s.", str_error(rc));
