Index: uspace/app/usbinfo/dump.c
===================================================================
--- uspace/app/usbinfo/dump.c	(revision 60b2b69876e048ee4591828f3e0035e4cd50e3b9)
+++ uspace/app/usbinfo/dump.c	(revision 5f635ca5f17ad0cfb38319aa99fcff04ca83851a)
@@ -56,7 +56,37 @@
 #define BCD_ARGS(a) BCD_INT((a)), BCD_FRAC((a))
 
+static void dump_descriptor_by_type(size_t, uint8_t *, size_t);
+
+typedef struct {
+	int descriptor;
+	void (*dump)(size_t indent, uint8_t *descriptor, size_t length);
+} descriptor_dump_t;
+
+static void dump_descriptor_device(size_t, uint8_t *, size_t);
+static void dump_descriptor_configuration(size_t, uint8_t *, size_t);
+static void dump_descriptor_interface(size_t, uint8_t *, size_t);
+static void dump_descriptor_string(size_t, uint8_t *, size_t);
+static void dump_descriptor_endpoint(size_t, uint8_t *, size_t);
+static void dump_descriptor_hid(size_t, uint8_t *, size_t);
+static void dump_descriptor_hub(size_t, uint8_t *, size_t);
+static void dump_descriptor_generic(size_t, uint8_t *, size_t);
+
+static descriptor_dump_t descriptor_dumpers[] = {
+	{ USB_DESCTYPE_DEVICE, dump_descriptor_device },
+	{ USB_DESCTYPE_CONFIGURATION, dump_descriptor_configuration },
+	{ USB_DESCTYPE_STRING, dump_descriptor_string },
+	{ USB_DESCTYPE_INTERFACE, dump_descriptor_interface },
+	{ USB_DESCTYPE_ENDPOINT, dump_descriptor_endpoint },
+	{ USB_DESCTYPE_HID, dump_descriptor_hid },
+	{ USB_DESCTYPE_HUB, dump_descriptor_hub },
+	{ -1, dump_descriptor_generic },
+	{ -1, NULL }
+};
+
 void dump_buffer(const char *msg, const uint8_t *buffer, size_t length)
 {
-	printf("%s\n", msg);
+	if (msg != NULL) {
+		printf("%s\n", msg);
+	}
 
 	size_t i;
@@ -70,21 +100,34 @@
 }
 
-void dump_match_ids(match_id_list_t *matches)
-{
-	printf("Match ids:\n");
-	link_t *link;
-	for (link = matches->ids.next;
-	    link != &matches->ids;
-	    link = link->next) {
-		match_id_t *match = list_get_instance(link, match_id_t, link);
-
-		printf(INDENT "%d %s\n", match->score, match->id);
-	}
-}
-
-void dump_standard_device_descriptor(usb_standard_device_descriptor_t *d)
-{
-	printf("Standard device descriptor:\n");
-
+void dump_descriptor_by_type(size_t indent, uint8_t *d, size_t length)
+{
+	if (length < 2) {
+		return;
+	}
+	int type = d[1];
+	
+	descriptor_dump_t *dumper = descriptor_dumpers;
+	while (dumper->dump != NULL) {
+		if ((dumper->descriptor == type) || (dumper->descriptor < 0)) {
+			dumper->dump(indent, d, length);
+			return;
+		}
+		dumper++;
+	}			
+}
+
+void dump_usb_descriptor(uint8_t *descriptor, size_t size)
+{
+	dump_descriptor_by_type(0, descriptor, size);
+}
+
+void dump_descriptor_device(size_t indent, uint8_t *descr, size_t size)
+{
+	usb_standard_device_descriptor_t *d
+	    = (usb_standard_device_descriptor_t *) descr;
+	if (size != sizeof(*d)) {
+		return;
+	}
+	
 	printf(INDENT "bLength = %d\n", d->length);
 	printf(INDENT "bDescriptorType = 0x%02x\n", d->descriptor_type);
@@ -104,11 +147,15 @@
 }
 
-void dump_standard_configuration_descriptor(
-    int index, usb_standard_configuration_descriptor_t *d)
-{
+void dump_descriptor_configuration(size_t indent, uint8_t *descr, size_t size)
+{
+	usb_standard_configuration_descriptor_t *d
+	    = (usb_standard_configuration_descriptor_t *) descr;
+	if (size != sizeof(*d)) {
+		return;
+	}
+	
 	bool self_powered = d->attributes & 64;
 	bool remote_wakeup = d->attributes & 32;
 	
-	printf("Standard configuration descriptor #%d\n", index);
 	printf(INDENT "bLength = %d\n", d->length);
 	printf(INDENT "bDescriptorType = 0x%02x\n", d->descriptor_type);
@@ -123,5 +170,48 @@
 	printf(INDENT "MaxPower = %d (%dmA)\n", d->max_power,
 	    2 * d->max_power);
-	// printf(INDENT " = %d\n", d->);
+}
+
+void dump_descriptor_interface(size_t indent, uint8_t *descr, size_t size)
+{
+	dump_descriptor_generic(indent, descr, size);
+}
+
+void dump_descriptor_string(size_t indent, uint8_t *descr, size_t size)
+{
+	dump_descriptor_generic(indent, descr, size);
+}
+
+void dump_descriptor_endpoint(size_t indent, uint8_t *descr, size_t size)
+{
+	dump_descriptor_generic(indent, descr, size);
+}
+
+void dump_descriptor_hid(size_t indent, uint8_t *descr, size_t size)
+{
+	dump_descriptor_generic(indent, descr, size);
+}
+
+void dump_descriptor_hub(size_t indent, uint8_t *descr, size_t size)
+{
+	dump_descriptor_generic(indent, descr, size);
+}
+
+void dump_descriptor_generic(size_t indent, uint8_t *descr, size_t size)
+{
+	dump_buffer(NULL, descr, size);
+}
+
+
+void dump_match_ids(match_id_list_t *matches)
+{
+	printf("Match ids:\n");
+	link_t *link;
+	for (link = matches->ids.next;
+	    link != &matches->ids;
+	    link = link->next) {
+		match_id_t *match = list_get_instance(link, match_id_t, link);
+
+		printf(INDENT "%d %s\n", match->score, match->id);
+	}
 }
 
@@ -152,4 +242,6 @@
 	}
 	printf("0x%02x (%s)\n", type, name);
+	dump_descriptor_by_type(depth, descriptor, descriptor[0]);
+	
 }
 
Index: uspace/app/usbinfo/info.c
===================================================================
--- uspace/app/usbinfo/info.c	(revision 60b2b69876e048ee4591828f3e0035e4cd50e3b9)
+++ uspace/app/usbinfo/info.c	(revision 5f635ca5f17ad0cfb38319aa99fcff04ca83851a)
@@ -72,5 +72,5 @@
 		return rc;
 	}
-	dump_standard_device_descriptor(&device_descriptor);
+	dump_usb_descriptor((uint8_t *)&device_descriptor, sizeof(device_descriptor));
 
 	/*
@@ -91,6 +91,5 @@
 		return rc;
 	}
-	dump_standard_configuration_descriptor(config_index,
-	    &config_descriptor);
+	//dump_standard_configuration_descriptor(config_index, &config_descriptor);
 
 	void *full_config_descriptor = malloc(config_descriptor.total_length);
Index: uspace/app/usbinfo/usbinfo.h
===================================================================
--- uspace/app/usbinfo/usbinfo.h	(revision 60b2b69876e048ee4591828f3e0035e4cd50e3b9)
+++ uspace/app/usbinfo/usbinfo.h	(revision 5f635ca5f17ad0cfb38319aa99fcff04ca83851a)
@@ -46,7 +46,5 @@
 void dump_buffer(const char *, const uint8_t *, size_t);
 void dump_match_ids(match_id_list_t *matches);
-void dump_standard_device_descriptor(usb_standard_device_descriptor_t *);
-void dump_standard_configuration_descriptor(int, 
-    usb_standard_configuration_descriptor_t *);
+void dump_usb_descriptor(uint8_t *, size_t);
 int dump_device(int, usb_address_t);
 void dump_descriptor_tree(uint8_t *, size_t);
