Index: uspace/drv/bus/usb/usbmast/main.c
===================================================================
--- uspace/drv/bus/usb/usbmast/main.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/drv/bus/usb/usbmast/main.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -82,5 +82,5 @@
     void *arg);
 
-static int usbmast_bd_open(bd_srv_t *);
+static int usbmast_bd_open(bd_srvs_t *, bd_srv_t *);
 static int usbmast_bd_close(bd_srv_t *);
 static int usbmast_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -100,5 +100,5 @@
 static usbmast_fun_t *bd_srv_usbmast(bd_srv_t *bd)
 {
-	return (usbmast_fun_t *)bd->arg;
+	return (usbmast_fun_t *)bd->srvs->sarg;
 }
 
@@ -240,7 +240,7 @@
 	mfun->lun = lun;
 
-	bd_srv_init(&mfun->bd);
-	mfun->bd.ops = &usbmast_bd_ops;
-	mfun->bd.arg = mfun;
+	bd_srvs_init(&mfun->bds);
+	mfun->bds.ops = &usbmast_bd_ops;
+	mfun->bds.sarg = mfun;
 
 	/* Set up a connection handler. */
@@ -311,9 +311,9 @@
 
 	mfun = (usbmast_fun_t *) ((ddf_fun_t *)arg)->driver_data;
-	bd_conn(iid, icall, &mfun->bd);
+	bd_conn(iid, icall, &mfun->bds);
 }
 
 /** Open device. */
-static int usbmast_bd_open(bd_srv_t *bd)
+static int usbmast_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
Index: uspace/drv/bus/usb/usbmast/usbmast.h
===================================================================
--- uspace/drv/bus/usb/usbmast/usbmast.h	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/drv/bus/usb/usbmast/usbmast.h	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -69,6 +69,6 @@
 	/** Block size in bytes */
 	size_t block_size;
-	/** Block device server structure */
-	bd_srv_t bd;
+	/** Block device service structure */
+	bd_srvs_t bds;
 } usbmast_fun_t;
 
Index: uspace/lib/c/generic/bd_srv.c
===================================================================
--- uspace/lib/c/generic/bd_srv.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/lib/c/generic/bd_srv.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -67,5 +67,5 @@
 	}
 
-	if (srv->ops->read_blocks == NULL) {
+	if (srv->srvs->ops->read_blocks == NULL) {
 		async_answer_0(rcallid, ENOTSUP);
 		async_answer_0(callid, ENOTSUP);
@@ -73,5 +73,5 @@
 	}
 
-	rc = srv->ops->read_blocks(srv, ba, cnt, buf, size);
+	rc = srv->srvs->ops->read_blocks(srv, ba, cnt, buf, size);
 	if (rc != EOK) {
 		async_answer_0(rcallid, ENOMEM);
@@ -109,5 +109,5 @@
 	}
 
-	if (srv->ops->read_toc == NULL) {
+	if (srv->srvs->ops->read_toc == NULL) {
 		async_answer_0(rcallid, ENOTSUP);
 		async_answer_0(callid, ENOTSUP);
@@ -115,5 +115,5 @@
 	}
 
-	rc = srv->ops->read_toc(srv, session, buf, size);
+	rc = srv->srvs->ops->read_toc(srv, session, buf, size);
 	if (rc != EOK) {
 		async_answer_0(rcallid, ENOMEM);
@@ -146,10 +146,10 @@
 	}
 
-	if (srv->ops->write_blocks == NULL) {
-		async_answer_0(callid, ENOTSUP);
-		return;
-	}
-
-	rc = srv->ops->write_blocks(srv, ba, cnt, data, size);
+	if (srv->srvs->ops->write_blocks == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	rc = srv->srvs->ops->write_blocks(srv, ba, cnt, data, size);
 	free(data);
 	async_answer_0(callid, rc);
@@ -162,10 +162,10 @@
 	size_t block_size;
 
-	if (srv->ops->get_block_size == NULL) {
-		async_answer_0(callid, ENOTSUP);
-		return;
-	}
-
-	rc = srv->ops->get_block_size(srv, &block_size);
+	if (srv->srvs->ops->get_block_size == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	rc = srv->srvs->ops->get_block_size(srv, &block_size);
 	async_answer_1(callid, rc, block_size);
 }
@@ -177,39 +177,42 @@
 	aoff64_t num_blocks;
 
-	if (srv->ops->get_num_blocks == NULL) {
-		async_answer_0(callid, ENOTSUP);
-		return;
-	}
-
-	rc = srv->ops->get_num_blocks(srv, &num_blocks);
+	if (srv->srvs->ops->get_num_blocks == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	rc = srv->srvs->ops->get_num_blocks(srv, &num_blocks);
 	async_answer_2(callid, rc, LOWER32(num_blocks), UPPER32(num_blocks));
 }
 
-void bd_srv_init(bd_srv_t *srv)
-{
-	fibril_mutex_initialize(&srv->lock);
-	srv->connected = false;
-	srv->ops = NULL;
-	srv->arg = NULL;
-	srv->client_sess = NULL;
-}
-
-int bd_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
-{
-	bd_srv_t *srv = (bd_srv_t *)arg;
-	int rc;
-
-	fibril_mutex_lock(&srv->lock);
-	if (srv->connected) {
-		fibril_mutex_unlock(&srv->lock);
-		async_answer_0(iid, EBUSY);
-		return EBUSY;
-	}
-
-	srv->connected = true;
-	fibril_mutex_unlock(&srv->lock);
+static bd_srv_t *bd_srv_create(bd_srvs_t *srvs)
+{
+	bd_srv_t *srv;
+
+	srv = calloc(1, sizeof(srv));
+	if (srv == NULL)
+		return NULL;
+
+	srv->srvs = srvs;
+	return srv;
+}
+
+void bd_srvs_init(bd_srvs_t *srvs)
+{
+	srvs->ops = NULL;
+	srvs->sarg = NULL;
+}
+
+int bd_conn(ipc_callid_t iid, ipc_call_t *icall, bd_srvs_t *srvs)
+{
+	bd_srv_t *srv;
+	int rc;
 
 	/* Accept the connection */
 	async_answer_0(iid, EOK);
+
+	srv = bd_srv_create(srvs);
+	if (srv == NULL)
+		return ENOMEM;
 
 	async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE);
@@ -219,5 +222,5 @@
 	srv->client_sess = sess;
 
-	rc = srv->ops->open(srv);
+	rc = srvs->ops->open(srvs, srv);
 	if (rc != EOK)
 		return rc;
@@ -230,7 +233,4 @@
 		if (!method) {
 			/* The other side has hung up */
-			fibril_mutex_lock(&srv->lock);
-			srv->connected = false;
-			fibril_mutex_unlock(&srv->lock);
 			async_answer_0(callid, EOK);
 			break;
@@ -258,5 +258,8 @@
 	}
 
-	return srv->ops->close(srv);
+	rc = srvs->ops->close(srv);
+	free(srv);
+
+	return rc;
 }
 
Index: uspace/lib/c/include/bd_srv.h
===================================================================
--- uspace/lib/c/include/bd_srv.h	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/lib/c/include/bd_srv.h	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -36,4 +36,5 @@
 #define LIBC_BD_SRV_H_
 
+#include <adt/list.h>
 #include <async.h>
 #include <fibril_synch.h>
@@ -43,14 +44,19 @@
 typedef struct bd_ops bd_ops_t;
 
+/** Service setup (per sevice) */
 typedef struct {
-	fibril_mutex_t lock;
-	bool connected;
 	bd_ops_t *ops;
-	void *arg;
+	void *sarg;
+} bd_srvs_t;
+
+/** Server structure (per client session) */
+typedef struct {
+	bd_srvs_t *srvs;
 	async_sess_t *client_sess;
+	void *carg;
 } bd_srv_t;
 
 typedef struct bd_ops {
-	int (*open)(bd_srv_t *);
+	int (*open)(bd_srvs_t *, bd_srv_t *);
 	int (*close)(bd_srv_t *);
 	int (*read_blocks)(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -61,7 +67,7 @@
 } bd_ops_t;
 
-extern void bd_srv_init(bd_srv_t *);
+extern void bd_srvs_init(bd_srvs_t *);
 
-extern int bd_conn(ipc_callid_t, ipc_call_t *, void *);
+extern int bd_conn(ipc_callid_t, ipc_call_t *, bd_srvs_t *);
 
 #endif
Index: uspace/srv/bd/ata_bd/ata_bd.c
===================================================================
--- uspace/srv/bd/ata_bd/ata_bd.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/ata_bd/ata_bd.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -104,5 +104,5 @@
 static void ata_bd_connection(ipc_callid_t iid, ipc_call_t *icall, void *);
 
-static int ata_bd_open(bd_srv_t *);
+static int ata_bd_open(bd_srvs_t *, bd_srv_t *);
 static int ata_bd_close(bd_srv_t *);
 static int ata_bd_read_blocks(bd_srv_t *, uint64_t ba, size_t cnt, void *buf,
@@ -146,5 +146,5 @@
 static disk_t *bd_srv_disk(bd_srv_t *bd)
 {
-	return (disk_t *)bd->arg;
+	return (disk_t *)bd->srvs->sarg;
 }
 
@@ -312,5 +312,5 @@
 	}
 
-	bd_conn(iid, icall, &ata_disk[disk_id].bd);
+	bd_conn(iid, icall, &ata_disk[disk_id].bds);
 }
 
@@ -336,7 +336,7 @@
 	fibril_mutex_initialize(&d->lock);
 
-	bd_srv_init(&d->bd);
-	d->bd.ops = &ata_bd_ops;
-	d->bd.arg = d;
+	bd_srvs_init(&d->bds);
+	d->bds.ops = &ata_bd_ops;
+	d->bds.sarg = d;
 
 	/* Try identify command. */
@@ -467,5 +467,5 @@
 }
 
-static int ata_bd_open(bd_srv_t *bd)
+static int ata_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
Index: uspace/srv/bd/ata_bd/ata_bd.h
===================================================================
--- uspace/srv/bd/ata_bd/ata_bd.h	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/ata_bd/ata_bd.h	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -119,5 +119,5 @@
 	service_id_t service_id;
 	int disk_id;
-	bd_srv_t bd;
+	bd_srvs_t bds;
 } disk_t;
 
Index: uspace/srv/bd/file_bd/file_bd.c
===================================================================
--- uspace/srv/bd/file_bd/file_bd.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/file_bd/file_bd.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -62,5 +62,5 @@
 
 static service_id_t service_id;
-static bd_srv_t bd_srv;
+static bd_srvs_t bd_srvs;
 static fibril_mutex_t dev_lock;
 
@@ -69,5 +69,5 @@
 static void file_bd_connection(ipc_callid_t iid, ipc_call_t *icall, void *);
 
-static int file_bd_open(bd_srv_t *);
+static int file_bd_open(bd_srvs_t *, bd_srv_t *);
 static int file_bd_close(bd_srv_t *);
 static int file_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -154,6 +154,6 @@
 static int file_bd_init(const char *fname)
 {
-	bd_srv_init(&bd_srv);
-	bd_srv.ops = &file_bd_ops;
+	bd_srvs_init(&bd_srvs);
+	bd_srvs.ops = &file_bd_ops;
 	
 	async_set_client_connection(file_bd_connection);
@@ -188,9 +188,9 @@
 static void file_bd_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
 {
-	bd_conn(iid, icall, &bd_srv);
+	bd_conn(iid, icall, &bd_srvs);
 }
 
 /** Open device. */
-static int file_bd_open(bd_srv_t *bd)
+static int file_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
Index: uspace/srv/bd/gxe_bd/gxe_bd.c
===================================================================
--- uspace/srv/bd/gxe_bd/gxe_bd.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/gxe_bd/gxe_bd.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -88,6 +88,6 @@
 /** GXE block device soft state */
 typedef struct {
-	/** Block device server structure */
-	bd_srv_t bd;
+	/** Block device service structure */
+	bd_srvs_t bds;
 	int disk_id;
 } gxe_bd_t;
@@ -109,5 +109,5 @@
 static int gxe_bd_write_block(int disk_id, uint64_t ba, const void *buf);
 
-static int gxe_bd_open(bd_srv_t *);
+static int gxe_bd_open(bd_srvs_t *, bd_srv_t *);
 static int gxe_bd_close(bd_srv_t *);
 static int gxe_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -127,5 +127,5 @@
 static gxe_bd_t *bd_srv_gxe(bd_srv_t *bd)
 {
-	return (gxe_bd_t *)bd->arg;
+	return (gxe_bd_t *)bd->srvs->sarg;
 }
 
@@ -166,7 +166,7 @@
 		char name[16];
 		
-		bd_srv_init(&gxe_bd[i].bd);
-		gxe_bd[i].bd.ops = &gxe_bd_ops;
-		gxe_bd[i].bd.arg = (void *)&gxe_bd[i];
+		bd_srvs_init(&gxe_bd[i].bds);
+		gxe_bd[i].bds.ops = &gxe_bd_ops;
+		gxe_bd[i].bds.sarg = (void *)&gxe_bd[i];
 		
 		snprintf(name, 16, "%s/disk%u", NAMESPACE, i);
@@ -203,9 +203,9 @@
 	}
 
-	bd_conn(iid, icall, &gxe_bd[disk_id].bd);
+	bd_conn(iid, icall, &gxe_bd[disk_id].bds);
 }
 
 /** Open device. */
-static int gxe_bd_open(bd_srv_t *bd)
+static int gxe_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
Index: uspace/srv/bd/part/guid_part/guid_part.c
===================================================================
--- uspace/srv/bd/part/guid_part/guid_part.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/part/guid_part/guid_part.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -83,6 +83,6 @@
 	/** Service representing the partition (outbound device) */
 	service_id_t dsid;
-	/** Block device server structure */
-	bd_srv_t bd;
+	/** Block device service structure */
+	bd_srvs_t bds;
 	/** Points to next partition structure. */
 	struct part *next;
@@ -104,5 +104,5 @@
 static int gpt_bsa_translate(part_t *p, aoff64_t ba, size_t cnt, aoff64_t *gba);
 
-static int gpt_bd_open(bd_srv_t *);
+static int gpt_bd_open(bd_srvs_t *, bd_srv_t *);
 static int gpt_bd_close(bd_srv_t *);
 static int gpt_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -122,5 +122,5 @@
 static part_t *bd_srv_part(bd_srv_t *bd)
 {
-	return (part_t *)bd->arg;
+	return (part_t *)bd->srvs->sarg;
 }
 
@@ -325,7 +325,7 @@
 	}
 
-	bd_srv_init(&part->bd);
-	part->bd.ops = &gpt_bd_ops;
-	part->bd.arg = part;
+	bd_srvs_init(&part->bds);
+	part->bds.ops = &gpt_bd_ops;
+	part->bds.sarg = part;
 
 	part->dsid = 0;
@@ -357,9 +357,9 @@
 	assert(part->present == true);
 
-	bd_conn(iid, icall, &part->bd);
+	bd_conn(iid, icall, &part->bds);
 }
 
 /** Open device. */
-static int gpt_bd_open(bd_srv_t *bd)
+static int gpt_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
Index: uspace/srv/bd/part/mbr_part/mbr_part.c
===================================================================
--- uspace/srv/bd/part/mbr_part/mbr_part.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/part/mbr_part/mbr_part.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -100,6 +100,6 @@
 	/** Device representing the partition (outbound device) */
 	service_id_t dsid;
-	/** Block device server structure */
-	bd_srv_t bd;
+	/** Block device service sturcture */
+	bd_srvs_t bds;
 	/** Points to next partition structure. */
 	struct part *next;
@@ -154,5 +154,5 @@
 static int mbr_bsa_translate(part_t *p, uint64_t ba, size_t cnt, uint64_t *gba);
 
-static int mbr_bd_open(bd_srv_t *);
+static int mbr_bd_open(bd_srvs_t *, bd_srv_t *);
 static int mbr_bd_close(bd_srv_t *);
 static int mbr_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -172,5 +172,5 @@
 static part_t *bd_srv_part(bd_srv_t *bd)
 {
-	return (part_t *)bd->arg;
+	return (part_t *)bd->srvs->sarg;
 }
 
@@ -402,7 +402,7 @@
 	part->present = (pte->ptype != PT_UNUSED) ? true : false;
 
-	bd_srv_init(&part->bd);
-	part->bd.ops = &mbr_bd_ops;
-	part->bd.arg = part;
+	bd_srvs_init(&part->bds);
+	part->bds.ops = &mbr_bd_ops;
+	part->bds.sarg = part;
 
 	part->dsid = 0;
@@ -433,9 +433,9 @@
 
 	assert(part->present == true);
-	bd_conn(iid, icall, &part->bd);
+	bd_conn(iid, icall, &part->bds);
 }
 
 /** Open device. */
-static int mbr_bd_open(bd_srv_t *bd)
+static int mbr_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
Index: uspace/srv/bd/rd/rd.c
===================================================================
--- uspace/srv/bd/rd/rd.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/rd/rd.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -68,5 +68,5 @@
 static const size_t block_size = 512;
 
-static int rd_open(bd_srv_t *);
+static int rd_open(bd_srvs_t *, bd_srv_t *);
 static int rd_close(bd_srv_t *);
 static int rd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -93,13 +93,13 @@
 };
 
-static bd_srv_t bd_srv;
+static bd_srvs_t bd_srvs;
 
 static void rd_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
 {
-	bd_conn(iid, icall, &bd_srv);
+	bd_conn(iid, icall, &bd_srvs);
 }
 
 /** Open device. */
-static int rd_open(bd_srv_t *bd)
+static int rd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
@@ -175,6 +175,6 @@
 	    (void *) addr_phys, size);
 	
-	bd_srv_init(&bd_srv);
-	bd_srv.ops = &rd_bd_ops;
+	bd_srvs_init(&bd_srvs);
+	bd_srvs.ops = &rd_bd_ops;
 	
 	async_set_client_connection(rd_client_conn);
Index: uspace/srv/bd/sata_bd/sata_bd.c
===================================================================
--- uspace/srv/bd/sata_bd/sata_bd.c	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/sata_bd/sata_bd.c	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -57,5 +57,5 @@
 static int disk_count;
 
-static int sata_bd_open(bd_srv_t *);
+static int sata_bd_open(bd_srvs_t *, bd_srv_t *);
 static int sata_bd_close(bd_srv_t *);
 static int sata_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
@@ -75,5 +75,5 @@
 static sata_bd_dev_t *bd_srv_sata(bd_srv_t *bd)
 {
-	return (sata_bd_dev_t *)bd->arg;
+	return (sata_bd_dev_t *)bd->srvs->sarg;
 }
 
@@ -104,7 +104,7 @@
 		ahci_get_num_blocks(disk[disk_count].sess, &disk[disk_count].blocks);
 		
-		bd_srv_init(&disk[disk_count].bd);
-		disk[disk_count].bd.ops = &sata_bd_ops;
-		disk[disk_count].bd.arg = &disk[disk_count];
+		bd_srvs_init(&disk[disk_count].bds);
+		disk[disk_count].bds.ops = &sata_bd_ops;
+		disk[disk_count].bds.sarg = &disk[disk_count];
 		
 		printf("Device %s - %s , blocks: %lu, block_size: %lu\n", 
@@ -183,9 +183,9 @@
 	}
 
-	bd_conn(iid, icall, &disk[disk_id].bd);
+	bd_conn(iid, icall, &disk[disk_id].bds);
 }
 
 /** Open device. */
-static int sata_bd_open(bd_srv_t *bd)
+static int sata_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
 	return EOK;
Index: uspace/srv/bd/sata_bd/sata_bd.h
===================================================================
--- uspace/srv/bd/sata_bd/sata_bd.h	(revision 4802dd7d8d17cb02ec8f79547ffde538bb8c6736)
+++ uspace/srv/bd/sata_bd/sata_bd.h	(revision 135486df91381258aa51c130b7b463fc4ff5e0a8)
@@ -58,5 +58,5 @@
 	size_t block_size;
 	/** Block device server structure */
-	bd_srv_t bd;
+	bd_srvs_t bds;
 } sata_bd_dev_t;
 
