diff --git a/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt b/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt
index 40b7c5a85aa0d35a629c331e17618726f618ce5b..b1ba267a3ae98b5527e8ce9eea74027464245101 100644
--- a/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt
+++ b/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt
@@ -13,7 +13,6 @@
  *  - Series 7 USB AVRs
  *  - Series 6 USB AVRs
  *  - Series 4 USB AVRs
- *  - Series 2 USB AVRs
  *
  *  \section SSec_Info USB Information:
  *
diff --git a/Demos/Device/LowLevel/DualVirtualSerial/DualVirtualSerial.txt b/Demos/Device/LowLevel/DualVirtualSerial/DualVirtualSerial.txt
index 40b7c5a85aa0d35a629c331e17618726f618ce5b..b1ba267a3ae98b5527e8ce9eea74027464245101 100644
--- a/Demos/Device/LowLevel/DualVirtualSerial/DualVirtualSerial.txt
+++ b/Demos/Device/LowLevel/DualVirtualSerial/DualVirtualSerial.txt
@@ -13,7 +13,6 @@
  *  - Series 7 USB AVRs
  *  - Series 6 USB AVRs
  *  - Series 4 USB AVRs
- *  - Series 2 USB AVRs
  *
  *  \section SSec_Info USB Information:
  *
diff --git a/LUFA/Drivers/USB/Class/Device/CDC.h b/LUFA/Drivers/USB/Class/Device/CDC.h
index d248868cd19a9c492006811e80ec34f8f1f2c4d0..e6a2bfd5cf5e5d571e71874a923159bd5e19cd93 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.h
+++ b/LUFA/Drivers/USB/Class/Device/CDC.h
@@ -104,12 +104,13 @@
 					struct
 					{
 						uint8_t HostToDevice; /**< Control line states from the host to device, as a set of CDC_CONTROL_LINE_OUT_*
-											   *   masks.
+											   *   masks. This value is updated each time \ref CDC_Device_USBTask() is called.
 											   */
 						uint8_t DeviceToHost; /**< Control line states from the device to host, as a set of CDC_CONTROL_LINE_IN_*
-											   *   masks.
+											   *   masks - to notify the host of changes to these values, call the
+											   *   \ref CDC_Device_SendControlLineStateChange() function.
 											   */
-					} ControlLineStates;
+					} ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */
 
 					struct
 					{
@@ -121,7 +122,9 @@
 											  *   CDCDevice_LineCodingParity_t enum
 											  */
 						uint8_t  DataBits; /**< Bits of data per character of the virtual serial port */
-					} LineEncoding;			
+					} LineEncoding;	/** Line encoding used in the virtual serial port, for the device's information. This is generally
+					                 *  only used if the virtual serial port data is to be reconstructed on a physical UART.
+					                 */		
 				} State; /**< State data for the USB class interface within the device. All elements in this section
 				          *   are reset to their defaults when the interface is enumerated.
 				          */
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h
index 466f141db8345c6ad4dee541deee8b067b40ae81..9433c59faec8214c641e62567b7fa6856b474791 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.h
+++ b/LUFA/Drivers/USB/Class/Host/CDC.h
@@ -92,12 +92,13 @@
 					struct
 					{
 						uint8_t HostToDevice; /**< Control line states from the host to device, as a set of CDC_CONTROL_LINE_OUT_*
-											   *   masks.
+											   *   masks - to notify the device of changes to these values, call the
+											   *   \ref CDC_Host_SendControlLineStateChange() function.
 											   */
 						uint8_t DeviceToHost; /**< Control line states from the device to host, as a set of CDC_CONTROL_LINE_IN_*
-											   *   masks.
+											   *   masks. This value is updated each time \ref CDC_Host_USBTask() is called.
 											   */
-					} ControlLineStates;
+					} ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */
 					
 					struct
 					{
@@ -109,7 +110,11 @@
 											  *   CDCDevice_LineCodingParity_t enum
 											  */
 						uint8_t  DataBits; /**< Bits of data per character of the virtual serial port */
-					} LineEncoding;
+					} LineEncoding; /** Line encoding used in the virtual serial port, for the device's information. This is generally
+					                 *  only used if the virtual serial port data is to be reconstructed on a physical UART. When set
+					                 *  by the host application, the \ref CDC_Host_SetLineEncoding() function must be called to push
+					                 *  the changes to the device.
+					                 */
 				} State; /**< State data for the USB class interface within the device. All elements in this section
 						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
 						  *   the interface is enumerated.
diff --git a/LUFA/ManPages/VIDAndPIDValues.txt b/LUFA/ManPages/VIDAndPIDValues.txt
index 339fd47b23b2085ef96d7e1067baf7651ab70eb8..5c17d52fc58edf0128bdd28a1dbdc11aa7709482 100644
--- a/LUFA/ManPages/VIDAndPIDValues.txt
+++ b/LUFA/ManPages/VIDAndPIDValues.txt
@@ -193,7 +193,7 @@
  *     0x204D
  *    </td>
  *    <td>
- *     Keyboard and Mouse Combination Demo Application
+ *     Combined Keyboard and Mouse Demo Application
  *    </td>
  *   </tr>
  *
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
index f327a47e8419f8e8a0090e7199d242b65a80d9c0..34ffb1e7b6123e374fa0c1476a3c095519d1ec27 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
@@ -204,13 +204,13 @@ bool TINYNVM_EraseMemory(const uint8_t EraseCommand, const uint16_t Address)
 	TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);
 	XPROGTarget_SendByte(EraseCommand);
 
-	/* Write to a location within the target address space to start the erase process */
-	TINYNVM_SendPointerAddress(Address);
+	/* Write to a high byte location within the target address space to start the erase process */
+	TINYNVM_SendPointerAddress(Address | 0x0001);
 	XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT);
 	XPROGTarget_SendByte(0x00);
 
-	/* Wait until the NVM bus is ready again */
-	if (!(TINYNVM_WaitWhileNVMBusBusy()))
+	/* Wait until the NVM controller is no longer busy */
+	if (!(TINYNVM_WaitWhileNVMControllerBusy()))
 	  return false;
 	
 	return true;
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h
index f8aa140684c30c8bc5bfc10266b88af0514ab8d6..223bbccfd22a8aa8b6ec863c2084bfb60443adf3 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h
@@ -63,6 +63,7 @@
 
 	/* Function Prototypes: */		
 		bool TINYNVM_WaitWhileNVMBusBusy(void);
+		bool TINYNVM_WaitWhileNVMControllerBusy(void);
 		bool TINYNVM_ReadMemory(const uint16_t ReadAddress, uint8_t* ReadBuffer, uint16_t ReadLength);
 		bool TINYNVM_WriteMemory(const uint16_t WriteAddress, uint8_t* WriteBuffer, uint16_t WriteLength);
 		bool TINYNVM_EraseMemory(const uint8_t EraseCommand, const uint16_t Address);
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
index e7b57da1719aab28f90232bd755bf1d796ce6bf0..24305dc20ce4cdadc479ed4f9df4ac805eb94c04 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
@@ -208,27 +208,38 @@ static void XPROGProtocol_Erase(void)
 	Endpoint_ClearOUT();
 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 	
-	uint8_t EraseCommand = XMEGA_NVM_CMD_NOOP;
-	
 	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 	{
+		uint8_t EraseCommand = XMEGA_NVM_CMD_NOOP;
+	
 		/* Determine which NVM command to send to the device depending on the memory to erase */
-		if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_CHIP)
-		  EraseCommand = XMEGA_NVM_CMD_CHIPERASE;
-		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP)
-		  EraseCommand = XMEGA_NVM_CMD_ERASEAPPSEC;
-		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT)
-		  EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSEC;
-		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM)
-		  EraseCommand = XMEGA_NVM_CMD_ERASEEEPROM;
-		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP_PAGE)
-		  EraseCommand = XMEGA_NVM_CMD_ERASEAPPSECPAGE;
-		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT_PAGE)
-		  EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSECPAGE;
-		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM_PAGE)
-		  EraseCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGE;
-		else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_USERSIG)
-		  EraseCommand = XMEGA_NVM_CMD_ERASEUSERSIG;
+		switch (Erase_XPROG_Params.MemoryType)
+		{
+			case XPRG_ERASE_CHIP:
+				EraseCommand = XMEGA_NVM_CMD_CHIPERASE;
+				break;
+			case XPRG_ERASE_APP:
+				EraseCommand = XMEGA_NVM_CMD_ERASEAPPSEC;
+				break;
+			case XPRG_ERASE_BOOT:
+				EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSEC;
+				break;
+			case XPRG_ERASE_EEPROM:
+				EraseCommand = XMEGA_NVM_CMD_ERASEEEPROM;
+				break;
+			case XPRG_ERASE_APP_PAGE:
+				EraseCommand = XMEGA_NVM_CMD_ERASEAPPSECPAGE;
+				break;
+			case XPRG_ERASE_BOOT_PAGE:
+				EraseCommand = XMEGA_NVM_CMD_ERASEBOOTSECPAGE;
+				break;
+			case XPRG_ERASE_EEPROM_PAGE:
+				EraseCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGE;
+				break;
+			case XPRG_ERASE_USERSIG:
+				EraseCommand = XMEGA_NVM_CMD_ERASEUSERSIG;
+				break;
+		}
 		
 		/* Erase the target memory, indicate timeout if ocurred */
 		if (!(XMEGANVM_EraseMemory(EraseCommand, Erase_XPROG_Params.Address)))
@@ -277,36 +288,33 @@ static void XPROGProtocol_WriteMemory(void)
 		uint8_t WriteBuffCommand = XMEGA_NVM_CMD_LOADFLASHPAGEBUFF;
 		uint8_t EraseBuffCommand = XMEGA_NVM_CMD_ERASEFLASHPAGEBUFF;
 		bool    PagedMemory      = true;
-
-		if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_APPL)
-		{
-			WriteCommand     = XMEGA_NVM_CMD_WRITEAPPSECPAGE;
-		}
-		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_BOOT)
-		{
-			WriteCommand     = XMEGA_NVM_CMD_WRITEBOOTSECPAGE;
-		}
-		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_EEPROM)
-		{
-			WriteCommand     = XMEGA_NVM_CMD_WRITEEEPROMPAGE;
-			WriteBuffCommand = XMEGA_NVM_CMD_LOADEEPROMPAGEBUFF;
-			EraseBuffCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGEBUFF;
-		}
-		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG)
-		{
-			/* User signature is paged, but needs us to manually indicate the mode bits since the host doesn't set them */
-			WriteMemory_XPROG_Params.PageMode = (XPRG_PAGEMODE_ERASE | XPRG_PAGEMODE_WRITE);
-			WriteCommand     = XMEGA_NVM_CMD_WRITEUSERSIG;
-		}
-		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_FUSE)
-		{
-			WriteCommand     = XMEGA_NVM_CMD_WRITEFUSE;
-			PagedMemory      = false;
-		}
-		else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_LOCKBITS)
+		
+		switch (WriteMemory_XPROG_Params.MemoryType)
 		{
-			WriteCommand     = XMEGA_NVM_CMD_WRITELOCK;
-			PagedMemory      = false;
+			case XPRG_MEM_TYPE_APPL:
+				WriteCommand     = XMEGA_NVM_CMD_WRITEAPPSECPAGE;
+				break;
+			case XPRG_MEM_TYPE_BOOT:
+				WriteCommand     = XMEGA_NVM_CMD_WRITEBOOTSECPAGE;
+				break;
+			case XPRG_MEM_TYPE_EEPROM:
+				WriteCommand     = XMEGA_NVM_CMD_WRITEEEPROMPAGE;
+				WriteBuffCommand = XMEGA_NVM_CMD_LOADEEPROMPAGEBUFF;
+				EraseBuffCommand = XMEGA_NVM_CMD_ERASEEEPROMPAGEBUFF;			
+				break;
+			case XPRG_MEM_TYPE_USERSIG:
+				/* User signature is paged, but needs us to manually indicate the mode bits since the host doesn't set them */
+				WriteMemory_XPROG_Params.PageMode = (XPRG_PAGEMODE_ERASE | XPRG_PAGEMODE_WRITE);
+				WriteCommand     = XMEGA_NVM_CMD_WRITEUSERSIG;
+				break;
+			case XPRG_MEM_TYPE_FUSE:
+				WriteCommand     = XMEGA_NVM_CMD_WRITEFUSE;
+				PagedMemory      = false;
+				break;
+			case XPRG_MEM_TYPE_LOCKBITS:
+				WriteCommand     = XMEGA_NVM_CMD_WRITELOCK;
+				PagedMemory      = false;
+				break;
 		}
 		
 		/* Send the appropriate memory write commands to the device, indicate timeout if occurred */
@@ -394,21 +402,29 @@ static void XPROGProtocol_ReadCRC(void)
 	} ReadCRC_XPROG_Params;
 	
 	Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params), NO_STREAM_CALLBACK);
+
 	Endpoint_ClearOUT();
 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 	
-	uint8_t  CRCCommand = XMEGA_NVM_CMD_NOOP;
 	uint32_t MemoryCRC;
 
 	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 	{
+		uint8_t CRCCommand;
+
 		/* Determine which NVM command to send to the device depending on the memory to CRC */
-		if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP)
-		  CRCCommand = XMEGA_NVM_CMD_APPCRC;
-		else if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_BOOT)
-		  CRCCommand = XMEGA_NVM_CMD_BOOTCRC;
-		else
-		  CRCCommand = XMEGA_NVM_CMD_FLASHCRC;
+		switch (ReadCRC_XPROG_Params.CRCType)
+		{
+			case XPRG_CRC_APP:
+				CRCCommand = XMEGA_NVM_CMD_APPCRC;
+				break;
+			case XPRG_CRC_BOOT:
+				CRCCommand = XMEGA_NVM_CMD_BOOTCRC;
+				break;
+			default:
+				CRCCommand = XMEGA_NVM_CMD_FLASHCRC;
+				break;
+		}
 		
 		/* Perform and retrieve the memory CRC, indicate timeout if occurred */
 		if (!(XMEGANVM_GetMemoryCRC(CRCCommand, &MemoryCRC)))
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
index 41bc14a1a92402f97ece52a941dc312b1c520af9..bc2953dd2a10b2d63a6e3b21b10059d2f0192d7d 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
@@ -131,7 +131,7 @@
 		#define TPI_NVMENABLE_KEY          (uint8_t[]){0x12, 0x89, 0xAB, 0x45, 0xCD, 0xD8, 0x88, 0xFF}
 
 		#define TPI_POINTER_INDIRECT       0
-		#define TPI_POINTER_INDIRECT_PI    (1 << 2)
+		#define TPI_POINTER_INDIRECT_PI    4
 		
 	/* Function Prototypes: */
 		void    XPROGTarget_EnableTargetPDI(void);