diff --git a/Demos/Device/ClassDriver/DualCDC/DualCDC.c b/Demos/Device/ClassDriver/DualCDC/DualCDC.c
index 9e3217cf76d767b6cbcd9232228071997959f5a7..82ed59d515f16240940f2c04190a85e44f822f86 100644
--- a/Demos/Device/ClassDriver/DualCDC/DualCDC.c
+++ b/Demos/Device/ClassDriver/DualCDC/DualCDC.c
@@ -78,11 +78,6 @@ USB_ClassInfo_CDC_Device_t VirtualSerial2_CDC_Interface =
 				.NotificationEndpointNumber = CDC2_NOTIFICATION_EPNUM,
 				.NotificationEndpointSize   = CDC_NOTIFICATION_EPSIZE,
 			},
-			
-		.State =
-			{
-				// Leave all state values to their defaults
-			}
 	};
 
 /** Main program entry point. This routine contains the overall program flow, including initial
diff --git a/Demos/Device/ClassDriver/GenericHID/GenericHID.c b/Demos/Device/ClassDriver/GenericHID/GenericHID.c
index b04f7af760bda96064ef472a253bceedf1d367f9..4315723f4542cb4d97480c312c5d48611306f305 100644
--- a/Demos/Device/ClassDriver/GenericHID/GenericHID.c
+++ b/Demos/Device/ClassDriver/GenericHID/GenericHID.c
@@ -118,8 +118,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Generic_HID_Interface.State.IdleMSRemaining)
-	  Generic_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Generic_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/Joystick/Joystick.c b/Demos/Device/ClassDriver/Joystick/Joystick.c
index d9ff6ca91c4d43bcbf7d51555b12713257c0962b..ffd167ef59beeae5cd68081432ad87b26d28727d 100644
--- a/Demos/Device/ClassDriver/Joystick/Joystick.c
+++ b/Demos/Device/ClassDriver/Joystick/Joystick.c
@@ -120,8 +120,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Joystick_HID_Interface.State.IdleMSRemaining)
-	  Joystick_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Joystick_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/Keyboard/Keyboard.c b/Demos/Device/ClassDriver/Keyboard/Keyboard.c
index cd8c3e69ea36f8f6fe1fbd76af87e8a3029c3327..fb19d02d9227ae98b17b367fcbc65ce676576fbd 100644
--- a/Demos/Device/ClassDriver/Keyboard/Keyboard.c
+++ b/Demos/Device/ClassDriver/Keyboard/Keyboard.c
@@ -121,8 +121,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Keyboard_HID_Interface.State.IdleMSRemaining)
-	  Keyboard_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
index 45a2c5270652a77cab3c4129b8ab1e2136016227..418ccba4e4aa2adad5fd8815d03a49de08d8d8ed 100644
--- a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
+++ b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
@@ -66,12 +66,7 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Interface =
 
 				.ReportINEndpointNumber  = MOUSE_IN_EPNUM,
 				.ReportINEndpointSize    = HID_EPSIZE,
-			},
-			
-		.State =
-			{
-				// Leave all state values to their defaults
-			}			
+			},		
 	};
 
 /** Main program entry point. This routine contains the overall program flow, including initial
@@ -147,11 +142,8 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Keyboard_HID_Interface.State.IdleMSRemaining)
-	  Keyboard_HID_Interface.State.IdleMSRemaining--;
-
-	if (Mouse_HID_Interface.State.IdleMSRemaining)
-	  Mouse_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
+	HID_Device_MillisecondElapsed(&Mouse_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/Mouse/Mouse.c b/Demos/Device/ClassDriver/Mouse/Mouse.c
index 44894340b181c07ef5d0e4b4dc148409d73a95c3..51021c0f5f9b8b4d7f443a770d04c850b1210d9f 100644
--- a/Demos/Device/ClassDriver/Mouse/Mouse.c
+++ b/Demos/Device/ClassDriver/Mouse/Mouse.c
@@ -120,8 +120,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Mouse_HID_Interface.State.IdleMSRemaining)
-	  Mouse_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Mouse_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c
index bfe97ffbb6161d92f54574496023c4d0cfd490f6..eef15f26cde1e1cf13f0456372832ce3be6cbee1 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.c
+++ b/LUFA/Drivers/USB/Class/Device/HID.c
@@ -184,4 +184,10 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 	}
 }
 
+void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo)
+{
+	if (HIDInterfaceInfo->State.IdleMSRemaining)
+	  HIDInterfaceInfo->State.IdleMSRemaining--;
+}
+
 #endif
diff --git a/LUFA/Drivers/USB/Class/Device/HID.h b/LUFA/Drivers/USB/Class/Device/HID.h
index ae68134fe3d40facafbfb957e78929ae0b8fc4a1..06456cf8ad4ece6f1e4aa94daf7b4ea19465a8e8 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.h
+++ b/LUFA/Drivers/USB/Class/Device/HID.h
@@ -121,6 +121,13 @@
 			 */
 			void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo);
 			
+			/** Indicates that a millisecond of idle time has elapsed on the given HID interface, and the interface's idle count should be
+			 *  decremented. This should be called once per millisecond so that hardware key-repeats function correctly.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 */
+			void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo);
+			
 			/** HID class driver callback for the user creation of a HID input report. This callback may fire in response to either
 			 *  HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback the
 			 *  user is responsible for the creation of the next HID input report to be sent to the host.
diff --git a/Projects/Magstripe/Magstripe.c b/Projects/Magstripe/Magstripe.c
index 898ad3c392aca7b88c20cfa45cea740787897e24..6d463d6a8de61ab02923d4d97aedf57289730920 100644
--- a/Projects/Magstripe/Magstripe.c
+++ b/Projects/Magstripe/Magstripe.c
@@ -153,8 +153,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** Timer 0 CTC ISR, firing once each millisecond to keep track of elapsed idle time in the HID interface. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Keyboard_HID_Interface.State.IdleMSRemaining)
-	  Keyboard_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
 }
 
 /** HID Class driver callback function for the creation of a HID report for the host.