Index: uspace/lib/drv/generic/remote_usbhc.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhc.c	(revision 6b1931b2a97dab616738c3b57767198156059bad)
+++ uspace/lib/drv/generic/remote_usbhc.c	(revision 3937bda2a1beb458c852ac38c43e928cf9647e3e)
@@ -540,4 +540,5 @@
 		.endpoint = DEV_IPC_GET_ARG2(*call)
 	};
+	size_t data_buffer_len = DEV_IPC_GET_ARG3(*call);
 
 	int rc;
@@ -546,5 +547,4 @@
 	void *data_buffer = NULL;
 	size_t setup_packet_len = 0;
-	size_t data_buffer_len = 0;
 
 	rc = async_data_write_accept(&setup_packet, false,
@@ -554,10 +554,13 @@
 		return;
 	}
-	rc = async_data_write_accept(&data_buffer, false,
-	    1, USB_MAX_PAYLOAD_SIZE, 0, &data_buffer_len);
-	if (rc != EOK) {
-		async_answer_0(callid, rc);
-		free(setup_packet);
-		return;
+
+	if (data_buffer_len > 0) {
+		rc = async_data_write_accept(&data_buffer, false,
+		    1, USB_MAX_PAYLOAD_SIZE, 0, &data_buffer_len);
+		if (rc != EOK) {
+			async_answer_0(callid, rc);
+			free(setup_packet);
+			return;
+		}
 	}
 
@@ -596,5 +599,4 @@
 	}
 
-	size_t data_len = DEV_IPC_GET_ARG3(*call);
 	usb_target_t target = {
 		.address = DEV_IPC_GET_ARG1(*call),
@@ -606,4 +608,5 @@
 	void *setup_packet = NULL;
 	size_t setup_packet_len = 0;
+	size_t data_len = 0;
 
 	rc = async_data_write_accept(&setup_packet, false,
Index: uspace/lib/usb/src/usbdrv.c
===================================================================
--- uspace/lib/usb/src/usbdrv.c	(revision 6b1931b2a97dab616738c3b57767198156059bad)
+++ uspace/lib/usb/src/usbdrv.c	(revision 3937bda2a1beb458c852ac38c43e928cf9647e3e)
@@ -464,6 +464,6 @@
 	assert(setup_packet != NULL);
 	assert(setup_packet_size > 0);
-	assert(buffer != NULL);
-	assert(buffer_size > 0);
+	assert(((buffer != NULL) && (buffer_size > 0))
+	    || ((buffer == NULL) && (buffer_size == 0)));
 	assert(handle != NULL);
 
@@ -494,8 +494,10 @@
 	}
 
-	rc = async_data_write_start(phone, buffer, buffer_size);
-	if (rc != EOK) {
-		async_wait_for(transfer->request, NULL);
-		return rc;
+	if (buffer_size > 0) {
+		rc = async_data_write_start(phone, buffer, buffer_size);
+		if (rc != EOK) {
+			async_wait_for(transfer->request, NULL);
+			return rc;
+		}
 	}
 
