diff --git a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
index dc8630257ccf82306498877761c7a51a39d5b472..f822d0ba54dd77ae16d5b9b790e01f4b2e085935 100644
--- a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
+++ b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
@@ -100,8 +100,15 @@
 				 *  number for the device.
 				 */
 				#define USE_INTERNAL_SERIAL           0xDC
+
+				/** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_LENGTH_BITS   80
 			#else
 				#define USE_INTERNAL_SERIAL           NO_DESCRIPTOR
+
+				#define INTERNAL_SERIAL_LENGTH_BITS   0
 			#endif			
 			
 		/* Function Prototypes: */
@@ -190,19 +197,14 @@
 				return (UDADDR & (1 << ADDEN));
 			}
 		
-			static inline uint8_t USB_Device_GetSerialString(uint16_t* UnicodeString, const uint8_t MaxLen)
+			static inline void USB_Device_GetSerialString(uint16_t* UnicodeString)
 			{
-				uint8_t SerialCharNum = 0;
-
 				ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
 				{
 					uint8_t SigReadAddress = 0x0E;
 
-					for (SerialCharNum = 0; SerialCharNum < MIN(MaxLen, 20); SerialCharNum++)
+					for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BYTES * 2); SerialCharNum++)
 					{
-						if (SerialCharNum == MaxLen)
-						  break;
-
 						uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
 
 						if (SerialCharNum & 0x01)
@@ -217,8 +219,6 @@
 						                                           (('A' - 10) + SerialByte) : ('0' + SerialByte));
 					}
 				}
-				
-				return SerialCharNum;
 			}
 		
 	#endif
diff --git a/LUFA/Drivers/USB/Core/DeviceStandardReq.c b/LUFA/Drivers/USB/Core/DeviceStandardReq.c
index a2270f4d284018d04d156c01d0d6f2932cdbb420..2ac6c0a54293afb4beeeae4a8364211a68cae887 100644
--- a/LUFA/Drivers/USB/Core/DeviceStandardReq.c
+++ b/LUFA/Drivers/USB/Core/DeviceStandardReq.c
@@ -204,12 +204,13 @@ static void USB_Device_GetInternalSerialDescriptor(void)
 	struct
 	{
 		USB_Descriptor_Header_t Header;
-		uint16_t                UnicodeString[20];
+		uint16_t                UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4];
 	} SignatureDescriptor;
 
 	SignatureDescriptor.Header.Type = DTYPE_String;
-	SignatureDescriptor.Header.Size = USB_STRING_LEN(USB_Device_GetSerialString(SignatureDescriptor.UnicodeString,
-	                                                 sizeof(SignatureDescriptor.UnicodeString) / sizeof(SignatureDescriptor.UnicodeString[0])));
+	SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4);
+	
+	USB_Device_GetSerialString(SignatureDescriptor.UnicodeString);
 
 	Endpoint_ClearSETUP();
 
diff --git a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
index 59897a769689e76bc2a9e736348bdcf534b152cc..8389d62dcbcc432f39ea61ac927996694f0a8b5f 100644
--- a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
@@ -90,9 +90,16 @@
 				 *  number for the device.
 				 */
 				#define USE_INTERNAL_SERIAL           0xDC
+				
+				/** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_LENGTH_BITS   120
 			#else
 				#define USE_INTERNAL_SERIAL           NO_DESCRIPTOR
-			#endif	
+
+				#define INTERNAL_SERIAL_LENGTH_BITS   0
+			#endif
 			
 		/* Function Prototypes: */
 			/** Sends a Remote Wakeup request to the host. This signals to the host that the device should
@@ -178,19 +185,14 @@
 				return AVR32_USBB.UDCON.adden;
 			}
 
-			static inline uint8_t USB_Device_GetSerialString(uint16_t* UnicodeString, const uint8_t MaxLen)
+			static inline void USB_Device_GetSerialString(uint16_t* UnicodeString)
 			{
-				uint8_t SerialCharNum = 0;
-
 				ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
 				{
-					uint32_t* SigReadAddress = 0x80800204;
+					uint8_t* SigReadAddress = (uint8_t*)0x80800204;
 
-					for (SerialCharNum = 0; SerialCharNum < MIN(MaxLen, 30); SerialCharNum++)
+					for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
 					{
-						if (SerialCharNum == MaxLen)
-						  break;
-
 						uint8_t SerialByte = *SigReadAddress;
 
 						if (SerialCharNum & 0x01)
@@ -205,8 +207,6 @@
 						                                           (('A' - 10) + SerialByte) : ('0' + SerialByte));
 					}
 				}
-				
-				return SerialCharNum;
 			}
 	#endif