diff --git a/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c b/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c
index bf39420ee29639e37f713056490a479eeda5d6fb..24701087ba85f8caff45494186588118cd04d877 100644
--- a/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c
+++ b/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c
@@ -132,15 +132,14 @@ int main(void)
 					{
 						HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
 						
+						/* Update the report item value if it is contained within the current report */
+						if (!(USB_GetHIDReportItemInfo(JoystickReport, ReportItem)))
+						  continue;
+
+						/* Determine what report item is being tested, process updated value as needed */
 						if ((ReportItem->Attributes.Usage.Page        == USAGE_PAGE_BUTTON) &&
 							(ReportItem->ItemType                     == REPORT_ITEM_TYPE_In))
 						{
-							/* Get the joystick button value if it is contained within the current report, if not,
-							 * skip to the next item in the parser list
-							 */
-							if (!(USB_GetHIDReportItemInfo(JoystickReport, ReportItem)))
-							  continue;
-
 							if (ReportItem->Value)
 							  LEDMask = LEDS_ALL_LEDS;
 						}
@@ -149,12 +148,6 @@ int main(void)
 								  (ReportItem->Attributes.Usage.Usage == USAGE_Y))                 &&
 								 (ReportItem->ItemType                == REPORT_ITEM_TYPE_In))
 						{
-							/* Get the joystick relative position value if it is contained within the current 
-							 * report, if not, skip to the next item in the parser list
-							 */
-							if (!(USB_GetHIDReportItemInfo(JoystickReport, ReportItem)))
-							  continue;							  
-
 							int16_t DeltaMovement = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));
 							
 							if (ReportItem->Attributes.Usage.Usage == USAGE_X)
diff --git a/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c
index 8fe3edefebf2731c21041ea7beebf3832782b872..78ec56aa321759e94b1833bcb5331fa072d82b1d 100644
--- a/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c
+++ b/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c
@@ -130,18 +130,16 @@ int main(void)
 					{
 						HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
 
-						/* Check if the current report item is a keyboard scancode */
+						/* Update the report item value if it is contained within the current report */
+						if (!(USB_GetHIDReportItemInfo(KeyboardReport, ReportItem)))
+						  continue;
+
+						/* Determine what report item is being tested, process updated value as needed */
 						if ((ReportItem->Attributes.Usage.Page      == USAGE_PAGE_KEYBOARD) &&
 							(ReportItem->Attributes.BitSize         == 8)                   &&
 							(ReportItem->Attributes.Logical.Maximum > 1)                    &&
 							(ReportItem->ItemType                   == REPORT_ITEM_TYPE_In))
 						{
-							/* Retrieve the keyboard scancode from the report data retrieved from the device if it is
-							 * contained within the current report, if not, skip to the next item in the parser list
-							 */
-							if (!(USB_GetHIDReportItemInfo(KeyboardReport, ReportItem)))
-							  continue;
-
 							/* Key code is an unsigned char in length, cast to the appropriate type */
 							uint8_t KeyCode = (uint8_t)ReportItem->Value;
 
diff --git a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
index db176e580d24d2fd411c0cae3fb70d9f21714950..b6411858abf79d44dcaf9575f5eda586c74a0f9b 100644
--- a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
+++ b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
@@ -132,15 +132,14 @@ int main(void)
 					{
 						HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
 						
+						/* Update the report item value if it is contained within the current report */
+						if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))
+						  continue;
+						
+						/* Determine what report item is being tested, process updated value as needed */
 						if ((ReportItem->Attributes.Usage.Page        == USAGE_PAGE_BUTTON) &&
 							(ReportItem->ItemType                     == REPORT_ITEM_TYPE_In))
 						{
-							/* Get the mouse button value if it is contained within the current report, if not,
-							 * skip to the next item in the parser list
-							 */
-							if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))
-							  continue;
-
 							if (ReportItem->Value)
 							  LEDMask = LEDS_ALL_LEDS;
 						}
@@ -148,12 +147,6 @@ int main(void)
 								 (ReportItem->Attributes.Usage.Usage  == USAGE_SCROLL_WHEEL)       &&
 								 (ReportItem->ItemType                == REPORT_ITEM_TYPE_In))
 						{
-							/* Get the mouse wheel value if it is contained within the current 
-							 * report, if not, skip to the next item in the parser list
-							 */
-							if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))
-							  continue;							  
-
 							int16_t WheelDelta = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));
 							
 							if (WheelDelta)
@@ -164,12 +157,6 @@ int main(void)
 								  (ReportItem->Attributes.Usage.Usage == USAGE_Y))                 &&
 								 (ReportItem->ItemType                == REPORT_ITEM_TYPE_In))
 						{
-							/* Get the mouse relative position value if it is contained within the current 
-							 * report, if not, skip to the next item in the parser list
-							 */
-							if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))
-							  continue;							  
-
 							int16_t DeltaMovement = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));
 							
 							if (ReportItem->Attributes.Usage.Usage == USAGE_X)
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.c b/LUFA/Drivers/USB/Class/Host/HIDParser.c
index 3ef9c7812912df4ff4169f4ecc30a86b07dd19e0..6c81ae8e502bc2333f6eaaf81a90a708adb74ae5 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.c
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.c
@@ -340,8 +340,10 @@ uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData, const uint8_t
 {
 	for (uint8_t i = 0; i < HID_MAX_REPORT_IDS; i++)
 	{
+		uint16_t ReportSizeBits = ParserData->ReportIDSizes[i].ReportSizeBits[ReportType];
+	
 		if (ParserData->ReportIDSizes[i].ReportID == ReportID)
-		  return ParserData->ReportIDSizes[i].ReportSizeBits[ReportType];
+		  return ((ReportSizeBits >> 3) + ((ReportSizeBits & 0x07) ? 1 : 0));
 	}
 
 	return 0;
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.h b/LUFA/Drivers/USB/Class/Host/HIDParser.h
index 53601ec617fcad378f67dd271547967733d5fa18..b7225f332974d8d8e63d54e443d5a32ffba46760 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.h
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.h
@@ -215,7 +215,7 @@
 			typedef struct
 			{
 				uint8_t                      ReportID; /** Report ID of the report within the HID interface */
-				uint8_t                      ReportSizeBits[3]; /** Total number of bits in each report type for the given Report ID,
+				uint16_t                     ReportSizeBits[3]; /** Total number of bits in each report type for the given Report ID,
 				                                                 *  indexed by the \ref HID_ReportItemTypes_t enum
 																 */
 			} HID_ReportSizeInfo_t;
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 9f9157de5d711761f07441591ed1824cc67d483c..1b5ede67bbc984c0500996e91438ea2444f664b8 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -57,6 +57,7 @@
   *  - Fixed incorrect values of USB_CONFIG_ATTR_SELFPOWERED and USB_CONFIG_ATTR_REMOTEWAKEUP tokens (thanks to Claus Christensen)
   *  - Fixed SerialStream driver blocking while waiting for characters to be received instead of returning EOF
   *  - Fixed SerialStream driver not setting stdin to the created serial stream
+  *  - Fixed USB_GetHIDReportSize() returning the number of bits in the specified report instead of bytes
   *
   *  \section Sec_ChangeLog091223 Version 091223
   *
diff --git a/LUFA/ManPages/LUFAPoweredProjects.txt b/LUFA/ManPages/LUFAPoweredProjects.txt
index e7561e603ac70b09bb0a486528b96cde8c7f61b6..bf61e9d4b6ec057a729bbb8938ea9f0cf75e8968 100644
--- a/LUFA/ManPages/LUFAPoweredProjects.txt
+++ b/LUFA/ManPages/LUFAPoweredProjects.txt
@@ -36,6 +36,7 @@
  *  - AVR USB Modem, a 3G Wireless Modem host: http://code.google.com/p/avrusbmodem/
  *  - Bicycle POV: http://www.code.google.com/p/bicycleledpov/
  *  - CAMTRIG, a remote Camera Trigger device: http://code.astraw.com/projects/motmot/camtrig
+ *  - CD Driver Emulator Dongle for ISO Files: http://cdemu.blogspot.com/
  *  - ClockTamer, a configurable clock generator: http://code.google.com/p/clock-tamer/
  *  - "Fingerlicking Wingdinger" (WARNING: Bad Language if no Javascript), a MIDI controller: http://noisybox.net/electronics/wingdinger/
  *  - Garmin GPS USB to NMEA standard serial sentence translator: http://github.com/nall/garmin-transmogrifier/tree/master
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
index 90559208d37dc8cc86a608d4d660c8cf101abc12..91ed775bb40229a3ef14666e70d689e2c434de77 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
@@ -167,10 +167,6 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, uint8_t* WriteBuffer, uint
 	
 	while (WriteLength)
 	{
-		/* Wait until the NVM controller is no longer busy */
-		if (!(TINYNVM_WaitWhileNVMControllerBusy()))
-		  return false;
-
 		/* Write the low byte of data to the target */
 		XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI);
 		XPROGTarget_SendByte(*(WriteBuffer++));
@@ -179,6 +175,10 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, uint8_t* WriteBuffer, uint
 		XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI);
 		XPROGTarget_SendByte(*(WriteBuffer++));
 
+		/* Wait until the NVM controller is no longer busy */
+		if (!(TINYNVM_WaitWhileNVMControllerBusy()))
+		  return false;
+
 		/* Need to decrement the write length twice, since we read out a whole word */
 		WriteLength -= 2;
 	}
diff --git a/Projects/Webserver/Lib/HTTPServerApp.c b/Projects/Webserver/Lib/HTTPServerApp.c
index c2263cb98c69b6744742da8a107598f188e0c633..ad768c89bc31d10839b32523ef2d7de5328291dc 100644
--- a/Projects/Webserver/Lib/HTTPServerApp.c
+++ b/Projects/Webserver/Lib/HTTPServerApp.c
@@ -41,7 +41,7 @@
  *  given location, and gives extra connection information.
  */
 char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n"
-                               "Server: LUFA RNDIS\r\n"
+                               "Server: LUFA " LUFA_VERSION_STRING "\r\n"
                                "Connection: close\r\n"
                                "MIME-version: 1.0\r\n"
                                "Content-Type: ";
@@ -50,7 +50,7 @@ char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n"
  *  given URL is invalid, and gives extra error information.
  */
 char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n"
-                               "Server: LUFA RNDIS\r\n"
+                               "Server: LUFA " LUFA_VERSION_STRING "\r\n"
                                "Connection: close\r\n"
                                "MIME-version: 1.0\r\n"
                                "Content-Type: text/plain\r\n\r\n"
diff --git a/Projects/Webserver/Lib/HTTPServerApp.h b/Projects/Webserver/Lib/HTTPServerApp.h
index 33a647bfe57dc4801f3988b24d27fc70bad2fa2b..b1139280c05b69471138be42770dcb25ba79da2b 100644
--- a/Projects/Webserver/Lib/HTTPServerApp.h
+++ b/Projects/Webserver/Lib/HTTPServerApp.h
@@ -40,6 +40,8 @@
 		#include <avr/pgmspace.h>
 		#include <string.h>
 		
+		#include <LUFA/Version.h>
+
 		#include <uip.h>
 		#include <ff.h>