diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c
index 98185a48760bbc9e4f169108b5aeb60a69a3a51b..e10d3478132a4fef779f10c982f8d548def4680d 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.c
+++ b/LUFA/Drivers/USB/LowLevel/Host.c
@@ -308,6 +308,22 @@ uint8_t USB_Host_GetDeviceDescriptor(void* const DeviceDescriptorPtr)
 	return USB_Host_SendControlRequest(DeviceDescriptorPtr);
 }
 
+uint8_t USB_Host_GetDeviceStringDescriptor(uint8_t Index, void* const Buffer, uint8_t BufferLength)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+			bRequest:      REQ_GetDescriptor,
+			wValue:        (DTYPE_String << 8) | Index,
+			wIndex:        0,
+			wLength:       BufferLength,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+	
+	return USB_Host_SendControlRequest(Buffer);
+}
+
 uint8_t USB_Host_ClearPipeStall(uint8_t EndpointNum)
 {
 	if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h
index 8cf1fe04741da4122e71b860320733dde7b6d272..0a07002102382c40a3342a486a5714f1d27c857a 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.h
+++ b/LUFA/Drivers/USB/LowLevel/Host.h
@@ -201,6 +201,22 @@
 			 */
 			uint8_t USB_Host_GetDeviceDescriptor(void* const DeviceDescriptorPtr);
 			
+			/** Convenience function. This routine sends a GetDescriptor standard request to the attached
+			 *  device, requesting the string descriptor of the specified index. This can be used to easily
+			 *  retrieve string descriptors from the device by index, after the index is obtained from the
+			 *  Device or Configuration descriptors.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \param[in] Index  Index of the string index to retrieve
+			 *  \param[out] Buffer  Pointer to the destination buffer where the retrieved string decriptor is
+			 *                      to be stored
+			 *  \param[in] BufferLength  Maximum size of the string descriptor which can be stored into the buffer
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_GetDeviceStringDescriptor(uint8_t Index, void* const Buffer, uint8_t BufferLength);
+			
 			/** Clears a stall condition on the given pipe, via a ClearFeature request to the attached device.
 			 *
 			 *  \note After this routine returns, the control pipe will be selected.
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 629467486c39974b0efb5c90d7827908939c0ef7..e68bf89e407e534c419e197d2d7431c9eba2c3de 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -22,6 +22,7 @@
   *  - Added new HID_ALIGN_DATA() macro to return the pre-retrieved value of a HID report item, left-aligned to a given datatype
   *  - Added new PreviousValue to the HID Report Parser report item structure, for easy monitoring of previous report item values
   *  - Added new EVK527 board target
+  *  - Added new USB_Host_GetDeviceStringDescriptor() convenience function
   *
   *  <b>Changed:</b>
   *  - Removed code in the Keyboard demos to send zeroed reports between two reports with differing numbers of keycodes