diff --git a/Demos/Device/ClassDriver/Joystick/Descriptors.c b/Demos/Device/ClassDriver/Joystick/Descriptors.c
index 09f12f06ae19282b2e59331b17903c7cd12e2904..e421d3f028859dbf95884707eabf33bfd2a55457 100644
--- a/Demos/Device/ClassDriver/Joystick/Descriptors.c
+++ b/Demos/Device/ClassDriver/Joystick/Descriptors.c
@@ -44,33 +44,14 @@
  *  more details on HID report descriptors.
  */ 
 USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
-{
-	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	HID_RI_USAGE(8, 0x04), /* Joystick */
-	HID_RI_COLLECTION(8, 0x01), /* Application */
-	    HID_RI_USAGE(8, 0x01), /* Pointer */
-	    HID_RI_COLLECTION(8, 0x00), /* Physical */
-	        HID_RI_USAGE(8, 0x30), /* Usage X */
-	        HID_RI_USAGE(8, 0x31), /* Usage Y */
-	        HID_RI_LOGICAL_MINIMUM(8, -100),
-	        HID_RI_LOGICAL_MAXIMUM(8, 100),
-	        HID_RI_REPORT_SIZE(8, 0x08),
-	        HID_RI_REPORT_COUNT(8, 0x02),
-	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_END_COLLECTION(0),
-	    HID_RI_USAGE_PAGE(8, 0x09), /* Button */
-	    HID_RI_USAGE_MINIMUM(8, 0x01),
-	    HID_RI_USAGE_MAXIMUM(8, 0x02),
-	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	    HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x01),
-	    HID_RI_REPORT_COUNT(8, 0x02),
-	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_REPORT_SIZE(8, 0x06),
-	    HID_RI_REPORT_COUNT(8, 0x01),
-	    HID_RI_INPUT(8, HID_IOF_CONSTANT),
-	HID_RI_END_COLLECTION(0),
-};
+	{
+		/* Use the HID class driver's standard Joystick report.
+		 *   Min X/Y Axis values: -100
+		 *   Max X/Y Axis values:  100
+		 *   Buttons: 2
+		 */
+		HID_DESCRIPTOR_JOYSTICK(-100, 100, 2)
+	};
 
 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
  *  device characteristics, including the supported USB version, control endpoint size and the
diff --git a/Demos/Device/ClassDriver/Joystick/Joystick.c b/Demos/Device/ClassDriver/Joystick/Joystick.c
index abb599248780b3d51e95d5842f1e5cd53ea8c6a3..6e9f4ee7214a61b349cedf4709bdf0b31fa62ebf 100644
--- a/Demos/Device/ClassDriver/Joystick/Joystick.c
+++ b/Demos/Device/ClassDriver/Joystick/Joystick.c
@@ -160,7 +160,7 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn
 	  JoystickReport->X =  100;
 
 	if (JoyStatus_LCL & JOY_PRESS)
-	  JoystickReport->Button  = (1 << 1);
+	  JoystickReport->Button |= (1 << 1);
 
 	if (ButtonStatus_LCL & BUTTONS_BUTTON1)
 	  JoystickReport->Button |= (1 << 0);
diff --git a/Demos/Device/ClassDriver/Keyboard/Descriptors.c b/Demos/Device/ClassDriver/Keyboard/Descriptors.c
index 16ca1955e88ecfe447c323df9b19a53bd6674389..5f3f1459262ac58608350e32f5bec0b5ba03fde3 100644
--- a/Demos/Device/ClassDriver/Keyboard/Descriptors.c
+++ b/Demos/Device/ClassDriver/Keyboard/Descriptors.c
@@ -45,38 +45,10 @@
  */
 USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
 {
-	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	HID_RI_USAGE(8, 0x06), /* Keyboard */
-	HID_RI_COLLECTION(8, 0x01), /* Application */
-	    HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
-	    HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
-	    HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
-	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	    HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x01),
-	    HID_RI_REPORT_COUNT(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_REPORT_COUNT(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_CONSTANT),
-	    HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
-	    HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
-	    HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
-	    HID_RI_REPORT_COUNT(8, 0x05),
-	    HID_RI_REPORT_SIZE(8, 0x01),
-	    HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_REPORT_COUNT(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x03),
-	    HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
-	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	    HID_RI_LOGICAL_MAXIMUM(8, 0x65),
-	    HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
-	    HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
-	    HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
-	    HID_RI_REPORT_COUNT(8, 0x06),
-	    HID_RI_REPORT_SIZE(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	HID_RI_END_COLLECTION(0),
+	/* Use the HID class driver's standard Keyboard report.
+	 *   Max simultaneous keys: 6
+	 */
+	HID_DESCRIPTOR_KEYBOARD(6)
 };
 
 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
diff --git a/Demos/Device/ClassDriver/KeyboardMouse/Descriptors.c b/Demos/Device/ClassDriver/KeyboardMouse/Descriptors.c
index be2b7e08551c4164d6058690b15bfba17753c1fe..10b0e2dda727daf7b67babd42349ba718cfa2b4f 100644
--- a/Demos/Device/ClassDriver/KeyboardMouse/Descriptors.c
+++ b/Demos/Device/ClassDriver/KeyboardMouse/Descriptors.c
@@ -47,71 +47,24 @@
  */
 USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
 {
-	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	HID_RI_USAGE(8, 0x02), /* Mouse */
-	HID_RI_COLLECTION(8, 0x01), /* Application */
-	    HID_RI_USAGE(8, 0x01), /* Pointer */
-	    HID_RI_COLLECTION(8, 0x00), /* Physical */
-	        HID_RI_USAGE_PAGE(8, 0x09), /* Button */
-	        HID_RI_USAGE_MINIMUM(8, 0x01),
-	        HID_RI_USAGE_MAXIMUM(8, 0x03),
-	        HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-	        HID_RI_REPORT_COUNT(8, 0x03),
-	        HID_RI_REPORT_SIZE(8, 0x01),
-	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
-	        HID_RI_REPORT_COUNT(8, 0x01),
-	        HID_RI_REPORT_SIZE(8, 0x05),
-	        HID_RI_INPUT(8, HID_IOF_CONSTANT),
-	        HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	        HID_RI_USAGE(8, 0x30), /* Usage X */
-	        HID_RI_USAGE(8, 0x31), /* Usage Y */
-	        HID_RI_LOGICAL_MINIMUM(8, -1),
-	        HID_RI_LOGICAL_MAXIMUM(8, 1),
-	        HID_RI_PHYSICAL_MINIMUM(8, -1),
-	        HID_RI_PHYSICAL_MAXIMUM(8, 1),
-	        HID_RI_REPORT_COUNT(8, 0x02),
-	        HID_RI_REPORT_SIZE(8, 0x08),
-	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE | HID_IOF_NON_VOLATILE),
-	    HID_RI_END_COLLECTION(0),
-	HID_RI_END_COLLECTION(0),
+	/* Use the HID class driver's standard Mouse report.
+	 *   Min X/Y Axis values: -1
+	 *   Max X/Y Axis values:  1
+	 *   Min physical X/Y Axis values (used to determine resolution): -1
+	 *   Max physical X/Y Axis values (used to determine resolution):  1
+	 *   Buttons: 3
+	 *   Absolute screen coordinates: false
+	 */
+	HID_DESCRIPTOR_MOUSE(-1, 1, -1, 1, 3, false)
 };
 
 /** Same as the MouseReport structure, but defines the keyboard HID interface's report structure. */
 USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
 {
-	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	HID_RI_USAGE(8, 0x06), /* Keyboard */
-	HID_RI_COLLECTION(8, 0x01), /* Application */
-	    HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
-	    HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
-	    HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
-	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	    HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x01),
-	    HID_RI_REPORT_COUNT(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_REPORT_COUNT(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_CONSTANT),
-	    HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
-	    HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
-	    HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
-	    HID_RI_REPORT_COUNT(8, 0x05),
-	    HID_RI_REPORT_SIZE(8, 0x01),
-	    HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_REPORT_COUNT(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x03),
-	    HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
-	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	    HID_RI_LOGICAL_MAXIMUM(8, 0x65),
-	    HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
-	    HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
-	    HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
-	    HID_RI_REPORT_COUNT(8, 0x06),
-	    HID_RI_REPORT_SIZE(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	HID_RI_END_COLLECTION(0),
+	/* Use the HID class driver's standard Keyboard report.
+	 *   Max simultaneous keys: 6
+	 */
+	HID_DESCRIPTOR_KEYBOARD(6)
 };
 
 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
diff --git a/Demos/Device/ClassDriver/MassStorageKeyboard/Descriptors.c b/Demos/Device/ClassDriver/MassStorageKeyboard/Descriptors.c
index a5d7973da307201817db2d87371d4e59907c277d..577721e0167dafa13be705c379f6652d70af997d 100644
--- a/Demos/Device/ClassDriver/MassStorageKeyboard/Descriptors.c
+++ b/Demos/Device/ClassDriver/MassStorageKeyboard/Descriptors.c
@@ -58,38 +58,10 @@
  */
 USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
 {
-	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	HID_RI_USAGE(8, 0x06), /* Keyboard */
-	HID_RI_COLLECTION(8, 0x01), /* Application */
-	    HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
-	    HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
-	    HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
-	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	    HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x01),
-	    HID_RI_REPORT_COUNT(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_REPORT_COUNT(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_CONSTANT),
-	    HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
-	    HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
-	    HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
-	    HID_RI_REPORT_COUNT(8, 0x05),
-	    HID_RI_REPORT_SIZE(8, 0x01),
-	    HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	    HID_RI_REPORT_COUNT(8, 0x01),
-	    HID_RI_REPORT_SIZE(8, 0x03),
-	    HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
-	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	    HID_RI_LOGICAL_MAXIMUM(8, 0x65),
-	    HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
-	    HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
-	    HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
-	    HID_RI_REPORT_COUNT(8, 0x06),
-	    HID_RI_REPORT_SIZE(8, 0x08),
-	    HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
-	HID_RI_END_COLLECTION(0),
+	/* Use the HID class driver's standard Keyboard report.
+	 *   Max simultaneous keys: 6
+	 */
+	HID_DESCRIPTOR_KEYBOARD(6)
 };
 
 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
diff --git a/Demos/Device/ClassDriver/Mouse/Descriptors.c b/Demos/Device/ClassDriver/Mouse/Descriptors.c
index 26ba10fb49a4cba9989a39b228fbb653e16dfc92..75efb09a6833089562475d99230136b2d217c53a 100644
--- a/Demos/Device/ClassDriver/Mouse/Descriptors.c
+++ b/Demos/Device/ClassDriver/Mouse/Descriptors.c
@@ -45,34 +45,15 @@
  */
 USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
 {
-	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	HID_RI_USAGE(8, 0x02), /* Mouse */
-	HID_RI_COLLECTION(8, 0x01), /* Application */
-	    HID_RI_USAGE(8, 0x01), /* Pointer */
-	    HID_RI_COLLECTION(8, 0x00), /* Physical */
-	        HID_RI_USAGE_PAGE(8, 0x09), /* Button */
-	        HID_RI_USAGE_MINIMUM(8, 0x01),
-	        HID_RI_USAGE_MAXIMUM(8, 0x03),
-	        HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-	        HID_RI_REPORT_COUNT(8, 0x03),
-	        HID_RI_REPORT_SIZE(8, 0x01),
-	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
-	        HID_RI_REPORT_COUNT(8, 0x01),
-	        HID_RI_REPORT_SIZE(8, 0x05),
-	        HID_RI_INPUT(8, HID_IOF_CONSTANT),
-	        HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	        HID_RI_USAGE(8, 0x30), /* Usage X */
-	        HID_RI_USAGE(8, 0x31), /* Usage Y */
-	        HID_RI_LOGICAL_MINIMUM(8, -1),
-	        HID_RI_LOGICAL_MAXIMUM(8, 1),
-	        HID_RI_PHYSICAL_MINIMUM(8, -1),
-	        HID_RI_PHYSICAL_MAXIMUM(8, 1),
-	        HID_RI_REPORT_COUNT(8, 0x02),
-	        HID_RI_REPORT_SIZE(8, 0x08),
-	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE | HID_IOF_NON_VOLATILE),
-	    HID_RI_END_COLLECTION(0),
-	HID_RI_END_COLLECTION(0),
+	/* Use the HID class driver's standard Mouse report.
+	 *   Min X/Y Axis values: -1
+	 *   Max X/Y Axis values:  1
+	 *   Min physical X/Y Axis values (used to determine resolution): -1
+	 *   Max physical X/Y Axis values (used to determine resolution):  1
+	 *   Buttons: 3
+	 *   Absolute screen coordinates: false
+	 */
+	HID_DESCRIPTOR_MOUSE(-1, 1, -1, 1, 3, false)
 };
 
 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
diff --git a/Demos/Device/ClassDriver/VirtualSerialMouse/Descriptors.c b/Demos/Device/ClassDriver/VirtualSerialMouse/Descriptors.c
index 22f29b95afc61647c0d2ebebb233879b6928d264..4e0e2b7474f3d8830a2437e3fb473edc586e7052 100644
--- a/Demos/Device/ClassDriver/VirtualSerialMouse/Descriptors.c
+++ b/Demos/Device/ClassDriver/VirtualSerialMouse/Descriptors.c
@@ -57,34 +57,15 @@
  */
 USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
 {
-	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	HID_RI_USAGE(8, 0x02), /* Mouse */
-	HID_RI_COLLECTION(8, 0x01), /* Application */
-	    HID_RI_USAGE(8, 0x01), /* Pointer */
-	    HID_RI_COLLECTION(8, 0x00), /* Physical */
-	        HID_RI_USAGE_PAGE(8, 0x09), /* Button */
-	        HID_RI_USAGE_MINIMUM(8, 0x01),
-	        HID_RI_USAGE_MAXIMUM(8, 0x03),
-	        HID_RI_LOGICAL_MINIMUM(8, 0x00),
-	        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-	        HID_RI_REPORT_COUNT(8, 0x03),
-	        HID_RI_REPORT_SIZE(8, 0x01),
-	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
-	        HID_RI_REPORT_COUNT(8, 0x01),
-	        HID_RI_REPORT_SIZE(8, 0x05),
-	        HID_RI_INPUT(8, HID_IOF_CONSTANT),
-	        HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
-	        HID_RI_USAGE(8, 0x30), /* Usage X */
-	        HID_RI_USAGE(8, 0x31), /* Usage Y */
-	        HID_RI_LOGICAL_MINIMUM(8, -1),
-	        HID_RI_LOGICAL_MAXIMUM(8, 1),
-	        HID_RI_PHYSICAL_MINIMUM(8, -1),
-	        HID_RI_PHYSICAL_MAXIMUM(8, 1),
-	        HID_RI_REPORT_COUNT(8, 0x02),
-	        HID_RI_REPORT_SIZE(8, 0x08),
-	        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE | HID_IOF_NON_VOLATILE),
-	    HID_RI_END_COLLECTION(0),
-	HID_RI_END_COLLECTION(0),
+	/* Use the HID class driver's standard Mouse report.
+	 *   Min X/Y Axis values: -1
+	 *   Max X/Y Axis values:  1
+	 *   Min physical X/Y Axis values (used to determine resolution): -1
+	 *   Max physical X/Y Axis values (used to determine resolution):  1
+	 *   Buttons: 3
+	 *   Absolute screen coordinates: false
+	 */
+	HID_DESCRIPTOR_MOUSE(-1, 1, -1, 1, 3, false)
 };
 
 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
diff --git a/Demos/Device/LowLevel/Joystick/Joystick.c b/Demos/Device/LowLevel/Joystick/Joystick.c
index df1a884b6662518a27ea41883b500802d942ce7d..f3185b6e6a3832b4fde46c0f15c429cac6246b46 100644
--- a/Demos/Device/LowLevel/Joystick/Joystick.c
+++ b/Demos/Device/LowLevel/Joystick/Joystick.c
@@ -159,7 +159,7 @@ bool GetNextReport(USB_JoystickReport_Data_t* const ReportData)
 	  ReportData->X =  100;
 
 	if (JoyStatus_LCL & JOY_PRESS)
-	  ReportData->Button  = (1 << 1);
+	  ReportData->Button |= (1 << 1);
 
 	if (ButtonStatus_LCL & BUTTONS_BUTTON1)
 	  ReportData->Button |= (1 << 0);
diff --git a/Demos/Device/LowLevel/KeyboardMouse/KeyboardMouse.c b/Demos/Device/LowLevel/KeyboardMouse/KeyboardMouse.c
index 05888797165904f17e592b5d1c818315e4a577fe..fbb742ca498b9fc2c1cbd04c25b5079b65cdedd5 100644
--- a/Demos/Device/LowLevel/KeyboardMouse/KeyboardMouse.c
+++ b/Demos/Device/LowLevel/KeyboardMouse/KeyboardMouse.c
@@ -290,7 +290,7 @@ void Mouse_HID_Task(void)
 		  MouseReportData.X = -1;
 
 		if (JoyStatus_LCL & JOY_PRESS)
-		  MouseReportData.Button  = (1 << 0);
+		  MouseReportData.Button |= (1 << 0);
 	}
 
 	/* Select the Mouse Report Endpoint */
diff --git a/Demos/Device/LowLevel/Mouse/Mouse.c b/Demos/Device/LowLevel/Mouse/Mouse.c
index 40ec25a869166fac8f717e25a8dbb2c293bc93aa..808cf50b0d05f9747f8553d58e06ba53f2d3ce7a 100644
--- a/Demos/Device/LowLevel/Mouse/Mouse.c
+++ b/Demos/Device/LowLevel/Mouse/Mouse.c
@@ -233,10 +233,10 @@ void CreateMouseReport(USB_MouseReport_Data_t* const ReportData)
 	if (JoyStatus_LCL & JOY_LEFT)
 	  ReportData->X = -1;
 	else if (JoyStatus_LCL & JOY_RIGHT)
-	  ReportData->X = 1;
+	  ReportData->X =  1;
 
 	if (JoyStatus_LCL & JOY_PRESS)
-	  ReportData->Button  = (1 << 0);
+	  ReportData->Button |= (1 << 0);
 
 	if (ButtonStatus_LCL & BUTTONS_BUTTON1)
 	  ReportData->Button |= (1 << 1);
diff --git a/LUFA/Drivers/USB/Class/Common/HID.h b/LUFA/Drivers/USB/Class/Common/HID.h
index f92f8929cfb329adbdbe7dccb1057e8cc5e5a128..2c6ec41367bc118673b0e7f3a1c9b7885e09ed38 100644
--- a/LUFA/Drivers/USB/Class/Common/HID.h
+++ b/LUFA/Drivers/USB/Class/Common/HID.h
@@ -325,6 +325,159 @@
 		#define HID_KEYBOARD_SC_RIGHT_GUI                         0xE7
 		//@}
 
+		/** \name Standard HID Device Report Descriptors */
+		//@{
+		/** \hideinitializer
+		 *  A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report descriptor
+		 *  is structured according to the following layout:
+		 *
+		 *  \code
+		 *  struct
+		 *  {
+		 *      uintA_t Buttons; // Pressed buttons bitmask
+		 *      intB_t X; // Signed X axis value
+		 *      intB_t Y; // Signed Y axis value
+		 *  } Joystick_Report;
+		 *  \endcode
+		 *
+		 *  Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the
+		 *  ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
+		 *
+		 *  \param[in] MinAxisVal  Minimum X/Y logical axis value
+		 *  \param[in] MaxAxisVal  Maximum X/Y logical axis value
+		 *  \param[in] Buttons     Total number of buttons in the device
+		 */
+		#define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, Buttons) \
+			HID_RI_USAGE_PAGE(8, 0x01),            \
+			HID_RI_USAGE(8, 0x04),                 \
+			HID_RI_COLLECTION(8, 0x01),            \
+				HID_RI_USAGE(8, 0x01),             \
+				HID_RI_COLLECTION(8, 0x00),        \
+					HID_RI_USAGE(8, 0x30),         \
+					HID_RI_USAGE(8, 0x31),         \
+					HID_RI_REPORT_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
+					HID_RI_REPORT_COUNT(8, 0x02),  \
+					HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+				HID_RI_END_COLLECTION(0),          \
+				HID_RI_USAGE_PAGE(8, 0x09),        \
+				HID_RI_USAGE_MINIMUM(8, 0x01),     \
+				HID_RI_USAGE_MAXIMUM(8, Buttons),  \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),   \
+				HID_RI_LOGICAL_MAXIMUM(8, 0x01),   \
+				HID_RI_REPORT_SIZE(8, 0x01),       \
+				HID_RI_REPORT_COUNT(8, Buttons),   \
+				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+				HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
+				HID_RI_REPORT_COUNT(8, 0x01),      \
+				HID_RI_INPUT(8, HID_IOF_CONSTANT), \
+			HID_RI_END_COLLECTION(0),
+
+		/** \hideinitializer
+		 *  A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor
+		 *  is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will
+		 *  be structured according to the following layout:
+		 *
+		 *  \code
+		 *  struct
+		 *  {
+		 *      uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (HID_KEYBOARD_MODIFER_* masks)
+		 *      uint8_t Reserved; // Reserved for OEM use, always set to 0.
+		 *      uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported
+		 *  } Keyboard_Report;
+		 *  \endcode
+		 *
+		 *  \param[in] MaxKeys  Number of simultaneous keys that can be reported at the one time (a value between 1 and
+		 *                      (ENDPOINT_SIZE - 2) )
+		 */
+		#define HID_DESCRIPTOR_KEYBOARD(MaxKeys)   \
+			HID_RI_USAGE_PAGE(8, 0x01),            \
+			HID_RI_USAGE(8, 0x06),                 \
+			HID_RI_COLLECTION(8, 0x01),            \
+				HID_RI_USAGE_PAGE(8, 0x07),        \
+				HID_RI_USAGE_MINIMUM(8, 0xE0),     \
+				HID_RI_USAGE_MAXIMUM(8, 0xE7),     \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),   \
+				HID_RI_LOGICAL_MAXIMUM(8, 0x01),   \
+				HID_RI_REPORT_SIZE(8, 0x01),       \
+				HID_RI_REPORT_COUNT(8, 0x08),      \
+				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+				HID_RI_REPORT_COUNT(8, 0x01),      \
+				HID_RI_REPORT_SIZE(8, 0x08),       \
+				HID_RI_INPUT(8, HID_IOF_CONSTANT), \
+				HID_RI_USAGE_PAGE(8, 0x08),        \
+				HID_RI_USAGE_MINIMUM(8, 0x01),     \
+				HID_RI_USAGE_MAXIMUM(8, 0x05),     \
+				HID_RI_REPORT_COUNT(8, 0x05),      \
+				HID_RI_REPORT_SIZE(8, 0x01),       \
+				HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+				HID_RI_REPORT_COUNT(8, 0x01),      \
+				HID_RI_REPORT_SIZE(8, 0x03),       \
+				HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),   \
+				HID_RI_LOGICAL_MAXIMUM(8, 0x65),   \
+				HID_RI_USAGE_PAGE(8, 0x07),        \
+				HID_RI_USAGE_MINIMUM(8, 0x00),     \
+				HID_RI_USAGE_MAXIMUM(8, 0x65),     \
+				HID_RI_REPORT_COUNT(8, MaxKeys),   \
+				HID_RI_REPORT_SIZE(8, 0x08),       \
+				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+			HID_RI_END_COLLECTION(0),
+
+		/** \hideinitializer
+		 *  A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor
+		 *  is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range
+		 *  and the number of Buttons is less than 8. For other values, the report is structured according to the following layout:
+		 *
+		 *  \code
+		 *  struct
+		 *  {
+		 *      uintA_t Buttons; // Pressed buttons bitmask
+		 *      intB_t X; // X axis value
+		 *      intB_t Y; // Y axis value
+		 *  } Mouse_Report;
+		 *  \endcode
+		 *
+		 *  Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the
+		 *  ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
+		 *
+		 *  \param[in] MinAxisVal      Minimum X/Y logical axis value
+		 *  \param[in] MaxAxisVal      Maximum X/Y logical axis value
+		 *  \param[in] MinPhysicalVal  Minimum X/Y physical axis value, for movement resolution calculations
+		 *  \param[in] MaxPhysicalVal  Maximum X/Y physical axis value, for movement resolution calculations
+		 *  \param[in] Buttons         Total number of buttons in the device
+		 *  \param[in] AbsoluteCoords  Boolean true to use absolute X/Y coordinates (e.g. touchscreen)
+		 */
+		#define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
+				HID_RI_USAGE_PAGE(8, 0x01),              \
+				HID_RI_USAGE(8, 0x02),                   \
+				HID_RI_COLLECTION(8, 0x01),              \
+					HID_RI_USAGE(8, 0x01),               \
+					HID_RI_COLLECTION(8, 0x00),          \
+						HID_RI_USAGE_PAGE(8, 0x09),      \
+						HID_RI_USAGE_MINIMUM(8, 0x01),   \
+						HID_RI_USAGE_MAXIMUM(8, Buttons), \
+						HID_RI_LOGICAL_MINIMUM(8, 0x00), \
+						HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
+						HID_RI_REPORT_COUNT(8, Buttons), \
+						HID_RI_REPORT_SIZE(8, 0x01),     \
+						HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE), \
+						HID_RI_REPORT_COUNT(8, 0x01),    \
+						HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
+						HID_RI_INPUT(8, HID_IOF_CONSTANT), \
+						HID_RI_USAGE_PAGE(8, 0x01),      \
+						HID_RI_USAGE(8, 0x30),           \
+						HID_RI_USAGE(8, 0x31),           \
+						HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
+						HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
+						HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
+						HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
+						HID_RI_REPORT_COUNT(8, 0x02),    \
+						HID_RI_REPORT_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
+						HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE) | HID_IOF_NON_VOLATILE), \
+					HID_RI_END_COLLECTION(0),            \
+				HID_RI_END_COLLECTION(0),
+		//@}
+		
 	/* Type Defines: */
 		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID
 		 *  device class.
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index df74a7c08ceb2a948ae72db9e2023487b498856e..b4a836c7070f66ccf586660cbdc5bd201affae55 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -17,7 +17,9 @@
   *   - Added basic driver example use code to the library documentation
   *   - Added new Endpoint_Null_Stream() and Pipe_Null_stream() functions
   *   - Added new ADC_GET_CHANNEL_MASK() convenience macro
-  *   - New HID report item macros (with HID_RI_ prefix) to allow for easy creation and editing of HID report descriptors
+  *   - Added new HID report item macros (with HID_RI_ prefix) to allow for easy creation and editing of HID report descriptors
+  *   - Added new HID_DESCRIPTOR_MOUSE, HID_DESCRIPTOR_KEYBOARD and HID_DESCRIPTOR_JOYSTICK macros for easy automatic creation of
+  *     basic USB HID device reports
   *  - Library Applications:
   *   - Added ability to write protect Mass Storage disk write operations from the host OS
   *