Index: uspace/drv/uhci/Makefile
===================================================================
--- uspace/drv/uhci/Makefile	(revision 93fb170c39691e453743ec966fe97197a7ddbfd1)
+++ uspace/drv/uhci/Makefile	(revision 15be932b80c07608050bdd42292d949e79ae7761)
@@ -40,5 +40,6 @@
 	uhci.c \
 	utils/fibril_semaphore.c \
-	utils/hc_synchronizer.c
+	utils/hc_synchronizer.c \
+	utils/identify.c
 
 include $(USPACE_PREFIX)/Makefile.common
Index: uspace/drv/uhci/utils/hc_synchronizer.c
===================================================================
--- uspace/drv/uhci/utils/hc_synchronizer.c	(revision 93fb170c39691e453743ec966fe97197a7ddbfd1)
+++ uspace/drv/uhci/utils/hc_synchronizer.c	(revision 15be932b80c07608050bdd42292d949e79ae7761)
@@ -1,3 +1,5 @@
+#include "debug.h"
 #include "hc_synchronizer.h"
+#include "uhci.h"
 
 void sync_init(sync_value_t *value)
@@ -31,2 +33,28 @@
 	fibril_semaphore_up(&value->done);
 }
+/*----------------------------------------------------------------------------*/
+int uhci_setup_sync(
+  device_t *hc,
+  usb_target_t target,
+  usb_transfer_type_t type,
+  void *buffer, size_t size,
+  sync_value_t *result
+  )
+{
+	assert(result);
+	sync_init(result);
+
+	int ret =
+	  uhci_setup(hc, target, type, buffer, size,
+		  sync_out_callback, (void*)result);
+
+	if (ret) {
+		uhci_print_error("sync setup transaction failed(%d).\n", ret);
+		return ret;
+	}
+
+	uhci_print_verbose("setup transaction sent, waiting to complete.\n");
+	sync_wait_for(result);
+
+	return ret;
+}
Index: uspace/drv/uhci/utils/hc_synchronizer.h
===================================================================
--- uspace/drv/uhci/utils/hc_synchronizer.h	(revision 93fb170c39691e453743ec966fe97197a7ddbfd1)
+++ uspace/drv/uhci/utils/hc_synchronizer.h	(revision 15be932b80c07608050bdd42292d949e79ae7761)
@@ -59,4 +59,12 @@
 void sync_out_callback(
   device_t *device, usb_transaction_outcome_t result, void *value);
+
+int uhci_setup_sync(
+  device_t *hc,
+  usb_target_t target,
+  usb_transfer_type_t type,
+  void *buffer, size_t size,
+  sync_value_t *result
+  );
 #endif
 /**
Index: uspace/drv/uhci/utils/identify.c
===================================================================
--- uspace/drv/uhci/utils/identify.c	(revision 15be932b80c07608050bdd42292d949e79ae7761)
+++ uspace/drv/uhci/utils/identify.c	(revision 15be932b80c07608050bdd42292d949e79ae7761)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2010 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <usb/classes/classes.h>
+#include <usb/descriptor.h>
+#include <usb/usbdrv.h>
+
+#include "identify.h"
+
+struct device_descriptor_packet
+{
+	usb_device_request_setup_packet_t request;
+	usb_standard_device_descriptor_t descriptor;
+};
+#define DEVICE_DESCRIPTOR_PACKET_INITIALIZER \
+	{ \
+		.request = { \
+			.request_type = 0, \
+			.request = USB_DEVREQ_GET_DESCRIPTOR, \
+			{ .value = USB_DESCTYPE_DEVICE }, \
+			.index = 0, \
+			.length = sizeof(usb_standard_device_descriptor_t) \
+		} \
+	}
+/*----------------------------------------------------------------------------*/
+struct configuration_descriptor_packet
+{
+	usb_device_request_setup_packet_t request;
+	usb_standard_configuration_descriptor_t descriptor;
+};
+#define CONFIGURATION_DESCRIPTOR_PACKET_INITIALIZER \
+	{ \
+		.request = { \
+			.request_type = 0, \
+			.request = USB_DEVREQ_GET_DESCRIPTOR, \
+			{ .value = USB_DESCTYPE_CONFIGURATION }, \
+			.index = 0, \
+			.length = sizeof(usb_standard_device_descriptor_t); \
+		}; \
+	}
+/*----------------------------------------------------------------------------*/
+int identify_device(device_t *hc, device_t *child, usb_address_t address)
+{
+	struct device_descriptor_packet packet =
+	  DEVICE_DESCRIPTOR_PACKET_INITIALIZER;
+
+  packet.descriptor.device_class = USB_CLASS_HUB;
+  usb_drv_create_match_ids_from_device_descriptor(
+	  &child->match_ids, &packet.descriptor );
+
+	return 0;
+}
Index: uspace/drv/uhci/utils/identify.h
===================================================================
--- uspace/drv/uhci/utils/identify.h	(revision 15be932b80c07608050bdd42292d949e79ae7761)
+++ uspace/drv/uhci/utils/identify.h	(revision 15be932b80c07608050bdd42292d949e79ae7761)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2010 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/** @addtogroup usb
+ * @{
+ */
+/** @file
+ * @brief UHCI driver
+ */
+#ifndef DRV_UHCI_UTILS_IDENTIFY_H
+#define DRV_UHCI_UTILS_IDENTIFY_H
+
+#include <driver.h>
+#include <usb/usb.h>
+
+int identify_device(device_t *hc, device_t *child, usb_address_t address);
+
+#endif
+/**
+ * @}
+ */
