diff --git a/Demos/Device/LowLevel/Keyboard/Keyboard.c b/Demos/Device/LowLevel/Keyboard/Keyboard.c
index 185d968d74bcb634226c773d49ad24868cc5e5b4..25271480891ff8adf800ae946c7836e2a31cb940 100644
--- a/Demos/Device/LowLevel/Keyboard/Keyboard.c
+++ b/Demos/Device/LowLevel/Keyboard/Keyboard.c
@@ -225,8 +225,8 @@ void EVENT_USB_UnhandledControlPacket(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Get idle period in MSB */
-				IdleCount = (USB_ControlRequest.wValue >> 8);
+				/* Get idle period in MSB, IdleCount must be multiplied by 4 to get number of milliseconds */
+				IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
 				
 				/* Acknowledge status stage */
 				while (!(Endpoint_IsINReady()));
@@ -239,8 +239,8 @@ void EVENT_USB_UnhandledControlPacket(void)
 			{		
 				Endpoint_ClearSETUP();
 				
-				/* Write the current idle duration to the host */
-				Endpoint_Write_Byte(IdleCount);
+				/* Write the current idle duration to the host, must be divided by 4 before sent to host */
+				Endpoint_Write_Byte(IdleCount >> 2);
 				
 				/* Send the flag to the host */
 				Endpoint_ClearIN();
@@ -329,8 +329,8 @@ void SendNextReport(void)
 	/* Check if the idle period is set and has elapsed */
 	if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))
 	{
-		/* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */
-		IdleMSRemaining = (IdleCount << 2);
+		/* Reset the idle time remaining counter */
+		IdleMSRemaining = IdleCount;
 		
 		/* Idle period is set and has elapsed, must send a report to the host */
 		SendReport = true;
diff --git a/Demos/Device/LowLevel/Mouse/Mouse.c b/Demos/Device/LowLevel/Mouse/Mouse.c
index c0989c5db4888402271f1508f7e4c31c96af3adc..60eb7fad7b4ac86a841f2908e7b96cc51c8381db 100644
--- a/Demos/Device/LowLevel/Mouse/Mouse.c
+++ b/Demos/Device/LowLevel/Mouse/Mouse.c
@@ -197,8 +197,8 @@ void EVENT_USB_UnhandledControlPacket(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Get idle period in MSB */
-				IdleCount = (USB_ControlRequest.wValue >> 8);
+				/* Get idle period in MSB, must multiply by 4 to get the duration in milliseconds */
+				IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
 				
 				/* Acknowledge status stage */
 				while (!(Endpoint_IsINReady()));
@@ -211,8 +211,8 @@ void EVENT_USB_UnhandledControlPacket(void)
 			{		
 				Endpoint_ClearSETUP();
 				
-				/* Write the current idle duration to the host */
-				Endpoint_Write_Byte(IdleCount);
+				/* Write the current idle duration to the host, must be divided by 4 before sent to host */
+				Endpoint_Write_Byte(IdleCount >> 2);
 				
 				/* Send the flag to the host */
 				Endpoint_ClearIN();
@@ -289,8 +289,8 @@ void SendNextReport(void)
 	/* Check if the idle period is set and has elapsed */
 	if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))
 	{
-		/* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */
-		IdleMSRemaining = (IdleCount << 2);
+		/* Reset the idle time remaining counter */
+		IdleMSRemaining = IdleCount;
 		
 		/* Idle period is set and has elapsed, must send a report to the host */
 		SendReport = true;
diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c
index d0320868f878ae61cda5b5117b5088a04f812036..bad934a3cd67767168f5380bae78af330aa5ee30 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.c
+++ b/LUFA/Drivers/USB/Class/Device/HID.c
@@ -38,8 +38,11 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterf
 	if (!(Endpoint_IsSETUPReceived()))
 	  return;
 	  
-	if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber)
-	  return;
+	if ((USB_ControlRequest.wIndex   != HIDInterfaceInfo->Config.InterfaceNumber) &&
+	    (USB_ControlRequest.bRequest != SetIdle))
+	{
+		return;
+	}
 
 	switch (USB_ControlRequest.bRequest)
 	{
@@ -105,12 +108,16 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterf
 		case REQ_SetIdle:
 			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSETUP();
-				
-				HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue >> 8) << 2);
-				
-				while (!(Endpoint_IsINReady()));
-				Endpoint_ClearIN();
+				if ((USB_ControlRequest.wIndex         == HIDInterfaceInfo->Config.InterfaceNumber) ||
+				    (USB_ControlRequest.wValue & 0xFF) == 0)
+				{
+					Endpoint_ClearSETUP();
+					
+					HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
+					
+					while (!(Endpoint_IsINReady()));
+					Endpoint_ClearIN();
+				}
 			}
 			
 			break;
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.c b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
index f49f5b39b2396be222e5e25f4cca32f6e28d71c1..23182164698f3c93bc68adb71cff75aafd5f607b 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.c
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
@@ -174,59 +174,65 @@ void USB_Device_GetConfiguration(void)
 	Endpoint_ClearOUT();
 }
 
-static void USB_Device_GetDescriptor(void)
+#if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+static void USB_Device_GetInternalSerialDescriptor(void)
 {
-	void*    DescriptorPointer;
-	uint16_t DescriptorSize;
+	struct
+	{
+		USB_Descriptor_Header_t Header;
+		int16_t                 UnicodeString[12];
+	} SignatureDescriptor;
 	
-	#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 SigReadAddress  = 0x0E;		
+	bool    OddNibbleRead   = false;
+
+	#if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
+		SignatureDescriptor.Header.Size            = sizeof(SignatureDescriptor);
+		SignatureDescriptor.Header.Type            = DTYPE_String;
+	#else
+		SignatureDescriptor.Header.bLength         = sizeof(SignatureDescriptor);
+		SignatureDescriptor.Header.bDescriptorType = DTYPE_String;
+	#endif
+
+	for (uint8_t SerialCharNum = 0; SerialCharNum < 12; SerialCharNum++)
 	{
-		struct
-		{
-			USB_Descriptor_Header_t Header;
-			int16_t                 UnicodeString[12];
-		} SignatureDescriptor;
-
-		#if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
-			SignatureDescriptor.Header.Size            = sizeof(SignatureDescriptor);
-			SignatureDescriptor.Header.Type            = DTYPE_String;
-		#else
-			SignatureDescriptor.Header.bLength         = sizeof(SignatureDescriptor);
-			SignatureDescriptor.Header.bDescriptorType = DTYPE_String;
-		#endif
+		uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
 		
-		uint8_t  SigReadAddress  = 0x0E;		
-		bool     OddRead         = false;
-
-		for (uint8_t SerialCharNum = 0; SerialCharNum < 12; SerialCharNum++)
+		if (OddNibbleRead)
 		{
-			uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
-			
-			if (OddRead)
-			{
-				SerialByte >>= 4;
-				SigReadAddress++;
-			}
-			else
-			{
-				SerialByte &= 0x0F;
-			}
-			
-			OddRead = !(OddRead);
-
-			if (SerialByte < 0x0A)
-			  SerialByte += '0';
-			else
-			  SerialByte += ('A' - 0x0A);
-
-			SignatureDescriptor.UnicodeString[SerialCharNum] = SerialByte;
+			SerialByte >>= 4;
+			SigReadAddress++;
+		}
+		else
+		{
+			SerialByte &= 0x0F;
 		}
 		
-		Endpoint_ClearSETUP();
-		Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
-		Endpoint_ClearOUT();
+		OddNibbleRead = !(OddNibbleRead);
+
+		if (SerialByte < 0x0A)
+		  SerialByte += '0';
+		else
+		  SerialByte += ('A' - 0x0A);
+
+		SignatureDescriptor.UnicodeString[SerialCharNum] = SerialByte;
+	}
+	
+	Endpoint_ClearSETUP();
+	Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
+	Endpoint_ClearOUT();
+}
+#endif
 
+static void USB_Device_GetDescriptor(void)
+{
+	void*    DescriptorPointer;
+	uint16_t DescriptorSize;
+	
+	#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))
+	{
+		USB_Device_GetInternalSerialDescriptor();
 		return;
 	}
 	#endif
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.h b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
index fdef727578d4c3f44c3ac0d79aadce1e013a552e..2640cbba1a9a7dfd17c56f75380c6f36214dc33d 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.h
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
@@ -99,6 +99,10 @@
 				static void USB_Device_GetDescriptor(void);
 				static void USB_Device_GetStatus(void);
 				static void USB_Device_ClearSetFeature(void);
+				
+				#if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+					static void USB_Device_GetInternalSerialDescriptor(void);
+				#endif				
 			#endif
 	#endif
 
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 1610059cc6a7beecc645753bb3a87941571c1bb9..2281ca5953d85123bdd99b4720102f1a16072091 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -55,6 +55,7 @@
   *  - Fixed USB_Host_SendControlRequest() not re-suspending the USB bus when initial device ready-wait fails
   *  - Fixed USB Pad regulator not being disabled on some AVR models when the USB_OPT_REG_DISABLED option is used
   *  - Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected
+  *  - Fixed Mouse/Keyboard demos not performing the correct arithmetic on the Idle period at the right times (thanks to Brian Dickman)
   *
   *
   *  \section Sec_ChangeLog090605 Version 090605