Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision 31bc40eda35b03ffcc18c812bb5db7b4ad313e3b)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision df8f3fa39d5ad84bba1218333a405b8109775286)
@@ -41,5 +41,4 @@
 #include <usb/host/batch.h>
 #include <usbhc_iface.h>
-//#include <driver.h>
 
 typedef struct hcd hcd_t;
@@ -54,5 +53,5 @@
 	void (*batch_private_dtor)(void *);
 };
-
+/*----------------------------------------------------------------------------*/
 static inline int hcd_init(hcd_t *hcd, size_t bandwidth)
 {
@@ -61,5 +60,13 @@
 	return usb_endpoint_manager_init(&hcd->ep_manager, bandwidth);
 }
-
+/*----------------------------------------------------------------------------*/
+static inline void reset_ep_if_need(
+    hcd_t *hcd, usb_target_t target, const char* setup_data)
+{
+	assert(hcd);
+	usb_endpoint_manager_reset_if_need(
+	    &hcd->ep_manager, target, (const uint8_t *)setup_data);
+}
+/*----------------------------------------------------------------------------*/
 static inline hcd_t * fun_to_hcd(ddf_fun_t *fun)
 {
@@ -67,5 +74,5 @@
 	return fun->driver_data;
 }
-
+/*----------------------------------------------------------------------------*/
 extern usbhc_iface_t hcd_iface;
 
Index: uspace/lib/usbhost/src/batch.c
===================================================================
--- uspace/lib/usbhost/src/batch.c	(revision 31bc40eda35b03ffcc18c812bb5db7b4ad313e3b)
+++ uspace/lib/usbhost/src/batch.c	(revision df8f3fa39d5ad84bba1218333a405b8109775286)
@@ -38,4 +38,5 @@
 #include <usb/debug.h>
 #include <usb/host/batch.h>
+#include <usb/host/hcd.h>
 
 void usb_transfer_batch_call_in(usb_transfer_batch_t *instance);
@@ -150,4 +151,12 @@
 	    str_error(instance->error));
 
+	if (instance->ep->transfer_type == USB_TRANSFER_CONTROL
+	    && instance->error == EOK) {
+		usb_target_t target =
+		    {instance->ep->address, instance->ep->endpoint};
+		reset_ep_if_need(
+		    fun_to_hcd(instance->fun), target, instance->setup_buffer);
+	}
+
 	instance->callback_out(instance->fun,
 	    instance->error, instance->arg);
Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision 31bc40eda35b03ffcc18c812bb5db7b4ad313e3b)
+++ uspace/lib/usbhost/src/iface.c	(revision df8f3fa39d5ad84bba1218333a405b8109775286)
@@ -117,5 +117,5 @@
 	assert(address);
 
-	usb_log_debug("Address request with speed %d.\n", speed);
+	usb_log_debug("Address request speed: %s.\n", usb_str_speed(speed));
 	*address = device_keeper_get_free_address(&hcd->dev_manager, speed);
 	usb_log_debug("Address request with result: %d.\n", *address);
@@ -191,4 +191,5 @@
 	    usb_device_keeper_get_speed(&hcd->dev_manager, address);
 	if (speed >= USB_SPEED_MAX) {
+		// Does this happen?
 		speed = ep_speed;
 	}
@@ -306,5 +307,4 @@
 	return send_batch(fun, target, USB_DIRECTION_BOTH, data, size,
 	    setup_data, setup_size, NULL, callback, arg, "Control WRITE");
-//	usb_endpoint_manager_reset_if_need(&hc->ep_manager, target, setup_data);
 }
 /*----------------------------------------------------------------------------*/
