--- a/drivers/head/stub_dev.c
+++ b/drivers/head/stub_dev.c
@@ -398,7 +398,11 @@ static int stub_probe(struct usb_interfa
 {
 	struct usb_device *udev = interface_to_usbdev(interface);
 	struct stub_device *sdev = NULL;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
 	char *udev_busid = interface->dev.parent->bus_id;
+#else
+	char *udev_busid = dev_name(interface->dev.parent);
+#endif
 	int err = 0;
 
 	udbg("Enter\n");
--- a/drivers/head/stub_main.c
+++ b/drivers/head/stub_main.c
@@ -252,18 +252,17 @@ static int __init usb_stub_init(void)
 		return -ENOMEM;
 	}
 
+	info(DRIVER_DESC "" DRIVER_VERSION);
+
+	memset(busid_table, 0, sizeof(busid_table));
+	spin_lock_init(&busid_table_lock);
+
 	ret = usb_register(&stub_driver);
 	if (ret) {
 		uerr("usb_register failed %d\n", ret);
 		return ret;
 	}
 
-
-	info(DRIVER_DESC "" DRIVER_VERSION);
-
-	memset(busid_table, 0, sizeof(busid_table));
-	spin_lock_init(&busid_table_lock);
-
 	ret = driver_create_file(&stub_driver.drvwrap.driver, &driver_attr_match_busid);
 
 	if (ret) {
--- a/drivers/head/stub_rx.c
+++ b/drivers/head/stub_rx.c
@@ -159,7 +159,11 @@ static int tweak_set_configuration_cmd(s
 	 * A user may need to set a special configuration value before
 	 * exporting the device.
 	 */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
 	uinfo("set_configuration (%d) to %s\n", config, urb->dev->dev.bus_id);
+#else
+	uinfo("set_configuration (%d) to %s\n", config, dev_name(&urb->dev->dev));
+#endif
 	uinfo("but, skip!\n");
 
 	return 0;
@@ -177,7 +181,11 @@ static int tweak_reset_device_cmd(struct
 	value = le16_to_cpu(req->wValue);
 	index = le16_to_cpu(req->wIndex);
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
 	uinfo("reset_device (port %d) to %s\n", index, urb->dev->dev.bus_id);
+#else
+	uinfo("reset_device (port %d) to %s\n", index, dev_name(&urb->dev->dev));
+#endif
 
 	/* all interfaces should be owned by usbip driver, so just reset it. */
 	ret = usb_lock_device_for_reset(urb->dev, NULL);
@@ -187,7 +195,11 @@ static int tweak_reset_device_cmd(struct
 	}
 
 	/* try to reset the device */
-	ret = usb_reset_composite_device(urb->dev, NULL);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+    ret = usb_reset_composite_device(urb->dev, NULL);
+#else
+	ret = usb_reset_device(urb->dev);
+#endif
 	if (ret < 0)
 		uerr("device reset\n");
 
--- a/drivers/head/usbip_common.c
+++ b/drivers/head/usbip_common.c
@@ -55,10 +55,7 @@ static ssize_t show_flag(struct device *
 static ssize_t store_flag(struct device *dev, struct device_attribute *attr,
 		const char *buf, size_t count)
 {
-	unsigned long flag;
-
-	sscanf(buf, "%lx", &flag);
-	usbip_debug_flag = flag;
+	sscanf(buf, "%lx", &usbip_debug_flag);
 
 	return count;
 }
@@ -390,7 +387,7 @@ int usbip_thread(void *param)
 	unlock_kernel();
 
 	/* srv.rb must wait for rx_thread starting */
-	complete(&ut->thread_done);
+	complete(&ut->thread_started);
 
 	/* start of while loop */
 	ut->loop_ops(ut);
@@ -403,15 +400,21 @@ int usbip_thread(void *param)
 
 void usbip_start_threads(struct usbip_device *ud)
 {
+
 	/*
 	 * threads are invoked per one device (per one connection).
 	 */
+    INIT_COMPLETION(ud->tcp_rx.thread_started);
+    INIT_COMPLETION(ud->tcp_tx.thread_started);
+    INIT_COMPLETION(ud->tcp_rx.thread_done);
+    INIT_COMPLETION(ud->tcp_tx.thread_done);
+
 	kernel_thread((int(*)(void *))usbip_thread, (void *)&ud->tcp_rx, 0);
 	kernel_thread((int(*)(void *))usbip_thread, (void *)&ud->tcp_tx, 0);
 
 	/* confirm threads are starting */
-	wait_for_completion(&ud->tcp_rx.thread_done);
-	wait_for_completion(&ud->tcp_tx.thread_done);
+	wait_for_completion(&ud->tcp_rx.thread_started);
+	wait_for_completion(&ud->tcp_tx.thread_started);
 }
 EXPORT_SYMBOL(usbip_start_threads);
 
@@ -436,6 +439,7 @@ void usbip_task_init(struct usbip_task *
 		void (*loop_ops)(struct usbip_task *))
 {
 	ut->thread = NULL;
+	init_completion(&ut->thread_started);
 	init_completion(&ut->thread_done);
 	ut->name = name;
 	ut->loop_ops = loop_ops;
--- a/drivers/head/usbip_event.c
+++ b/drivers/head/usbip_event.c
@@ -38,7 +38,7 @@ void usbip_start_eh(struct usbip_device
 
 	kernel_thread((int(*)(void *)) usbip_thread, (void *) eh, 0);
 
-	wait_for_completion(&eh->thread_done);
+	wait_for_completion(&eh->thread_started);
 }
 EXPORT_SYMBOL(usbip_start_eh);
 
--- a/drivers/head/vhci_hcd.c
+++ b/drivers/head/vhci_hcd.c
@@ -58,7 +58,7 @@ static void vhci_stop(struct usb_hcd *hc
 static int vhci_get_frame_number(struct usb_hcd *hcd);
 
 static const char driver_name[] = "vhci_hcd";
-static const char driver_desc[] = "USB/IP Virtual Host Contoroller";
+static const char driver_desc[] = "USB/IP Virtual Host Controller";
 
 
 
@@ -416,14 +416,6 @@ static int vhci_hub_control(struct usb_h
 				case USB_PORT_FEAT_SUSPEND:
 					dbg_vhci_rh(" SetPortFeature: USB_PORT_FEAT_SUSPEND\n");
 					uerr(" not yet\n");
-#if 0
-					dum->port_status[rhport] |= (1 << USB_PORT_FEAT_SUSPEND);
-					if (dum->driver->suspend) {
-						spin_unlock (&dum->lock);
-						dum->driver->suspend (&dum->gadget);
-						spin_lock (&dum->lock);
-					}
-#endif
 					break;
 				case USB_PORT_FEAT_RESET:
 					dbg_vhci_rh(" SetPortFeature: USB_PORT_FEAT_RESET\n");
@@ -432,12 +424,6 @@ static int vhci_hub_control(struct usb_h
 						dum->port_status[rhport] &= ~(USB_PORT_STAT_ENABLE
 								| USB_PORT_STAT_LOW_SPEED
 								| USB_PORT_STAT_HIGH_SPEED);
-#if 0
-						if (dum->driver) {
-							dev_dbg (hardware, "disconnect\n");
-							stop_activity (dum, dum->driver);
-						}
-#endif
 
 						/* FIXME test that code path! */
 					}
@@ -1060,7 +1046,7 @@ static int vhci_hcd_probe(struct platfor
 	struct usb_hcd		*hcd;
 	int			ret;
 
-	uinfo("proving...\n");
+	uinfo("probing...\n");
 
 	dbg_vhci_hc("name %s id %d\n", pdev->name, pdev->id);
 
@@ -1076,7 +1062,11 @@ static int vhci_hcd_probe(struct platfor
 	 * Allocate and initialize hcd.
 	 * Our private data is also allocated automatically.
 	 */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
 	hcd = usb_create_hcd(&vhci_hc_driver, &pdev->dev, pdev->dev.bus_id);
+#else
+	hcd = usb_create_hcd(&vhci_hc_driver, &pdev->dev, dev_name(&pdev->dev));
+#endif
 	if (!hcd) {
 		uerr("create hcd failed\n");
 		return -ENOMEM;
--- a/drivers/head/vhci_sysfs.c
+++ b/drivers/head/vhci_sysfs.c
@@ -123,7 +123,11 @@ static ssize_t show_status(struct device
 			out += sprintf(out, "%03u %08x ",
 					vdev->speed, vdev->devid);
 			out += sprintf(out, "%16p ", vdev->ud.tcp_socket);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
 			out += sprintf(out, "%s", vdev->udev->dev.bus_id);
+#else
+			out += sprintf(out, "%s", dev_name(&vdev->udev->dev));
+#endif
 
 		} else
 			out += sprintf(out, "000 000 000 0000000000000000 0-0");
--- a/drivers/head/usbip_common.h
+++ b/drivers/head/usbip_common.h
@@ -300,6 +300,7 @@ struct usbip_device;
 
 struct usbip_task {
 	struct task_struct *thread;
+	struct completion thread_started;
 	struct completion thread_done;
 	char *name;
 	void (*loop_ops)(struct usbip_task *);