Index: uspace/drv/bus/usb/usbhid/main.c
===================================================================
--- uspace/drv/bus/usb/usbhid/main.c	(revision f2964e4523ea4081acddb6f42fcb7d6ebf764615)
+++ uspace/drv/bus/usb/usbhid/main.c	(revision 98604cc36ff3d82e72090720b0e4eb520678a96b)
@@ -95,5 +95,5 @@
 		usb_hid_destroy(hid_dev);
 		return rc;
-	}	
+	}
 
 	usb_log_debug("USB/HID device structure initialized.\n");
@@ -130,6 +130,8 @@
 		usb_log_error("Failed to start polling fibril for `%s'.\n",
 		    dev->ddf_dev->name);
+		usb_hid_destroy(hid_dev);
 		return rc;
 	}
+	dev->driver_data = hid_dev;
 
 	/*
@@ -182,12 +184,27 @@
 /*----------------------------------------------------------------------------*/
 
-/* Currently, the framework supports only device adding. Once the framework
- * supports unplug, more callbacks will be added. */
+/**
+ * Callback for removing a device from the driver.
+ *
+ * @param dev Structure representing the device.
+ *
+ * @retval EOK if successful. 
+ * @retval EREFUSED if the device is not supported.
+ */
+static int usb_hid_device_gone(usb_device_t *dev)
+{
+	usb_hid_dev_t *hid_dev = dev->driver_data;
+	usb_hid_destroy(hid_dev);
+	return EOK;
+}
+
+/** USB generic driver callbacks */
 static usb_driver_ops_t usb_hid_driver_ops = {
-        .device_add = usb_hid_device_add,
+	.device_add = usb_hid_device_add,
+	.device_gone = usb_hid_device_gone,
 };
 
 
-/* The driver itself. */
+/** The driver itself. */
 static usb_driver_t usb_hid_driver = {
         .name = NAME,
Index: uspace/drv/bus/usb/usbhid/usbhid.c
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.c	(revision f2964e4523ea4081acddb6f42fcb7d6ebf764615)
+++ uspace/drv/bus/usb/usbhid/usbhid.c	(revision 98604cc36ff3d82e72090720b0e4eb520678a96b)
@@ -630,5 +630,5 @@
 	}
 
-	usb_hid_destroy(hid_dev);
+//	usb_hid_destroy(hid_dev);
 }
 
