Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision 00b13408d3ace1e62546388ce4d47d0bea4aedd6)
+++ uspace/drv/usbhub/usbhub.c	(revision 3746bfe076028ab83d67672fae39f9de54cbc2e7)
@@ -405,7 +405,11 @@
 	//if this hub already uses default address, it cannot request it once more
 	if(hub->is_default_address_used) return;
+	int opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
+				port, USB_HUB_FEATURE_C_PORT_CONNECTION);
+	if(opResult != EOK){
+		usb_log_warning("could not clear port-change-connection flag");
+	}
 
 	usb_device_request_setup_packet_t request;
-	int opResult;
 	usb_log_info("some connection changed");
 	assert(hub->endpoints.control.hc_phone);
@@ -431,4 +435,5 @@
 		usb_hub_release_default_address(hub);
 	}
+	return;
 }
 
@@ -531,5 +536,10 @@
 static void usb_hub_removed_device(
     usb_hub_info_t * hub,uint16_t port) {
-		
+
+	int opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
+				port, USB_HUB_FEATURE_C_PORT_CONNECTION);
+	if(opResult != EOK){
+		usb_log_warning("could not clear port-change-connection flag");
+	}
 	/** \TODO remove device from device manager - not yet implemented in
 	 * devide manager
@@ -611,7 +621,4 @@
 	//something connected/disconnected
 	if (usb_port_connect_change(&status)) {
-		opResult = usb_hub_clear_port_feature(pipe,
-		    port, USB_HUB_FEATURE_C_PORT_CONNECTION);
-		// TODO: check opResult
 		if (usb_port_dev_connected(&status)) {
 			usb_log_info("some connection changed");
Index: uspace/drv/usbmouse/init.c
===================================================================
--- uspace/drv/usbmouse/init.c	(revision 00b13408d3ace1e62546388ce4d47d0bea4aedd6)
+++ uspace/drv/usbmouse/init.c	(revision 3746bfe076028ab83d67672fae39f9de54cbc2e7)
@@ -124,4 +124,23 @@
 		goto leave;
 	}
+	
+	/* Open the control pipe. */
+	rc = usb_endpoint_pipe_start_session(&dev->ctrl_pipe);
+	if (rc != EOK) {
+		goto leave;
+	}
+	
+	/* Set the boot protocol. */
+	rc = usb_control_request_set(&dev->ctrl_pipe,
+	    USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
+	    USB_HIDREQ_SET_PROTOCOL, USB_HID_PROTOCOL_BOOT, dev->interface_no,
+	    NULL, 0);
+	if (rc != EOK) {
+		goto leave;
+	}
+	
+	/* Close the control pipe (ignore errors). */
+	usb_endpoint_pipe_end_session(&dev->ctrl_pipe);
+
 
 	/* Everything allright. */
Index: uspace/lib/usb/include/usb/devdrv.h
===================================================================
--- uspace/lib/usb/include/usb/devdrv.h	(revision 00b13408d3ace1e62546388ce4d47d0bea4aedd6)
+++ uspace/lib/usb/include/usb/devdrv.h	(revision 3746bfe076028ab83d67672fae39f9de54cbc2e7)
@@ -47,4 +47,9 @@
 	 */
 	usb_endpoint_mapping_t *pipes;
+	/** Current interface.
+	 * Usually, drivers operate on single interface only.
+	 * This item contains the value of the interface or -1 for any.
+	 */
+	int interface_no;
 	/** Generic DDF device backing this one. */
 	ddf_dev_t *ddf_dev;
Index: uspace/lib/usb/src/devdrv.c
===================================================================
--- uspace/lib/usb/src/devdrv.c	(revision 00b13408d3ace1e62546388ce4d47d0bea4aedd6)
+++ uspace/lib/usb/src/devdrv.c	(revision 3746bfe076028ab83d67672fae39f9de54cbc2e7)
@@ -109,5 +109,5 @@
 {
 	int rc;
-	int my_interface = usb_device_get_assigned_interface(dev->ddf_dev);
+	dev->interface_no = usb_device_get_assigned_interface(dev->ddf_dev);
 
 	size_t pipe_count = count_other_pipes(drv);
@@ -134,5 +134,5 @@
 
 		dev->pipes[i].description = drv->endpoints[i];
-		dev->pipes[i].interface_no = my_interface;
+		dev->pipes[i].interface_no = dev->interface_no;
 	}
 
