Index: uspace/srv/bd/vbd/disk.c
===================================================================
--- uspace/srv/bd/vbd/disk.c	(revision 4f2911877822735bb738e57467b15f4958b39bc0)
+++ uspace/srv/bd/vbd/disk.c	(revision 3a9cf3536b79bfa327a5a14448447c2b19f029f9)
@@ -89,4 +89,29 @@
 }
 
+static vbds_disk_t *vbds_disk_first(void)
+{
+	link_t *link;
+
+	link = list_first(&vbds_disks);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, vbds_disk_t, ldisks);
+}
+
+static vbds_disk_t *vbds_disk_next(vbds_disk_t *disk)
+{
+	link_t *link;
+
+	if (disk == NULL)
+		return NULL;
+
+	link = list_next(&disk->ldisks, &vbds_disks);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, vbds_disk_t, ldisks);
+}
+
 int vbds_disks_init(void)
 {
@@ -107,5 +132,5 @@
 }
 
-/** Check for new disk devices */
+/** Check for new/removed disk devices */
 static int vbds_disks_check_new(void)
 {
@@ -114,5 +139,8 @@
 	service_id_t *svcs;
 	size_t count, i;
-	int rc;
+	vbds_disk_t *cur, *next;
+	int rc;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "vbds_disks_check_new()");
 
 	fibril_mutex_lock(&vbds_disks_lock);
@@ -133,4 +161,7 @@
 	}
 
+	list_foreach(vbds_disks, ldisks, vbds_disk_t, disk)
+		disk->present = false;
+
 	for (i = 0; i < count; i++) {
 		already_known = false;
@@ -139,4 +170,5 @@
 			if (disk->svc_id == svcs[i]) {
 				already_known = true;
+				disk->present = true;
 				break;
 			}
@@ -151,5 +183,24 @@
 				    "disk.");
 			}
+		} else {
+			log_msg(LOG_DEFAULT, LVL_DEBUG, "Disk %lu already known",
+			    (unsigned long) svcs[i]);
 		}
+	}
+
+	cur = vbds_disk_first();
+	while (cur != NULL) {
+		next = vbds_disk_next(cur);
+		if (!cur->present) {
+			log_msg(LOG_DEFAULT, LVL_NOTE, "Disk '%lu' is gone",
+			    (unsigned long) cur->svc_id);
+			rc = vbds_disk_remove(cur->svc_id);
+			if (rc != EOK) {
+				log_msg(LOG_DEFAULT, LVL_ERROR, "Could not "
+				    "remove disk.");
+			}
+		}
+
+		cur = next;
 	}
 
@@ -403,4 +454,5 @@
 	disk->label = label;
 	disk->block_size = block_size;
+	disk->present = true;
 
 	list_initialize(&disk->parts);
Index: uspace/srv/bd/vbd/types/vbd.h
===================================================================
--- uspace/srv/bd/vbd/types/vbd.h	(revision 4f2911877822735bb738e57467b15f4958b39bc0)
+++ uspace/srv/bd/vbd/types/vbd.h	(revision 3a9cf3536b79bfa327a5a14448447c2b19f029f9)
@@ -42,4 +42,5 @@
 #include <label.h>
 #include <loc.h>
+#include <stdbool.h>
 #include <sys/types.h>
 #include <types/label.h>
@@ -87,4 +88,6 @@
 	/** Block size */
 	size_t block_size;
+	/** Used to mark disks still present during re-discovery */
+	bool present;
 } vbds_disk_t;
 
Index: uspace/srv/locsrv/locsrv.c
===================================================================
--- uspace/srv/locsrv/locsrv.c	(revision 4f2911877822735bb738e57467b15f4958b39bc0)
+++ uspace/srv/locsrv/locsrv.c	(revision 3a9cf3536b79bfa327a5a14448447c2b19f029f9)
@@ -445,4 +445,5 @@
 	free(server);
 	
+	loc_category_change_event();
 	return EOK;
 }
@@ -557,4 +558,6 @@
 	fibril_mutex_unlock(&services_list_mutex);
 	async_answer_0(iid, EOK);
+
+	loc_category_change_event();
 }
 
