diff --git a/Demos/Keyboard/Keyboard.c b/Demos/Keyboard/Keyboard.c
index a26f357a1ba5b8f7d863df4632a69014104de73b..d6b254ffb49e53ff7c841cd523e6049bab316367 100644
--- a/Demos/Keyboard/Keyboard.c
+++ b/Demos/Keyboard/Keyboard.c
@@ -385,8 +385,9 @@ void ProcessLEDReport(uint8_t LEDReport)
 /** Sends the next HID report to the host, via the keyboard data endpoint. */
 static inline void SendNextReport(void)
 {
-	USB_KeyboardReport_Data_t KeyboardReportData;
-	bool                      SendReport = true;
+	static USB_KeyboardReport_Data_t PrevKeyboardReportData;
+	USB_KeyboardReport_Data_t        KeyboardReportData;
+	bool                             SendReport = true;
 	
 	/* Create the next keyboard report for transmission to the host */
 	CreateKeyboardReport(&KeyboardReportData);
@@ -402,11 +403,14 @@ static inline void SendNextReport(void)
 		}
 		else
 		{
-			/* Idle period not elapsed, indicate that a report must not be sent */
-			SendReport = false;			
+			/* Idle period not elapsed, indicate that a report must not be sent unless the report has changed */
+			SendReport = (memcmp(&PrevKeyboardReportData, &KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)) != 0);
 		}
 	}
 	
+	/* Save the current report data for later comparison to check for changes */
+	PrevKeyboardReportData = KeyboardReportData;
+
 	/* Select the Keyboard Report Endpoint */
 	Endpoint_SelectEndpoint(KEYBOARD_EPNUM);
 
diff --git a/Demos/Mouse/Mouse.c b/Demos/Mouse/Mouse.c
index c4b7f55adbfb1d020b0c7ab3ef2a028c9f9d82a2..c066d424a27b57ad55296ebb35b2d051d4db665f 100644
--- a/Demos/Mouse/Mouse.c
+++ b/Demos/Mouse/Mouse.c
@@ -337,8 +337,9 @@ void CreateMouseReport(USB_MouseReport_Data_t* ReportData)
 /** Sends the next HID report to the host, via the keyboard data endpoint. */
 static inline void SendNextReport(void)
 {
-	USB_MouseReport_Data_t MouseReportData;
-	bool                   SendReport = true;
+	static USB_MouseReport_Data_t PrevMouseReportData;
+	USB_MouseReport_Data_t        MouseReportData;
+	bool                          SendReport = true;
 	
 	/* Create the next mouse report for transmission to the host */
 	CreateMouseReport(&MouseReportData);
@@ -354,10 +355,13 @@ static inline void SendNextReport(void)
 		}
 		else
 		{
-			/* Idle period not elapsed, indicate that a report must not be sent */
-			SendReport = false;
+			/* Idle period not elapsed, indicate that a report must not be sent unless the report has changed */
+			SendReport = (memcmp(&PrevMouseReportData, &MouseReportData, sizeof(USB_MouseReport_Data_t)) != 0);
 		}
 	}
+
+	/* Save the current report data for later comparison to check for changes */
+	PrevMouseReportData = MouseReportData;
 	
 	/* Select the Mouse Report Endpoint */
 	Endpoint_SelectEndpoint(MOUSE_EPNUM);