diff --git a/Bootloaders/CDC/Descriptors.c b/Bootloaders/CDC/Descriptors.c
index 8973c4e9666d08ef94541a76fa62194d27f0090a..ee2b0aa1dc3a3c9a5ea996c63953a33736c9c748 100644
--- a/Bootloaders/CDC/Descriptors.c
+++ b/Bootloaders/CDC/Descriptors.c
@@ -206,29 +206,38 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                     const uint8_t wIndex,
                                     const void** const DescriptorAddress)
 {
-	const uint8_t DescriptorType   = (wValue >> 8);
-	const uint8_t DescriptorNumber = (wValue & 0xFF);
+	const uint8_t  DescriptorType   = (wValue >> 8);
+	const uint8_t  DescriptorNumber = (wValue & 0xFF);
 
 	const void* Address = NULL;
+	uint16_t    Size    = NO_DESCRIPTOR;
 
 	switch (DescriptorType)
 	{
 		case DTYPE_Device:
 			Address = &DeviceDescriptor;
+			Size    = sizeof(USB_Descriptor_Device_t);
 			break;
 		case DTYPE_Configuration:
 			Address = &ConfigurationDescriptor;
+			Size    = sizeof(USB_Descriptor_Configuration_t);
 			break;
 		case DTYPE_String:
 			if (!(DescriptorNumber))
-			  Address = &LanguageString;
+			{
+				Address = &LanguageString;
+				Size    = LanguageString.Header.Size;
+			}
 			else
-			  Address = &ProductString;
+			{
+				Address = &ProductString;
+				Size    = ProductString.Header.Size;
+			}
 
 			break;
 	}
 
 	*DescriptorAddress = Address;
-	return (Address != NULL) ? ((USB_Descriptor_Header_t*)Address)->Size : NO_DESCRIPTOR;
+	return Size;
 }
 
diff --git a/Bootloaders/DFU/Descriptors.c b/Bootloaders/DFU/Descriptors.c
index 55449c606331f5f670fe9a8f0dc2f5eb39be31ad..b9c77aa9a6137f40570dbd8d27b806c506c95f27 100644
--- a/Bootloaders/DFU/Descriptors.c
+++ b/Bootloaders/DFU/Descriptors.c
@@ -147,29 +147,38 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                     const uint8_t wIndex,
                                     const void** const DescriptorAddress)
 {
-	const uint8_t DescriptorType   = (wValue >> 8);
-	const uint8_t DescriptorNumber = (wValue & 0xFF);
+	const uint8_t  DescriptorType   = (wValue >> 8);
+	const uint8_t  DescriptorNumber = (wValue & 0xFF);
 
 	const void* Address = NULL;
+	uint16_t    Size    = NO_DESCRIPTOR;
 
 	switch (DescriptorType)
 	{
 		case DTYPE_Device:
 			Address = &DeviceDescriptor;
+			Size    = sizeof(USB_Descriptor_Device_t);
 			break;
-		case DTYPE_Configuration:
+		case DTYPE_Configuration: 
 			Address = &ConfigurationDescriptor;
+			Size    = sizeof(USB_Descriptor_Configuration_t);
 			break;
-		case DTYPE_String:
+		case DTYPE_String: 
 			if (!(DescriptorNumber))
-			  Address = &LanguageString;
+			{
+				Address = &LanguageString;
+				Size    = LanguageString.Header.Size;
+			}
 			else
-			  Address = &ProductString;
-
+			{
+				Address = &ProductString;
+				Size    = ProductString.Header.Size;
+			}
+			
 			break;
 	}
-
+	
 	*DescriptorAddress = Address;
-	return (Address != NULL) ? ((USB_Descriptor_Header_t*)Address)->Size : NO_DESCRIPTOR;
+	return Size;
 }
 
diff --git a/Bootloaders/HID/Descriptors.c b/Bootloaders/HID/Descriptors.c
index f79d34686fd0f7b3f40af24dd34ef4d759839be8..fef43ab9406baa3e70dce98b09ec6a61140c4918 100644
--- a/Bootloaders/HID/Descriptors.c
+++ b/Bootloaders/HID/Descriptors.c
@@ -154,23 +154,33 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                     const uint8_t wIndex,
                                     const void** const DescriptorAddress)
 {
-	const uint8_t DescriptorType = (wValue >> 8);
+	const uint8_t DescriptorType   = (wValue >> 8);
 
 	const void* Address = NULL;
 	uint16_t    Size    = NO_DESCRIPTOR;
 	
+	/* If/Else If chain compiles slightly smaller than a switch case */
 	if (DescriptorType == DTYPE_Device)
-	  Address = &DeviceDescriptor;
+	{
+		Address = &DeviceDescriptor;
+		Size    = sizeof(USB_Descriptor_Device_t);	
+	}
 	else if (DescriptorType == DTYPE_Configuration)
-	  Address = &ConfigurationDescriptor;
+	{
+		Address = &ConfigurationDescriptor;
+		Size    = sizeof(USB_Descriptor_Configuration_t);	
+	}
 	else if (DescriptorType == HID_DTYPE_HID)
-	  Address = &ConfigurationDescriptor.HID_VendorHID;
+	{
+		Address = &ConfigurationDescriptor.HID_VendorHID;
+		Size    = sizeof(USB_HID_Descriptor_HID_t);
+	}
 	else
-	  Address = &HIDReport;
+	{
+		Address = &HIDReport;
+		Size    = sizeof(HIDReport);
+	}
 
-	if (Address != NULL)
-	  Size = (Address == &HIDReport) ? sizeof(HIDReport) : ((USB_Descriptor_Header_t*)Address)->Size;
-	
 	*DescriptorAddress = Address;
 	return Size;
 }
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index 2f6bd97412b7fb46861c2e2b8173248621fbc1d1..414240653a20456b7a68aa4f5a5459df6fd557c8 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -17,7 +17,6 @@
   *      -# Investigate virtual hubs when in device mode instead of composite devices
   *      -# Change makefiles to allow for absolute LUFA location to be used
   *      -# Re-add interrupt Pipe/Endpoint support
-  *      -# Investigate dynamically created device descriptors
   *      -# Add makefile includes to reduce boilerplate in user makefiles
   *  - Documentation/Support
   *      -# Add detailed overviews of how each demo works