Index: uspace/drv/bus/usb/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -197,7 +197,8 @@
 	const int ret = ddf_fun_unbind(fun);
 	if (ret != EOK) {
-		usb_log_error("ailed to unbind generic hid fun.\n");
+		usb_log_error("Failed to unbind generic hid fun.\n");
 		return;
 	}
+	usb_log_debug2("%s unbound.\n", fun->name);
 	ddf_fun_destroy(fun);
 }
Index: uspace/drv/bus/usb/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -502,5 +502,5 @@
 
 	if (kbd_dev == NULL) {
-		usb_log_fatal("No memory!\n");
+		usb_log_error("No memory!\n");
 		return NULL;
 	}
@@ -624,5 +624,5 @@
 
 	if (kbd_dev->keys == NULL) {
-		usb_log_fatal("No memory!\n");
+		usb_log_error("No memory!\n");
 		free(kbd_dev);
 		return ENOMEM;
@@ -633,5 +633,5 @@
 
 	if (kbd_dev->keys_old == NULL) {
-		usb_log_fatal("No memory!\n");
+		usb_log_error("No memory!\n");
 		free(kbd_dev->keys);
 		free(kbd_dev);
@@ -797,4 +797,5 @@
 		usb_log_warning("Failed to unbind kbd function.\n");
 	} else {
+		usb_log_debug2("%s unbound.\n", kbd_dev->fun->name);
 		kbd_dev->fun->driver_data = NULL;
 		ddf_fun_destroy(kbd_dev->fun);
@@ -811,8 +812,9 @@
 
 	if (data != NULL) {
-		usb_kbd_t *kbd_dev = (usb_kbd_t *)data;
+		usb_kbd_t *kbd_dev = data;
 		if (usb_kbd_is_initialized(kbd_dev)) {
 			usb_kbd_mark_unusable(kbd_dev);
-		} else {
+			/* wait for autorepeat */
+			async_usleep(CHECK_DELAY);
 			usb_kbd_destroy(kbd_dev);
 		}
Index: uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.c
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.c	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.c	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -46,6 +46,4 @@
 
 
-/** Delay between auto-repeat state checks when no key is being repeated. */
-static unsigned int CHECK_DELAY = 10000;
 
 /*----------------------------------------------------------------------------*/
@@ -79,7 +77,5 @@
 		// check if the kbd structure is usable
 		if (!usb_kbd_is_initialized(kbd)) {
-			if (usb_kbd_is_ready_to_destroy(kbd)) {
-				usb_kbd_destroy(kbd);
-			}
+			usb_log_warning("kbd not ready, exiting autorepeat.\n");
 			return;
 		}
Index: uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.h
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.h	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.h	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -37,4 +37,7 @@
 #define USB_HID_KBDREPEAT_H_
 
+/** Delay between auto-repeat state checks when no key is being repeated. */
+#define CHECK_DELAY 10000
+
 struct usb_kbd_t;
 
Index: uspace/drv/bus/usb/usbhid/main.c
===================================================================
--- uspace/drv/bus/usb/usbhid/main.c	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/main.c	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -206,4 +206,5 @@
 	assert(!hid_dev->running);
 	usb_hid_destroy(hid_dev);
+	usb_log_debug2("%s destruction complete.\n", dev->ddf_dev->name);
 	return EOK;
 }
Index: uspace/drv/bus/usb/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -249,4 +249,5 @@
 			usb_log_error("Failed to unbind multim function.\n");
 		} else {
+			usb_log_debug2("%s unbound.\n", multim_dev->fun->name);
 			ddf_fun_destroy(multim_dev->fun);
 		}
Index: uspace/drv/bus/usb/usbhid/usbhid.c
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.c	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/usbhid.c	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -418,5 +418,5 @@
 
 	if (hid_dev == NULL) {
-		usb_log_fatal("No memory!\n");
+		usb_log_error("No memory!\n");
 		return NULL;
 	}
@@ -425,5 +425,5 @@
 	    usb_hid_report_t)));
 	if (hid_dev->report == NULL) {
-		usb_log_fatal("No memory!\n");
+		usb_log_error("No memory!\n");
 		free(hid_dev);
 		return NULL;
@@ -631,5 +631,4 @@
 
 	hid_dev->running = false;
-//	usb_hid_destroy(hid_dev);
 }
 
Index: uspace/drv/bus/usb/usbhid/usbhid.h
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.h	(revision bd444e5851af036872590141ad204427819209b3)
+++ uspace/drv/bus/usb/usbhid/usbhid.h	(revision 2a5b62b53750c7ae2c795af4b93bb10c1bafe435)
@@ -129,5 +129,5 @@
 
 	int report_nr;
-	bool running;
+	volatile bool running;
 };
 
