Index: uspace/drv/bus/usb/usbmast/bo_trans.c
===================================================================
--- uspace/drv/bus/usb/usbmast/bo_trans.c	(revision f97f5cc2b91f2a3565f7b96b67bd28a8cb42c06a)
+++ uspace/drv/bus/usb/usbmast/bo_trans.c	(revision f76d2c2c443491a18c91f9d5b7760dd39b90f5ed)
@@ -44,12 +44,7 @@
 #include "usbmast.h"
 
-bool usb_mast_verbose = false;
 
 #define MASTLOG(format, ...) \
-	do { \
-		if (usb_mast_verbose) { \
-			usb_log_debug2("USB cl08: " format, ##__VA_ARGS__); \
-		} \
-	} while (false)
+	usb_log_debug2("USB cl08: " format, ##__VA_ARGS__)
 
 /** Send command via bulk-only transport.
@@ -65,22 +60,19 @@
 {
 	int rc;
-	int retval = EOK;
-	size_t act_size;
-	usb_pipe_t *bulk_in_pipe = &mfun->mdev->usb_dev->pipes[BULK_IN_EP].pipe;
-	usb_pipe_t *bulk_out_pipe = &mfun->mdev->usb_dev->pipes[BULK_OUT_EP].pipe;
-	usb_direction_t ddir;
-	void *dbuf;
-	size_t dbuf_size;
-
-	if (cmd->data_out != NULL && cmd->data_in == NULL) {
-		ddir = USB_DIRECTION_OUT;
-		dbuf = (void *)cmd->data_out;
-		dbuf_size = cmd->data_out_size;
-	} else if (cmd->data_out == NULL && cmd->data_in != NULL) {
+
+	if (cmd->data_in && cmd->data_out)
+		return EINVAL;
+
+	usb_pipe_t *bulk_in_pipe = mfun->mdev->bulk_in_pipe;
+	usb_pipe_t *bulk_out_pipe = mfun->mdev->bulk_out_pipe;
+
+	usb_pipe_t *dpipe = bulk_out_pipe;
+	usb_direction_t ddir = USB_DIRECTION_OUT;
+	size_t dbuf_size = cmd->data_out_size;
+
+	if (cmd->data_in) {
 		ddir = USB_DIRECTION_IN;
-		dbuf = cmd->data_in;
 		dbuf_size = cmd->data_in_size;
-	} else {
-		assert(false);
+		dpipe = bulk_in_pipe;
 	}
 
@@ -96,19 +88,24 @@
 	    usb_debug_str_buffer((uint8_t *) &cbw, sizeof(cbw), 0),
 	    str_error(rc));
-	if (rc != EOK)
-		return EIO;
+	if (rc != EOK) {
+		usb_log_error("Bulk out write failed: %s\n", str_error(rc));
+		return EIO;
+	}
 
 	MASTLOG("Transferring data.\n");
-	if (ddir == USB_DIRECTION_IN) {
+	if (cmd->data_in) {
+		size_t act_size;
 		/* Recieve data from the device. */
-		rc = usb_pipe_read(bulk_in_pipe, dbuf, dbuf_size, &act_size);
+		rc = usb_pipe_read(dpipe, cmd->data_in, cmd->data_in_size,
+		    &act_size);
 		MASTLOG("Received %zu bytes (%s): %s.\n", act_size,
-		    usb_debug_str_buffer((uint8_t *) dbuf, act_size, 0),
+		    usb_debug_str_buffer(cmd->data_in, act_size, 0),
 		    str_error(rc));
-	} else {
+	}
+	if (cmd->data_out) {
 		/* Send data to the device. */
-		rc = usb_pipe_write(bulk_out_pipe, dbuf, dbuf_size);
-		MASTLOG("Sent %zu bytes (%s): %s.\n", act_size,
-		    usb_debug_str_buffer((uint8_t *) dbuf, act_size, 0),
+		rc = usb_pipe_write(dpipe, cmd->data_out, cmd->data_out_size);
+		MASTLOG("Sent %zu bytes (%s): %s.\n", cmd->data_out_size,
+		    usb_debug_str_buffer(cmd->data_out, cmd->data_out_size, 0),
 		    str_error(rc));
 	}
@@ -116,12 +113,8 @@
 	if (rc == ESTALL) {
 		/* Clear stall condition and continue below to read CSW. */
-		if (ddir == USB_DIRECTION_IN) {
-			usb_pipe_clear_halt(&mfun->mdev->usb_dev->ctrl_pipe,
-			    &mfun->mdev->usb_dev->pipes[BULK_IN_EP].pipe);
-		} else {
-			usb_pipe_clear_halt(&mfun->mdev->usb_dev->ctrl_pipe,
-			    &mfun->mdev->usb_dev->pipes[BULK_OUT_EP].pipe);
-		}
+		usb_pipe_clear_halt(
+		    usb_device_get_default_pipe(mfun->mdev->usb_dev), dpipe);
         } else if (rc != EOK) {
+		usb_log_error("Failed to transfer data: %s", str_error(rc));
 		return EIO;
 	}
@@ -136,15 +129,16 @@
 	    str_error(rc));
 	if (rc != EOK) {
-		MASTLOG("rc != EOK\n");
+		usb_log_error("Failed to read CSW: %s", str_error(rc));
 		return EIO;
 	}
 
 	if (csw_size != sizeof(csw)) {
-		MASTLOG("csw_size != sizeof(csw)\n");
+		usb_log_error("Received CSW of incorrect size.");
 		return EIO;
 	}
 
 	if (csw.dCSWTag != tag) {
-		MASTLOG("csw.dCSWTag != tag\n");
+		usb_log_error("Received CSW with incorrect tag. (expected: %"
+		    PRIX32" received: %"PRIx32, tag, csw.dCSWTag);
 		return EIO;
 	}
@@ -158,19 +152,21 @@
 		break;
 	case cbs_failed:
-		MASTLOG("Command failed\n");
 		cmd->status = CMDS_FAILED;
+		usb_log_error("CBS Failed.\n");
 		break;
 	case cbs_phase_error:
-		MASTLOG("Phase error\n");
-		retval = EIO;
+		usb_log_error("CBS phase error.\n");
+		rc = EIO;
 		break;
 	default:
-		retval = EIO;
-		break;
-	}
-
-	size_t residue = (size_t) uint32_usb2host(csw.dCSWDataResidue);
+		usb_log_error("CBS other error.\n");
+		rc = EIO;
+		break;
+	}
+
+	const size_t residue = uint32_usb2host(csw.dCSWDataResidue);
 	if (residue > dbuf_size) {
-		MASTLOG("residue > dbuf_size\n");
+		usb_log_error("Residue > buffer size (%zu > %zu).\n",
+		    residue, dbuf_size);
 		return EIO;
 	}
@@ -184,8 +180,8 @@
 	 */
 
-	if (ddir == USB_DIRECTION_IN)
+	if (cmd->data_in)
 		cmd->rcvd_size = dbuf_size - residue;
 
-	return retval;
+	return rc;
 }
 
@@ -197,7 +193,8 @@
 int usb_massstor_reset(usbmast_dev_t *mdev)
 {
-	return usb_control_request_set(&mdev->usb_dev->ctrl_pipe,
+	return usb_control_request_set(
+	    usb_device_get_default_pipe(mdev->usb_dev),
 	    USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
-	    0xFF, 0, mdev->usb_dev->interface_no, NULL, 0);
+	    0xFF, 0, usb_device_get_iface_number(mdev->usb_dev), NULL, 0);
 }
 
@@ -215,8 +212,8 @@
 	 */
 	usb_massstor_reset(mdev);
-	usb_pipe_clear_halt(&mdev->usb_dev->ctrl_pipe,
-	    &mdev->usb_dev->pipes[BULK_IN_EP].pipe);
-	usb_pipe_clear_halt(&mdev->usb_dev->ctrl_pipe,
-	    &mdev->usb_dev->pipes[BULK_OUT_EP].pipe);
+	usb_pipe_clear_halt(usb_device_get_default_pipe(mdev->usb_dev),
+	    mdev->bulk_in_pipe);
+	usb_pipe_clear_halt(usb_device_get_default_pipe(mdev->usb_dev),
+	    mdev->bulk_out_pipe);
 }
 
@@ -236,7 +233,9 @@
 	uint8_t max_lun;
 	size_t data_recv_len;
-	int rc = usb_control_request_get(&mdev->usb_dev->ctrl_pipe,
+	int rc = usb_control_request_get(
+	    usb_device_get_default_pipe(mdev->usb_dev),
 	    USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
-	    0xFE, 0, mdev->usb_dev->interface_no, &max_lun, 1, &data_recv_len);
+	    0xFE, 0, usb_device_get_iface_number(mdev->usb_dev), &max_lun, 1,
+	    &data_recv_len);
 	if (rc != EOK) {
 		return rc;
Index: uspace/drv/bus/usb/usbmast/bo_trans.h
===================================================================
--- uspace/drv/bus/usb/usbmast/bo_trans.h	(revision f97f5cc2b91f2a3565f7b96b67bd28a8cb42c06a)
+++ uspace/drv/bus/usb/usbmast/bo_trans.h	(revision f76d2c2c443491a18c91f9d5b7760dd39b90f5ed)
@@ -44,7 +44,4 @@
 #include "usbmast.h"
 
-#define BULK_IN_EP 0
-#define BULK_OUT_EP 1
-
 typedef enum cmd_status {
 	CMDS_GOOD,
@@ -63,5 +60,5 @@
 
 	/** Command Descriptor Block */
-	void *cdb;
+	const void *cdb;
 	/** CDB size in bytes */
 	size_t cdb_size;
Index: uspace/drv/bus/usb/usbmast/main.c
===================================================================
--- uspace/drv/bus/usb/usbmast/main.c	(revision f97f5cc2b91f2a3565f7b96b67bd28a8cb42c06a)
+++ uspace/drv/bus/usb/usbmast/main.c	(revision f76d2c2c443491a18c91f9d5b7760dd39b90f5ed)
@@ -44,4 +44,5 @@
 #include <usb/classes/massstor.h>
 #include <errno.h>
+#include <io/logctl.h>
 #include <str_error.h>
 #include "cmdw.h"
@@ -51,7 +52,4 @@
 
 #define NAME "usbmast"
-
-#define GET_BULK_IN(dev) ((dev)->pipes[BULK_IN_EP].pipe)
-#define GET_BULK_OUT(dev) ((dev)->pipes[BULK_OUT_EP].pipe)
 
 static const usb_endpoint_description_t bulk_in_ep = {
@@ -112,5 +110,5 @@
 static int usbmast_device_gone(usb_device_t *dev)
 {
-	usbmast_dev_t *mdev = dev->driver_data;
+	usbmast_dev_t *mdev = usb_device_data_get(dev);
 	assert(mdev);
 
@@ -152,4 +150,13 @@
 	unsigned i;
 
+	usb_endpoint_mapping_t *epm_in =
+	    usb_device_get_mapped_ep_desc(dev, &bulk_in_ep);
+	usb_endpoint_mapping_t *epm_out =
+	    usb_device_get_mapped_ep_desc(dev, &bulk_out_ep);
+	if (!epm_in || !epm_out || !epm_in->present || !epm_out->present) {
+		usb_log_error("Required EPs were not mapped.\n");
+		return ENOENT;
+	}
+
 	/* Allocate softstate */
 	mdev = usb_device_data_alloc(dev, sizeof(usbmast_dev_t));
@@ -159,14 +166,12 @@
 	}
 
-	mdev->ddf_dev = dev->ddf_dev;
 	mdev->usb_dev = dev;
 
-	usb_log_info("Initializing mass storage `%s'.\n", ddf_dev_get_name(dev->ddf_dev));
+	usb_log_info("Initializing mass storage `%s'.\n",
+	    usb_device_get_name(dev));
 	usb_log_debug("Bulk in endpoint: %d [%zuB].\n",
-	    dev->pipes[BULK_IN_EP].pipe.endpoint_no,
-	    dev->pipes[BULK_IN_EP].pipe.max_packet_size);
+	    epm_in->pipe.endpoint_no, epm_in->pipe.max_packet_size);
 	usb_log_debug("Bulk out endpoint: %d [%zuB].\n",
-	    dev->pipes[BULK_OUT_EP].pipe.endpoint_no,
-	    dev->pipes[BULK_OUT_EP].pipe.max_packet_size);
+	    epm_out->pipe.endpoint_no, epm_out->pipe.max_packet_size);
 
 	usb_log_debug("Get LUN count...\n");
@@ -179,4 +184,6 @@
 	}
 
+	mdev->bulk_in_pipe = &epm_in->pipe;
+	mdev->bulk_out_pipe = &epm_out->pipe;
 	for (i = 0; i < mdev->lun_count; i++) {
 		rc = usbmast_fun_create(mdev, i);
@@ -223,5 +230,5 @@
 	}
 
-	fun = ddf_fun_create(mdev->ddf_dev, fun_exposed, fun_name);
+	fun = usb_device_ddf_fun_create(mdev->usb_dev, fun_exposed, fun_name);
 	if (fun == NULL) {
 		usb_log_error("Failed to create DDF function %s.\n", fun_name);
@@ -254,5 +261,5 @@
 	if (rc != EOK) {
 		usb_log_warning("Failed to inquire device `%s': %s.\n",
-		    ddf_dev_get_name(mdev->ddf_dev), str_error(rc));
+		    usb_device_get_name(mdev->usb_dev), str_error(rc));
 		rc = EIO;
 		goto error;
@@ -261,5 +268,5 @@
 	usb_log_info("Mass storage `%s' LUN %u: " \
 	    "%s by %s rev. %s is %s (%s).\n",
-	    ddf_dev_get_name(mdev->ddf_dev),
+	    usb_device_get_name(mdev->usb_dev),
 	    lun,
 	    inquiry.product,
@@ -274,5 +281,5 @@
 	if (rc != EOK) {
 		usb_log_warning("Failed to read capacity, device `%s': %s.\n",
-		    ddf_dev_get_name(mdev->ddf_dev), str_error(rc));
+		    usb_device_get_name(mdev->usb_dev), str_error(rc));
 		rc = EIO;
 		goto error;
@@ -396,5 +403,5 @@
 {
 	log_init(NAME);
-
+	logctl_set_log_level(NAME, LVL_NOTE);
 	return usb_driver_main(&usbmast_driver);
 }
Index: uspace/drv/bus/usb/usbmast/scsi_ms.c
===================================================================
--- uspace/drv/bus/usb/usbmast/scsi_ms.c	(revision f97f5cc2b91f2a3565f7b96b67bd28a8cb42c06a)
+++ uspace/drv/bus/usb/usbmast/scsi_ms.c	(revision f76d2c2c443491a18c91f9d5b7760dd39b90f5ed)
@@ -63,7 +63,5 @@
 static void usbmast_dump_sense(scsi_sense_data_t *sense_buf)
 {
-	unsigned sense_key;
-
-	sense_key = sense_buf->flags_key & 0x0f;
+	const unsigned sense_key = sense_buf->flags_key & 0x0f;
 	printf("Got sense data. Sense key: 0x%x (%s), ASC 0x%02x, "
 	    "ASCQ 0x%02x.\n", sense_key,
@@ -73,4 +71,34 @@
 }
 
+static int usb_massstor_unit_ready(usbmast_fun_t *mfun)
+{
+	scsi_cmd_t cmd;
+	scsi_cdb_test_unit_ready_t cdb;
+	int rc;
+
+	memset(&cdb, 0, sizeof(cdb));
+	cdb.op_code = SCSI_CMD_TEST_UNIT_READY;
+
+	memset(&cmd, 0, sizeof(cmd));
+	cmd.cdb = &cdb;
+	cmd.cdb_size = sizeof(cdb);
+
+	rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd);
+
+        if (rc != EOK) {
+		usb_log_error("Test Unit Ready failed on device %s: %s.",
+		   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
+		return rc;
+	}
+	/* Ignore command error here. If there's something wrong
+	 * with the device the following commands will fail too.
+	 */
+	if (cmd.status != CMDS_GOOD)
+		usb_log_warning("Test Unit Ready command failed on device %s.",
+		   usb_device_get_name(mfun->mdev->usb_dev));
+
+	return EOK;
+}
+
 /** Run SCSI command.
  *
@@ -85,8 +113,15 @@
 
 	do {
+		rc = usb_massstor_unit_ready(mfun);
+		if (rc != EOK) {
+			usb_log_error("Inquiry transport failed, device %s: %s.\n",
+			   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
+			return rc;
+		}
+
 		rc = usb_massstor_cmd(mfun, 0xDEADBEEF, cmd);
 		if (rc != EOK) {
 			usb_log_error("Inquiry transport failed, device %s: %s.\n",
-			   ddf_dev_get_name(mfun->mdev->ddf_dev), str_error(rc));
+			   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
 			return rc;
 		}
@@ -96,5 +131,5 @@
 
 		usb_log_error("SCSI command failed, device %s.\n",
-		    ddf_dev_get_name(mfun->mdev->ddf_dev));
+		    usb_device_get_name(mfun->mdev->usb_dev));
 
 		rc = usbmast_request_sense(mfun, &sense_buf, sizeof(sense_buf));
@@ -147,5 +182,5 @@
 	if (rc != EOK) {
 		usb_log_error("Inquiry transport failed, device %s: %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev), str_error(rc));
+		   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
 		return rc;
 	}
@@ -153,5 +188,5 @@
 	if (cmd.status != CMDS_GOOD) {
 		usb_log_error("Inquiry command failed, device %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev));
+		   usb_device_get_name(mfun->mdev->usb_dev));
 		return EIO;
 	}
@@ -215,5 +250,5 @@
         if (rc != EOK || cmd.status != CMDS_GOOD) {
 		usb_log_error("Request Sense failed, device %s: %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev), str_error(rc));
+		   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
 		return rc;
 	}
@@ -257,5 +292,5 @@
         if (rc != EOK) {
 		usb_log_error("Read Capacity (10) transport failed, device %s: %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev), str_error(rc));
+		   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
 		return rc;
 	}
@@ -263,5 +298,5 @@
 	if (cmd.status != CMDS_GOOD) {
 		usb_log_error("Read Capacity (10) command failed, device %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev));
+		   usb_device_get_name(mfun->mdev->usb_dev));
 		return EIO;
 	}
@@ -314,5 +349,5 @@
         if (rc != EOK) {
 		usb_log_error("Read (10) transport failed, device %s: %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev), str_error(rc));
+		   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
 		return rc;
 	}
@@ -320,5 +355,5 @@
 	if (cmd.status != CMDS_GOOD) {
 		usb_log_error("Read (10) command failed, device %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev));
+		   usb_device_get_name(mfun->mdev->usb_dev));
 		return EIO;
 	}
@@ -370,5 +405,5 @@
         if (rc != EOK) {
 		usb_log_error("Write (10) transport failed, device %s: %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev), str_error(rc));
+		   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
 		return rc;
 	}
@@ -376,5 +411,5 @@
 	if (cmd.status != CMDS_GOOD) {
 		usb_log_error("Write (10) command failed, device %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev));
+		   usb_device_get_name(mfun->mdev->usb_dev));
 		return EIO;
 	}
@@ -394,8 +429,4 @@
 int usbmast_sync_cache(usbmast_fun_t *mfun, uint64_t ba, size_t nblocks)
 {
-	scsi_cmd_t cmd;
-	scsi_cdb_sync_cache_10_t cdb;
-	int rc;
-
 	if (ba > UINT32_MAX)
 		return ELIMIT;
@@ -404,18 +435,20 @@
 		return ELIMIT;
 
-	memset(&cdb, 0, sizeof(cdb));
-	cdb.op_code = SCSI_CMD_SYNC_CACHE_10;
-	cdb.lba = host2uint32_t_be(ba);
-	cdb.numlb = host2uint16_t_be(nblocks);
-
-	memset(&cmd, 0, sizeof(cmd));
-	cmd.cdb = &cdb;
-	cmd.cdb_size = sizeof(cdb);
-
-	rc = usbmast_run_cmd(mfun, &cmd);
+	const scsi_cdb_sync_cache_10_t cdb = {
+		.op_code = SCSI_CMD_SYNC_CACHE_10,
+		.lba = host2uint32_t_be(ba),
+		.numlb = host2uint16_t_be(nblocks),
+	};
+
+	scsi_cmd_t cmd = {
+		.cdb = &cdb,
+		.cdb_size = sizeof(cdb),
+	};
+
+	const int rc = usbmast_run_cmd(mfun, &cmd);
 
         if (rc != EOK) {
 		usb_log_error("Synchronize Cache (10) transport failed, device %s: %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev), str_error(rc));
+		   usb_device_get_name(mfun->mdev->usb_dev), str_error(rc));
 		return rc;
 	}
@@ -423,5 +456,5 @@
 	if (cmd.status != CMDS_GOOD) {
 		usb_log_error("Synchronize Cache (10) command failed, device %s.\n",
-		   ddf_dev_get_name(mfun->mdev->ddf_dev));
+		   usb_device_get_name(mfun->mdev->usb_dev));
 		return EIO;
 	}
Index: uspace/drv/bus/usb/usbmast/usbmast.h
===================================================================
--- uspace/drv/bus/usb/usbmast/usbmast.h	(revision f97f5cc2b91f2a3565f7b96b67bd28a8cb42c06a)
+++ uspace/drv/bus/usb/usbmast/usbmast.h	(revision f76d2c2c443491a18c91f9d5b7760dd39b90f5ed)
@@ -43,6 +43,4 @@
 /** Mass storage device. */
 typedef struct usbmast_dev {
-	/** DDF device */
-	ddf_dev_t *ddf_dev;
 	/** USB device */
 	usb_device_t *usb_dev;
@@ -51,4 +49,8 @@
 	/** LUN functions */
 	ddf_fun_t **luns;
+	/** Data read pipe */
+	usb_pipe_t *bulk_in_pipe;
+	/** Data write pipe */
+	usb_pipe_t *bulk_out_pipe;
 } usbmast_dev_t;
 
