Index: uspace/lib/fs/libfs.c
===================================================================
--- uspace/lib/fs/libfs.c	(revision 925a21e74e0c2e08fbcb216e413237c0cb1ac3de)
+++ uspace/lib/fs/libfs.c	(revision 5bf76c164fa130e2a664b14a5d195687bf11e6e2)
@@ -877,4 +877,82 @@
 }
 
+static FIBRIL_MUTEX_INITIALIZE(instances_mutex);
+static LIST_INITIALIZE(instances_list);
+
+typedef struct {
+	service_id_t service_id;
+	link_t link;
+	void *data;
+} fs_instance_t;
+
+int fs_instance_create(service_id_t service_id, void *data)
+{
+	fs_instance_t *inst = malloc(sizeof(fs_instance_t));
+	if (!inst)
+		return ENOMEM;
+
+	link_initialize(&inst->link);
+	inst->service_id = service_id;
+	inst->data = data;
+
+	fibril_mutex_lock(&instances_mutex);
+	list_foreach(instances_list, link) {
+		fs_instance_t *cur = list_get_instance(link, fs_instance_t,
+		    link);
+
+		if (cur->service_id == service_id) {
+			fibril_mutex_unlock(&instances_mutex);
+			free(inst);
+			return EEXIST;
+		}
+
+		/* keep the list sorted */
+		if (cur->service_id < service_id) {
+			list_insert_before(&inst->link, &cur->link);
+			fibril_mutex_unlock(&instances_mutex);
+			return EOK;
+		}
+	}
+	list_append(&inst->link, &instances_list);
+	fibril_mutex_unlock(&instances_mutex);
+
+	return EOK;
+}
+
+int fs_instance_get(service_id_t service_id, void **idp)
+{
+	fibril_mutex_lock(&instances_mutex);
+	list_foreach(instances_list, link) {
+		fs_instance_t *inst = list_get_instance(link, fs_instance_t,
+		    link);
+
+		if (inst->service_id == service_id) {
+			*idp = inst->data;
+			fibril_mutex_unlock(&instances_mutex);
+			return EOK;
+		}
+	}
+	fibril_mutex_unlock(&instances_mutex);
+	return ENOENT;
+}
+
+int fs_instance_destroy(service_id_t service_id)
+{
+	fibril_mutex_lock(&instances_mutex);
+	list_foreach(instances_list, link) {
+		fs_instance_t *inst = list_get_instance(link, fs_instance_t,
+		    link);
+
+		if (inst->service_id == service_id) {
+			list_remove(&inst->link);
+			fibril_mutex_unlock(&instances_mutex);
+			free(inst);
+			return EOK;
+		}
+	}
+	fibril_mutex_unlock(&instances_mutex);
+	return ENOENT;
+}
+
 /** @}
  */
Index: uspace/lib/fs/libfs.h
===================================================================
--- uspace/lib/fs/libfs.h	(revision 925a21e74e0c2e08fbcb216e413237c0cb1ac3de)
+++ uspace/lib/fs/libfs.h	(revision 5bf76c164fa130e2a664b14a5d195687bf11e6e2)
@@ -105,4 +105,8 @@
 extern void fs_node_initialize(fs_node_t *);
 
+extern int fs_instance_create(service_id_t, void *);
+extern int fs_instance_get(service_id_t, void **);
+extern int fs_instance_destroy(service_id_t);
+
 #endif
 
Index: uspace/srv/fs/mfs/mfs.h
===================================================================
--- uspace/srv/fs/mfs/mfs.h	(revision 925a21e74e0c2e08fbcb216e413237c0cb1ac3de)
+++ uspace/srv/fs/mfs/mfs.h	(revision 5bf76c164fa130e2a664b14a5d195687bf11e6e2)
@@ -131,5 +131,4 @@
 
 struct mfs_instance {
-	link_t link;
 	service_id_t service_id;
 	struct mfs_sb_info *sbi;
Index: uspace/srv/fs/mfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/mfs/mfs_ops.c	(revision 925a21e74e0c2e08fbcb216e413237c0cb1ac3de)
+++ uspace/srv/fs/mfs/mfs_ops.c	(revision 5bf76c164fa130e2a664b14a5d195687bf11e6e2)
@@ -73,6 +73,4 @@
 
 
-static LIST_INITIALIZE(inst_list);
-static FIBRIL_MUTEX_INITIALIZE(inst_list_mutex);
 static hash_table_t open_nodes;
 static FIBRIL_MUTEX_INITIALIZE(open_nodes_lock);
@@ -179,6 +177,4 @@
 		return ENOMEM;
 	}
-
-	instance->open_nodes_cnt = 0;
 
 	sb = malloc(MFS_SUPERBLOCK_SIZE);
@@ -268,5 +264,4 @@
 		free(instance);
 		free(sbi);
-		free(sb);
 		block_cache_fini(service_id);
 		block_fini(service_id);
@@ -275,12 +270,17 @@
 	}
 
-	/*Initialize the instance structure and add it to the list*/
-	link_initialize(&instance->link);
+	/*Initialize the instance structure and remember it*/
 	instance->service_id = service_id;
 	instance->sbi = sbi;
-
-	fibril_mutex_lock(&inst_list_mutex);
-	list_append(&instance->link, &inst_list);
-	fibril_mutex_unlock(&inst_list_mutex);
+	instance->open_nodes_cnt = 0;
+	rc = fs_instance_create(service_id, instance);
+	if (rc != EOK) {
+		free(instance);
+		free(sbi);
+		block_cache_fini(service_id);
+		block_fini(service_id);
+		mfsdebug("fs instance creation failed\n");
+		return rc;
+	}
 
 	mfsdebug("mount successful\n");
@@ -315,9 +315,6 @@
 	block_fini(service_id);
 
-	/* Remove the instance from the list */
-	fibril_mutex_lock(&inst_list_mutex);
-	list_remove(&inst->link);
-	fibril_mutex_unlock(&inst_list_mutex);
-
+	/* Remove and destroy the instance */
+	(void) fs_instance_destroy(service_id);
 	free(inst->sbi);
 	free(inst);
@@ -1012,28 +1009,15 @@
 mfs_instance_get(service_id_t service_id, struct mfs_instance **instance)
 {
-	struct mfs_instance *instance_ptr;
-
-	fibril_mutex_lock(&inst_list_mutex);
-
-	if (list_empty(&inst_list)) {
-		fibril_mutex_unlock(&inst_list_mutex);
-		return EINVAL;
-	}
-
-	list_foreach(inst_list, link) {
-		instance_ptr = list_get_instance(link, struct mfs_instance,
-						 link);
-
-		if (instance_ptr->service_id == service_id) {
-			*instance = instance_ptr;
-			fibril_mutex_unlock(&inst_list_mutex);
-			return EOK;
-		}
-	}
-
-	mfsdebug("Instance not found\n");
-
-	fibril_mutex_unlock(&inst_list_mutex);
-	return EINVAL;
+	void *data;
+	int rc;
+
+	rc = fs_instance_get(service_id, &data);
+	if (rc == EOK) {
+		*instance = (struct mfs_instance *) data;
+	} else {
+		mfsdebug("instance not found\n");
+	}
+
+	return rc;
 }
 
