Index: uspace/app/usbinfo/info.c
===================================================================
--- uspace/app/usbinfo/info.c	(revision 7b13d8e4475adb45eca5728fbab2199a8ca45782)
+++ uspace/app/usbinfo/info.c	(revision aad3587bd0f7196caa5bc5ec57ff02ff6939440b)
@@ -200,4 +200,50 @@
 }
 
+void dump_strings(usbinfo_device_t *dev)
+{
+	/* Get supported languages. */
+	l18_win_locales_t *langs;
+	size_t langs_count;
+	int rc = usb_request_get_supported_languages(&dev->ctrl_pipe,
+	    &langs, &langs_count);
+	if (rc != EOK) {
+		fprintf(stderr,
+		    NAME ": failed to get list of supported languages: %s.\n",
+		    str_error(rc));
+		return;
+	}
+
+	printf("%sString languages (%zu):", get_indent(0), langs_count);
+	size_t i;
+	for (i = 0; i < langs_count; i++) {
+		printf(" 0x%04x", (int) langs[i]);
+	}
+	printf(".\n");
+
+	/* Get all strings and dump them. */
+	for (i = 0; i < langs_count; i++) {
+		l18_win_locales_t lang = langs[i];
+
+		printf("%sStrings for language 0x%04x:\n", get_indent(0),
+		    (int) lang);
+		/*
+		 * Try only the first 15 strings
+		 * (typically, device will not have much more anyway).
+		 */
+		size_t idx;
+		for (idx = 1; idx < 0x0F; idx++) {
+			char *string;
+			rc = usb_request_get_string(&dev->ctrl_pipe, idx, lang,
+			    &string);
+			if (rc != EOK) {
+				continue;
+			}
+			printf("%sString #%zu: \"%s\"\n", get_indent(1),
+			    idx, string);
+			free(string);
+		}
+	}
+}
+
 int dump_device(devman_handle_t hc_handle, usb_address_t address)
 {
Index: uspace/app/usbinfo/main.c
===================================================================
--- uspace/app/usbinfo/main.c	(revision 7b13d8e4475adb45eca5728fbab2199a8ca45782)
+++ uspace/app/usbinfo/main.c	(revision aad3587bd0f7196caa5bc5ec57ff02ff6939440b)
@@ -134,4 +134,5 @@
 	_OPTION("-m --match-ids", "Print match ids generated for the device.");
 	_OPTION("-t --descriptor-tree", "Print descriptor tree.");
+	_OPTION("-s --strings", "Try to print all string descriptors.");
 
 	printf("\n");
@@ -148,7 +149,8 @@
 	{"match-ids", no_argument, NULL, 'm'},
 	{"descriptor-tree", no_argument, NULL, 't'},
+	{"strings", no_argument, NULL, 's'},
 	{0, 0, NULL, 0}
 };
-static const char *short_options = "himt";
+static const char *short_options = "himts";
 
 int main(int argc, char *argv[])
@@ -162,4 +164,5 @@
 	bool action_print_match_ids = false;
 	bool action_print_descriptor_tree = false;
+	bool action_print_strings = false;
 
 	/*
@@ -189,4 +192,7 @@
 				action_print_descriptor_tree = true;
 				break;
+			case 's':
+				action_print_strings = true;
+				break;
 			default:
 				assert(false && "unreachable code");
@@ -198,4 +204,5 @@
 	if (!action_print_match_ids
 	    && !action_print_short_identification
+	    && !action_print_strings
 	    && !action_print_descriptor_tree) {
 		action_print_short_identification = true;
@@ -239,4 +246,7 @@
 			dump_descriptor_tree_brief(dev);
 		}
+		if (action_print_strings) {
+			dump_strings(dev);
+		}
 
 		/* Destroy the control pipe (close the session etc.). */
Index: uspace/app/usbinfo/usbinfo.h
===================================================================
--- uspace/app/usbinfo/usbinfo.h	(revision 7b13d8e4475adb45eca5728fbab2199a8ca45782)
+++ uspace/app/usbinfo/usbinfo.h	(revision aad3587bd0f7196caa5bc5ec57ff02ff6939440b)
@@ -76,4 +76,5 @@
 void dump_device_match_ids(usbinfo_device_t *);
 void dump_descriptor_tree_brief(usbinfo_device_t *);
+void dump_strings(usbinfo_device_t *);
 
 
