diff --git a/Demos/Device/ClassDriver/CDC/Descriptors.c b/Demos/Device/ClassDriver/CDC/Descriptors.c
index 9a2fe5e68a51cb87ff781dbacb4fe9876573392c..1cdad8e8f3124a8b64169376573e18edbcbc2183 100644
--- a/Demos/Device/ClassDriver/CDC/Descriptors.c
+++ b/Demos/Device/ClassDriver/CDC/Descriptors.c
@@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
 
 	.ManufacturerStrIndex   = 0x01,
 	.ProductStrIndex        = 0x02,
-	.SerialNumStrIndex      = NO_DESCRIPTOR,
+	.SerialNumStrIndex      = USE_INTERNAL_SERIAL,
 
 	.NumberOfConfigurations = 1
 };
diff --git a/Demos/Device/ClassDriver/DualCDC/Descriptors.c b/Demos/Device/ClassDriver/DualCDC/Descriptors.c
index 951a5586cc9fbd8c67563640f46a0e38b525b715..92b3eb930e9d6137276ee09fc039afbfeb3f9055 100644
--- a/Demos/Device/ClassDriver/DualCDC/Descriptors.c
+++ b/Demos/Device/ClassDriver/DualCDC/Descriptors.c
@@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
 	
 	.ManufacturerStrIndex   = 0x01,
 	.ProductStrIndex        = 0x02,
-	.SerialNumStrIndex      = NO_DESCRIPTOR,
+	.SerialNumStrIndex      = USE_INTERNAL_SERIAL,
 	
 	.NumberOfConfigurations = 1
 };
diff --git a/Demos/Device/ClassDriver/MassStorage/Descriptors.c b/Demos/Device/ClassDriver/MassStorage/Descriptors.c
index 6c02a6c552724996ea3f45f77bec7d948f545da7..13d18a69d127a82b619defe8af41b19f99ea4eb2 100644
--- a/Demos/Device/ClassDriver/MassStorage/Descriptors.c
+++ b/Demos/Device/ClassDriver/MassStorage/Descriptors.c
@@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
 		
 	.ManufacturerStrIndex   = 0x01,
 	.ProductStrIndex        = 0x02,
-	.SerialNumStrIndex      = 0x03,
+	.SerialNumStrIndex      = USE_INTERNAL_SERIAL,
 		
 	.NumberOfConfigurations = 1
 };
@@ -156,20 +156,6 @@ USB_Descriptor_String_t PROGMEM ProductString =
 	.UnicodeString          = L"LUFA Mass Storage Demo"
 };
 
-/** Serial number descriptor string. This is a Unicode string containing a string of HEX characters at least 12
- *  digits in length to uniquely identify a device when concatenated with the device's Vendor and Product IDs. By
- *  using the unique serial number string to identify a device, the device drivers do not need to be reinstalled
- *  each time the device is inserted into a different USB port on the same system. <b>This should be unique between
- *  devices, or conflicts will occur if two devices sharing the same serial number are inserted into the same system
- *  at the same time.</b>
- */
-USB_Descriptor_String_t PROGMEM SerialNumberString =
-{
-	.Header                 = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String},
-		
-	.UnicodeString          = L"000000000000"
-};
-
 /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
  *  documentation) by the application code so that the address and size of a requested descriptor can be given
  *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
@@ -209,10 +195,6 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex,
 					Address = (void*)&ProductString;
 					Size    = pgm_read_byte(&ProductString.Header.Size);
 					break;
-				case 0x03: 
-					Address = (void*)&SerialNumberString;
-					Size    = pgm_read_byte(&SerialNumberString.Header.Size);
-					break;
 			}
 			
 			break;
diff --git a/Demos/Device/ClassDriver/USBtoSerial/Descriptors.c b/Demos/Device/ClassDriver/USBtoSerial/Descriptors.c
index d4db3a4b72936da3d5f19a61775cbbad752b25d5..38f5689b57c53872a88ffefd3d28072ff2cb2d47 100644
--- a/Demos/Device/ClassDriver/USBtoSerial/Descriptors.c
+++ b/Demos/Device/ClassDriver/USBtoSerial/Descriptors.c
@@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
 		
 	.ManufacturerStrIndex   = 0x01,
 	.ProductStrIndex        = 0x02,
-	.SerialNumStrIndex      = NO_DESCRIPTOR,
+	.SerialNumStrIndex      = USE_INTERNAL_SERIAL,
 		
 	.NumberOfConfigurations = 1
 };
diff --git a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
index 2ce75b2d9fc4e2151355ddd7ddc35e1868a9609e..274b84fc4d2fe9360c93a94b47ab1a775a7924e8 100644
--- a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
+++ b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
@@ -74,6 +74,21 @@
 			 *  descriptor does not exist.
 			 */
 			#define NO_DESCRIPTOR                     0
+
+			#if (!defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))) || defined(__DOXYGEN__)
+				/** String descriptor index for the device's unique serial number string descriptor within the device.
+				 *  This unique serial number is used by the host to associate resources to the device (such as drivers or COM port
+				 *  number allocations) to a device regardless of the port it is plugged in to on the host. Some USB AVRs contain
+				 *  a unique serial number internally, and setting the device descriptors serial number string index to this value
+				 *  will cause it to use the internal serial number.
+				 *
+				 *  On unsupported devices, this will evaluate to NO_DESCRIPTOR and so will force the host to create a pseduo-serial
+				 *  number for the device.
+				 */
+				#define USE_INTERNAL_SERIAL         0xDC
+			#else
+				#define USE_INTERNAL_SERIAL         NO_DESCRIPTOR
+			#endif
 			
 			/** Macro to calculate the power value for the device descriptor, from a given number of milliamps. */
 			#define USB_CONFIG_POWER_MA(mA)            (mA >> 1)
@@ -244,13 +259,14 @@
 				                                          */
 				uint8_t                 SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal
 				                                            *   serial number, in uppercase Unicode ASCII.
-															*
-															*  \note On some AVR models, there is an embedded serial number
-															*        in the chip which can be used for the device serial number.
-				                                            *        To use this serial number, define USE_INTERNAL_SERIAL to a
-															*        unique string index number in the project makefile and set
-															*        this value to USE_INTERNAL_SERIAL.
-															*
+				                                            *
+				                                            *  \note On some AVR models, there is an embedded serial number
+				                                            *        in the chip which can be used for the device serial number.
+				                                            *        To use this serial number, set this to USE_INTERNAL_SERIAL.
+				                                            *        On unsupported devices, this will evaluate to 0 and will cause
+				                                            *        the host to generate a pseudo-unique value for the device upon
+				                                            *        insertion.
+				                                            *
 				                                            *  \see ManufacturerStrIndex structure entry.
 				                                            */
 
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.c b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
index 55b49b8034c2323dd7885434afa77a5035b68e2e..4014ed1caf78439edce9574ac4b17334ff3a7c3e 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.c
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
@@ -179,7 +179,7 @@ static void USB_Device_GetDescriptor(void)
 	void*    DescriptorPointer;
 	uint16_t DescriptorSize;
 	
-	#if defined(USE_INTERNAL_SERIAL)
+	#if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
 	if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
 	{
 		uint8_t SignatureDescriptor[2 + (sizeof(int16_t) * 12)];
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.h b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
index 65fa0418cd77b9a4a0b6c6c8890ba635a2c7b5d0..505256e68bc47379b9ffbda9a2fa53ebf4ae2bd2 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.h
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
@@ -45,21 +45,12 @@
 		#include "../HighLevel/USBTask.h"
 		#include "LowLevel.h"
 
-	/* Preprocessor Checks: */
-		#if defined(USE_INTERNAL_SERIAL) && !(defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
-			#error USE_INTERNAL_SERIAL invalid, the selected AVR model does not contain unique serial bytes.
-		#endif
-		
-		#if defined(USE_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL <= 1)
-			#error USE_INTERNAL_SERIAL must be defined to the string descriptor index chosen for the serial number descriptor.
-		#endif
-
 	/* Enable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
 			extern "C" {
 		#endif
 
-	/* Public Interface - May be used in end-application: */
+	/* Public Interface - May be used in end-application: */			
 		/* Global Variables: */
 			/** Indicates the currently set configuration number of the device. USB devices may have several
 			 *  different configurations which the host can select between; this indicates the currently selected
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index f7ae4c664a27e9a3f004350e3cb156b09e46c86e..6f116da67c8e7655bc28cc24d20121dc9b7ee7f7 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -28,7 +28,8 @@
   *    cleared to prevent endpoint type corruption
   *  - Fix documentation mentioning Pipe_GetCurrentToken() function when real name is Pipe_GetPipeToken()
   *  - Extend USB_GetDeviceConfigDescriptor() routine to require the configuration number within the device to fetch
-  *  - Added new USE_INTERNAL_SERIAL compile time option
+  *  - Added new USE_INTERNAL_SERIAL define for using the unique serial numbers in some AVR models as the USB device's serial number,
+  *    added NO_INTERNAL_SERIAL compile time option to turn off new serial number reading code
   *
   *  \section Sec_ChangeLog090605 Version 090605
   *
diff --git a/LUFA/ManPages/CompileTimeTokens.txt b/LUFA/ManPages/CompileTimeTokens.txt
index e1f248d8fbb3bf7e1f895eb6e81f2da11144f69d..bc49ba2cc9c01a10f205fec0b7c82cea34d72409 100644
--- a/LUFA/ManPages/CompileTimeTokens.txt
+++ b/LUFA/ManPages/CompileTimeTokens.txt
@@ -80,13 +80,11 @@
  *  compatibility. If this token is defined, the structure element names are switched to the LUFA-specific but more descriptive
  *  names documented in the StdDescriptors.h source file.
  *
- *  <b>USE_INTERNAL_SERIAL</b> - ( \ref Group_Descriptors ) \n
+ *  <b>NO_INTERNAL_SERIAL</b> - ( \ref Group_Descriptors ) \n
  *  Some AVR models contain a unique 20-digit serial number which can be used as the device serial number, while in device mode. This
  *  allows the host to uniquely identify the device regardless of if it is moved between USB ports on the same computer, allowing
- *  allocated resources (such as drivers, COM Port number allocations) to be preserved. To make the library use this value for the
- *  device's serial number, define this token in the project makefile, set it to a unique string descriptor index (i.e. one not used
- *  elsewhere in the device for a string descriptor) and set the Device Descriptor's serial number descriptor index entry to the
- *  USE_INTERNAL_SERIAL value.
+ *  allocated resources (such as drivers, COM Port number allocations) to be preserved. This is not needed in many apps, and so the
+ *  code that performs this task can be disabled by defining this option and passing it to the compiler via the -D switch.
  *
  *  <b>FIXED_CONTROL_ENDPOINT_SIZE</b> - ( \ref Group_EndpointManagement ) \n
  *  By default, the library determines the size of the control endpoint (when in device mode) by reading the device descriptor.