diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c
index 92c2291c950e45d78680b273f21867d0d93df8d8..d875b842dde266e3b7779a6a14cd6f95d3136828 100644
--- a/Bootloaders/CDC/BootloaderCDC.c
+++ b/Bootloaders/CDC/BootloaderCDC.c
@@ -206,7 +206,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending
  *  on the AVR910 protocol command issued.
  *
- *  \param Command  Single character AVR910 protocol command indicating what memory operation to perform
+ *  \param[in] Command  Single character AVR910 protocol command indicating what memory operation to perform
  */
 static void ReadWriteMemoryBlock(const uint8_t Command)
 {
@@ -343,7 +343,7 @@ static uint8_t FetchNextCommandByte(void)
 /** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the
  *  bank when full ready for the next byte in the packet to the host.
  *
- *  \param Response  Next response byte to send to the host
+ *  \param[in] Response  Next response byte to send to the host
  */
 static void WriteNextResponseByte(const uint8_t Response)
 {
diff --git a/Bootloaders/CDC/Descriptors.h b/Bootloaders/CDC/Descriptors.h
index 62d75986e5dd454858b351c3667a9f2931fb4f86..8bccd686f0f36a9fdb4951bba052908089c72e7e 100644
--- a/Bootloaders/CDC/Descriptors.h
+++ b/Bootloaders/CDC/Descriptors.h
@@ -84,7 +84,7 @@
 		 *  type define so that the same macro can be used for functional descriptors of varying data lengths,
 		 *  while allowing the sizeof() operator to return correct results.
 		 *
-		 *  \param DataSize  Size of the functional descriptor's data payload, in bytes
+		 *  \param[in] DataSize  Size of the functional descriptor's data payload, in bytes
 		 */
 		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
 		     struct                                        \
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index b8a25185d5052f5c82e67f53401a03cb568a0bfb..2086a91d2095093999568afb12766ab54269a238 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -454,7 +454,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** Routine to discard the specified number of bytes from the control endpoint stream. This is used to
  *  discard unused bytes in the stream from the host, including the memory program block suffix.
  *
- *  \param NumberOfBytes  Number of bytes to discard from the host from the control endpoint
+ *  \param[in] NumberOfBytes  Number of bytes to discard from the host from the control endpoint
  */
 static void DiscardFillerBytes(uint8_t NumberOfBytes)
 {
diff --git a/Bootloaders/DFU/BootloaderDFU.h b/Bootloaders/DFU/BootloaderDFU.h
index a47da3d5cb5cd367310127065928c62f426d6f8e..9366c2284534b70f5b3d2e4c31f6d532fd906b86 100644
--- a/Bootloaders/DFU/BootloaderDFU.h
+++ b/Bootloaders/DFU/BootloaderDFU.h
@@ -76,16 +76,16 @@
 		
 		/** Convenience macro, used to determine if the issued command is the given one-byte long command.
 		 *
-		 *  \param dataarr  Command byte array to check against
-		 *  \param cb1      First command byte to check
+		 *  \param[in] dataarr  Command byte array to check against
+		 *  \param[in] cb1      First command byte to check
 		 */
 		#define IS_ONEBYTE_COMMAND(dataarr, cb1)       (dataarr[0] == cb1)
 
 		/** Convenience macro, used to determine if the issued command is the given two-byte long command.
 		 *
-		 *  \param dataarr  Command byte array to check against
-		 *  \param cb1      First command byte to check
-		 *  \param cb2      Second command byte to check
+		 *  \param[in] dataarr  Command byte array to check against
+		 *  \param[in] cb1      First command byte to check
+		 *  \param[in] cb2      Second command byte to check
 		 */
 		#define IS_TWOBYTE_COMMAND(dataarr, cb1, cb2) ((dataarr[0] == cb1) && (dataarr[1] == cb2))
 	
diff --git a/Demos/Device/ClassDriver/GenericHID/GenericHID.c b/Demos/Device/ClassDriver/GenericHID/GenericHID.c
index 823fa45b8d13af762f504322d600b3e209af7a5a..3f9c40281f3f999323fabdee35d1b1f20f7596f2 100644
--- a/Demos/Device/ClassDriver/GenericHID/GenericHID.c
+++ b/Demos/Device/ClassDriver/GenericHID/GenericHID.c
@@ -131,13 +131,13 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** HID class driver callback function for the creation of HID reports to the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
- *  \param ReportData  Pointer to a buffer where the created report should be stored
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in,out] ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
+ *  \param[out] ReportData  Pointer to a buffer where the created report should be stored
  *
  *  \return Number of bytes written in the report (or zero if no report is to be sent
  */
-uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
+uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID, void* ReportData)
 {
 	// Create generic HID report here
 	
@@ -146,13 +146,13 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInte
 
 /** HID class driver callback function for the processing of HID reports from the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID of the received report from the host
- *  \param ReportData  Pointer to a buffer where the created report has been stored
- *  \param ReportSize  Size in bytes of the received HID report
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in] ReportID  Report ID of the received report from the host
+ *  \param[in] ReportData  Pointer to a buffer where the created report has been stored
+ *  \param[in] ReportSize  Size in bytes of the received HID report
  */
-void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID,
-                                          void* ReportData, uint16_t ReportSize)
+void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID,
+                                          const void* ReportData, const uint16_t ReportSize)
 {
 	// Process received generic HID report here
 }
diff --git a/Demos/Device/ClassDriver/GenericHID/GenericHID.h b/Demos/Device/ClassDriver/GenericHID/GenericHID.h
index 843b262d48e5325dc321256e69baf80715cf61b8..6d5de7177e6104350f2228d5182502d79d5ef4e9 100644
--- a/Demos/Device/ClassDriver/GenericHID/GenericHID.h
+++ b/Demos/Device/ClassDriver/GenericHID/GenericHID.h
@@ -72,9 +72,9 @@
 		void EVENT_USB_ConfigurationChanged(void);
 		void EVENT_USB_UnhandledControlPacket(void);
 
-		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID,
+		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID,
 		                                             void* ReportData);
-		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID, 
-		                                              void* ReportData, uint16_t ReportSize);
+		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID, 
+		                                              const void* ReportData, const uint16_t ReportSize);
 		
 #endif
diff --git a/Demos/Device/ClassDriver/Joystick/Joystick.c b/Demos/Device/ClassDriver/Joystick/Joystick.c
index 0a1d3809fd859cbcb01469a67a253f1210d38261..1e13e9933a2566c3775b4d635dd0770b31566035 100644
--- a/Demos/Device/ClassDriver/Joystick/Joystick.c
+++ b/Demos/Device/ClassDriver/Joystick/Joystick.c
@@ -133,13 +133,13 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** HID class driver callback function for the creation of HID reports to the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
- *  \param ReportData  Pointer to a buffer where the created report should be stored
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in,out] ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
+ *  \param[out] ReportData  Pointer to a buffer where the created report should be stored
  *
  *  \return Number of bytes written in the report (or zero if no report is to be sent
  */
-uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
+uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID, void* ReportData)
 {
 	USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;
 	
@@ -167,13 +167,13 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInte
 
 /** HID class driver callback function for the processing of HID reports from the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID of the received report from the host
- *  \param ReportData  Pointer to a buffer where the created report has been stored
- *  \param ReportSize  Size in bytes of the received HID report
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in] ReportID  Report ID of the received report from the host
+ *  \param[in] ReportData  Pointer to a buffer where the created report has been stored
+ *  \param[in] ReportSize  Size in bytes of the received HID report
  */
-void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID,
-                                          void* ReportData, uint16_t ReportSize)
+void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID,
+                                          const void* ReportData, const uint16_t ReportSize)
 {
 	// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
 }
diff --git a/Demos/Device/ClassDriver/Joystick/Joystick.h b/Demos/Device/ClassDriver/Joystick/Joystick.h
index 343b190e71081aaaa1c7beb2c1d345321751fc77..0f35fcce27f559c0cef439389adc2adc7d97f8a0 100644
--- a/Demos/Device/ClassDriver/Joystick/Joystick.h
+++ b/Demos/Device/ClassDriver/Joystick/Joystick.h
@@ -83,9 +83,9 @@
 		void EVENT_USB_ConfigurationChanged(void);
 		void EVENT_USB_UnhandledControlPacket(void);
 
-		uint16_t CALLBACK_HID_Device_CreateNextHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID,
+		uint16_t CALLBACK_HID_Device_CreateNextHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID,
 		                                                 void* ReportData);
-		void     CALLBACK_HID_Device_ProcessReceivedHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID, 
-		                                                      void* ReportData, uint16_t ReportSize);
+		void     CALLBACK_HID_Device_ProcessReceivedHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, const uint8_t ReportID, 
+		                                                      const void* ReportData, const uint16_t ReportSize);
 
 #endif
diff --git a/Demos/Device/ClassDriver/Keyboard/Keyboard.c b/Demos/Device/ClassDriver/Keyboard/Keyboard.c
index f44a934516a63e7fb807b3f87ba5b53474513238..af56a228cbef6a7ad8ec8685fa8cf8ae1b23defd 100644
--- a/Demos/Device/ClassDriver/Keyboard/Keyboard.c
+++ b/Demos/Device/ClassDriver/Keyboard/Keyboard.c
@@ -134,13 +134,13 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** HID class driver callback function for the creation of HID reports to the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
- *  \param ReportData  Pointer to a buffer where the created report should be stored
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in,out] ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
+ *  \param[out] ReportData  Pointer to a buffer where the created report should be stored
  *
  *  \return Number of bytes written in the report (or zero if no report is to be sent
  */
-uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
+uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID, void* ReportData)
 {
 	USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData;
 	
@@ -168,13 +168,13 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInte
 
 /** HID class driver callback function for the processing of HID reports from the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID of the received report from the host
- *  \param ReportData  Pointer to a buffer where the created report has been stored
- *  \param ReportSize  Size in bytes of the received HID report
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in] ReportID  Report ID of the received report from the host
+ *  \param[in] ReportData  Pointer to a buffer where the created report has been stored
+ *  \param[in] ReportSize  Size in bytes of the received HID report
  */
-void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID,
-                                          void* ReportData, uint16_t ReportSize)
+void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID,
+                                          const void* ReportData, const uint16_t ReportSize)
 {
 	uint8_t  LEDMask   = LEDS_NO_LEDS;
 	uint8_t* LEDReport = (uint8_t*)ReportData;
diff --git a/Demos/Device/ClassDriver/Keyboard/Keyboard.h b/Demos/Device/ClassDriver/Keyboard/Keyboard.h
index 3dc7eaeec5d1f253620c776c0d4d9bc089da83c6..52b07ce609edd4c6ea8adbbdf14f9f4d89bbd726 100644
--- a/Demos/Device/ClassDriver/Keyboard/Keyboard.h
+++ b/Demos/Device/ClassDriver/Keyboard/Keyboard.h
@@ -86,9 +86,9 @@
 		void EVENT_USB_ConfigurationChanged(void);
 		void EVENT_USB_UnhandledControlPacket(void);
 
-		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID,
+		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID,
 		                                             void* ReportData);
-		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID, 
-		                                              void* ReportData, uint16_t ReportSize);
+		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID, 
+		                                              const void* ReportData, const uint16_t ReportSize);
 
 #endif
diff --git a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
index 93722195ae9dabe69895d0ad8d9acca471655d75..5c33eebe16dc601c05c6341649c47841b97fb292 100644
--- a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
+++ b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
@@ -165,13 +165,13 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** HID class driver callback function for the creation of HID reports to the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
- *  \param ReportData  Pointer to a buffer where the created report should be stored
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in,out] ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
+ *  \param[out] ReportData  Pointer to a buffer where the created report should be stored
  *
  *  \return Number of bytes written in the report (or zero if no report is to be sent
  */
-uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
+uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID, void* ReportData)
 {
 	uint8_t JoyStatus_LCL    = Joystick_GetStatus();
 	uint8_t ButtonStatus_LCL = Buttons_GetStatus();
@@ -226,13 +226,13 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInte
 
 /** HID class driver callback function for the processing of HID reports from the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID of the received report from the host
- *  \param ReportData  Pointer to a buffer where the created report has been stored
- *  \param ReportSize  Size in bytes of the received HID report
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in] ReportID  Report ID of the received report from the host
+ *  \param[in] ReportData  Pointer to a buffer where the created report has been stored
+ *  \param[in] ReportSize  Size in bytes of the received HID report
  */
-void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID,
-                                          void* ReportData, uint16_t ReportSize)
+void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID,
+                                          const void* ReportData, const uint16_t ReportSize)
 {
 	if (HIDInterfaceInfo == &Keyboard_HID_Interface)
 	{
diff --git a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.h b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.h
index 81ca3f6ef75cb5125150d09d47dcdb39f86a929d..a04051bb93f320d624bc6bad7d0f8aa65392b1eb 100644
--- a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.h
+++ b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.h
@@ -90,9 +90,9 @@
 		void EVENT_USB_ConfigurationChanged(void);
 		void EVENT_USB_UnhandledControlPacket(void);
 
-		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID,
+		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID,
 		                                             void* ReportData);
-		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID, 
-		                                              void* ReportData, uint16_t ReportSize);
+		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID, 
+		                                              const void* ReportData, const uint16_t ReportSize);
 		
 #endif
diff --git a/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c b/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c
index 5b5a2bd9087a59a1c301bc3870084dd9f8478dd6..326f66024f378fe252c4afecc14c4263ee2b7418 100644
--- a/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c
+++ b/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c
@@ -43,9 +43,9 @@
  *  the pre-selected data OUT endpoint. This routine reads in OS sized blocks from the endpoint and writes
  *  them to the dataflash in Dataflash page sized blocks.
  *
- *  \param MSInterfaceInfo  Pointer to a Mass Storage class state structure for the Mass Storage interface being used
- *  \param BlockAddress  Data block starting address for the write sequence
- *  \param TotalBlocks   Number of blocks of data to write
+ *  \param[in] MSInterfaceInfo  Pointer to a Mass Storage class state structure for the Mass Storage interface being used
+ *  \param[in] BlockAddress  Data block starting address for the write sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to write
  */
 void DataflashManager_WriteBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, const uint32_t BlockAddress, uint16_t TotalBlocks)
 {
@@ -169,9 +169,9 @@ void DataflashManager_WriteBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, co
  *  the pre-selected data IN endpoint. This routine reads in Dataflash page sized blocks from the Dataflash
  *  and writes them in OS sized blocks to the endpoint.
  *
- *  \param MSInterfaceInfo  Pointer to a Mass Storage class state structure for the Mass Storage interface being used
- *  \param BlockAddress  Data block starting address for the read sequence
- *  \param TotalBlocks   Number of blocks of data to read
+ *  \param[in] MSInterfaceInfo  Pointer to a Mass Storage class state structure for the Mass Storage interface being used
+ *  \param[in] BlockAddress  Data block starting address for the read sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to read
  */
 void DataflashManager_ReadBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, const uint32_t BlockAddress, uint16_t TotalBlocks)
 {
@@ -273,9 +273,9 @@ void DataflashManager_ReadBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, con
  *  dataflash in Dataflash page sized blocks. This can be linked to FAT libraries to write files to the
  *  dataflash.
  *
- *  \param BlockAddress  Data block starting address for the write sequence
- *  \param TotalBlocks   Number of blocks of data to write
- *  \param BufferPtr     Pointer to the data source RAM buffer
+ *  \param[in] BlockAddress  Data block starting address for the write sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to write
+ *  \param[in] BufferPtr     Pointer to the data source RAM buffer
  */
 void DataflashManager_WriteBlocks_RAM(const uint32_t BlockAddress, uint16_t TotalBlocks, uint8_t* BufferPtr)
 {
@@ -365,9 +365,9 @@ void DataflashManager_WriteBlocks_RAM(const uint32_t BlockAddress, uint16_t Tota
  *  and writes them in OS sized blocks to the given buffer. This can be linked to FAT libraries to read
  *  the files stored on the dataflash.
  *
- *  \param BlockAddress  Data block starting address for the read sequence
- *  \param TotalBlocks   Number of blocks of data to read
- *  \param BufferPtr     Pointer to the data destination RAM buffer
+ *  \param[in] BlockAddress  Data block starting address for the read sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to read
+ *  \param[out] BufferPtr     Pointer to the data destination RAM buffer
  */
 void DataflashManager_ReadBlocks_RAM(const uint32_t BlockAddress, uint16_t TotalBlocks, uint8_t* BufferPtr)
 {
diff --git a/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c b/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c
index 4e6c050131e915c37d00ea69209cecc1199d183b..08f11b7d675964aec5f5c0cd542646279ec594e5 100644
--- a/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c
+++ b/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c
@@ -84,7 +84,7 @@ SCSI_Request_Sense_Response_t SenseData =
  *  to the appropriate SCSI command handling routine if the issued command is supported by the device, else it returns
  *  a command failure due to a ILLEGAL REQUEST.
  *
- *  \param MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
  */
 bool SCSI_DecodeSCSICommand(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 {
@@ -142,7 +142,7 @@ bool SCSI_DecodeSCSICommand(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 /** Command processing for an issued SCSI INQUIRY command. This command returns information about the device's features
  *  and capabilities to the host.
  *
- *  \param MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
  *
  *  \return Boolean true if the command completed successfully, false otherwise.
  */
@@ -184,7 +184,7 @@ static bool SCSI_Command_Inquiry(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 /** Command processing for an issued SCSI REQUEST SENSE command. This command returns information about the last issued command,
  *  including the error code and additional error information so that the host can determine why a command failed to complete.
  *
- *  \param MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
  *
  *  \return Boolean true if the command completed successfully, false otherwise.
  */
@@ -208,7 +208,7 @@ static bool SCSI_Command_Request_Sense(USB_ClassInfo_MS_Device_t* MSInterfaceInf
 /** Command processing for an issued SCSI READ CAPACITY (10) command. This command returns information about the device's capacity
  *  on the selected Logical Unit (drive), as a number of OS-sized blocks.
  *
- *  \param MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
  *
  *  \return Boolean true if the command completed successfully, false otherwise.
  */
@@ -231,7 +231,7 @@ static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* MSInterface
  *  board, and indicates if they are present and functioning correctly. Only the Self-Test portion of the diagnostic command is
  *  supported.
  *
- *  \param MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
  *
  *  \return Boolean true if the command completed successfully, false otherwise.
  */
@@ -296,8 +296,8 @@ static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* MSInterfaceI
  *  and total number of blocks to process, then calls the appropriate low-level dataflash routine to handle the actual
  *  reading and writing of the data.
  *
- *  \param MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
- *  \param IsDataRead  Indicates if the command is a READ (10) command or WRITE (10) command (DATA_READ or DATA_WRITE)
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
+ *  \param[in] IsDataRead  Indicates if the command is a READ (10) command or WRITE (10) command (DATA_READ or DATA_WRITE)
  *
  *  \return Boolean true if the command completed successfully, false otherwise.
  */
diff --git a/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.h b/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.h
index bf61d8edc4a4124db5fc49fd801537e7d615f44b..052f908cdd83fd0db9a895c3908c32bbd1faa3e5 100644
--- a/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.h
+++ b/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.h
@@ -53,9 +53,9 @@
 		 *  is for convenience, as it allows for all three sense values (returned upon request to the host to give information about
 		 *  the last command failure) in a quick and easy manner.
 		 *
-		 *  \param key    New SCSI sense key to set the sense code to
-		 *  \param acode  New SCSI additional sense key to set the additional sense code to
-		 *  \param aqual  New SCSI additional sense key qualifier to set the additional sense qualifier code to
+		 *  \param[in] key    New SCSI sense key to set the sense code to
+		 *  \param[in] acode  New SCSI additional sense key to set the additional sense code to
+		 *  \param[in] aqual  New SCSI additional sense key qualifier to set the additional sense qualifier code to
 		 */
 		#define SCSI_SET_SENSE(key, acode, aqual)  MACROS{ SenseData.SenseKey = key;              \
 		                                                   SenseData.AdditionalSenseCode = acode; \
diff --git a/Demos/Device/ClassDriver/MassStorage/MassStorage.c b/Demos/Device/ClassDriver/MassStorage/MassStorage.c
index 87da9758966f01564f5b3ff58e9ab6ef4f82ec03..0a6604cfb28d3354f12292c04e9aac35f82f24ac 100644
--- a/Demos/Device/ClassDriver/MassStorage/MassStorage.c
+++ b/Demos/Device/ClassDriver/MassStorage/MassStorage.c
@@ -125,7 +125,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 
 /** Mass Storage class driver callback function the reception of SCSI commands from the host, which must be processed.
  *
- *  \param MSInterfaceInfo  Pointer to the Mass Storage class interface configuration structure being referenced
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface configuration structure being referenced
  */
 bool CALLBACK_MS_Device_SCSICommandReceived(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 {
diff --git a/Demos/Device/ClassDriver/Mouse/Mouse.c b/Demos/Device/ClassDriver/Mouse/Mouse.c
index 0d63c7a76e36fe3c749e1ddde8552b04b320c87a..45d14a38ef217ee1732b8b8077c9b6b9210fdf82 100644
--- a/Demos/Device/ClassDriver/Mouse/Mouse.c
+++ b/Demos/Device/ClassDriver/Mouse/Mouse.c
@@ -133,13 +133,13 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** HID class driver callback function for the creation of HID reports to the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
- *  \param ReportData  Pointer to a buffer where the created report should be stored
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in,out] ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
+ *  \param[out] ReportData  Pointer to a buffer where the created report should be stored
  *
  *  \return Number of bytes written in the report (or zero if no report is to be sent
  */
-uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
+uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID, void* ReportData)
 {
 	USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData;
 		
@@ -167,13 +167,13 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInte
 
 /** HID class driver callback function for the processing of HID reports from the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
- *  \param ReportID  Report ID of the received report from the host
- *  \param ReportData  Pointer to a buffer where the created report has been stored
- *  \param ReportSize  Size in bytes of the received HID report
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced
+ *  \param[in] ReportID  Report ID of the received report from the host
+ *  \param[in] ReportData  Pointer to a buffer where the created report has been stored
+ *  \param[in] ReportSize  Size in bytes of the received HID report
  */
-void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID,
-                                          void* ReportData, uint16_t ReportSize)
+void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID,
+                                          const void* ReportData, const uint16_t ReportSize)
 {
 	// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
 }
diff --git a/Demos/Device/ClassDriver/Mouse/Mouse.h b/Demos/Device/ClassDriver/Mouse/Mouse.h
index f973f726ae5fcd7a94c7bf2af3c9064fa47d8b21..f134d92dc0cad1c03cc069f94f214be4e8afdf49 100644
--- a/Demos/Device/ClassDriver/Mouse/Mouse.h
+++ b/Demos/Device/ClassDriver/Mouse/Mouse.h
@@ -85,9 +85,9 @@
 		void EVENT_USB_ConfigurationChanged(void);
 		void EVENT_USB_UnhandledControlPacket(void);
 
-		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t* ReportID,
+		uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID,
 		                                             void* ReportData);
-		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID, 
-		                                              void* ReportData, uint16_t ReportSize);
+		void     CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID, 
+		                                              const void* ReportData, const uint16_t ReportSize);
 
 #endif
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Descriptors.h b/Demos/Device/ClassDriver/RNDISEthernet/Descriptors.h
index eb437355242972e1b8394ae61af9b5632573a6fc..28b801f1ac403894032d5aceb4e92dc40888abaf 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Descriptors.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Descriptors.h
@@ -47,7 +47,7 @@
 		 *  a single typedef struct. A macro is used instead so that functional descriptors can be created
 		 *  easily by specifying the size of the payload. This allows sizeof() to work correctly.
 		 *
-		 *  \param DataSize  Size in bytes of the CDC functional descriptor's data payload
+		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload
 		 */		
 		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
 		     struct                                        \
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ARP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ARP.c
index 0f108c2905f33d7b6dbbac181c38e14556363bbd..c3f0d141f4329db91654f1f86bbecbf00c332d34 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ARP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ARP.c
@@ -41,8 +41,8 @@
  *  to the output Ethernet frame if the host is requesting the IP or MAC address of the
  *  virtual server device on the network.
  *
- *  \param InDataStart   Pointer to the start of the incoming packet's ARP header
- *  \param OutDataStart  Pointer to the start of the outgoing packet's ARP header
+ *  \param[in] InDataStart   Pointer to the start of the incoming packet's ARP header
+ *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's ARP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/DHCP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/DHCP.c
index 76711fb4f38ac21970e971b15925ef4d7ad87a3e..89d5bc9219f18210e555c7514904bf41ac1f25e0 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/DHCP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/DHCP.c
@@ -40,9 +40,9 @@
 /** Processes a DHCP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if the host is requesting or accepting an IP address.
  *
- *  \param IPHeaderInStart     Pointer to the start of the incoming packet's IP header
- *  \param DHCPHeaderInStart   Pointer to the start of the incoming packet's DHCP header
- *  \param DHCPHeaderOutStart  Pointer to the start of the outgoing packet's DHCP header
+ *  \param[in] IPHeaderInStart     Pointer to the start of the incoming packet's IP header
+ *  \param[in] DHCPHeaderInStart   Pointer to the start of the incoming packet's DHCP header
+ *  \param[out] DHCPHeaderOutStart  Pointer to the start of the outgoing packet's DHCP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c
index 57380a08223f981b83bbbfba544de3818567108f..fb6bb1aab9fd942531fcc7a82d3aea16c038e924 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c
@@ -110,8 +110,8 @@ void Ethernet_ProcessPacket(Ethernet_Frame_Info_t* FrameIN, Ethernet_Frame_Info_
 /** Calculates the appropriate ethernet checksum, consisting of the addition of the one's
  *  compliment of each word, complimented.
  *
- *  \param Data   Pointer to the packet buffer data whose checksum must be calculated
- *  \param Bytes  Number of bytes in the data buffer to process
+ *  \param[in] Data   Pointer to the packet buffer data whose checksum must be calculated
+ *  \param[in] Bytes  Number of bytes in the data buffer to process
  *
  *  \return A 16-bit Ethernet checksum value
  */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h
index 0708268c65b014b6bba0727c0432e3c23ce8fcb9..a867ff6f6e2c37a660094de8283774dc2444e633 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h
@@ -63,8 +63,8 @@
 	
 		/** Performs a comparison between two MAC addresses, indicating if they are identical.
 		 *  
-		 *  \param MAC1  First MAC address
-		 *  \param MAC2  Second MAC address
+		 *  \param[in] MAC1  First MAC address
+		 *  \param[in] MAC2  Second MAC address
 		 *
 		 *  \return True if the addresses match, false otherwise
 		 */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ICMP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ICMP.c
index ee87f83832ba8c6f6a64da18341346038206fd1f..618faea284f0fb71caad25e2f053d478b09cb0e9 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ICMP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ICMP.c
@@ -40,9 +40,9 @@
 /** Processes an ICMP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if the host is issuing a ICMP ECHO request.
  *
- *  \param FrameIN  Pointer to the incomming Ethernet frame information structure
- *  \param InDataStart   Pointer to the start of the incoming packet's ICMP header
- *  \param OutDataStart  Pointer to the start of the outgoing packet's ICMP header
+ *  \param[in] FrameIN        Pointer to the incomming Ethernet frame information structure
+ *  \param[in] InDataStart    Pointer to the start of the incoming packet's ICMP header
+ *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's ICMP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.c
index c5c38fcadeec62897f37ead7339addc5a62f4285..db09a2662fae5a965351567f4ad4cdfb82a25f43 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.c
@@ -39,9 +39,9 @@
 /** Processes an IP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if one is created by a subprotocol handler.
  *
- *  \param FrameIN       Pointer to the incomming Ethernet frame information structure
- *  \param InDataStart   Pointer to the start of the incoming packet's IP header
- *  \param OutDataStart  Pointer to the start of the outgoing packet's IP header
+ *  \param[in] FrameIN        Pointer to the incomming Ethernet frame information structure
+ *  \param[in] InDataStart    Pointer to the start of the incoming packet's IP header
+ *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's IP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE if no
  *           response was generated, NO_PROCESS if the packet processing was deferred until the
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.h b/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.h
index f77c772d87d7506ad7e8b48a2853663e80fae3b0..ebb927075750277d66a58e95b48ffa3f565d6246 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/IP.h
@@ -59,8 +59,8 @@
 		
 		/** Performs a comparison between two IP addresses, indicating if they are identical.
 		 *  
-		 *  \param IP1  First IP address
-		 *  \param IP2  Second IP address
+		 *  \param[in] IP1  First IP address
+		 *  \param[in] IP2  Second IP address
 		 *
 		 *  \return True if the addresses match, false otherwise
 		 */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c
index add0333f214f4a3cc16e351d5d01bdb987c0af18..aac72ae51be0db728b3fd99d4bfd71a3bfd31126 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c
@@ -51,7 +51,7 @@
 
 /** Decodes an Ethernet frame header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an Ethernet frame header
+ *  \param[in] InDataStart  Pointer to the start of an Ethernet frame header
  */
 void DecodeEthernetFrameHeader(void* InDataStart)
 {
@@ -93,7 +93,7 @@ void DecodeEthernetFrameHeader(void* InDataStart)
 
 /** Decodes an ARP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an ARP packet header
+ *  \param[in] InDataStart  Pointer to the start of an ARP packet header
  */
 void DecodeARPHeader(void* InDataStart)
 {
@@ -143,7 +143,7 @@ void DecodeARPHeader(void* InDataStart)
 
 /** Decodes an IP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an IP packet header
+ *  \param[in] InDataStart  Pointer to the start of an IP packet header
  */
 void DecodeIPHeader(void* InDataStart)
 {
@@ -181,7 +181,7 @@ void DecodeIPHeader(void* InDataStart)
 
 /** Decodes an ICMP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an ICMP packet header
+ *  \param[in] InDataStart  Pointer to the start of an ICMP packet header
  */
 void DecodeICMPHeader(void* InDataStart)
 {
@@ -197,7 +197,7 @@ void DecodeICMPHeader(void* InDataStart)
 
 /** Decodes a TCP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of a TCP packet header
+ *  \param[in] InDataStart  Pointer to the start of a TCP packet header
  */
 void DecodeTCPHeader(void* InDataStart)
 {
@@ -225,7 +225,7 @@ void DecodeTCPHeader(void* InDataStart)
 
 /** Decodes an UDP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of a UDP packet header
+ *  \param[in] InDataStart  Pointer to the start of a UDP packet header
  */
 void DecodeUDPHeader(void* InDataStart)
 {
@@ -243,7 +243,7 @@ void DecodeUDPHeader(void* InDataStart)
 
 /** Decodes an DHCP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of a DHCP packet header
+ *  \param[in] InDataStart  Pointer to the start of a DHCP packet header
  */
 void DecodeDHCPHeader(void* InDataStart)
 {
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
index 652714985e335809d15ebfe0a6c077b18fc1330d..674643381d22c110a6c8090f108d9b0ad90be561 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
@@ -171,9 +171,9 @@ void TCP_Init(void)
 
 /** Sets the state and callback handler of the given port, specified in big endian to the given state.
  *
- *  \param Port     Port whose state and callback function to set, specified in big endian
- *  \param State    New state of the port, a value from the TCP_PortStates_t enum
- *  \param Handler  Application callback handler for the port
+ *  \param[in] Port     Port whose state and callback function to set, specified in big endian
+ *  \param[in] State    New state of the port, a value from the TCP_PortStates_t enum
+ *  \param[in] Handler  Application callback handler for the port
  *
  *  \return Boolean true if the port state was set, false otherwise (no more space in the port state table)
  */
@@ -220,7 +220,7 @@ bool TCP_SetPortState(uint16_t Port, uint8_t State, void (*Handler)(TCP_Connecti
 
 /** Retrieves the current state of a given TCP port, specified in big endian.
  *
- *  \param Port  TCP port whose state is to be retrieved, given in big-endian
+ *  \param[in] Port  TCP port whose state is to be retrieved, given in big-endian
  *
  *  \return A value from the TCP_PortStates_t enum
  */
@@ -242,10 +242,10 @@ uint8_t TCP_GetPortState(uint16_t Port)
 /** Sets the connection state of the given port, remote address and remote port to the given TCP connection state. If the
  *  connection exists in the connection state table it is updated, otherwise it is created if possible.
  *
- *  \param Port           TCP port of the connection on the device, specified in big endian
- *  \param RemoteAddress  Remote protocol IP address of the connected device
- *  \param RemotePort     TCP port of the remote device in the connection, specified in big endian
- *  \param State          TCP connection state, a value from the TCP_ConnectionStates_t enum
+ *  \param[in] Port           TCP port of the connection on the device, specified in big endian
+ *  \param[in] RemoteAddress  Remote protocol IP address of the connected device
+ *  \param[in] RemotePort     TCP port of the remote device in the connection, specified in big endian
+ *  \param[in] State          TCP connection state, a value from the TCP_ConnectionStates_t enum
  *
  *  \return Boolean true if the connection was updated or created, false otherwise (no more space in the connection state table)
  */
@@ -283,9 +283,9 @@ bool TCP_SetConnectionState(uint16_t Port, IP_Address_t RemoteAddress, uint16_t
 
 /** Retrieves the current state of a given TCP connection to a host.
  *
- *  \param Port           TCP port on the device in the connection, specified in big endian
- *  \param RemoteAddress  Remote protocol IP address of the connected host
- *  \param RemotePort     Remote TCP port of the connected host, specified in big endian
+ *  \param[in] Port           TCP port on the device in the connection, specified in big endian
+ *  \param[in] RemoteAddress  Remote protocol IP address of the connected host
+ *  \param[in] RemotePort     Remote TCP port of the connected host, specified in big endian
  *
  *  \return A value from the TCP_ConnectionStates_t enum
  */
@@ -310,9 +310,9 @@ uint8_t TCP_GetConnectionState(uint16_t Port, IP_Address_t RemoteAddress, uint16
 
 /** Retrieves the connection info structure of a given connection to a host.
  *
- *  \param Port           TCP port on the device in the connection, specified in big endian
- *  \param RemoteAddress  Remote protocol IP address of the connected host
- *  \param RemotePort     Remote TCP port of the connected host, specified in big endian
+ *  \param[in] Port           TCP port on the device in the connection, specified in big endian
+ *  \param[in] RemoteAddress  Remote protocol IP address of the connected host
+ *  \param[in] RemotePort     Remote TCP port of the connected host, specified in big endian
  *
  *  \return ConnectionInfo structure of the connection if found, NULL otherwise
  */
@@ -337,9 +337,9 @@ TCP_ConnectionInfo_t* TCP_GetConnectionInfo(uint16_t Port, IP_Address_t RemoteAd
 /** Processes a TCP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if one is created by a application handler.
  *
- *  \param IPHeaderInStart    Pointer to the start of the incoming packet's IP header
- *  \param TCPHeaderInStart   Pointer to the start of the incoming packet's TCP header
- *  \param TCPHeaderOutStart  Pointer to the start of the outgoing packet's TCP header
+ *  \param[in] IPHeaderInStart     Pointer to the start of the incoming packet's IP header
+ *  \param[in] TCPHeaderInStart    Pointer to the start of the incoming packet's TCP header
+ *  \param[out] TCPHeaderOutStart  Pointer to the start of the outgoing packet's TCP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE if no
  *           response was generated, NO_PROCESS if the packet processing was deferred until the
@@ -579,10 +579,10 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, void* TCPHeaderInStart, void
 /** Calculates the appropriate TCP checksum, consisting of the addition of the one's compliment of each word,
  *  complimented.
  *
- *  \param TCPHeaderOutStart  Pointer to the start of the packet's outgoing TCP header
- *  \param SourceAddress      Source protocol IP address of the outgoing IP header
- *  \param DestinationAddress Destination protocol IP address of the outgoing IP header
- *  \param TCPOutSize         Size in bytes of the TCP data header and payload
+ *  \param[in] TCPHeaderOutStart   Pointer to the start of the packet's outgoing TCP header
+ *  \param[in] SourceAddress       Source protocol IP address of the outgoing IP header
+ *  \param[in] DestinationAddress  Destination protocol IP address of the outgoing IP header
+ *  \param[in] TCPOutSize          Size in bytes of the TCP data header and payload
  *
  *  \return A 16-bit TCP checksum value
  */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h
index 919245a0d1ea653fb37652f43a4b74008c740ca5..b7c991e125484dac3d68ecc82d38e0e1a2c9a805 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h
@@ -89,7 +89,7 @@
 		
 		/** Application macro: Determines if the given application buffer contains a packet received from the host
 		 *
-		 *  \param Buffer  Application buffer to check
+		 *  \param[in] Buffer  Application buffer to check
 		 *
 		 *  \return Boolean true if the buffer contains a packet from the host, false otherwise
 		 */
@@ -97,7 +97,7 @@
 
 		/** Application macro: Indicates if the application buffer is currently locked by the application for device-to-host transfers.
 		 *
-		 *  \param Buffer  Application buffer to check
+		 *  \param[in] Buffer  Application buffer to check
 		 *
 		 *  \return Boolean true if the buffer has been captured by the application for device-to-host transmissions, false otherwise
 		 */
@@ -106,7 +106,7 @@
 
 		/** Application macro: Indicates if the application can lock the buffer for multiple continued device-to-host transmissions.
 		 *
-		 *  \param Buffer  Application buffer to check
+		 *  \param[in] Buffer  Application buffer to check
 		 *
 		 *  \return Boolean true if the buffer may be captured by the application for device-to-host transmissions, false otherwise
 		 */
@@ -117,32 +117,32 @@
 		 *
 		 *  \note The application must check that the buffer can be locked first using TCP_APP_CAN_CAPTURE_BUFFER().
 		 *
-		 *  \param Buffer  Application buffer to lock
+		 *  \param[in] Buffer  Application buffer to lock
 		 */
 		#define TCP_APP_CAPTURE_BUFFER(Buffer)       MACROS{ Buffer->Direction = TCP_PACKETDIR_OUT; Buffer->InUse = true; }MACROE
 
 		/** Application macro: Releases a captured application buffer, allowing for host-to-device packets to be received.
 		 *
-		 *  \param Buffer  Application buffer to release
+		 *  \param[in] Buffer  Application buffer to release
 		 */
 		#define TCP_APP_RELEASE_BUFFER(Buffer)       MACROS{ Buffer->InUse = false; }MACROE
 
 		/** Application macro: Sends the contents of the given application buffer to the host.
 		 *
-		 *  \param Buffer  Application buffer to send
-		 *  \param Len     Length of data contained in the buffer
+		 *  \param[in] Buffer  Application buffer to send
+		 *  \param[in] Len     Length of data contained in the buffer
 		 */
 		#define TCP_APP_SEND_BUFFER(Buffer, Len)     MACROS{ Buffer->Direction = TCP_PACKETDIR_OUT; Buffer->Length = Len; Buffer->Ready = true; }MACROE
 
 		/** Application macro: Clears the application buffer, ready for a packet to be written to it.
 		 *
-		 *  \param Buffer  Application buffer to clear
+		 *  \param[in] Buffer  Application buffer to clear
 		 */
 		#define TCP_APP_CLEAR_BUFFER(Buffer)         MACROS{ Buffer->Ready = false; Buffer->Length = 0; }MACROE
 		
 		/** Application macro: Closes an open connection to a host.
 		 *
-		 *  \param Connection  Open TCP connection to close
+		 *  \param[in] Connection  Open TCP connection to close
 		 */
 		#define TCP_APP_CLOSECONNECTION(Connection)  MACROS{ Connection->State = TCP_Connection_Closing;  }MACROE
 
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c
index 1f571c3e995d4e726cc1cb22fa4a7ad6c33be94f..dbd33d15d4ab27f2a74e79f373c43931b74f6236 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c
@@ -40,9 +40,9 @@
 /** Processes a UDP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if a subprotocol handler has created a response packet.
  *
- *  \param IPHeaderInStart    Pointer to the start of the incoming packet's IP header
- *  \param UDPHeaderInStart   Pointer to the start of the incoming packet's UDP header
- *  \param UDPHeaderOutStart  Pointer to the start of the outgoing packet's UDP header
+ *  \param[in] IPHeaderInStart     Pointer to the start of the incoming packet's IP header
+ *  \param[in] UDPHeaderInStart    Pointer to the start of the incoming packet's UDP header
+ *  \param[out] UDPHeaderOutStart  Pointer to the start of the outgoing packet's UDP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c
index c07f2c8bd4f669733d5eeba03b077f62e668f3df..8055d91638047ec1e30e1da8a8f5e37ebd0bfb15 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Webserver.c
@@ -78,8 +78,8 @@ void Webserver_Init(void)
 
 /** Indicates if a given request equals the given HTTP command.
  *
- *  \param RequestHeader  HTTP request made by the host
- *  \param Command        HTTP command to compare the request to
+ *  \param[in] RequestHeader  HTTP request made by the host
+ *  \param[in] Command        HTTP command to compare the request to
  *
  *  \return Boolean true if the command matches the request, false otherwise
  */
@@ -92,8 +92,8 @@ static bool IsHTTPCommand(uint8_t* RequestHeader, char* Command)
 /** Application callback routine, executed each time the TCP processing task runs. This callback determines what request
  *  has been made (if any), and serves up appropriate responses.
  *
- *  \param ConnectionState  Pointer to a TCP Connection State structure giving connection information
- *  \param Buffer           Pointer to the application's send/receive packet buffer
+ *  \param[in] ConnectionState  Pointer to a TCP Connection State structure giving connection information
+ *  \param[in,out] Buffer       Pointer to the application's send/receive packet buffer
  */
 void Webserver_ApplicationCallback(TCP_ConnectionState_t* ConnectionState, TCP_ConnectionBuffer_t* Buffer)
 {
diff --git a/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.c b/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.c
index a2ba253d24eb8c956ab2c1d2f42c6ae3119dfbcb..ac63f0f9fc6eaa3092ba43a7a19329d5935fa579 100644
--- a/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.c
+++ b/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.c
@@ -158,9 +158,9 @@ ISR(USART1_RX_vect, ISR_BLOCK)
 
 /** Event handler for the CDC Class driver Line Encoding Changed event.
  *
- *  \param CDCInterfaceInfo  Pointer to the CDC class interface configuration structure being referenced
+ *  \param[in] CDCInterfaceInfo  Pointer to the CDC class interface configuration structure being referenced
  */
-void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
+void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 {
 	uint8_t ConfigMask = 0;
 
diff --git a/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.h b/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.h
index d0d4edb6c04ca4cf928e5c67f306287971b9778a..3ee7e89edff362aafd1aa10d4c9c0a3f3654a4d4 100644
--- a/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.h
+++ b/Demos/Device/ClassDriver/USBtoSerial/USBtoSerial.h
@@ -74,6 +74,6 @@
 		void EVENT_USB_ConfigurationChanged(void);
 		void EVENT_USB_UnhandledControlPacket(void);
 		
-		void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+		void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 
 #endif
diff --git a/Demos/Device/LowLevel/AudioInput/Descriptors.h b/Demos/Device/LowLevel/AudioInput/Descriptors.h
index 2cbd1cbd150585a106aa605462dbe7ee8236daa2..678eaafd3adb5cc0d09e4a70ad1767937e1abbcf 100644
--- a/Demos/Device/LowLevel/AudioInput/Descriptors.h
+++ b/Demos/Device/LowLevel/AudioInput/Descriptors.h
@@ -123,7 +123,7 @@
 
 		/** Convenience macro, to fill a 24-bit AudioSampleFreq_t structure with the given sample rate as a 24-bit number.
 		 *
-		 *  \param freq  Required audio sampling frequency in HZ
+		 *  \param[in] freq  Required audio sampling frequency in HZ
 		 */
 		#define SAMPLE_FREQ(freq)  {LowWord: ((uint32_t)freq & 0x00FFFF), HighByte: (((uint32_t)freq >> 16) & 0x0000FF)}
 		
diff --git a/Demos/Device/LowLevel/AudioOutput/Descriptors.h b/Demos/Device/LowLevel/AudioOutput/Descriptors.h
index f09bd087f1ad49b8cca882cdf7f3aee88233170c..a16a76f195423902310afc78b85a48ac6835adce 100644
--- a/Demos/Device/LowLevel/AudioOutput/Descriptors.h
+++ b/Demos/Device/LowLevel/AudioOutput/Descriptors.h
@@ -123,7 +123,7 @@
 
 		/** Convenience macro, to fill a 24-bit AudioSampleFreq_t structure with the given sample rate as a 24-bit number.
 		 *
-		 *  \param freq  Required audio sampling frequency in HZ
+		 *  \param[in] freq  Required audio sampling frequency in HZ
 		 */
 		#define SAMPLE_FREQ(freq)  {LowWord: ((uint32_t)freq & 0x00FFFF), HighByte: (((uint32_t)freq >> 16) & 0x0000FF)}
 		
diff --git a/Demos/Device/LowLevel/CDC/Descriptors.h b/Demos/Device/LowLevel/CDC/Descriptors.h
index 41b44300acd4c53a8bfa17dd0b219bd4ccb431db..bf9e7df1da5bd87651bc6c37899a7918ec0fd8cb 100644
--- a/Demos/Device/LowLevel/CDC/Descriptors.h
+++ b/Demos/Device/LowLevel/CDC/Descriptors.h
@@ -47,7 +47,7 @@
 		 *  a single typedef struct. A macro is used instead so that functional descriptors can be created
 		 *  easily by specifying the size of the payload. This allows sizeof() to work correctly.
 		 *
-		 *  \param DataSize  Size in bytes of the CDC functional descriptor's data payload
+		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload
 		 */
 		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
 		     struct                                        \
diff --git a/Demos/Device/LowLevel/DualCDC/Descriptors.h b/Demos/Device/LowLevel/DualCDC/Descriptors.h
index 2c2311b9ca1c0ab9af0e6f0ae825a3adda23eebd..aa95b8a4c01e862c17965b141c44390fd50db9bc 100644
--- a/Demos/Device/LowLevel/DualCDC/Descriptors.h
+++ b/Demos/Device/LowLevel/DualCDC/Descriptors.h
@@ -47,7 +47,7 @@
 		 *  a single typedef struct. A macro is used instead so that functional descriptors can be created
 		 *  easily by specifying the size of the payload. This allows sizeof() to work correctly.
 		 *
-		 *  \param DataSize  Size in bytes of the CDC functional descriptor's data payload
+		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload
 		 */
 		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
 		     struct                                        \
diff --git a/Demos/Device/LowLevel/GenericHID/GenericHID.c b/Demos/Device/LowLevel/GenericHID/GenericHID.c
index 40de8b94ae7dbf9a543a6eeac9560a452503a9c5..f467494723698d628b688641c2a570df15708076 100644
--- a/Demos/Device/LowLevel/GenericHID/GenericHID.c
+++ b/Demos/Device/LowLevel/GenericHID/GenericHID.c
@@ -170,7 +170,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 
 /** Function to process the lest received report from the host.
  *
- *  \param DataArray  Pointer to a buffer where the last report data is stored
+ *  \param[in] DataArray  Pointer to a buffer where the last report data is stored
  */
 void ProcessGenericHIDReport(uint8_t* DataArray)
 {
@@ -186,7 +186,7 @@ void ProcessGenericHIDReport(uint8_t* DataArray)
 
 /** Function to create the next report to send back to the host at the next reporting interval.
  *
- *  \param DataArray  Pointer to a buffer where the next report data should be stored
+ *  \param[out] DataArray  Pointer to a buffer where the next report data should be stored
  */
 void CreateGenericHIDReport(uint8_t* DataArray)
 {
diff --git a/Demos/Device/LowLevel/Joystick/Joystick.c b/Demos/Device/LowLevel/Joystick/Joystick.c
index 0c018aa8d64a16a7dd6b1826d94f31438089f454..42ae62caac731b572105a93de54b23539205fc2c 100644
--- a/Demos/Device/LowLevel/Joystick/Joystick.c
+++ b/Demos/Device/LowLevel/Joystick/Joystick.c
@@ -136,7 +136,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 
 /** Fills the given HID report data structure with the next HID report to send to the host.
  *
- *  \param ReportData  Pointer to a HID report data structure to be filled
+ *  \param[out] ReportData  Pointer to a HID report data structure to be filled
  *
  *  \return Boolean true if the new report differs from the last report, false otherwise
  */
diff --git a/Demos/Device/LowLevel/Keyboard/Keyboard.c b/Demos/Device/LowLevel/Keyboard/Keyboard.c
index 35ef41ba8a1b13d7499a914ecc7a73b609334b01..185d968d74bcb634226c773d49ad24868cc5e5b4 100644
--- a/Demos/Device/LowLevel/Keyboard/Keyboard.c
+++ b/Demos/Device/LowLevel/Keyboard/Keyboard.c
@@ -266,7 +266,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** Fills the given HID report data structure with the next HID report to send to the host.
  *
- *  \param ReportData  Pointer to a HID report data structure to be filled
+ *  \param[out] ReportData  Pointer to a HID report data structure to be filled
  */
 void CreateKeyboardReport(USB_KeyboardReport_Data_t* ReportData)
 {
@@ -291,7 +291,7 @@ void CreateKeyboardReport(USB_KeyboardReport_Data_t* ReportData)
 
 /** Processes a received LED report, and updates the board LEDs states to match.
  *
- *  \param LEDReport  LED status report from the host
+ *  \param[in] LEDReport  LED status report from the host
  */
 void ProcessLEDReport(uint8_t LEDReport)
 {
diff --git a/Demos/Device/LowLevel/MIDI/MIDI.h b/Demos/Device/LowLevel/MIDI/MIDI.h
index 735ac84427bb2c5e212e11bafa981078b86f27fb..3b9b938a5de76a201ece5cb2f11f1821a611b184 100644
--- a/Demos/Device/LowLevel/MIDI/MIDI.h
+++ b/Demos/Device/LowLevel/MIDI/MIDI.h
@@ -63,7 +63,7 @@
 		/** Convenience macro. MIDI channels are numbered from 1-10 (natural numbers) however the logical channel
 		 *  addresses are zero-indexed. This converts a natural MIDI channel number into the logical channel address.
 		 *
-		 *  \param channel  MIDI channel number to address
+		 *  \param[in] channel  MIDI channel number to address
 		 */
 		#define MIDI_CHANNEL(channel)     (channel - 1)
 
diff --git a/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c b/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c
index 4b624190f90b87bd2d776768b84204aee6ae87f9..c5035fe0a3711fc94b2380da269499192df3f384 100644
--- a/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c
+++ b/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c
@@ -43,8 +43,8 @@
  *  the pre-selected data OUT endpoint. This routine reads in OS sized blocks from the endpoint and writes
  *  them to the dataflash in Dataflash page sized blocks.
  *
- *  \param BlockAddress  Data block starting address for the write sequence
- *  \param TotalBlocks   Number of blocks of data to write
+ *  \param[in] BlockAddress  Data block starting address for the write sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to write
  */
 void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlocks)
 {
@@ -168,8 +168,8 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo
  *  the pre-selected data IN endpoint. This routine reads in Dataflash page sized blocks from the Dataflash
  *  and writes them in OS sized blocks to the endpoint.
  *
- *  \param BlockAddress  Data block starting address for the read sequence
- *  \param TotalBlocks   Number of blocks of data to read
+ *  \param[in] BlockAddress  Data block starting address for the read sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to read
  */
 void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBlocks)
 {
@@ -271,9 +271,9 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc
  *  dataflash in Dataflash page sized blocks. This can be linked to FAT libraries to write files to the
  *  dataflash.
  *
- *  \param BlockAddress  Data block starting address for the write sequence
- *  \param TotalBlocks   Number of blocks of data to write
- *  \param BufferPtr     Pointer to the data source RAM buffer
+ *  \param[in] BlockAddress  Data block starting address for the write sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to write
+ *  \param[in] BufferPtr     Pointer to the data source RAM buffer
  */
 void DataflashManager_WriteBlocks_RAM(const uint32_t BlockAddress, uint16_t TotalBlocks, uint8_t* BufferPtr)
 {
@@ -367,9 +367,9 @@ void DataflashManager_WriteBlocks_RAM(const uint32_t BlockAddress, uint16_t Tota
  *  and writes them in OS sized blocks to the given buffer. This can be linked to FAT libraries to read
  *  the files stored on the dataflash.
  *
- *  \param BlockAddress  Data block starting address for the read sequence
- *  \param TotalBlocks   Number of blocks of data to read
- *  \param BufferPtr     Pointer to the data destination RAM buffer
+ *  \param[in] BlockAddress  Data block starting address for the read sequence
+ *  \param[in] TotalBlocks   Number of blocks of data to read
+ *  \param[out] BufferPtr    Pointer to the data destination RAM buffer
  */
 void DataflashManager_ReadBlocks_RAM(const uint32_t BlockAddress, uint16_t TotalBlocks, uint8_t* BufferPtr)
 {
diff --git a/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c b/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c
index 5993a546dda48f7ff9f7bb10d49587e97d1ba13d..53d773ffb70c4813ffc82a97d08d1d513b7664e1 100644
--- a/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c
+++ b/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c
@@ -302,7 +302,7 @@ static bool SCSI_Command_Send_Diagnostic(void)
  *  and total number of blocks to process, then calls the appropriate low-level dataflash routine to handle the actual
  *  reading and writing of the data.
  *
- *  \param IsDataRead  Indicates if the command is a READ (10) command or WRITE (10) command (DATA_READ or DATA_WRITE)
+ *  \param[in] IsDataRead  Indicates if the command is a READ (10) command or WRITE (10) command (DATA_READ or DATA_WRITE)
  *
  *  \return Boolean true if the command completed successfully, false otherwise.
  */
diff --git a/Demos/Device/LowLevel/MassStorage/Lib/SCSI.h b/Demos/Device/LowLevel/MassStorage/Lib/SCSI.h
index d7693cafbb23b39c3aca90797f64f78a97348fe2..5002df5d4390e7fb9637ef918b726d78e9e398bb 100644
--- a/Demos/Device/LowLevel/MassStorage/Lib/SCSI.h
+++ b/Demos/Device/LowLevel/MassStorage/Lib/SCSI.h
@@ -54,9 +54,9 @@
 		 *  is for convenience, as it allows for all three sense values (returned upon request to the host to give information about
 		 *  the last command failure) in a quick and easy manner.
 		 *
-		 *  \param key    New SCSI sense key to set the sense code to
-		 *  \param acode  New SCSI additional sense key to set the additional sense code to
-		 *  \param aqual  New SCSI additional sense key qualifier to set the additional sense qualifier code to
+		 *  \param[in] key    New SCSI sense key to set the sense code to
+		 *  \param[in] acode  New SCSI additional sense key to set the additional sense code to
+		 *  \param[in] aqual  New SCSI additional sense key qualifier to set the additional sense qualifier code to
 		 */
 		#define SCSI_SET_SENSE(key, acode, aqual)  MACROS{ SenseData.SenseKey = key;              \
 		                                                   SenseData.AdditionalSenseCode = acode; \
diff --git a/Demos/Device/LowLevel/Mouse/Mouse.c b/Demos/Device/LowLevel/Mouse/Mouse.c
index c586b5971d260f79bc0d0b28b7fdf6f9bb76ecb6..c0989c5db4888402271f1508f7e4c31c96af3adc 100644
--- a/Demos/Device/LowLevel/Mouse/Mouse.c
+++ b/Demos/Device/LowLevel/Mouse/Mouse.c
@@ -238,7 +238,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** Fills the given HID report data structure with the next HID report to send to the host.
  *
- *  \param ReportData  Pointer to a HID report data structure to be filled
+ *  \param[out] ReportData  Pointer to a HID report data structure to be filled
  */
 void CreateMouseReport(USB_MouseReport_Data_t* ReportData)
 {
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Descriptors.h b/Demos/Device/LowLevel/RNDISEthernet/Descriptors.h
index eb437355242972e1b8394ae61af9b5632573a6fc..28b801f1ac403894032d5aceb4e92dc40888abaf 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Descriptors.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Descriptors.h
@@ -47,7 +47,7 @@
 		 *  a single typedef struct. A macro is used instead so that functional descriptors can be created
 		 *  easily by specifying the size of the payload. This allows sizeof() to work correctly.
 		 *
-		 *  \param DataSize  Size in bytes of the CDC functional descriptor's data payload
+		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload
 		 */		
 		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
 		     struct                                        \
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.c
index 0f108c2905f33d7b6dbbac181c38e14556363bbd..f2dc9ffcb6eeb913b7406d9b5dc2a164f4bdf9e0 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.c
@@ -41,8 +41,8 @@
  *  to the output Ethernet frame if the host is requesting the IP or MAC address of the
  *  virtual server device on the network.
  *
- *  \param InDataStart   Pointer to the start of the incoming packet's ARP header
- *  \param OutDataStart  Pointer to the start of the outgoing packet's ARP header
+ *  \param[in] InDataStart    Pointer to the start of the incoming packet's ARP header
+ *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's ARP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.c
index 76711fb4f38ac21970e971b15925ef4d7ad87a3e..4301554bdea0aef5aac423054c42eccf9f091486 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.c
@@ -40,9 +40,9 @@
 /** Processes a DHCP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if the host is requesting or accepting an IP address.
  *
- *  \param IPHeaderInStart     Pointer to the start of the incoming packet's IP header
- *  \param DHCPHeaderInStart   Pointer to the start of the incoming packet's DHCP header
- *  \param DHCPHeaderOutStart  Pointer to the start of the outgoing packet's DHCP header
+ *  \param[in] IPHeaderInStart      Pointer to the start of the incoming packet's IP header
+ *  \param[in] DHCPHeaderInStart    Pointer to the start of the incoming packet's DHCP header
+ *  \param[out] DHCPHeaderOutStart  Pointer to the start of the outgoing packet's DHCP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.c
index 3d34f716a5d993980f654349721e63456696e712..2856131c44b76c5b7f6f8b46f57a2f2523c6e642 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.c
@@ -116,8 +116,8 @@ void Ethernet_ProcessPacket(void)
 /** Calculates the appropriate ethernet checksum, consisting of the addition of the one's
  *  compliment of each word, complimented.
  *
- *  \param Data   Pointer to the packet buffer data whose checksum must be calculated
- *  \param Bytes  Number of bytes in the data buffer to process
+ *  \param[in] Data   Pointer to the packet buffer data whose checksum must be calculated
+ *  \param[in] Bytes  Number of bytes in the data buffer to process
  *
  *  \return A 16-bit Ethernet checksum value
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h b/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h
index b360f07aed1ff21259ee75e4126efaf540adb61b..b91a56ba20ddea8cacb6bcb5fc678eb1bf1ec10b 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h
@@ -58,8 +58,8 @@
 	
 		/** Performs a comparison between two MAC addresses, indicating if they are identical.
 		 *  
-		 *  \param MAC1  First MAC address
-		 *  \param MAC2  Second MAC address
+		 *  \param[in] MAC1  First MAC address
+		 *  \param[in] MAC2  Second MAC address
 		 *
 		 *  \return True if the addresses match, false otherwise
 		 */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c
index da4ffcfa18b8ed5daf2eceffdb7a6c9c381a6dff..6ff33115fd5020040d85a9b2caacb48c5a2272e0 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c
@@ -40,8 +40,8 @@
 /** Processes an ICMP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if the host is issuing a ICMP ECHO request.
  *
- *  \param InDataStart   Pointer to the start of the incoming packet's ICMP header
- *  \param OutDataStart  Pointer to the start of the outgoing packet's ICMP header
+ *  \param[in] InDataStart    Pointer to the start of the incoming packet's ICMP header
+ *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's ICMP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.c
index 8fb0b446d7d5b7e3c56a78f676a88954ec11a80f..2b881572f2a8ac1b18a545cd3b746f274a4a26ed 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.c
@@ -39,8 +39,8 @@
 /** Processes an IP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if one is created by a subprotocol handler.
  *
- *  \param InDataStart   Pointer to the start of the incoming packet's IP header
- *  \param OutDataStart  Pointer to the start of the outgoing packet's IP header
+ *  \param[in] InDataStart    Pointer to the start of the incoming packet's IP header
+ *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's IP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE if no
  *           response was generated, NO_PROCESS if the packet processing was deferred until the
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.h b/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.h
index fc1a46aefc1c7f443d43994bc8e2355c184eae77..5d9f91dad54dabc9ee601c211e2cfdcda5b66a00 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.h
@@ -59,8 +59,8 @@
 		
 		/** Performs a comparison between two IP addresses, indicating if they are identical.
 		 *  
-		 *  \param IP1  First IP address
-		 *  \param IP2  Second IP address
+		 *  \param[in] IP1  First IP address
+		 *  \param[in] IP2  Second IP address
 		 *
 		 *  \return True if the addresses match, false otherwise
 		 */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c
index add0333f214f4a3cc16e351d5d01bdb987c0af18..aac72ae51be0db728b3fd99d4bfd71a3bfd31126 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c
@@ -51,7 +51,7 @@
 
 /** Decodes an Ethernet frame header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an Ethernet frame header
+ *  \param[in] InDataStart  Pointer to the start of an Ethernet frame header
  */
 void DecodeEthernetFrameHeader(void* InDataStart)
 {
@@ -93,7 +93,7 @@ void DecodeEthernetFrameHeader(void* InDataStart)
 
 /** Decodes an ARP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an ARP packet header
+ *  \param[in] InDataStart  Pointer to the start of an ARP packet header
  */
 void DecodeARPHeader(void* InDataStart)
 {
@@ -143,7 +143,7 @@ void DecodeARPHeader(void* InDataStart)
 
 /** Decodes an IP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an IP packet header
+ *  \param[in] InDataStart  Pointer to the start of an IP packet header
  */
 void DecodeIPHeader(void* InDataStart)
 {
@@ -181,7 +181,7 @@ void DecodeIPHeader(void* InDataStart)
 
 /** Decodes an ICMP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of an ICMP packet header
+ *  \param[in] InDataStart  Pointer to the start of an ICMP packet header
  */
 void DecodeICMPHeader(void* InDataStart)
 {
@@ -197,7 +197,7 @@ void DecodeICMPHeader(void* InDataStart)
 
 /** Decodes a TCP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of a TCP packet header
+ *  \param[in] InDataStart  Pointer to the start of a TCP packet header
  */
 void DecodeTCPHeader(void* InDataStart)
 {
@@ -225,7 +225,7 @@ void DecodeTCPHeader(void* InDataStart)
 
 /** Decodes an UDP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of a UDP packet header
+ *  \param[in] InDataStart  Pointer to the start of a UDP packet header
  */
 void DecodeUDPHeader(void* InDataStart)
 {
@@ -243,7 +243,7 @@ void DecodeUDPHeader(void* InDataStart)
 
 /** Decodes an DHCP header and prints its contents to through the USART in a human readable format.
  *
- *  \param InDataStart  Pointer to the start of a DHCP packet header
+ *  \param[in] InDataStart  Pointer to the start of a DHCP packet header
  */
 void DecodeDHCPHeader(void* InDataStart)
 {
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.c
index 8bbc9f2ffe1fcc852f70570cd0f576943d3b9ef4..454d1b495bfc729c23b3d6916a57d95971b61a86 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.c
@@ -232,11 +232,11 @@ void ProcessRNDISControlMessage(void)
 /** Processes RNDIS query commands, retrieving information from the adapter and reporting it back to the host. The requested
  *  parameter is given as an OID value.
  *
- *  \param OId           OId value of the parameter being queried
- *  \param QueryData     Pointer to any extra query data being sent by the host to the device inside the RNDIS message buffer
- *  \param QuerySize     Size in bytes of the extra query data being sent by the host
- *  \param ResponseData  Pointer to the start of the query response inside the RNDIS message buffer
- *  \param ResponseSize  Pointer to the size in bytes of the response data being sent to the host
+ *  \param[in] OId            OId value of the parameter being queried
+ *  \param[in] QueryData      Pointer to any extra query data being sent by the host to the device inside the RNDIS message buffer
+ *  \param[in] QuerySize      Size in bytes of the extra query data being sent by the host
+ *  \param[out] ResponseData  Pointer to the start of the query response inside the RNDIS message buffer
+ *  \param[out] ResponseSize  Pointer to the size in bytes of the response data being sent to the host
  *
  *  \return Boolean true if the query was handled, false otherwise
  */
@@ -364,9 +364,9 @@ static bool ProcessNDISQuery(uint32_t OId, void* QueryData, uint16_t QuerySize,
 /** Processes RNDIS set commands, setting adapter parameters to values given by the host. The requested parameter is given 
  *  as an OID value.
  *
- *  \param OId      OId value of the parameter being set
- *  \param SetData  Pointer to the parameter value in the RNDIS message buffer
- *  \param SetSize  Size in bytes of the parameter value being sent by the host
+ *  \param[in] OId      OId value of the parameter being set
+ *  \param[in] SetData  Pointer to the parameter value in the RNDIS message buffer
+ *  \param[in] SetSize  Size in bytes of the parameter value being sent by the host
  *
  *  \return Boolean true if the set was handled, false otherwise
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
index b7b225a4138110ae7e8b32d3ce94d73a547a170c..b4fc12c934dbbbcd800bb88eadf3a8839dc95555 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
@@ -171,9 +171,9 @@ void TCP_Init(void)
 
 /** Sets the state and callback handler of the given port, specified in big endian to the given state.
  *
- *  \param Port     Port whose state and callback function to set, specified in big endian
- *  \param State    New state of the port, a value from the TCP_PortStates_t enum
- *  \param Handler  Application callback handler for the port
+ *  \param[in] Port     Port whose state and callback function to set, specified in big endian
+ *  \param[in] State    New state of the port, a value from the TCP_PortStates_t enum
+ *  \param[in] Handler  Application callback handler for the port
  *
  *  \return Boolean true if the port state was set, false otherwise (no more space in the port state table)
  */
@@ -220,7 +220,7 @@ bool TCP_SetPortState(uint16_t Port, uint8_t State, void (*Handler)(TCP_Connecti
 
 /** Retrieves the current state of a given TCP port, specified in big endian.
  *
- *  \param Port  TCP port whose state is to be retrieved, given in big-endian
+ *  \param[in] Port  TCP port whose state is to be retrieved, given in big-endian
  *
  *  \return A value from the TCP_PortStates_t enum
  */
@@ -242,10 +242,10 @@ uint8_t TCP_GetPortState(uint16_t Port)
 /** Sets the connection state of the given port, remote address and remote port to the given TCP connection state. If the
  *  connection exists in the connection state table it is updated, otherwise it is created if possible.
  *
- *  \param Port           TCP port of the connection on the device, specified in big endian
- *  \param RemoteAddress  Remote protocol IP address of the connected device
- *  \param RemotePort     TCP port of the remote device in the connection, specified in big endian
- *  \param State          TCP connection state, a value from the TCP_ConnectionStates_t enum
+ *  \param[in] Port           TCP port of the connection on the device, specified in big endian
+ *  \param[in] RemoteAddress  Remote protocol IP address of the connected device
+ *  \param[in] RemotePort     TCP port of the remote device in the connection, specified in big endian
+ *  \param[in] State          TCP connection state, a value from the TCP_ConnectionStates_t enum
  *
  *  \return Boolean true if the connection was updated or created, false otherwise (no more space in the connection state table)
  */
@@ -283,9 +283,9 @@ bool TCP_SetConnectionState(uint16_t Port, IP_Address_t RemoteAddress, uint16_t
 
 /** Retrieves the current state of a given TCP connection to a host.
  *
- *  \param Port           TCP port on the device in the connection, specified in big endian
- *  \param RemoteAddress  Remote protocol IP address of the connected host
- *  \param RemotePort     Remote TCP port of the connected host, specified in big endian
+ *  \param[in] Port           TCP port on the device in the connection, specified in big endian
+ *  \param[in] RemoteAddress  Remote protocol IP address of the connected host
+ *  \param[in] RemotePort     Remote TCP port of the connected host, specified in big endian
  *
  *  \return A value from the TCP_ConnectionStates_t enum
  */
@@ -310,9 +310,9 @@ uint8_t TCP_GetConnectionState(uint16_t Port, IP_Address_t RemoteAddress, uint16
 
 /** Retrieves the connection info structure of a given connection to a host.
  *
- *  \param Port           TCP port on the device in the connection, specified in big endian
- *  \param RemoteAddress  Remote protocol IP address of the connected host
- *  \param RemotePort     Remote TCP port of the connected host, specified in big endian
+ *  \param[in] Port           TCP port on the device in the connection, specified in big endian
+ *  \param[in] RemoteAddress  Remote protocol IP address of the connected host
+ *  \param[in] RemotePort     Remote TCP port of the connected host, specified in big endian
  *
  *  \return ConnectionInfo structure of the connection if found, NULL otherwise
  */
@@ -337,9 +337,9 @@ TCP_ConnectionInfo_t* TCP_GetConnectionInfo(uint16_t Port, IP_Address_t RemoteAd
 /** Processes a TCP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if one is created by a application handler.
  *
- *  \param IPHeaderInStart    Pointer to the start of the incoming packet's IP header
- *  \param TCPHeaderInStart   Pointer to the start of the incoming packet's TCP header
- *  \param TCPHeaderOutStart  Pointer to the start of the outgoing packet's TCP header
+ *  \param[in] IPHeaderInStart     Pointer to the start of the incoming packet's IP header
+ *  \param[in] TCPHeaderInStart    Pointer to the start of the incoming packet's TCP header
+ *  \param[out] TCPHeaderOutStart  Pointer to the start of the outgoing packet's TCP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE if no
  *           response was generated, NO_PROCESS if the packet processing was deferred until the
@@ -579,10 +579,10 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, void* TCPHeaderInStart, void
 /** Calculates the appropriate TCP checksum, consisting of the addition of the one's compliment of each word,
  *  complimented.
  *
- *  \param TCPHeaderOutStart  Pointer to the start of the packet's outgoing TCP header
- *  \param SourceAddress      Source protocol IP address of the outgoing IP header
- *  \param DestinationAddress Destination protocol IP address of the outgoing IP header
- *  \param TCPOutSize         Size in bytes of the TCP data header and payload
+ *  \param[in] TCPHeaderOutStart  Pointer to the start of the packet's outgoing TCP header
+ *  \param[in] SourceAddress      Source protocol IP address of the outgoing IP header
+ *  \param[in] DestinationAddress Destination protocol IP address of the outgoing IP header
+ *  \param[in] TCPOutSize         Size in bytes of the TCP data header and payload
  *
  *  \return A 16-bit TCP checksum value
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h
index 313bd0216b9779b6452567bea1e5ea28869b6291..e98085f29864a7208f67a2c6923506b51a6e1af1 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h
@@ -89,7 +89,7 @@
 		
 		/** Application macro: Determines if the given application buffer contains a packet received from the host
 		 *
-		 *  \param Buffer  Application buffer to check
+		 *  \param[in] Buffer  Application buffer to check
 		 *
 		 *  \return Boolean true if the buffer contains a packet from the host, false otherwise
 		 */
@@ -97,7 +97,7 @@
 
 		/** Application macro: Indicates if the application buffer is currently locked by the application for device-to-host transfers.
 		 *
-		 *  \param Buffer  Application buffer to check
+		 *  \param[in] Buffer  Application buffer to check
 		 *
 		 *  \return Boolean true if the buffer has been captured by the application for device-to-host transmissions, false otherwise
 		 */
@@ -106,7 +106,7 @@
 
 		/** Application macro: Indicates if the application can lock the buffer for multiple continued device-to-host transmissions.
 		 *
-		 *  \param Buffer  Application buffer to check
+		 *  \param[in] Buffer  Application buffer to check
 		 *
 		 *  \return Boolean true if the buffer may be captured by the application for device-to-host transmissions, false otherwise
 		 */
@@ -117,32 +117,32 @@
 		 *
 		 *  \note The application must check that the buffer can be locked first using TCP_APP_CAN_CAPTURE_BUFFER().
 		 *
-		 *  \param Buffer  Application buffer to lock
+		 *  \param[in] Buffer  Application buffer to lock
 		 */
 		#define TCP_APP_CAPTURE_BUFFER(Buffer)       MACROS{ Buffer->Direction = TCP_PACKETDIR_OUT; Buffer->InUse = true; }MACROE
 
 		/** Application macro: Releases a captured application buffer, allowing for host-to-device packets to be received.
 		 *
-		 *  \param Buffer  Application buffer to release
+		 *  \param[in] Buffer  Application buffer to release
 		 */
 		#define TCP_APP_RELEASE_BUFFER(Buffer)       MACROS{ Buffer->InUse = false; }MACROE
 
 		/** Application macro: Sends the contents of the given application buffer to the host.
 		 *
-		 *  \param Buffer  Application buffer to send
-		 *  \param Len     Length of data contained in the buffer
+		 *  \param[in] Buffer  Application buffer to send
+		 *  \param[in] Len     Length of data contained in the buffer
 		 */
 		#define TCP_APP_SEND_BUFFER(Buffer, Len)     MACROS{ Buffer->Direction = TCP_PACKETDIR_OUT; Buffer->Length = Len; Buffer->Ready = true; }MACROE
 
 		/** Application macro: Clears the application buffer, ready for a packet to be written to it.
 		 *
-		 *  \param Buffer  Application buffer to clear
+		 *  \param[in] Buffer  Application buffer to clear
 		 */
 		#define TCP_APP_CLEAR_BUFFER(Buffer)         MACROS{ Buffer->Ready = false; Buffer->Length = 0; }MACROE
 		
 		/** Application macro: Closes an open connection to a host.
 		 *
-		 *  \param Connection  Open TCP connection to close
+		 *  \param[in] Connection  Open TCP connection to close
 		 */
 		#define TCP_APP_CLOSECONNECTION(Connection)  MACROS{ Connection->State = TCP_Connection_Closing;  }MACROE
 
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c
index 1f571c3e995d4e726cc1cb22fa4a7ad6c33be94f..dbd33d15d4ab27f2a74e79f373c43931b74f6236 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c
@@ -40,9 +40,9 @@
 /** Processes a UDP packet inside an Ethernet frame, and writes the appropriate response
  *  to the output Ethernet frame if a subprotocol handler has created a response packet.
  *
- *  \param IPHeaderInStart    Pointer to the start of the incoming packet's IP header
- *  \param UDPHeaderInStart   Pointer to the start of the incoming packet's UDP header
- *  \param UDPHeaderOutStart  Pointer to the start of the outgoing packet's UDP header
+ *  \param[in] IPHeaderInStart     Pointer to the start of the incoming packet's IP header
+ *  \param[in] UDPHeaderInStart    Pointer to the start of the incoming packet's UDP header
+ *  \param[out] UDPHeaderOutStart  Pointer to the start of the outgoing packet's UDP header
  *
  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c
index c07f2c8bd4f669733d5eeba03b077f62e668f3df..8055d91638047ec1e30e1da8a8f5e37ebd0bfb15 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c
@@ -78,8 +78,8 @@ void Webserver_Init(void)
 
 /** Indicates if a given request equals the given HTTP command.
  *
- *  \param RequestHeader  HTTP request made by the host
- *  \param Command        HTTP command to compare the request to
+ *  \param[in] RequestHeader  HTTP request made by the host
+ *  \param[in] Command        HTTP command to compare the request to
  *
  *  \return Boolean true if the command matches the request, false otherwise
  */
@@ -92,8 +92,8 @@ static bool IsHTTPCommand(uint8_t* RequestHeader, char* Command)
 /** Application callback routine, executed each time the TCP processing task runs. This callback determines what request
  *  has been made (if any), and serves up appropriate responses.
  *
- *  \param ConnectionState  Pointer to a TCP Connection State structure giving connection information
- *  \param Buffer           Pointer to the application's send/receive packet buffer
+ *  \param[in] ConnectionState  Pointer to a TCP Connection State structure giving connection information
+ *  \param[in,out] Buffer       Pointer to the application's send/receive packet buffer
  */
 void Webserver_ApplicationCallback(TCP_ConnectionState_t* ConnectionState, TCP_ConnectionBuffer_t* Buffer)
 {
diff --git a/Demos/Device/LowLevel/USBtoSerial/Descriptors.h b/Demos/Device/LowLevel/USBtoSerial/Descriptors.h
index 41b44300acd4c53a8bfa17dd0b219bd4ccb431db..bf9e7df1da5bd87651bc6c37899a7918ec0fd8cb 100644
--- a/Demos/Device/LowLevel/USBtoSerial/Descriptors.h
+++ b/Demos/Device/LowLevel/USBtoSerial/Descriptors.h
@@ -47,7 +47,7 @@
 		 *  a single typedef struct. A macro is used instead so that functional descriptors can be created
 		 *  easily by specifying the size of the payload. This allows sizeof() to work correctly.
 		 *
-		 *  \param DataSize  Size in bytes of the CDC functional descriptor's data payload
+		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload
 		 */
 		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
 		     struct                                        \
diff --git a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
index 5bb89af473348f1512509ea2143b6b3352988eb5..9f7da5998275787a76bce1745abd5407ea2a0b26 100644
--- a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
+++ b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
@@ -164,10 +164,10 @@ void ReadNextReport(void)
 
 /** Writes a report to the attached device.
  *
- *  \param ReportOUTData  Buffer containing the report to send to the device
- *  \param ReportIndex  Index of the report in the device (zero if the device does not use multiple reports)
- *  \param ReportType  Type of report to send, either HID_REPORTTYPE_OUTPUT or HID_REPORTTYPE_FEATURE
- *  \param ReportLength  Length of the report to send
+ *  \param[in] ReportOUTData  Buffer containing the report to send to the device
+ *  \param[in] ReportIndex  Index of the report in the device (zero if the device does not use multiple reports)
+ *  \param[in] ReportType  Type of report to send, either HID_REPORTTYPE_OUTPUT or HID_REPORTTYPE_FEATURE
+ *  \param[in] ReportLength  Length of the report to send
  */
 void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t ReportType, uint16_t ReportLength)
 {
diff --git a/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c
index 54e400ded7407d11b88c5ca9c2e2cadd31395c5b..4e78b0de9134126a9c3c7ba73b5b75ed1962c263 100644
--- a/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c
+++ b/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c
@@ -224,7 +224,7 @@ void Keyboard_HID_Task(void)
 /** Processes a read HID report from an attached keyboard, extracting out elements via the HID parser results
  *  as required and prints pressed characters to the serial port. Each time a key is typed, a board LED is toggled.
  *
- *  \param KeyboardReport  Pointer to a HID report from an attached keyboard device
+ *  \param[in] KeyboardReport  Pointer to a HID report from an attached keyboard device
  */
 void ProcessKeyboardReport(uint8_t* KeyboardReport)
 {
diff --git a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c
index e2a64da90fb7b3a4da88b26da62483c0a7ed8b93..7ee7de138287b82e5bc9e513f793b8d2a4d9351f 100644
--- a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c
+++ b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c
@@ -170,7 +170,7 @@ static uint8_t MassStore_WaitForDataReceived(void)
 /** Sends or receives the transaction's data stage to or from the attached device, reading or
  *  writing to the nominated buffer.
  *
- *  \param  BufferPtr  Pointer to the data buffer to read from or write to
+ *  \param[in,out]  BufferPtr  Pointer to the data buffer to read from or write to
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -269,7 +269,7 @@ uint8_t MassStore_MassStorageReset(void)
 /** Issues a Mass Storage class specific request to determine the index of the highest numbered Logical
  *  Unit in the attached device.
  *
- *  \param MaxLUNIndex  Pointer to the location that the maximum LUN index value should be stored
+ *  \param[out] MaxLUNIndex  Pointer to the location that the maximum LUN index value should be stored
  *
  *  \return A value from the USB_Host_SendControlErrorCodes_t enum
  */
@@ -304,8 +304,8 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
 /** Issues a SCSI Inquiry command to the attached device, to determine the device's information. This
  *  gives information on the device's capabilities.
  *
- *  \param LUNIndex    Index of the LUN inside the device the command is being addressed to
- *  \param InquiryPtr  Pointer to the inquiry data structure where the inquiry data from the device is to be stored
+ *  \param[in] LUNIndex    Index of the LUN inside the device the command is being addressed to
+ *  \param[out] InquiryPtr  Pointer to the inquiry data structure where the inquiry data from the device is to be stored
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -367,8 +367,8 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex, const SCSI_Inquiry_Response_t*
 /** Issues a SCSI Request Sense command to the attached device, to determine the current SCSI sense information. This
  *  gives error codes for the last issued SCSI command to the device.
  *
- *  \param LUNIndex  Index of the LUN inside the device the command is being addressed to
- *  \param SensePtr  Pointer to the sense data structure where the sense data from the device is to be stored
+ *  \param[in] LUNIndex   Index of the LUN inside the device the command is being addressed to
+ *  \param[out] SensePtr  Pointer to the sense data structure where the sense data from the device is to be stored
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -430,11 +430,11 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex, const SCSI_Request_Sense_
 /** Issues a SCSI Device Block Read command to the attached device, to read in one or more data blocks from the
  *  storage medium into a buffer.
  *
- *  \param LUNIndex      Index of the LUN inside the device the command is being addressed to
- *  \param BlockAddress  Start block address to read from
- *  \param Blocks        Number of blocks to read from the device
- *  \param BlockSize     Size in bytes of each block to read
- *  \param BufferPtr     Pointer to the buffer where the read data is to be written to
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to
+ *  \param[in] BlockAddress  Start block address to read from
+ *  \param[in] Blocks        Number of blocks to read from the device
+ *  \param[in] BlockSize     Size in bytes of each block to read
+ *  \param[out] BufferPtr    Pointer to the buffer where the read data is to be written to
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -501,11 +501,11 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAd
 /** Issues a SCSI Device Block Write command to the attached device, to write one or more data blocks to the
  *  storage medium from a buffer.
  *
- *  \param LUNIndex      Index of the LUN inside the device the command is being addressed to
- *  \param BlockAddress  Start block address to write to
- *  \param Blocks        Number of blocks to write to in the device
- *  \param BlockSize     Size in bytes of each block to write
- *  \param BufferPtr     Pointer to the buffer where the write data is to be sourced from
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to
+ *  \param[in] BlockAddress  Start block address to write to
+ *  \param[in] Blocks        Number of blocks to write to in the device
+ *  \param[in] BlockSize     Size in bytes of each block to write
+ *  \param[in] BufferPtr     Pointer to the buffer where the write data is to be sourced from
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -565,7 +565,7 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockA
 /** Issues a SCSI Device Test Unit Ready command to the attached device, to determine if the device is ready to accept
  *  other commands.
  *
- *  \param LUNIndex      Index of the LUN inside the device the command is being addressed to
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -613,8 +613,8 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex)
 /** Issues a SCSI Device Read Capacity command to the attached device, to determine the capacity of the
  *  given Logical Unit within the device.
  *
- *  \param LUNIndex     Index of the LUN inside the device the command is being addressed to
- *  \param CapacityPtr  Device capacity structure where the capacity data is to be stored
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to
+ *  \param[out] CapacityPtr  Device capacity structure where the capacity data is to be stored
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -685,8 +685,8 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, SCSI_Capacity_t* const Ca
  *  being removed. This is a legacy command for SCSI disks with removable storage (such as ZIP disks), but should still
  *  be issued before the first read or write command is sent.
  *
- *  \param LUNIndex        Index of the LUN inside the device the command is being addressed to
- *  \param PreventRemoval  Whether or not the LUN media should be locked to prevent removal or not
+ *  \param[in] LUNIndex        Index of the LUN inside the device the command is being addressed to
+ *  \param[in] PreventRemoval  Whether or not the LUN media should be locked to prevent removal or not
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
diff --git a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h
index 8f3e8a12eae627c4583b1ca863f233987eac8305..f13b4b15af1ae02289e819f8775658c20dec35e8 100644
--- a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h
+++ b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h
@@ -42,7 +42,7 @@
 		#include "MassStorageHost.h"
 		#include "SCSI_Codes.h"
 
-		#include <LUFA/Drivers/USB/USB.h>                    // USB Functionality
+		#include <LUFA/Drivers/USB/USB.h>
 
 	/* Macros: */
 		/** Class specific request to reset the Mass Storage interface of the attached device */
diff --git a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c
index 200c81ad45c3028dff8442b8d5c7358f651d213e..2f84d0fb8307d87d0409fda264f45d0bf95df2e3 100644
--- a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c
+++ b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c
@@ -349,9 +349,9 @@ void MassStorage_Task(void)
  *  printing error codes to the serial port and waiting until the device is removed before
  *  continuing.
  *
- *  \param CommandString  ASCII string located in PROGMEM space indicating what operation failed
- *  \param FailedAtSCSILayer  Indicates if the command failed at the (logical) SCSI layer or at the physical USB layer
- *  \param ErrorCode      Error code of the function which failed to complete successfully
+ *  \param[in] CommandString      ASCII string located in PROGMEM space indicating what operation failed
+ *  \param[in] FailedAtSCSILayer  Indicates if the command failed at the (logical) SCSI layer or at the physical USB layer
+ *  \param[in] ErrorCode          Error code of the function which failed to complete successfully
  */
 void ShowDiskReadError(char* CommandString, bool FailedAtSCSILayer, uint8_t ErrorCode)
 {
diff --git a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.h b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.h
index a5b84c2ebb1902632696186a3d0a7d17bd7d2ac2..1307a1af2ae839db84c7ac606cc1522c96ec568f 100644
--- a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.h
+++ b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.h
@@ -49,12 +49,12 @@
 
 		#include "Lib/MassStoreCommands.h"
 
-		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
-		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/Peripheral/SerialStream.h>        // Serial stream driver
-		#include <LUFA/Drivers/Board/LEDs.h>                     // LEDs driver
-		#include <LUFA/Drivers/Board/Buttons.h>                  // Board Buttons driver
+		#include <LUFA/Version.h>
+		#include <LUFA/Drivers/Misc/TerminalCodes.h>
+		#include <LUFA/Drivers/USB/USB.h>
+		#include <LUFA/Drivers/Peripheral/SerialStream.h>
+		#include <LUFA/Drivers/Board/LEDs.h>
+		#include <LUFA/Drivers/Board/Buttons.h>
 
 	/* Macros: */
 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
diff --git a/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c
index 5f0d35866f8205997f582826d4865189056f293f..d7a947105c8598c1e7a3d3e112c767b36bc7ad8f 100644
--- a/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c
+++ b/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c
@@ -224,7 +224,7 @@ void Mouse_HID_Task(void)
 /** Processes a read HID report from an attached mouse, extracting out elements via the HID parser results
  *  as required and displays movement and button presses on the board LEDs.
  *
- *  \param MouseReport  Pointer to a HID report from an attached mouse device
+ *  \param[in] MouseReport  Pointer to a HID report from an attached mouse device
  */
 void ProcessMouseReport(uint8_t* MouseReport)
 {
diff --git a/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c b/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c
index 8f05e48f4aca3a78ba548531511a4dfc28012008..bf85750844c262d47c46b44bed79924aa54965b8 100644
--- a/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c
+++ b/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c
@@ -190,8 +190,8 @@ uint8_t SImage_RecieveBlockHeader(void)
 
 /** Function to send the given data to the device, after a command block has been issued.
  *
- *  \param Buffer  Source data buffer to send to the device
- *  \param Bytes   Number of bytes to send
+ *  \param[in] Buffer  Source data buffer to send to the device
+ *  \param[in] Bytes   Number of bytes to send
  */
 void SImage_SendData(void* Buffer, uint16_t Bytes)
 {
@@ -211,8 +211,8 @@ void SImage_SendData(void* Buffer, uint16_t Bytes)
 
 /** Function to receive the given data to the device, after a response block has been received.
  *
- *  \param Buffer  Destination data buffer to put read bytes from the device
- *  \param Bytes   Number of bytes to receive
+ *  \param[out] Buffer  Destination data buffer to put read bytes from the device
+ *  \param[in] Bytes    Number of bytes to receive
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
@@ -257,7 +257,7 @@ bool SImage_IsEventReceived(void)
 
 /** Clears the stall condition in the attached device on the nominated endpoint number.
  *
- *  \param EndpointNum  Endpoint number in the attached device whose stall condition is to be cleared
+ *  \param[in] EndpointNum  Endpoint number in the attached device whose stall condition is to be cleared
  *
  *  \return A value from the USB_Host_SendControlErrorCodes_t enum
  */
diff --git a/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.h b/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.h
index ad0ba55a24391993c45cec432deff05ce733c8a0..2674b6aa56ae6400dc0c1347cb89373b863a1574 100644
--- a/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.h
+++ b/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.h
@@ -57,7 +57,7 @@
 		/** Used in the DataLength field of a PIMA container, to give the total container size in bytes for
 		 *  a command container.
 		 *
-		 *  \param params  Number of parameters which are to be sent in the Param field of the container
+		 *  \param[in] params  Number of parameters which are to be sent in the Param field of the container
 		 */
 		#define PIMA_COMMAND_SIZE(params)      ((sizeof(PIMA_SendBlock) - sizeof(PIMA_SendBlock.Params)) + \
 		                                        (params * sizeof(PIMA_SendBlock.Params[0])))
@@ -65,7 +65,7 @@
 		/** Used in the DataLength field of a PIMA container, to give the total container size in bytes for
 		 *  a data container.
 		 *
-		 *  \param datalen  Length in bytes of the data in the container
+		 *  \param[in] datalen  Length in bytes of the data in the container
 		 */
 		#define PIMA_DATA_SIZE(datalen)        ((sizeof(PIMA_SendBlock) - sizeof(PIMA_SendBlock.Params)) + datalen)
 
diff --git a/Demos/Host/LowLevel/StillImageHost/StillImageHost.c b/Demos/Host/LowLevel/StillImageHost/StillImageHost.c
index a337ab0455448e4b87f68dd36d2837e10e42f628..5243871239568f180df0a4f2c57b5037eda31af2 100644
--- a/Demos/Host/LowLevel/StillImageHost/StillImageHost.c
+++ b/Demos/Host/LowLevel/StillImageHost/StillImageHost.c
@@ -327,8 +327,8 @@ void StillImage_Task(void)
 /** Function to convert a given Unicode encoded string to ASCII. This function will only work correctly on Unicode
  *  strings which contain ASCII printable characters only.
  *
- *  \param UnicodeString  Pointer to a Unicode encoded input string
- *  \param Buffer         Pointer to a buffer where the converted ASCII string should be stored
+ *  \param[in] UnicodeString  Pointer to a Unicode encoded input string
+ *  \param[out] Buffer        Pointer to a buffer where the converted ASCII string should be stored
  */
 void UnicodeToASCII(uint8_t* UnicodeString, char* Buffer)
 {
@@ -351,8 +351,8 @@ void UnicodeToASCII(uint8_t* UnicodeString, char* Buffer)
 
 /** Displays a PIMA command error via the device's serial port.
  *
- *  \param ErrorCode          Error code of the function which failed to complete successfully
- *  \param ResponseCodeError  Indicates if the error is due to a command failed indication from the device, or a communication failure
+ *  \param[in] ErrorCode          Error code of the function which failed to complete successfully
+ *  \param[in] ResponseCodeError  Indicates if the error is due to a command failed indication from the device, or a communication failure
  */
 void ShowCommandError(uint8_t ErrorCode, bool ResponseCodeError)
 {
diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h
index 24ba1f68b156cb9b58b8d4efbd44640e3708deac..92f4f22fa8b9bc0df0c81bc4f229a03bfb1418f5 100644
--- a/LUFA/Common/Common.h
+++ b/LUFA/Common/Common.h
@@ -121,7 +121,7 @@
 			 *
 			 *  \ingroup Group_BitManip
 			 *
-			 *  \param Byte   Byte of data whose bits are to be reversed
+			 *  \param[in] Byte   Byte of data whose bits are to be reversed
 			 */
 			static inline uint8_t BitReverse(uint8_t Byte) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
 			static inline uint8_t BitReverse(uint8_t Byte)
@@ -137,7 +137,7 @@
 			 *
 			 *  \ingroup Group_BitManip
 			 *
-			 *  \param Word   Word of data whose bytes are to be swapped
+			 *  \param[in] Word   Word of data whose bytes are to be swapped
 			 */
 			static inline uint16_t SwapEndian_16(uint16_t Word) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
 			static inline uint16_t SwapEndian_16(uint16_t Word)
@@ -149,7 +149,7 @@
 			 *
 			 *  \ingroup Group_BitManip
 			 *
-			 *  \param DWord   Double word of data whose bytes are to be swapped
+			 *  \param[in] DWord   Double word of data whose bytes are to be swapped
 			 */
 			static inline uint32_t SwapEndian_32(uint32_t DWord) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
 			static inline uint32_t SwapEndian_32(uint32_t DWord)
@@ -164,8 +164,8 @@
 			 *
 			 *  \ingroup Group_BitManip
 			 *
-			 *  \param Data   Pointer to a number containing an even number of bytes to be reversed
-			 *  \param Bytes  Length of the data in bytes
+			 *  \param[in,out] Data  Pointer to a number containing an even number of bytes to be reversed
+			 *  \param[in] Bytes  Length of the data in bytes
 			 */
 			static inline void SwapEndian_n(uint8_t* Data, uint8_t Bytes);
 			static inline void SwapEndian_n(uint8_t* Data, uint8_t Bytes)
diff --git a/LUFA/DriverStubs/Dataflash.h b/LUFA/DriverStubs/Dataflash.h
index 41581a730a938312cc45ffc67ff09e1e471174fe..92de426c0f0437de53af2bbaab7640f590d32415 100644
--- a/LUFA/DriverStubs/Dataflash.h
+++ b/LUFA/DriverStubs/Dataflash.h
@@ -85,8 +85,8 @@
 			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
 			 *  are deselected.
 			 *
-			 *  \param PageAddress  Address of the page to manipulate, ranging from
-			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
 			 */
 			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
 			{
@@ -102,8 +102,8 @@
 			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
 			 *  dataflash commands which require a complete 24-byte address.
 			 *
-			 *  \param PageAddress  Page address within the selected dataflash IC
-			 *  \param BufferByte   Address within the dataflash's buffer
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
 			 */
 			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
 			{	
diff --git a/LUFA/Drivers/Board/Dataflash.h b/LUFA/Drivers/Board/Dataflash.h
index 20300930e59cdf74e605a02f40d1153a36108460..57ce92d4ca19a7bda26a065054cf4d6487dabcc2 100644
--- a/LUFA/Drivers/Board/Dataflash.h
+++ b/LUFA/Drivers/Board/Dataflash.h
@@ -86,8 +86,8 @@
 
 				/** Selects the given dataflash chip.
 				 *
-				 *  \param  ChipMask  Mask of the Dataflash IC to select, in the form of DATAFLASH_CHIPn mask (where n is
-				 *          the chip number).
+				 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of DATAFLASH_CHIPn mask (where n is
+				 *              the chip number).
 				 */
 				static inline void Dataflash_SelectChip(uint8_t ChipMask);
 
@@ -105,7 +105,7 @@
 		/* Inline Functions: */
 			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
 			 *
-			 *  \param Byte of data to send to the dataflash
+			 *  \param[in] Byte of data to send to the dataflash
 			 *
 			 *  \return Last response byte from the dataflash
 			 */
@@ -117,7 +117,7 @@
 
 			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
 			 *
-			 *  \param Byte of data to send to the dataflash
+			 *  \param[in] Byte of data to send to the dataflash
 			 */
 			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
 			static inline void Dataflash_SendByte(const uint8_t Byte)
@@ -154,7 +154,7 @@
 			/** Initializes the dataflash driver (including the SPI driver) so that commands and data may be
 			 *  sent to an attached dataflash IC.
 			 *
-			 *  \param PrescalerMask  SPI prescaler mask, see SPI.h documentation
+			 *  \param[in] PrescalerMask  SPI prescaler mask, see SPI.h documentation
 			 */
 			static inline void Dataflash_Init(const uint8_t PrescalerMask)
 			{
@@ -191,16 +191,16 @@
 			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
 			 *  are deselected.
 			 *
-			 *  \param PageAddress  Address of the page to manipulate, ranging from
-			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
 			 */
 			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress);
 
 			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
 			 *  dataflash commands which require a complete 24-byte address.
 			 *
-			 *  \param PageAddress  Page address within the selected dataflash IC
-			 *  \param BufferByte   Address within the dataflash's buffer
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
 			 */
 			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte);
 
diff --git a/LUFA/Drivers/Board/LEDs.h b/LUFA/Drivers/Board/LEDs.h
index f65e67c81d9317f6be7dff6c383e63de11a52d10..9693999942ce80e22ef4f097f6099e45e4a5b14f 100644
--- a/LUFA/Drivers/Board/LEDs.h
+++ b/LUFA/Drivers/Board/LEDs.h
@@ -117,28 +117,28 @@
 
 		/** Turns on the LEDs specified in the given LED mask.
 		 *
-		 *  \param LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
+		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
 		 */
 		static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask);
 
 		/** Turns off the LEDs specified in the given LED mask.
 		 *
-		 *  \param LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
+		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
 		 */
 		static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask);
 
 		/** Turns off all LEDs not specified in the given LED mask, and turns on all the LEDs in the given LED
 		 *  mask.
 		 *
-		 *  \param LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
+		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
 		 */
 		static inline void LEDs_SetAllLEDs(const uint8_t LEDMask);
 
 		/** Turns off all LEDs in the LED mask that are not set in the active mask, and turns on all the LEDs
 		 *  specified in both the LED and active masks.
 		 *
-		 *  \param LEDMask     Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
-		 *  \param ActiveMask  Mask of whether the LEDs in the LED mask should be turned on or off
+		 *  \param[in] LEDMask     Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file)
+		 *  \param[in] ActiveMask  Mask of whether the LEDs in the LED mask should be turned on or off
 		 */
 		static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask);
 
diff --git a/LUFA/Drivers/Board/STK525/Dataflash.h b/LUFA/Drivers/Board/STK525/Dataflash.h
index bc9ab9fbd6d6578e8cb8d9f24e2f9a9878687478..33787569aeb2d2415071cd4d543be5e17eed4ab4 100644
--- a/LUFA/Drivers/Board/STK525/Dataflash.h
+++ b/LUFA/Drivers/Board/STK525/Dataflash.h
@@ -85,8 +85,8 @@
 			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
 			 *  are deselected.
 			 *
-			 *  \param PageAddress  Address of the page to manipulate, ranging from
-			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
 			 */
 			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
 			{
@@ -101,8 +101,8 @@
 			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
 			 *  dataflash commands which require a complete 24-byte address.
 			 *
-			 *  \param PageAddress  Page address within the selected dataflash IC
-			 *  \param BufferByte   Address within the dataflash's buffer
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
 			 */
 			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
 			{	
diff --git a/LUFA/Drivers/Board/STK526/Dataflash.h b/LUFA/Drivers/Board/STK526/Dataflash.h
index cb8193e56af89110697440d3e615fb5f18d19b17..0b388e301e5b4a0d274c92a7160240485506b6d3 100644
--- a/LUFA/Drivers/Board/STK526/Dataflash.h
+++ b/LUFA/Drivers/Board/STK526/Dataflash.h
@@ -85,8 +85,8 @@
 			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
 			 *  are deselected.
 			 *
-			 *  \param PageAddress  Address of the page to manipulate, ranging from
-			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
 			 */
 			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
 			{
@@ -101,8 +101,8 @@
 			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
 			 *  dataflash commands which require a complete 24-byte address.
 			 *
-			 *  \param PageAddress  Page address within the selected dataflash IC
-			 *  \param BufferByte   Address within the dataflash's buffer
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
 			 */
 			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
 			{	
diff --git a/LUFA/Drivers/Board/USBKEY/Dataflash.h b/LUFA/Drivers/Board/USBKEY/Dataflash.h
index d4bfdc9438a9f3766b264ef18c3854643efa81b1..52681dedbd64c487e929da306a75a2f1d8ec22e9 100644
--- a/LUFA/Drivers/Board/USBKEY/Dataflash.h
+++ b/LUFA/Drivers/Board/USBKEY/Dataflash.h
@@ -88,8 +88,8 @@
 			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
 			 *  are deselected.
 			 *
-			 *  \param PageAddress  Address of the page to manipulate, ranging from
-			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
 			 */
 			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
 			{
@@ -107,8 +107,8 @@
 			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
 			 *  dataflash commands which require a complete 24-byte address.
 			 *
-			 *  \param PageAddress  Page address within the selected dataflash IC
-			 *  \param BufferByte   Address within the dataflash's buffer
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
 			 */
 			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
 			{	
diff --git a/LUFA/Drivers/Peripheral/AT90USBXXX67/ADC.h b/LUFA/Drivers/Peripheral/AT90USBXXX67/ADC.h
index 4cc7c32c3bcda26e1fe595ab2f9f809d7c51f2ea..4110a508c7b21a69d0e9eb818967dfec81c93a1a 100644
--- a/LUFA/Drivers/Peripheral/AT90USBXXX67/ADC.h
+++ b/LUFA/Drivers/Peripheral/AT90USBXXX67/ADC.h
@@ -115,7 +115,7 @@
 				 *  The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and
 				 *  prescaler masks.
 				 *
-				 *  \param Mode  Mask of ADC settings, including adjustment, prescale, mode and reference
+				 *  \param[in] Mode  Mask of ADC settings, including adjustment, prescale, mode and reference
 				 */
 				static inline void ADC_Init(uint8_t Mode);
 				
@@ -159,7 +159,7 @@
 			 *  associated port pin as an input and disables the digital portion of the I/O to reduce
 			 *  power consumption.
 			 *
-			 *  \param Channel  ADC channel number to set up for conversions
+			 *  \param[in] Channel  ADC channel number to set up for conversions
 			 */
 			static inline void ADC_SetupChannel(const uint8_t Channel)
 			{
@@ -196,7 +196,7 @@
 			 *  Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and
 			 *  the result read via the \ref ADC_GetResult() macro.
 			 *
-			 *  \param MUXMask  Mask comprising of an ADC channel number, reference mask and adjustment mask
+			 *  \param[in] MUXMask  Mask comprising of an ADC channel number, reference mask and adjustment mask
 			 */
 			static inline void ADC_StartReading(const uint8_t MUXMask)
 			{
@@ -208,7 +208,7 @@
 			/** Performs a complete single reading from channel, including a polling spinloop to wait for the
 			 *  conversion to complete, and the returning of the converted value.
 			 *
-			 *  \param MUXMask  Mask comprising of an ADC channel number, reference mask and adjustment mask
+			 *  \param[in] MUXMask  Mask comprising of an ADC channel number, reference mask and adjustment mask
 			 */
 			static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask) ATTR_WARN_UNUSED_RESULT;
 			static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask)
diff --git a/LUFA/Drivers/Peripheral/SPI.h b/LUFA/Drivers/Peripheral/SPI.h
index 66cdaf513e372cbf0c0f78c6b9cc2f41fb49d4a0..dc8661ad5c1d68947ed08dfb8cd84e3fb3a8de56 100644
--- a/LUFA/Drivers/Peripheral/SPI.h
+++ b/LUFA/Drivers/Peripheral/SPI.h
@@ -90,8 +90,8 @@
 			/** Initializes the SPI subsystem, ready for transfers. Must be called before calling any other
 			 *  SPI routines.
 			 *
-			 *  \param PrescalerMask  Prescaler mask to set the SPI clock speed
-			 *  \param Master         If true, sets the SPI system to use master mode, slave if false
+			 *  \param[in] PrescalerMask  Prescaler mask to set the SPI clock speed
+			 *  \param[in] Master         If true, sets the SPI system to use master mode, slave if false
 			 */
 			static inline void SPI_Init(const uint8_t PrescalerMask, const bool Master)
 			{
@@ -109,7 +109,7 @@
 			
 			/** Sends and receives a byte through the SPI interface, blocking until the transfer is complete.
 			 *
-			 *  \param Byte  Byte to send through the SPI interface
+			 *  \param[in] Byte  Byte to send through the SPI interface
 			 *
 			 *  \return Response byte from the attached SPI device
 			 */
@@ -124,7 +124,7 @@
 			/** Sends a byte through the SPI interface, blocking until the transfer is complete. The response
 			 *  byte sent to from the attached SPI device is ignored.
 			 *
-			 *  \param Byte Byte to send through the SPI interface
+			 *  \param[in] Byte Byte to send through the SPI interface
 			 */
 			static inline void SPI_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
 			static inline void SPI_SendByte(const uint8_t Byte)
diff --git a/LUFA/Drivers/Peripheral/Serial.h b/LUFA/Drivers/Peripheral/Serial.h
index 7e718fe0c273b98798689482832433fd165f1024..82cbcfc2c09677b0c608cb6536420e09a485f088 100644
--- a/LUFA/Drivers/Peripheral/Serial.h
+++ b/LUFA/Drivers/Peripheral/Serial.h
@@ -88,13 +88,13 @@
 		/* Function Prototypes: */
 			/** Transmits a given string located in program space (FLASH) through the USART.
 			 *
-			 *  \param FlashStringPtr  Pointer to a string located in program space
+			 *  \param[in] FlashStringPtr  Pointer to a string located in program space
 			 */
 			void Serial_TxString_P(const char *FlashStringPtr) ATTR_NON_NULL_PTR_ARG(1);
 
 			/** Transmits a given string located in SRAM memory through the USART.
 			 *
-			 *  \param StringPtr  Pointer to a string located in SRAM space
+			 *  \param[in] StringPtr  Pointer to a string located in SRAM space
 			 */
 			void Serial_TxString(const char *StringPtr) ATTR_NON_NULL_PTR_ARG(1);
 
@@ -102,8 +102,8 @@
 			/** Initializes the USART, ready for serial data transmission and reception. This initialises the interface to
 			 *  standard 8-bit, no parity, 1 stop bit settings suitable for most applications.
 			 *
-			 *  \param BaudRate     Serial baud rate, in bits per second
-			 *  \param DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate
+			 *  \param[in] BaudRate     Serial baud rate, in bits per second
+			 *  \param[in] DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate
 			 */
 			static inline void Serial_Init(const uint32_t BaudRate, const bool DoubleSpeed)
 			{
@@ -119,7 +119,7 @@
 
 			/** Transmits a given byte through the USART.
 			 *
-			 *  \param DataByte  Byte to transmit through the USART
+			 *  \param[in] DataByte  Byte to transmit through the USART
 			 */
 			static inline void Serial_TxByte(const char DataByte)
 			{
diff --git a/LUFA/Drivers/Peripheral/SerialStream.h b/LUFA/Drivers/Peripheral/SerialStream.h
index 27531358966ea8abf37a7a053a3c0f39ff1dba7f..d3f0014bc81a61d88b80e6282cea6f2678432612 100644
--- a/LUFA/Drivers/Peripheral/SerialStream.h
+++ b/LUFA/Drivers/Peripheral/SerialStream.h
@@ -79,8 +79,8 @@
 			/** Initializes the serial stream (and regular USART driver) so that both the stream and regular
 			 *  USART driver functions can be used. Must be called before any stream or regular USART functions.
 			 *
-			 *  \param BaudRate     Baud rate to configure the USART to
-			 *  \param DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate
+			 *  \param[in] BaudRate     Baud rate to configure the USART to
+			 *  \param[in] DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate
 			 */
 			static inline void SerialStream_Init(const uint32_t BaudRate, const bool DoubleSpeed)
 			{
diff --git a/LUFA/Drivers/USB/Class/Common/Audio.h b/LUFA/Drivers/USB/Class/Common/Audio.h
index a55fd0d7c36836636cb6dc1d7a0986669e012431..33bc8980e80cd9661c6fd2897c87e076720d7963 100644
--- a/LUFA/Drivers/USB/Class/Common/Audio.h
+++ b/LUFA/Drivers/USB/Class/Common/Audio.h
@@ -201,7 +201,7 @@
 
 		/** Convenience macro, to fill a 24-bit AudioSampleFreq_t structure with the given sample rate as a 24-bit number.
 		 *
-		 *  \param freq  Required audio sampling frequency in HZ
+		 *  \param[in] freq  Required audio sampling frequency in HZ
 		 */
 		#define AUDIO_SAMPLE_FREQ(freq)  {LowWord: ((uint32_t)freq & 0x00FFFF), HighByte: (((uint32_t)freq >> 16) & 0x0000FF)}
 		
diff --git a/LUFA/Drivers/USB/Class/Common/CDC.h b/LUFA/Drivers/USB/Class/Common/CDC.h
index 5138032da198ce4ad376eb1b035e303fd54ae2c5..69803150a80144ca6c5bc83a0525219670a321d6 100644
--- a/LUFA/Drivers/USB/Class/Common/CDC.h
+++ b/LUFA/Drivers/USB/Class/Common/CDC.h
@@ -111,7 +111,7 @@
 		 *  a single typedef struct. A macro is used instead so that functional descriptors can be created
 		 *  easily by specifying the size of the payload. This allows sizeof() to work correctly.
 		 *
-		 *  \param DataSize  Size in bytes of the CDC functional descriptor's data payload
+		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload
 		 */
 		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
 		     struct                                        \
diff --git a/LUFA/Drivers/USB/Class/Common/MIDI.h b/LUFA/Drivers/USB/Class/Common/MIDI.h
index dfeadb05be044224ed9801a35988a26888ecda97..7dfb0e780e155ed34012c14643ae08e90d3c48da 100644
--- a/LUFA/Drivers/USB/Class/Common/MIDI.h
+++ b/LUFA/Drivers/USB/Class/Common/MIDI.h
@@ -71,7 +71,7 @@
 		/** Convenience macro. MIDI channels are numbered from 1-10 (natural numbers) however the logical channel
 		 *  addresses are zero-indexed. This converts a natural MIDI channel number into the logical channel address.
 		 *
-		 *  \param channel  MIDI channel number to address
+		 *  \param[in] channel  MIDI channel number to address
 		 */
 		#define MIDI_CHANNEL(channel)        (channel - 1)
 		
diff --git a/LUFA/Drivers/USB/Class/Device/Audio.c b/LUFA/Drivers/USB/Class/Device/Audio.c
index e398f1c0e76d82e6db9d87d316756561d9b6de59..d117bedf6835ad217b0f02369376eb5b3db456c5 100644
--- a/LUFA/Drivers/USB/Class/Device/Audio.c
+++ b/LUFA/Drivers/USB/Class/Device/Audio.c
@@ -33,7 +33,7 @@
 
 #include "Audio.h"
 
-void Audio_Device_ProcessControlPacket(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo)
+void Audio_Device_ProcessControlPacket(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
 {
 	if (!(Endpoint_IsSETUPReceived()))
 	  return;
@@ -83,7 +83,7 @@ bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* AudioInterfac
 	return true;
 }
 
-void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo)
+void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
 {
 
 }
@@ -124,7 +124,7 @@ int32_t Audio_Device_ReadSample24(void)
 	return Sample;
 }
 
-void Audio_Device_WriteSample8(int8_t Sample)
+void Audio_Device_WriteSample8(const int8_t Sample)
 {
 	Endpoint_Write_Byte(Sample);
 
@@ -132,7 +132,7 @@ void Audio_Device_WriteSample8(int8_t Sample)
 	  Endpoint_ClearIN();
 }
 
-void Audio_Device_WriteSample16(int16_t Sample)
+void Audio_Device_WriteSample16(const int16_t Sample)
 {
 	Endpoint_Write_Word_LE(Sample);
 
@@ -140,7 +140,7 @@ void Audio_Device_WriteSample16(int16_t Sample)
 	  Endpoint_ClearIN();
 }
 
-void Audio_Device_WriteSample24(int32_t Sample)
+void Audio_Device_WriteSample24(const int32_t Sample)
 {
 	Endpoint_Write_Byte(Sample >> 16);
 	Endpoint_Write_Word_LE(Sample);
@@ -149,13 +149,13 @@ void Audio_Device_WriteSample24(int32_t Sample)
 	  Endpoint_ClearIN();
 }
 
-bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo)
+bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
 {
 	Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataOUTEndpointNumber);
 	return Endpoint_IsOUTReceived();
 }
 
-bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo)
+bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
 {
 	Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataINEndpointNumber);
 	return Endpoint_IsINReady();
diff --git a/LUFA/Drivers/USB/Class/Device/Audio.h b/LUFA/Drivers/USB/Class/Device/Audio.h
index faa9c9243fc57e170da7bfe4c1d938d2ec74b306..7ce062437b585b23fd07fdbeea6ee77b544553f3 100644
--- a/LUFA/Drivers/USB/Class/Device/Audio.h
+++ b/LUFA/Drivers/USB/Class/Device/Audio.h
@@ -97,25 +97,25 @@
 			 *  \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the
 			 *  given Audio interface is selected.
 			 *
-			 *  \param AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
 			 *
 			 *  \return Boolean true if the endpoints were sucessfully configured, false otherwise
 			 */
-			bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo);
+			bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
 
 			/** Processes incomming control requests from the host, that are directed to the given Audio class interface. This should be
 			 *  linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
 			 *
-			 *  \param AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
 			 */
-			void Audio_Device_ProcessControlPacket(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo);
+			void Audio_Device_ProcessControlPacket(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
 
 			/** General management task for a given Audio class interface, required for the correct operation of the interface. This should
 			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
 			 *
-			 *  \param AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
 			 */
-			void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo);
+			void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
 			
 			/** Reads the next 8-bit audio sample from the current audio interface.
 			 *
@@ -149,43 +149,43 @@
 			 *  \note This should be preceeded immediately by a call to the USB_Audio_IsReadyForNextSample() function to ensure that
 			 *        the correct endpoint is selected and ready for data.
 			 *
-			 *  \param Sample  Signed 8-bit audio sample
+			 *  \param[in] Sample  Signed 8-bit audio sample
 			 */
-			void Audio_Device_WriteSample8(int8_t Sample);
+			void Audio_Device_WriteSample8(const int8_t Sample);
 
 			/** Writes the next 16-bit audio sample to the current audio interface.
 			 *
 			 *  \note This should be preceeded immediately by a call to the USB_Audio_IsReadyForNextSample() function to ensure that
 			 *        the correct endpoint is selected and ready for data.
 			 *
-			 *  \param Sample  Signed 16-bit audio sample
+			 *  \param[in] Sample  Signed 16-bit audio sample
 			 */
-			void Audio_Device_WriteSample16(int16_t Sample);
+			void Audio_Device_WriteSample16(const int16_t Sample);
 
 			/** Writes the next 24-bit audio sample to the current audio interface.
 			 *
 			 *  \note This should be preceeded immediately by a call to the USB_Audio_IsReadyForNextSample() function to ensure that
 			 *        the correct endpoint is selected and ready for data.
 			 *
-			 *  \param Sample  Signed 24-bit audio sample
+			 *  \param[in] Sample  Signed 24-bit audio sample
 			 */
-			void Audio_Device_WriteSample24(int32_t Sample);
+			void Audio_Device_WriteSample24(const int32_t Sample);
 
 			/** Determines if the given audio interface is ready for a sample to be read from it.
 			 *
-			 *  \param AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
 			 *
 			 *  \return Boolean true if the given Audio interface has a sample to be read, false otherwise
 			 */
-			bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo);
+			bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
 
 			/** Determines if the given audio interface is ready to accept the next sample to be written to it.
 			 *
-			 *  \param AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
 			 *
 			 *  \return Boolean true if the given Audio interface is ready to accept the next sample, false otherwise
 			 */
-			bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* AudioInterfaceInfo);
+			bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
 
 	/* Disable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c
index fc6ea93fb9bda618cf803901f1ca4c867e6adbca..07c05141bd715c902eff63822e7340a89b937fef 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.c
+++ b/LUFA/Drivers/USB/Class/Device/CDC.c
@@ -131,7 +131,7 @@ void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
 	Endpoint_ClearIN();
 }
 
-void CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, char* Data, uint16_t Length)
+void CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, char* const Data, const uint16_t Length)
 {
 	if (!(USB_IsConnected))
 	  return;
@@ -140,7 +140,7 @@ void CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, char* D
 	Endpoint_Write_Stream_LE(Data, Length, NO_STREAM_CALLBACK);
 }
 
-void CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, uint8_t Data)
+void CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data)
 {
 	if (!(USB_IsConnected))
 	  return;
@@ -156,7 +156,7 @@ void CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, uint8_t D
 	Endpoint_Write_Byte(Data);	
 }
 
-uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
+uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 {
 	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpointNumber);
 
@@ -178,7 +178,7 @@ uint8_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
 	return DataByte;
 }
 
-void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
+void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 {
 	if (!(USB_IsConnected))
 	  return;
diff --git a/LUFA/Drivers/USB/Class/Device/CDC.h b/LUFA/Drivers/USB/Class/Device/CDC.h
index 157b35003bc7fcdbf50ff4096e41305411aa4bce..7b232fc8964e1c40d02bd5b2e047320e4d1fd7b4 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.h
+++ b/LUFA/Drivers/USB/Class/Device/CDC.h
@@ -108,34 +108,34 @@
 			 *  \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the
 			 *  given CDC interface is selected.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 *
 			 *  \return Boolean true if the endpoints were sucessfully configured, false otherwise
 			 */
-			bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 
 			/** Processes incomming control requests from the host, that are directed to the given CDC class interface. This should be
 			 *  linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 */
-			void CDC_Device_ProcessControlPacket(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			void CDC_Device_ProcessControlPacket(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 
 			/** General management task for a given CDC class interface, required for the correct operation of the interface. This should
 			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 */
-			void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 
 			/** CDC class driver event for a line encoding change on a CDC interface. This event fires each time the host requests a
 			 *  line encoding change (containing the serial parity, baud and other configuration information) and may be hooked in the
 			 *  user program by declaring a handler function with the same name and parameters listed here. The new line encoding
 			 *  settings are available in the LineEncoding structure inside the CDC interface structure passed as a parameter.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 */
-			void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 			
 			/** CDC class driver event for a control line state change on a CDC interface. This event fires each time the host requests a
 			 *  control line state change (containing the virtual serial control line states, such as DTR) and may be hooked in the
@@ -143,62 +143,62 @@
 			 *  are available in the ControlLineStates.HostToDevice value inside the CDC interface structure passed as a parameter, set as
 			 *  a mask of CDC_CONTROL_LINE_OUT_* masks.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 */		
-			void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 
 			/** Sends a given string to the attached USB host, if connected. If a host is not connected when the function is called, the
 			 *  string is discarded.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
-			 *  \param Data  Pointer to the string to send to the host
-			 *  \param Length  Size in bytes of the string to send to the host
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in] Data  Pointer to the string to send to the host
+			 *  \param[in] Length  Size in bytes of the string to send to the host
 			 */
-			void CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, char* Data, uint16_t Length);
+			void CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, char* const Data, const uint16_t Length);
 			
 			/** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the
 			 *  byte is discarded.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
-			 *  \param Data  Byte of data to send to the host
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in] Data  Byte of data to send to the host
 			 */
-			void CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, uint8_t Data);
+			void CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data);
 			
 			/** Determines the number of bytes received by the CDC interface from the host, waiting to be read.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 *
 			 *  \return Total number of buffered bytes received from the host
 			 */
-			uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 			
 			/** Reads a byte of data from the host. If no data is waiting to be read of if a USB host is not connected, the function
 			 *  returns 0. The USB_CDC_BytesReceived() function should be queried before data is recieved to ensure that no data
 			 *  underflow occurs.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 *
 			 *  \return Next received byte from the host, or 0 if no data received
 			 */
-			uint8_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			uint8_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 			
 			/** Sends a Serial Control Line State Change notification to the host. This should be called when the virtual serial
 			 *  control lines (DCD, DSR, etc.) have changed states, or to give BREAK notfications to the host. Line states persist
 			 *  until they are cleared via a second notification. This should be called each time the CDC class driver's 
 			 *  ControlLineStates.DeviceToHost value is updated to push the new states to the USB host.
 			 *
-			 *  \param CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
 			 */
-			void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo);
+			void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);
 
 	/* Private Interface - For use in library only: */
 	#if !defined(__DOXYGEN__)
 		/* Function Prototypes: */
 			#if defined(INCLUDE_FROM_CDC_CLASS_DEVICE_C)
 				void CDC_Device_Event_Stub(void);
-				void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
+				void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 														  ATTR_WEAK ATTR_ALIAS(CDC_Device_Event_Stub);
-				void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
+				void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 															 ATTR_WEAK ATTR_ALIAS(CDC_Device_Event_Stub);
 			#endif
 
diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c
index c37dc5d5c63c792f9dbd50add07f95b83bd4901c..d0320868f878ae61cda5b5117b5088a04f812036 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.c
+++ b/LUFA/Drivers/USB/Class/Device/HID.c
@@ -33,7 +33,7 @@
 
 #include "HID.h"
 
-void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo)
+void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 {
 	if (!(Endpoint_IsSETUPReceived()))
 	  return;
@@ -130,7 +130,7 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* HIDInterfaceInf
 	}
 }
 
-bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo)
+bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 {
 	HIDInterfaceInfo->State.UsingReportProtocol = true;
 
@@ -143,7 +143,7 @@ bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo)
 	return true;
 }
 		
-void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo)
+void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 {
 	if (!(USB_IsConnected))
 	  return;
diff --git a/LUFA/Drivers/USB/Class/Device/HID.h b/LUFA/Drivers/USB/Class/Device/HID.h
index 61e5eed2812771059e2badf7397387b69b2a6890..984078c3e5be3d70c7d88dfc4edb77859c227ef4 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.h
+++ b/LUFA/Drivers/USB/Class/Device/HID.h
@@ -89,7 +89,7 @@
 			 *  \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration
 			 *  containing the given HID interface is selected.
 			 *
-			 *  \param HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
 			 *
 			 *  \return Boolean true if the endpoints were sucessfully configured, false otherwise
 			 */
@@ -98,14 +98,14 @@
 			/** Processes incomming control requests from the host, that are directed to the given HID class interface. This should be
 			 *  linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
 			 *
-			 *  \param HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
 			 */		
 			void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo);
 
 			/** General management task for a given HID class interface, required for the correct operation of the interface. This should
 			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
 			 *
-			 *  \param HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
 			 */
 			void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo);
 			
@@ -113,11 +113,11 @@
 			 *  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.
 			 *
-			 *  \param HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
-			 *  \param ReportID  If preset to a non-zero value, this is the report ID being requested by the host. If zero, this should
-			 *                   be set to the report ID of the generated HID input report. If multiple reports are not sent via the
-			 *                   given HID interface, this parameter should be ignored.
-			 *  \param ReportData  Pointer to a buffer where the generated HID report should be stored.
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *  \param[in,out] ReportID  If preset to a non-zero value, this is the report ID being requested by the host. If zero, this should
+			 *                 be set to the report ID of the generated HID input report. If multiple reports are not sent via the
+			 *                 given HID interface, this parameter should be ignored.
+			 *  \param[out] ReportData  Pointer to a buffer where the generated HID report should be stored.
 			 *
 			 *  \return  Number of bytes in the generated input report, or zero if no report is to be sent
 			 */
@@ -127,14 +127,14 @@
 			 *  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 processing of the received HID output report from the host.
 			 *
-			 *  \param HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
-			 *  \param ReportID  Report ID of the received output report. If multiple reports are not received via the given HID
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *  \param[in] ReportID  Report ID of the received output report. If multiple reports are not received via the given HID
 			 *                   interface, this parameter should be ignored.
-			 *  \param ReportData  Pointer to a buffer where the received HID report is stored.
-			 *  \param ReportSize  Size in bytes of the received report from the host.
+			 *  \param[in] ReportData  Pointer to a buffer where the received HID report is stored.
+			 *  \param[in] ReportSize  Size in bytes of the received report from the host.
 			 */
-			void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID, void* ReportData,
-													  uint16_t ReportSize);
+			void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, const uint8_t ReportID,
+			                                          const void* ReportData, const uint16_t ReportSize);
 
 	/* Disable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
diff --git a/LUFA/Drivers/USB/Class/Device/MIDI.c b/LUFA/Drivers/USB/Class/Device/MIDI.c
index 0dcc94db9ba8d9e81e5ccf2f7a4241c786b6cc8d..da33bdb610582022dcc47d96c0cf655725b8bf1c 100644
--- a/LUFA/Drivers/USB/Class/Device/MIDI.c
+++ b/LUFA/Drivers/USB/Class/Device/MIDI.c
@@ -33,12 +33,12 @@
 
 #include "MIDI.h"
 
-void MIDI_Device_ProcessControlPacket(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo)
+void MIDI_Device_ProcessControlPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
 {
 
 }
 
-bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo)
+bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
 {
 	if (MIDIInterfaceInfo->Config.DataINEndpointNumber)
 	{
@@ -63,12 +63,12 @@ bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceIn
 	return true;
 }
 
-void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo)
+void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
 {
 
 }
 
-void MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo, MIDI_EventPacket_t* Event)
+void MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, MIDI_EventPacket_t* const Event)
 {
 	if (!(USB_IsConnected))
 	  return;
@@ -82,7 +82,7 @@ void MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo,
 	}
 }
 
-bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo, MIDI_EventPacket_t* Event)
+bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, MIDI_EventPacket_t* const Event)
 {
 	if (!(USB_IsConnected))
 	  return false;
diff --git a/LUFA/Drivers/USB/Class/Device/MIDI.h b/LUFA/Drivers/USB/Class/Device/MIDI.h
index e81089c931a6da33c5f847d8b48377d15cee7324..19ff5d4638223b14b7f1db31fdde149327fdd55e 100644
--- a/LUFA/Drivers/USB/Class/Device/MIDI.h
+++ b/LUFA/Drivers/USB/Class/Device/MIDI.h
@@ -54,12 +54,6 @@
 
 	/* Public Interface - May be used in end-application: */
 		/* Type Define: */
-			/** Configuration information structure for \ref USB_ClassInfo_MIDI_Device_t MIDI device interface structures. */
-			typedef  USB_ClassInfo_MIDI_Device_Config_t;
-	
-			/** Current State information structure for \ref USB_ClassInfo_MIDI_Device_t MIDI device interface structures. */
-			typedef  USB_ClassInfo_MIDI_Device_State_t;
-	
 			/** Class state structure. An instance of this structure should be made for each MIDI interface
 			 *  within the user application, and passed to each of the MIDI class driver functions as the
 			 *  MIDIInterfaceInfo parameter. This stores each MIDI interface's configuration and state information.
@@ -92,41 +86,41 @@
 			 *  \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration
 			 *  containing the given MIDI interface is selected.
 			 *
-			 *  \param MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
 			 *
 			 *  \return Boolean true if the endpoints were sucessfully configured, false otherwise
 			 */
-			bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo);
+			bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo);
 			
 			/** Processes incomming control requests from the host, that are directed to the given MIDI class interface. This should be
 			 *  linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
 			 *
-			 *  \param MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
 			 */		
-			void MIDI_Device_ProcessControlPacket(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo);
+			void MIDI_Device_ProcessControlPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo);
 
 			/** General management task for a given MIDI class interface, required for the correct operation of the interface. This should
 			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
 			 *
-			 *  \param MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
 			 */
-			void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo);
+			void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo);
 
 			/** Sends a MIDI event packet to the host. If no host is connected, the event packet is discarded.
 			 *
-			 *  \param MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
-			 *  \param Event  Pointer to a populated USB_MIDI_EventPacket_t structure containing the MIDI event to send
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[in] Event  Pointer to a populated USB_MIDI_EventPacket_t structure containing the MIDI event to send
 			 */
-			void MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo, MIDI_EventPacket_t* Event);
+			void MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, MIDI_EventPacket_t* const Event);
 
 			/** Receives a MIDI event packet from the host.
 			 *
-			 *  \param MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
-			 *  \param Event  Pointer to a USB_MIDI_EventPacket_t structure where the received MIDI event is to be placed
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[out] Event  Pointer to a USB_MIDI_EventPacket_t structure where the received MIDI event is to be placed
 			 *
 			 *  \return Boolean true if a MIDI event packet was received, false otherwise
 			 */
-			bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* MIDIInterfaceInfo, MIDI_EventPacket_t* Event);
+			bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, MIDI_EventPacket_t* const Event);
 
 	/* Disable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
diff --git a/LUFA/Drivers/USB/Class/Device/MassStorage.c b/LUFA/Drivers/USB/Class/Device/MassStorage.c
index aedab106ff3cb5e8470b15be00a1b16637aa8650..9d73989b70affa9ef9a4db190d6ced6ff5c3b5e5 100644
--- a/LUFA/Drivers/USB/Class/Device/MassStorage.c
+++ b/LUFA/Drivers/USB/Class/Device/MassStorage.c
@@ -36,7 +36,7 @@
 
 static USB_ClassInfo_MS_Device_t* CallbackMSInterfaceInfo;
 
-void MS_Device_ProcessControlPacket(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
+void MS_Device_ProcessControlPacket(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
 {
 	if (!(Endpoint_IsSETUPReceived()))
 	  return;
@@ -75,7 +75,7 @@ void MS_Device_ProcessControlPacket(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 	}
 }
 
-bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
+bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
 {
 	if (!(Endpoint_ConfigureEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber, EP_TYPE_BULK,
 							         ENDPOINT_DIR_IN, MSInterfaceInfo->Config.DataINEndpointSize,
@@ -94,7 +94,7 @@ bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 	return true;
 }
 
-void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
+void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
 {
 	if (!(USB_IsConnected))
 	  return;
@@ -138,7 +138,7 @@ void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 	MSInterfaceInfo->State.IsMassStoreReset = false;
 }
 
-static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
+static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
 {
 	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber);
 
@@ -171,7 +171,7 @@ static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* MSInterfaceI
 	return true;
 }
 
-static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
+static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
 {
 	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber);
 
diff --git a/LUFA/Drivers/USB/Class/Device/MassStorage.h b/LUFA/Drivers/USB/Class/Device/MassStorage.h
index 15be00e09991dc3dee5656e8da2d7c31ed173340..6b139ad5e87bf0aefcc3b97e92f45a8cab4a43a4 100644
--- a/LUFA/Drivers/USB/Class/Device/MassStorage.h
+++ b/LUFA/Drivers/USB/Class/Device/MassStorage.h
@@ -95,43 +95,43 @@
 			 *  \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration
 			 *  containing the given Mass Storage interface is selected.
 			 *
-			 *  \param MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
 			 *
 			 *  \return Boolean true if the endpoints were sucessfully configured, false otherwise
 			 */
-			bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* MSInterfaceInfo);
+			bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo);
 			
 			/** Processes incomming control requests from the host, that are directed to the given Mass Storage class interface. This should be
 			 *  linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
 			 *
-			 *  \param MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
 			 */		
-			void MS_Device_ProcessControlPacket(USB_ClassInfo_MS_Device_t* MSInterfaceInfo);
+			void MS_Device_ProcessControlPacket(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo);
 
 			/** General management task for a given Mass Storage class interface, required for the correct operation of the interface. This should
 			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
 			 *
-			 *  \param MSInterfaceInfo  Pointer to a structure containing a Mass Storage configuration and state.
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage configuration and state.
 			 */
-			void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* MSInterfaceInfo);
+			void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo);
 			
 			/** Mass Storage class driver callback for the user processing of a received SCSI command. This callback will fire each time the
 			 *  host sends a SCSI command which requires processing by the user application. Inside this callback the user is responsible
 			 *  for the processing of the received SCSI command from the host. The SCSI command is available in the CommandBlock structure
 			 *  inside the Mass Storage class state structure passed as a parameter to the callback function.
 			 *
-			 *  \param MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
 			 *
 			 *  \return Boolean true if the SCSI command was successfully processed, false otherwise
 			 */
-			bool CALLBACK_MS_Device_SCSICommandReceived(USB_ClassInfo_MS_Device_t* MSInterfaceInfo);
+			bool CALLBACK_MS_Device_SCSICommandReceived(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo);
 		
 	/* Private Interface - For use in library only: */
 	#if !defined(__DOXYGEN__)
 		/* Function Prototypes: */
 			#if defined(INCLUDE_FROM_MS_CLASS_DEVICE_C)
-				static void    MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* MSInterfaceInfo);
-				static bool    MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* MSInterfaceInfo);
+				static void    MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo);
+				static bool    MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo);
 				static uint8_t StreamCallback_MS_Device_AbortOnMassStoreReset(void);
 			#endif
 		
diff --git a/LUFA/Drivers/USB/Class/Device/RNDIS.c b/LUFA/Drivers/USB/Class/Device/RNDIS.c
index bf753bf99f8096018cdb5d22461339e1bfeb74c0..1b2da6ff3d7758b1f473b3844c18c8cea568c748 100644
--- a/LUFA/Drivers/USB/Class/Device/RNDIS.c
+++ b/LUFA/Drivers/USB/Class/Device/RNDIS.c
@@ -65,7 +65,7 @@ static const uint32_t PROGMEM AdapterSupportedOIDList[]  =
 		OID_802_3_XMIT_MORE_COLLISIONS,
 	};
 
-void RNDIS_Device_ProcessControlPacket(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
+void RNDIS_Device_ProcessControlPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
 {
 	if (!(Endpoint_IsSETUPReceived()))
 	  return;
@@ -110,7 +110,7 @@ void RNDIS_Device_ProcessControlPacket(USB_ClassInfo_RNDIS_Device_t* RNDISInterf
 	}
 }
 
-bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
+bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
 {
 	if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo->Config.DataINEndpointNumber, EP_TYPE_BULK,
 							         ENDPOINT_DIR_IN, RNDISInterfaceInfo->Config.DataINEndpointSize,
@@ -136,7 +136,7 @@ bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* RNDISInterfac
 	return true;
 }
 
-void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
+void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
 {
 	if (!(USB_IsConnected))
 	  return;
@@ -208,7 +208,7 @@ void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
 	}
 }							
 
-void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
+void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
 {
 	/* Note: Only a single buffer is used for both the received message and its response to save SRAM. Because of
 	         this, response bytes should be filled in order so that they do not clobber unread data in the buffer. */
@@ -331,9 +331,9 @@ void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* RNDIS
 	}
 }
 
-static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo,
-                                          uint32_t OId, void* QueryData, uint16_t QuerySize,
-                                          void* ResponseData, uint16_t* ResponseSize)
+static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+                                          const uint32_t OId, void* const QueryData, const uint16_t QuerySize,
+                                          void* ResponseData, uint16_t* const ResponseSize)
 {
 	switch (OId)
 	{
@@ -443,8 +443,8 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* RNDISInt
 	}
 }
 
-static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo, uint32_t OId, void* SetData,
-                                        uint16_t SetSize)
+static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, const uint32_t OId, void* SetData,
+                                        const uint16_t SetSize)
 {
 	switch (OId)
 	{
diff --git a/LUFA/Drivers/USB/Class/Device/RNDIS.h b/LUFA/Drivers/USB/Class/Device/RNDIS.h
index 21fb0940017dcbaac5041f388f89f881d52c492a..a4c2050e9ba22a74ed240704fc81e0e6936c9ba8 100644
--- a/LUFA/Drivers/USB/Class/Device/RNDIS.h
+++ b/LUFA/Drivers/USB/Class/Device/RNDIS.h
@@ -103,36 +103,36 @@
 			 *  \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration
 			 *  containing the given HID interface is selected.
 			 *
-			 *  \param RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
 			 *
 			 *  \return Boolean true if the endpoints were sucessfully configured, false otherwise
 			 */
-			bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo);
+			bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo);
 
 			/** Processes incomming control requests from the host, that are directed to the given RNDIS class interface. This should be
 			 *  linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
 			 *
-			 *  \param RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
 			 */		
-			void RNDIS_Device_ProcessControlPacket(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo);
+			void RNDIS_Device_ProcessControlPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo);
 			
 			/** General management task for a given HID class interface, required for the correct operation of the interface. This should
 			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
 			 *
-			 *  \param RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
 			 */
-			void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo);
+			void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo);
 		
 	/* Private Interface - For use in library only: */
 	#if !defined(__DOXYGEN__)
 		/* Function Prototypes: */
 		#if defined(INCLUDE_FROM_RNDIS_CLASS_DEVICE_C)
-			static void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo);
-			static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo, 
-			                                          uint32_t OId, void* QueryData, uint16_t QuerySize,
-										              void* ResponseData, uint16_t* ResponseSize);
-			static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo, uint32_t OId,
-			                                        void* SetData, uint16_t SetSize);	
+			static void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo);
+			static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, 
+			                                          const uint32_t OId, void* const QueryData, const uint16_t QuerySize,
+										              void* ResponseData, uint16_t* const ResponseSize);
+			static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, const uint32_t OId,
+			                                        void* SetData, const uint16_t SetSize);	
 		#endif
 		
 	#endif
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.h b/LUFA/Drivers/USB/Class/Host/HIDParser.h
index 4acce2462ef65a1cc49fb0093c2a9366ab7b8e6c..f878aa1673ca6ad8e819f33ef916ed089069378d 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.h
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.h
@@ -209,9 +209,9 @@
 			/** Function to process a given HID report returned from an attached device, and store it into a given
 			 *  \ref HID_ReportInfo_t structure.
 			 *
-			 *  \param ReportData  Buffer containing the device's HID report table
-			 *  \param ReportSize  Size in bytes of the HID report table
-			 *  \param ParserData  Pointer to a \ref HID_ReportInfo_t instance for the parser output
+			 *  \param[in] ReportData  Buffer containing the device's HID report table
+			 *  \param[in] ReportSize  Size in bytes of the HID report table
+			 *  \param[out] ParserData  Pointer to a \ref HID_ReportInfo_t instance for the parser output
 			 *
 			 *  \return A value in the \ref HID_Parse_ErrorCodes_t enum
 			 */
@@ -221,8 +221,8 @@
 			/** Extracts the given report item's value out of the given HID report and places it into the Value
 			 *  member of the report item's \ref HID_ReportItem_t structure.
 			 *
-			 *  \param ReportData  Buffer containing an IN or FEATURE report from an attached device
-			 *  \param ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array
+			 *  \param[in] ReportData  Buffer containing an IN or FEATURE report from an attached device
+			 *  \param[in,out] ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array
 			 *
 			 *  \returns Boolean true if the item to retrieve was located in the given report, false otherwise
 			 */
@@ -236,8 +236,8 @@
 			 *
 			 *  If the device has multiple HID reports, the report ID is set to the report ID of the given item.
 			 *
-			 *  \param ReportData  Buffer holding the current OUT report data
-			 *  \param ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array
+			 *  \param[out] ReportData  Buffer holding the current OUT report data
+			 *  \param[in] ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array
 			 */
 			void USB_SetHIDReportItemInfo(uint8_t* ReportData, const HID_ReportItem_t* ReportItem)
 			                              ATTR_NON_NULL_PTR_ARG(1, 2);
diff --git a/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h b/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h
index 17b6378e93fa76f91f8ceb168fb45e625dace286..a9b0b14230a1a2cd9dd3ea21a1f9ebaa2c7656ff 100644
--- a/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h
+++ b/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h
@@ -133,9 +133,9 @@
 			 *
 			 *  \note This function is available in USB Host mode only.
 			 *
-			 *  \param BytesRem  Pointer to an int storing the remaining bytes in the configuration descriptor
-			 *  \param CurrConfigLoc  Pointer to the current position in the configuration descriptor
-			 *  \param ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor
+			 *  \param[in,out] BytesRem  Pointer to an int storing the remaining bytes in the configuration descriptor
+			 *  \param[in,out] CurrConfigLoc  Pointer to the current position in the configuration descriptor
+			 *  \param[in] ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor
 			 *
 			 *  \return Value of one of the members of the \ref DSearch_Comp_Return_ErrorCodes_t enum
 			 *
@@ -183,17 +183,17 @@
 		/* Function Prototypes: */
 			/** Retrieves the configuration descriptor data or size from an attached device via a standard request.
 			 *
-			 *  \param ConfigNumber  Device configuration descriptor number to fetch from the device (usually set to 1 for
-			 *                       single configuration devices)
+			 *  \param[in] ConfigNumber  Device configuration descriptor number to fetch from the device (usually set to 1 for
+			 *                           single configuration devices)
 			 *
-			 *  \param ConfigSizePtr  Pointer to a uint16_t for either storing or retrieving the configuration
-			 *         descriptor size
+			 *  \param[in,out] ConfigSizePtr  Pointer to a uint16_t for either storing or retrieving the configuration
+			 *                                descriptor size
 			 *
-			 *  \param BufferPtr  Pointer to the buffer for storing the configuration descriptor data. If this is
-			 *                    NULL, the size of the configuration descriptor will be retrieved instead and
-			 *                    placed in the variable pointed to by ConfigSizePtr. If this is non-NULL, the number
-			 *                    of bytes indicated by ConfigSizePtr of the configuration descriptor will be loaded
-			 *                    into the buffer
+			 *  \param[out] BufferPtr  Pointer to the buffer for storing the configuration descriptor data. If this is
+			 *                         NULL, the size of the configuration descriptor will be retrieved instead and
+			 *                         placed in the variable pointed to by ConfigSizePtr. If this is non-NULL, the number
+			 *                         of bytes indicated by ConfigSizePtr of the configuration descriptor will be loaded
+			 *                         into the buffer
 			 */
 			uint8_t USB_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr, void* BufferPtr)
 			                                      ATTR_NON_NULL_PTR_ARG(2);
@@ -201,9 +201,9 @@
 			/** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value.
 			 *  The bytes remaining value is automatically decremented.
 			 *
-			 * \param BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
-			 * \param CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
-			 * \param Type  Descriptor type value to search for
+			 * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+			 * \param[in] Type  Descriptor type value to search for
 			 */
 			void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
 			                                 uint8_t** const CurrConfigLoc,
@@ -215,10 +215,10 @@
 			 *  descriptor is reached first, the number of bytes remaining to process is set to zero and the
 			 *  function exits. The bytes remaining value is automatically decremented.
 			 *
-			 * \param BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
-			 * \param CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
-			 * \param Type  Descriptor type value to search for
-			 * \param BeforeType  Descriptor type value which must not be reached before the given Type descriptor
+			 * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+			 * \param[in] Type  Descriptor type value to search for
+			 * \param[in] BeforeType  Descriptor type value which must not be reached before the given Type descriptor
 			 */
 			void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
 			                                       uint8_t** const CurrConfigLoc,
@@ -230,10 +230,10 @@
 			 *  which must come after a descriptor of the second given type value. The bytes remaining value is
 			 *  automatically decremented.
 			 *
-			 * \param BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
-			 * \param CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
-			 * \param Type  Descriptor type value to search for
-			 * \param AfterType  Descriptor type value which must be reached before the given Type descriptor
+			 * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+			 * \param[in] Type  Descriptor type value to search for
+			 * \param[in] AfterType  Descriptor type value which must be reached before the given Type descriptor
 			 */
 			void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
 			                                      uint8_t** const CurrConfigLoc,
@@ -245,8 +245,8 @@
 			/** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then
 			    points to the next sub-descriptor. The bytes remaining value is automatically decremented.
 			 *
-			 * \param BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
-			 * \param CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+			 * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
 			 */
 			static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
 			                                         uint8_t** const CurrConfigLoc) 
diff --git a/LUFA/Drivers/USB/HighLevel/Events.h b/LUFA/Drivers/USB/HighLevel/Events.h
index 7f369bc630c7ec02464583185c9c47f2c381eca9..2df0dda08d43fbf4f691bfc346959f667906c80c 100644
--- a/LUFA/Drivers/USB/HighLevel/Events.h
+++ b/LUFA/Drivers/USB/HighLevel/Events.h
@@ -127,7 +127,7 @@
 			 *
 			 *  \note This event only exists on USB AVR models which support dual role modes.
 			 *
-			 *  \param ErrorCode  Error code indicating the failure reason, a value in \ref USB_InitErrorCodes_t
+			 *  \param[in] ErrorCode  Error code indicating the failure reason, a value in \ref USB_InitErrorCodes_t
 			 */
 			void EVENT_USB_InitFailure(const uint8_t ErrorCode);
 
@@ -146,7 +146,7 @@
 			/** Event for USB host error. This event fires when a hardware fault has occurred whilst the USB
 			 *  interface is in host mode.
 			 *
-			 *  \param ErrorCode  Error code indicating the failure reason, a value in \ref USB_Host_ErrorCodes_t
+			 *  \param[in] ErrorCode  Error code indicating the failure reason, a value in \ref USB_Host_ErrorCodes_t
 			 *
 			 *  \note This event only exists on USB AVR models which supports host mode.
 			 *
@@ -185,12 +185,12 @@
 			/** Event for USB device enumeration failure. This event fires when a the USB interface is
 			 *  in host mode, and an attached USB device has failed to enumerate completely.
 			 *
-			 *  \param ErrorCode  Error code indicating the failure reason, a value in 
-			 *                    \ref USB_Host_EnumerationErrorCodes_t
+			 *  \param[in] ErrorCode  Error code indicating the failure reason, a value in 
+			 *                        \ref USB_Host_EnumerationErrorCodes_t
 			 *
-			 *  \param SubErrorCode  Sub error code indicating the reason for failure - for example, if the
-			 *                       ErrorCode parameter indicates a control error, this will give the error
-			 *                       code returned by the \ref USB_Host_SendControlRequest() function.
+			 *  \param[in] SubErrorCode  Sub error code indicating the reason for failure - for example, if the
+			 *                           ErrorCode parameter indicates a control error, this will give the error
+			 *                           code returned by the \ref USB_Host_SendControlRequest() function.
 			 *
 			 *  \note This event only exists on USB AVR models which supports host mode.
 			 *
diff --git a/LUFA/Drivers/USB/LowLevel/Device.h b/LUFA/Drivers/USB/LowLevel/Device.h
index 6661b9e0ce974903674597bb6832896e393c38f7..470c317a04d42fdaef1fe82a158bbcbf16da7b23 100644
--- a/LUFA/Drivers/USB/LowLevel/Device.h
+++ b/LUFA/Drivers/USB/LowLevel/Device.h
@@ -124,15 +124,15 @@
 			 *  index and language ID. This function MUST be overridden in the user application (added with full, identical  
 			 *  prototype and name so that the library can call it to retrieve descriptor data.
 			 *
-			 *  \param wValue             The type of the descriptor to retrieve in the upper byte, and the index in the 
-			 *                            lower byte (when more than one descriptor of the given type exists, such as the
-			 *                            case of string descriptors). The type may be one of the standard types defined
-			 *                            in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.
-			 *  \param wIndex             The language ID of the string to return if the wValue type indicates DTYPE_String,
-			 *                            otherwise zero for standard descriptors, or as defined in a class-specific
-			 *                            standards.
-			 *  \param DescriptorAddress  Pointer to the descriptor in memory. This should be set by the routine to
-			 *                            the address of the descriptor.
+			 *  \param[in] wValue  The type of the descriptor to retrieve in the upper byte, and the index in the 
+			 *                     lower byte (when more than one descriptor of the given type exists, such as the
+			 *                     case of string descriptors). The type may be one of the standard types defined
+			 *                     in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.
+			 *  \param[in] wIndex  The language ID of the string to return if the wValue type indicates DTYPE_String,
+			 *                     otherwise zero for standard descriptors, or as defined in a class-specific
+			 *                     standards.
+			 *  \param[out] DescriptorAddress  Pointer to the descriptor in memory. This should be set by the routine to
+			 *                                 the address of the descriptor.
 			 *
 			 *  \note By default, the library expects all descriptors to be located in flash memory via the PROGMEM attribute.
 			 *        If descriptors should be located in RAM or EEPROM instead (to speed up access in the case of RAM, or to
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c
index dca7554978d1d31e4aa4aec5f605a83771079702..1ff66ddfaa76c668ccdc266c83777e550bc2db5f 100644
--- a/LUFA/Drivers/USB/LowLevel/Endpoint.c
+++ b/LUFA/Drivers/USB/LowLevel/Endpoint.c
@@ -119,6 +119,46 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length
 	if ((ErrorCode = Endpoint_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Endpoint_IsReadWriteAllowed()))
+					{
+						Endpoint_ClearOUT();
+
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return ENDPOINT_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Endpoint_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					Endpoint_Discard_Byte();
+			case 7: Endpoint_Discard_Byte();
+			case 6: Endpoint_Discard_Byte();
+			case 5: Endpoint_Discard_Byte();
+			case 4: Endpoint_Discard_Byte();
+			case 3: Endpoint_Discard_Byte();
+			case 2: Endpoint_Discard_Byte();
+			case 1:	Endpoint_Discard_Byte();
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Endpoint_IsReadWriteAllowed()))
@@ -155,6 +195,46 @@ uint8_t Endpoint_Write_Stream_LE(const void* Buffer, uint16_t Length
 	if ((ErrorCode = Endpoint_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Endpoint_IsReadWriteAllowed()))
+					{
+						Endpoint_ClearIN();
+
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return ENDPOINT_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Endpoint_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					Endpoint_Write_Byte(*(DataStream++));
+			case 7: Endpoint_Write_Byte(*(DataStream++));
+			case 6: Endpoint_Write_Byte(*(DataStream++));
+			case 5: Endpoint_Write_Byte(*(DataStream++));
+			case 4: Endpoint_Write_Byte(*(DataStream++));
+			case 3: Endpoint_Write_Byte(*(DataStream++));
+			case 2: Endpoint_Write_Byte(*(DataStream++));
+			case 1:	Endpoint_Write_Byte(*(DataStream++));
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Endpoint_IsReadWriteAllowed()))
@@ -175,7 +255,7 @@ uint8_t Endpoint_Write_Stream_LE(const void* Buffer, uint16_t Length
 			Length--;
 		}
 	}
-	
+
 	return ENDPOINT_RWSTREAM_NoError;
 }
 
@@ -191,6 +271,46 @@ uint8_t Endpoint_Write_Stream_BE(const void* Buffer, uint16_t Length
 	if ((ErrorCode = Endpoint_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Endpoint_IsReadWriteAllowed()))
+					{
+						Endpoint_ClearIN();
+
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return ENDPOINT_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Endpoint_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					Endpoint_Write_Byte(*(DataStream--));
+			case 7: Endpoint_Write_Byte(*(DataStream--));
+			case 6: Endpoint_Write_Byte(*(DataStream--));
+			case 5: Endpoint_Write_Byte(*(DataStream--));
+			case 4: Endpoint_Write_Byte(*(DataStream--));
+			case 3: Endpoint_Write_Byte(*(DataStream--));
+			case 2: Endpoint_Write_Byte(*(DataStream--));
+			case 1:	Endpoint_Write_Byte(*(DataStream--));
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Endpoint_IsReadWriteAllowed()))
@@ -211,7 +331,7 @@ uint8_t Endpoint_Write_Stream_BE(const void* Buffer, uint16_t Length
 			Length--;
 		}
 	}
-	
+
 	return ENDPOINT_RWSTREAM_NoError;
 }
 
@@ -227,6 +347,46 @@ uint8_t Endpoint_Read_Stream_LE(void* Buffer, uint16_t Length
 	if ((ErrorCode = Endpoint_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Endpoint_IsReadWriteAllowed()))
+					{
+						Endpoint_ClearOUT();
+
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return ENDPOINT_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Endpoint_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					*(DataStream++) = Endpoint_Read_Byte();
+			case 7: *(DataStream++) = Endpoint_Read_Byte();
+			case 6: *(DataStream++) = Endpoint_Read_Byte();
+			case 5: *(DataStream++) = Endpoint_Read_Byte();
+			case 4: *(DataStream++) = Endpoint_Read_Byte();
+			case 3: *(DataStream++) = Endpoint_Read_Byte();
+			case 2: *(DataStream++) = Endpoint_Read_Byte();
+			case 1:	*(DataStream++) = Endpoint_Read_Byte();
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Endpoint_IsReadWriteAllowed()))
@@ -247,7 +407,7 @@ uint8_t Endpoint_Read_Stream_LE(void* Buffer, uint16_t Length
 			Length--;
 		}
 	}
-	
+
 	return ENDPOINT_RWSTREAM_NoError;
 }
 
@@ -263,6 +423,46 @@ uint8_t Endpoint_Read_Stream_BE(void* Buffer, uint16_t Length
 	if ((ErrorCode = Endpoint_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Endpoint_IsReadWriteAllowed()))
+					{
+						Endpoint_ClearOUT();
+
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return ENDPOINT_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Endpoint_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					*(DataStream--) = Endpoint_Read_Byte();
+			case 7: *(DataStream--) = Endpoint_Read_Byte();
+			case 6: *(DataStream--) = Endpoint_Read_Byte();
+			case 5: *(DataStream--) = Endpoint_Read_Byte();
+			case 4: *(DataStream--) = Endpoint_Read_Byte();
+			case 3: *(DataStream--) = Endpoint_Read_Byte();
+			case 2: *(DataStream--) = Endpoint_Read_Byte();
+			case 1:	*(DataStream--) = Endpoint_Read_Byte();
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Endpoint_IsReadWriteAllowed()))
@@ -283,7 +483,7 @@ uint8_t Endpoint_Read_Stream_BE(void* Buffer, uint16_t Length
 			Length--;
 		}
 	}
-	
+
 	return ENDPOINT_RWSTREAM_NoError;
 }
 #endif
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.h b/LUFA/Drivers/USB/LowLevel/Endpoint.h
index 2c7a064e56f01017135dce656611cb8b7711aef5..772d1feed310d82c9843989df7a1aa29c48edb19 100644
--- a/LUFA/Drivers/USB/LowLevel/Endpoint.h
+++ b/LUFA/Drivers/USB/LowLevel/Endpoint.h
@@ -117,13 +117,13 @@
 			
 			/** Maximum size in bytes of a given endpoint.
 			 *
-			 *  \param n  Endpoint number, a value between 0 and (ENDPOINT_TOTAL_ENDPOINTS - 1)
+			 *  \param[in] n  Endpoint number, a value between 0 and (ENDPOINT_TOTAL_ENDPOINTS - 1)
 			 */				
 			#define ENDPOINT_MAX_SIZE(n)                  _ENDPOINT_GET_MAXSIZE(n)
 
 			/** Indicates if the given endpoint supports double banking.
 			 *
-			 *  \param n  Endpoint number, a value between 0 and (ENDPOINT_TOTAL_ENDPOINTS - 1)
+			 *  \param[in] n  Endpoint number, a value between 0 and (ENDPOINT_TOTAL_ENDPOINTS - 1)
 			 */				
 			#define ENDPOINT_DOUBLEBANK_SUPPORTED(n)      _ENDPOINT_GET_DOUBLEBANK(n)
 
@@ -169,14 +169,14 @@
 				 *  Any endpoint operations which do not require the endpoint number to be indicated will operate on
 				 *  the currently selected endpoint.
 				 *
-				 *  \param EndpointNumber Endpoint number to select
+				 *  \param[in] EndpointNumber Endpoint number to select
 				 */
 				static inline void Endpoint_SelectEndpoint(uint8_t EndpointNumber);
 				
 				/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
 				 *  In and Out pointers to the bank's contents.
 				 *
-				 *  \param EndpointNumber Endpoint number whose FIFO buffers are to be reset
+				 *  \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset
 				 */
 				static inline void Endpoint_ResetFIFO(uint8_t EndpointNumber);
 				
@@ -227,7 +227,7 @@
 				/** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
 				 *  endpoints).
 				 *
-				 *  \param EndpointNumber  Index of the endpoint whose interrupt flag should be tested
+				 *  \param[in] EndpointNumber  Index of the endpoint whose interrupt flag should be tested
 				 *
 				 *  \return Boolean true if the specified endpoint has interrupted, false otherwise
 				 */
@@ -454,7 +454,7 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Byte  Next byte to write into the the currently selected endpoint's FIFO buffer
+			 *  \param[in] Byte  Next byte to write into the the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_Byte(const uint8_t Byte)
@@ -515,7 +515,7 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Word  Next word to write to the currently selected endpoint's FIFO buffer
+			 *  \param[in] Word  Next word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_Word_LE(const uint16_t Word)
@@ -529,7 +529,7 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Word  Next word to write to the currently selected endpoint's FIFO buffer
+			 *  \param[in] Word  Next word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_Word_BE(const uint16_t Word)
@@ -604,7 +604,7 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param DWord  Next double word to write to the currently selected endpoint's FIFO buffer
+			 *  \param[in] DWord  Next double word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_DWord_LE(const uint32_t DWord)
@@ -620,7 +620,7 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param DWord  Next double word to write to the currently selected endpoint's FIFO buffer
+			 *  \param[in] DWord  Next double word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_DWord_BE(const uint32_t DWord)
@@ -722,8 +722,8 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Length    Number of bytes to send via the currently selected endpoint.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[in] Length    Number of bytes to send via the currently selected endpoint.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -748,9 +748,9 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer    Pointer to the source data buffer to read from.
-			 *  \param Length    Number of bytes to read for the currently selected endpoint into the buffer.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[in] Buffer    Pointer to the source data buffer to read from.
+			 *  \param[in] Length    Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -775,9 +775,9 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer    Pointer to the source data buffer to read from.
-			 *  \param Length    Number of bytes to read for the currently selected endpoint into the buffer.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[in] Buffer    Pointer to the source data buffer to read from.
+			 *  \param[in] Length    Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -802,9 +802,9 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer    Pointer to the destination data buffer to write to.
-			 *  \param Length    Number of bytes to send via the currently selected endpoint.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[out] Buffer    Pointer to the destination data buffer to write to.
+			 *  \param[in] Length    Number of bytes to send via the currently selected endpoint.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -829,9 +829,9 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer    Pointer to the destination data buffer to write to.
-			 *  \param Length    Number of bytes to send via the currently selected endpoint.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[out] Buffer    Pointer to the destination data buffer to write to.
+			 *  \param[in] Length    Number of bytes to send via the currently selected endpoint.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -855,8 +855,8 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer  Pointer to the source data buffer to read from.
-			 *  \param Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 			 *
 			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 			 */
@@ -874,8 +874,8 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer  Pointer to the source data buffer to read from.
-			 *  \param Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 			 *
 			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 			 */
@@ -893,8 +893,8 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer  Pointer to the destination data buffer to write to.
-			 *  \param Length  Number of bytes to send via the currently selected endpoint.
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in] Length  Number of bytes to send via the currently selected endpoint.
 			 *
 			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 			 */
@@ -912,8 +912,8 @@
 			 *
 			 *  \ingroup Group_EndpointRW
 			 *
-			 *  \param Buffer  Pointer to the destination data buffer to write to.
-			 *  \param Length  Number of bytes to send via the currently selected endpoint.
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in] Length  Number of bytes to send via the currently selected endpoint.
 			 *
 			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 			 */
diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h
index 26e2d7675c40d0e6d7c5ad33d204e3cf6e43b6fe..08b21f688f9580bf1f39d0bf3ad033f0dc4bb34d 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.h
+++ b/LUFA/Drivers/USB/LowLevel/Host.h
@@ -182,7 +182,7 @@
 			 *
 			 *  \note After this routine returns, the control pipe will be selected.
 			 *
-			 *  \param ConfigNumber  Configuration index to send to the device
+			 *  \param[in] ConfigNumber  Configuration index to send to the device
 			 *
 			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
 			 */
@@ -194,8 +194,8 @@
 			 *
 			 *  \note After this routine returns, the control pipe will be selected.
 			 *
-			 *  \param DeviceDescriptorPtr  Pointer to the destination device descriptor structure where
-			 *                              the read data is to be stored
+			 *  \param[out] DeviceDescriptorPtr  Pointer to the destination device descriptor structure where
+			 *                                   the read data is to be stored
 			 *
 			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
 			 */
@@ -205,7 +205,7 @@
 			 *
 			 *  \note After this routine returns, the control pipe will be selected.
 			 *
-			 *  \param EndpointIndex  Index of the endpoint to clear
+			 *  \param[in] EndpointIndex  Index of the endpoint to clear
 			 *
 			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
 			 */			
diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.h b/LUFA/Drivers/USB/LowLevel/HostChapter9.h
index 1e3f7b25812dbb9337fa355b55935e8dbe86ec18..3fa5277a3b18718e23500b5398a00af27ad16c02 100644
--- a/LUFA/Drivers/USB/LowLevel/HostChapter9.h
+++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.h
@@ -71,8 +71,8 @@
 			 *
 			 *  \ingroup Group_PipeControlReq
 			 *
-			 *  \param BufferPtr  Pointer to the start of the data buffer if the request has a data stage, or
-			 *                    NULL if the request transfers no data to or from the device.
+			 *  \param[in] BufferPtr  Pointer to the start of the data buffer if the request has a data stage, or
+			 *                        NULL if the request transfers no data to or from the device.
 			 *
 			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
 			 */
diff --git a/LUFA/Drivers/USB/LowLevel/LowLevel.h b/LUFA/Drivers/USB/LowLevel/LowLevel.h
index 14d10c77651906b08299a466c5d98695243cb0fd..df1fa0bcc3f7b1be66dc46d0af8b9ed6043f4c0f 100644
--- a/LUFA/Drivers/USB/LowLevel/LowLevel.h
+++ b/LUFA/Drivers/USB/LowLevel/LowLevel.h
@@ -228,14 +228,14 @@
 			 *  Calling this function when the USB interface is already initialized will cause a complete USB
 			 *  interface reset and re-enumeration.
 			 *
-			 *  \param Mode     This is a mask indicating what mode the USB interface is to be initialized to.
-			 *                  Valid mode masks are \ref USB_MODE_DEVICE, \ref USB_MODE_HOST or \ref USB_MODE_UID.
+			 *  \param[in] Mode     This is a mask indicating what mode the USB interface is to be initialized to.
+			 *                      Valid mode masks are \ref USB_MODE_DEVICE, \ref USB_MODE_HOST or \ref USB_MODE_UID.
 			 *
-			 *  \param Options  Mask indicating the options which should be used when initializing the USB
-			 *                  interface to control the USB interface's behaviour. This should be comprised of
-			 *                  a USB_OPT_REG_* mask to control the regulator, a USB_OPT_*_PLL mask to control the
-			 *                  PLL, and a USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
-			 *                  mode speed.
+			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
+			 *                      interface to control the USB interface's behaviour. This should be comprised of
+			 *                      a USB_OPT_REG_* mask to control the regulator, a USB_OPT_*_PLL mask to control the
+			 *                      PLL, and a USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
+			 *                      mode speed.
 			 *
 			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required, 
 			 *        this can be statically set via defining the token USB_DEVICE_ONLY for device mode or 
diff --git a/LUFA/Drivers/USB/LowLevel/OTG.h b/LUFA/Drivers/USB/LowLevel/OTG.h
index d3dee96f3d444c337532131848a13f67f6323ff7..d95488e3ce9eab06dd11b9a51404df180db24974 100644
--- a/LUFA/Drivers/USB/LowLevel/OTG.h
+++ b/LUFA/Drivers/USB/LowLevel/OTG.h
@@ -102,7 +102,7 @@
 				 *  There are two different methods of sending a SRP - either pulses on the VBUS line, or by
 				 *  pulsing the Data + line via the internal pull-up resistor.
 				 *
-				 *  \param SRPTypeMask  Mask indicating the type of SRP to use, either \ref USB_OTG_SRP_VBUS or \ref USB_OTG_STP_DATA.
+				 *  \param[in] SRPTypeMask  Mask indicating the type of SRP to use, either \ref USB_OTG_SRP_VBUS or \ref USB_OTG_STP_DATA.
 				 */
 				static inline void USB_OTG_Dev_InitiateSRP(uint8_t SRPTypeMask);
 			#else
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c
index 1376de49524d5fd3533a765f19818962183c8a44..ab092796ccfe5e4959d3428d8011a76490fc6ca5 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.c
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.c
@@ -120,6 +120,46 @@ uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length
 	if ((ErrorCode = Pipe_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Pipe_IsReadWriteAllowed()))
+					{
+						Pipe_ClearOUT();
+							
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return PIPE_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Pipe_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					Pipe_Write_Byte(*(DataStream++));
+			case 7: Pipe_Write_Byte(*(DataStream++));
+			case 6: Pipe_Write_Byte(*(DataStream++));
+			case 5: Pipe_Write_Byte(*(DataStream++));
+			case 4: Pipe_Write_Byte(*(DataStream++));
+			case 3: Pipe_Write_Byte(*(DataStream++));
+			case 2: Pipe_Write_Byte(*(DataStream++));
+			case 1: Pipe_Write_Byte(*(DataStream++));
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+	
 	while (Length)
 	{
 		if (!(Pipe_IsReadWriteAllowed()))
@@ -158,6 +198,46 @@ uint8_t Pipe_Write_Stream_BE(const void* Data, uint16_t Length
 	if ((ErrorCode = Pipe_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Pipe_IsReadWriteAllowed()))
+					{
+						Pipe_ClearOUT();
+							
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return PIPE_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Pipe_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					Pipe_Write_Byte(*(DataStream--));
+			case 7: Pipe_Write_Byte(*(DataStream--));
+			case 6: Pipe_Write_Byte(*(DataStream--));
+			case 5: Pipe_Write_Byte(*(DataStream--));
+			case 4: Pipe_Write_Byte(*(DataStream--));
+			case 3: Pipe_Write_Byte(*(DataStream--));
+			case 2: Pipe_Write_Byte(*(DataStream--));
+			case 1: Pipe_Write_Byte(*(DataStream--));
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Pipe_IsReadWriteAllowed()))
@@ -195,6 +275,46 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 	if ((ErrorCode = Pipe_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Pipe_IsReadWriteAllowed()))
+					{
+						Pipe_ClearIN();
+							
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return PIPE_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Pipe_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					Pipe_Discard_Byte();
+			case 7: Pipe_Discard_Byte();
+			case 6: Pipe_Discard_Byte();
+			case 5: Pipe_Discard_Byte();
+			case 4: Pipe_Discard_Byte();
+			case 3: Pipe_Discard_Byte();
+			case 2: Pipe_Discard_Byte();
+			case 1:	Pipe_Discard_Byte();
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Pipe_IsReadWriteAllowed()))
@@ -233,6 +353,46 @@ uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length
 	if ((ErrorCode = Pipe_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Pipe_IsReadWriteAllowed()))
+					{
+						Pipe_ClearIN();
+							
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return PIPE_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Pipe_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					*(DataStream++) = Pipe_Read_Byte();
+			case 7: *(DataStream++) = Pipe_Read_Byte();
+			case 6: *(DataStream++) = Pipe_Read_Byte();
+			case 5: *(DataStream++) = Pipe_Read_Byte();
+			case 4: *(DataStream++) = Pipe_Read_Byte();
+			case 3: *(DataStream++) = Pipe_Read_Byte();
+			case 2: *(DataStream++) = Pipe_Read_Byte();
+			case 1:	*(DataStream++) = Pipe_Read_Byte();
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Pipe_IsReadWriteAllowed()))
@@ -271,6 +431,46 @@ uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length
 	if ((ErrorCode = Pipe_WaitUntilReady()))
 	  return ErrorCode;
 
+	#if defined(FAST_STREAM_TRANSFERS)
+	uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
+
+	if (Length >= 8)
+	{
+		Length -= BytesRemToAlignment;
+
+		switch (BytesRemToAlignment)
+		{
+			default:
+				do
+				{
+					if (!(Pipe_IsReadWriteAllowed()))
+					{
+						Pipe_ClearIN();
+							
+						#if !defined(NO_STREAM_CALLBACKS)
+						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
+						  return PIPE_RWSTREAM_CallbackAborted;
+						#endif
+
+						if ((ErrorCode = Pipe_WaitUntilReady()))
+						  return ErrorCode;
+					}
+
+					Length -= 8;
+					
+					*(DataStream--) = Pipe_Read_Byte();
+			case 7: *(DataStream--) = Pipe_Read_Byte();
+			case 6: *(DataStream--) = Pipe_Read_Byte();
+			case 5: *(DataStream--) = Pipe_Read_Byte();
+			case 4: *(DataStream--) = Pipe_Read_Byte();
+			case 3: *(DataStream--) = Pipe_Read_Byte();
+			case 2: *(DataStream--) = Pipe_Read_Byte();
+			case 1:	*(DataStream--) = Pipe_Read_Byte();
+				} while (Length >= 8);	
+		}
+	}
+	#endif
+
 	while (Length)
 	{
 		if (!(Pipe_IsReadWriteAllowed()))
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h
index 30e0fde90da168d4d9cbd3c742c187d3a49a77da..cf61eeae028c7a48c4268309a094c31006f1a628 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.h
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.h
@@ -187,13 +187,13 @@
 				/** Selects the given pipe number. Any pipe operations which do not require the pipe number to be
 				 *  indicated will operate on the currently selected pipe.
 				 *
-				 *  \param PipeNumber  Index of the pipe to select
+				 *  \param[in] PipeNumber  Index of the pipe to select
 				 */
 				static inline void Pipe_SelectPipe(uint8_t PipeNumber);
 				
 				/** Resets the desired pipe, including the pipe banks and flags.
 				 *
-				 *  \param PipeNumber  Index of the pipe to reset
+				 *  \param[in] PipeNumber  Index of the pipe to reset
 				 */
 				static inline void Pipe_ResetPipe(uint8_t PipeNumber);
 				
@@ -226,7 +226,7 @@
 				 *  control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
 				 *  which have two endpoints of opposite direction sharing the same endpoint address within the device.
 				 *
-				 *  \param Token  New pipe token to set the selected pipe to, as a PIPE_TOKEN_* mask
+				 *  \param[in] Token  New pipe token to set the selected pipe to, as a PIPE_TOKEN_* mask
 				 */
 				static inline void Pipe_SetPipeToken(uint8_t Token);
 				
@@ -236,7 +236,7 @@
 				/** Configures the currently selected pipe to only allow the specified number of IN requests to be
 				 *  accepted by the pipe before it is automatically frozen.
 				 *
-				 *  \param TotalINRequests  Total number of IN requests that the pipe may receive before freezing
+				 *  \param[in] TotalINRequests  Total number of IN requests that the pipe may receive before freezing
 				 */
 				static inline void Pipe_SetFiniteINRequests(uint8_t TotalINRequests);
 
@@ -248,7 +248,7 @@
 				
 				/** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
 				 *
-				 *  \param Milliseconds  Number of milliseconds between each pipe poll
+				 *  \param[in] Milliseconds  Number of milliseconds between each pipe poll
 				 */
 				static inline void Pipe_SetInterruptPeriod(uint8_t Milliseconds);
 				
@@ -262,7 +262,7 @@
 				/** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type
 				 *  pipes).
 				 *
-				 *  \param PipeNumber  Index of the pipe whose interrupt flag should be tested
+				 *  \param[in] PipeNumber  Index of the pipe whose interrupt flag should be tested
 				 *
 				 *  \return Boolean true if the specified pipe has interrupted, false otherwise
 				 */
@@ -516,7 +516,7 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Byte  Next byte to write into the the currently selected pipe's FIFO buffer
+			 *  \param[in] Byte  Next byte to write into the the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_Byte(const uint8_t Byte)
@@ -577,7 +577,7 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Word  Next word to write to the currently selected pipe's FIFO buffer
+			 *  \param[in] Word  Next word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_Word_LE(const uint16_t Word)
@@ -591,7 +591,7 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Word  Next word to write to the currently selected pipe's FIFO buffer
+			 *  \param[in] Word  Next word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_Word_BE(const uint16_t Word)
@@ -666,7 +666,7 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param DWord  Next double word to write to the currently selected pipe's FIFO buffer
+			 *  \param[in] DWord  Next double word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_DWord_LE(const uint32_t DWord)
@@ -680,7 +680,7 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param DWord  Next double word to write to the currently selected pipe's FIFO buffer
+			 *  \param[in] DWord  Next double word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_DWord_BE(const uint32_t DWord)
@@ -771,9 +771,9 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Buffer    Pointer to the source data buffer to read from.
-			 *  \param Length    Number of bytes to read for the currently selected pipe into the buffer.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[in] Buffer    Pointer to the source data buffer to read from.
+			 *  \param[in] Length    Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -798,9 +798,9 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Buffer    Pointer to the source data buffer to read from.
-			 *  \param Length    Number of bytes to read for the currently selected pipe into the buffer.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[in] Buffer    Pointer to the source data buffer to read from.
+			 *  \param[in] Length    Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -825,8 +825,8 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Length  Number of bytes to send via the currently selected pipe.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[in] Length  Number of bytes to send via the currently selected pipe.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -851,9 +851,9 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Buffer    Pointer to the source data buffer to write to.
-			 *  \param Length    Number of bytes to read for the currently selected pipe to read from.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[out] Buffer    Pointer to the source data buffer to write to.
+			 *  \param[in] Length    Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
 			 */
@@ -878,9 +878,9 @@
 			 *
 			 *  \ingroup Group_PipeRW
 			 *
-			 *  \param Buffer    Pointer to the source data buffer to write to.
-			 *  \param Length    Number of bytes to read for the currently selected pipe to read from.
-			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
+			 *  \param[out] Buffer    Pointer to the source data buffer to write to.
+			 *  \param[in] Length    Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in] Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
 			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
 			 */
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index fd066d0b3c0f2827351c9ae4c31fe8b7067d9b3a..5163ee65912b8dee0c9741a2e6fc680b398e07b0 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -19,6 +19,7 @@
   *  - Add standardized descriptor names to class driver structures, controlled by USE_NONSTANDARD_DESCRIPTOR_NAMES
   *  - Update Host mode Class Driver demo .txt files
   *  - Debug mode for pipe/endpoint calls
+  *  - Test and document new FAST_STREAM_TRANSFERS compile time option
   *
   *  <b>Targeted for Future Releases:</b>
   *  - Remake AVRStudio project files
diff --git a/LUFA/ManPages/LibraryApps.txt b/LUFA/ManPages/LibraryApps.txt
index 3a6fecc1d1dd4e2a559f690c7c3bb519e9153c61..5b25c89be95a73d58df4416bbce50201a93a88c7 100644
--- a/LUFA/ManPages/LibraryApps.txt
+++ b/LUFA/ManPages/LibraryApps.txt
@@ -9,6 +9,9 @@
  *  The LUFA library ships with several different host and device demos, located in the /Demos/ subdirectory.
  *  If this directory is missing, please re-download the project from the project homepage. Within this directory the demos
  *  are seperated by USB mode (Device, Host, OTG) and further seperated by the use or non-use of the library USB Class drivers.
+ *  With one or two exceptions (e.g. proprietary classes such as RNDIS) all the included demos will work across all OSes without
+ *  the need for special drivers. One Windows, some demos require the supplied .INF file to be used as the device driver, which
+ *  directs the OS to use its inbuilt class drivers for the device.
  *
  *  Also included with the library are three fully functional bootloaders, located in the /Bootloaders/ subdirectory.
  *  The DFU class bootloader is compatible with Atmel's FLIP software or the open source dfu-programmer project, the
diff --git a/LUFA/ManPages/Licence.txt b/LUFA/ManPages/Licence.txt
index 120e937ae6363d325a14f220de8a25162de9ae60..36f0267f17b78d16a6b7fe0e67345c5b12e5cbe3 100644
--- a/LUFA/ManPages/Licence.txt
+++ b/LUFA/ManPages/Licence.txt
@@ -5,7 +5,7 @@
  */
 
 /**
- *  \page Page_Licence licence
+ *  \page Page_Licence Source Code Licence
  *
  *  The LUFA library is currently released under the MIT licence, included below.
  *
diff --git a/LUFA/Scheduler/Scheduler.h b/LUFA/Scheduler/Scheduler.h
index 44e6bb06c1d384aac601cdc664671ef4081c50ef..51679eba3d3c2153b7a1d5bf10717506416ffe07 100644
--- a/LUFA/Scheduler/Scheduler.h
+++ b/LUFA/Scheduler/Scheduler.h
@@ -196,7 +196,7 @@
 			/** Resets the delay counter value to the current tick count. This should be called to reset the period
 			 *  for a delay in a task which is dependant on the current tick value.
 			 *
-			 *  \param DelayCounter  Counter which is storing the starting tick count for a given delay.
+			 *  \param[out] DelayCounter  Counter which is storing the starting tick count for a given delay.
 			 */
 			static inline void Scheduler_ResetDelay(SchedulerDelayCounter_t* const DelayCounter)
 			                                        ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
@@ -211,8 +211,8 @@
 		/* Function Prototypes: */
 			/** Determines if the given tick delay has elapsed, based on the given .
 			 *
-			 *  \param Delay         The delay to test for, measured in ticks
-			 *  \param DelayCounter  The counter which is storing the starting tick value for the delay
+			 *  \param[in] Delay         The delay to test for, measured in ticks
+			 *  \param[in] DelayCounter  The counter which is storing the starting tick value for the delay
 			 *
 			 *  \return Boolean true if the delay has elapsed, false otherwise
 			 *
@@ -233,16 +233,16 @@
 			
 			/** Sets the task mode for a given task.
 			 *
-			 *  \param Task        Name of the task whose status is to be changed
-			 *  \param TaskStatus  New task status for the task (TASK_RUN or TASK_STOP)
+			 *  \param[in] Task        Name of the task whose status is to be changed
+			 *  \param[in] TaskStatus  New task status for the task (TASK_RUN or TASK_STOP)
 			 */
 			void Scheduler_SetTaskMode(const TaskPtr_t Task, const bool TaskStatus);
 			
 			/** Sets the task mode for a given task group ID, allowing for an entire group of tasks to have their
 			 *  statuses changed at once.
 			 *
-			 *  \param GroupID     Value of the task group ID whose status is to be changed
-			 *  \param TaskStatus  New task status for tasks in the specified group (TASK_RUN or TASK_STOP)
+			 *  \param[in] GroupID     Value of the task group ID whose status is to be changed
+			 *  \param[in] TaskStatus  New task status for tasks in the specified group (TASK_RUN or TASK_STOP)
 			 */
 			void Scheduler_SetGroupTaskMode(const uint8_t GroupID, const bool TaskStatus);
 
diff --git a/Projects/Magstripe/Lib/CircularBitBuffer.h b/Projects/Magstripe/Lib/CircularBitBuffer.h
index 6f1fa1508f1942513311fbb44379b6138e2f2055..ffbdc86c6b749d21276ab898a9c2d79ac2525412 100644
--- a/Projects/Magstripe/Lib/CircularBitBuffer.h
+++ b/Projects/Magstripe/Lib/CircularBitBuffer.h
@@ -73,20 +73,20 @@
 	/* Function Prototypes: */	
 		/** Initializes or resets a given bit buffer, ready to store new bits.
 		 *  
-		 *  \param Buffer  Bit buffer to initialize
+		 *  \param[in,out] Buffer  Bit buffer to initialize
 		 */
 		void BitBuffer_Init(BitBuffer_t* Buffer) ATTR_NON_NULL_PTR_ARG(1);
 		
 		/** Stores a bit into the next location inside a given bit buffer.
 		 *
-		 *  \param Buffer  Bit buffer to store a bit into
-		 *  \param Bit  Bit to store into the buffer
+		 *  \param[in,out] Buffer  Bit buffer to store a bit into
+		 *  \param[in] Bit  Bit to store into the buffer
 		 */
 		void BitBuffer_StoreNextBit(BitBuffer_t* Buffer, bool Bit) ATTR_NON_NULL_PTR_ARG(1);
 		
 		/** Retrieves a bit from the next location inside a given bit buffer.
 		 *
-		 *  \param Buffer  Bit buffer to store a bit into
+		 *  \param[in,out] Buffer  Bit buffer to store a bit into
 		 *
 		 *  \return Next bit from the buffer
 		 */
diff --git a/Projects/Magstripe/Magstripe.c b/Projects/Magstripe/Magstripe.c
index 1963973b45419c2c0db545318b06f2b2560ab47d..ec2313c0471ed7fe9170eb01922ffd47238e06e4 100644
--- a/Projects/Magstripe/Magstripe.c
+++ b/Projects/Magstripe/Magstripe.c
@@ -160,9 +160,9 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 
 /** HID Class driver callback function for the creation of a HID report for the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID interface structure for the HID interface being referenced
- *  \param ReportID  Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
- *  \param ReportData  Pointer to the preallocated report buffer where the created report should be stored
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID interface structure for the HID interface being referenced
+ *  \param[in,out] ReportID      Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
+ *  \param[out] ReportData       Pointer to the preallocated report buffer where the created report should be stored
  *
  *  \return Number of bytes in the created report
  */
@@ -209,10 +209,10 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* HIDInte
 
 /** HID Class driver callback function for the processing of a received HID report from the host.
  *
- *  \param HIDInterfaceInfo  Pointer to the HID interface structure for the HID interface being referenced
- *  \param ReportID  Report ID of the received report from the host
- *  \param ReportData  Pointer to the report buffer where the received report is stored
- *  \param ReportSize  Size in bytes of the report received from the host
+ *  \param[in] HIDInterfaceInfo  Pointer to the HID interface structure for the HID interface being referenced
+ *  \param[in] ReportID          Report ID of the received report from the host
+ *  \param[in] ReportData        Pointer to the report buffer where the received report is stored
+ *  \param[in] ReportSize        Size in bytes of the report received from the host
  */
 void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo, uint8_t ReportID,
                                           void* ReportData, uint16_t ReportSize)
diff --git a/Projects/MissileLauncher/MissileLauncher.c b/Projects/MissileLauncher/MissileLauncher.c
index bd542ee45002f1422c799beb3ecabd351b64454a..192ca3340ab1ce33d1b350c6c361b3ce8b3ff84c 100644
--- a/Projects/MissileLauncher/MissileLauncher.c
+++ b/Projects/MissileLauncher/MissileLauncher.c
@@ -154,8 +154,8 @@ void Read_Joystick_Status(void)
 
 /** Lower level send routine, copies report into a larger buffer and sends.
  *
- *  \param Report  Report data to send.
- *  \param ReportSize  Report length in bytes.
+ *  \param[in] Report  Report data to send.
+ *  \param[in] ReportSize  Report length in bytes.
  */
 void Send_Command_Report(uint8_t *Report, uint16_t ReportSize)
 {
@@ -163,9 +163,9 @@ void Send_Command_Report(uint8_t *Report, uint16_t ReportSize)
 	WriteNextReport(CmdBuffer, ReportSize);
 }
 
-/** Send one of the CMD_* command constants listed above.
+/** Sends one of the CMD_* command constants to the attached device.
  *
- *  \param Command  One of the command constants.
+ *  \param[in] Command  One of the command constants.
  */
 void Send_Command(uint8_t* Command)
 {
@@ -248,8 +248,8 @@ void DiscardNextReport(void)
 
 /** Writes a report to the attached device.
  *
- *  \param ReportOUTData  Buffer containing the report to send to the device
- *  \param ReportLength  Length of the report to send
+ *  \param[in] ReportOUTData  Buffer containing the report to send to the device
+ *  \param[in] ReportLength  Length of the report to send
  */
 void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength)
 {