diff --git a/Bootloaders/TeensyHID/Descriptors.c b/Bootloaders/TeensyHID/Descriptors.c
index 791269cbcafdbf2272e545dcf7fe1cad458e4f2e..65a8d11b617a41ed63ec09b3d179d24a76fa3894 100644
--- a/Bootloaders/TeensyHID/Descriptors.c
+++ b/Bootloaders/TeensyHID/Descriptors.c
@@ -152,7 +152,7 @@ USB_Descriptor_Configuration_t ConfigurationDescriptor =
  */
 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)
 {
-	const uint8_t  DescriptorType   = (wValue >> 8);
+	const uint8_t DescriptorType = (wValue >> 8);
 
 	void*    Address = NULL;
 	uint16_t Size    = NO_DESCRIPTOR;
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 17702b663b070870e959d70b42c1b2685d5f9ac0..48361e3075fda9a2adbaf2963a7a952e7f0ef20d 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -10,8 +10,11 @@
   *
   *  <b>New:</b>
   *  - Added TPI programming support for 6-pin ATTINY to the AVRISP programmer project
+  *  - Added command timeout counter to the AVRISP project so that the device no longer freezes when incorrectly connected
+  *    to a target
   *
   *  <b>Changed:</b>
+  *  - Slowed down bit-banged PDI programming in the AVRISP project slightly to prevent transmission errors
   *
   *  <b>Fixed:</b>
   *
diff --git a/LUFA/ManPages/LUFAPoweredProjects.txt b/LUFA/ManPages/LUFAPoweredProjects.txt
index 9d95a6ea0bcc49ebc8c798db9161980337f08dbe..615e5c6abfe71b31d79d926231b947945fea63f9 100644
--- a/LUFA/ManPages/LUFAPoweredProjects.txt
+++ b/LUFA/ManPages/LUFAPoweredProjects.txt
@@ -37,7 +37,7 @@
  *  - "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
  *  - Generic HID Device Creator : http://generichid.sourceforge.net/
- *  - Mobo 4.3, some sort of Audio related device: http://sites.google.com/site/lofturj/mobo4_3
+ *  - Mobo 4.3, a USB controlled all band (160-10m) HF SDR transceiver: http://sites.google.com/site/lofturj/mobo4_3
  *  - NES Controller USB modification: http://projects.peterpolidoro.net/video/NESUSB.htm
  *  - MakeTV Episode Dispenser: http://www.youtube.com/watch?v=BkWUi18hl3g
  *  - Opendous-JTAG, an open source JTAG device: http://code.google.com/p/opendous-jtag/
diff --git a/Projects/AVRISP/AVRISP.c b/Projects/AVRISP/AVRISP.c
index c0572fca2f3a1ab005dc0ef292ab7c7c7a32d0a1..7974f1ca9897a9c0e50ff08801dd7890863cdde8 100644
--- a/Projects/AVRISP/AVRISP.c
+++ b/Projects/AVRISP/AVRISP.c
@@ -78,7 +78,7 @@ void SetupHardware(void)
 	ADC_StartReading(VTARGET_ADC_CHANNEL | ADC_RIGHT_ADJUSTED | ADC_REFERENCE_AVCC);
 	#endif
 	
-	/* Millisecond timer initialization for timeouts and delays */
+	/* Millisecond timer initialization for managing the command timeout counter */
 	OCR0A  = ((F_CPU / 64) / 1000);
 	TCCR0A = (1 << WGM01);
 	TCCR0B = ((1 << CS01) | (1 << CS00));
diff --git a/Projects/AVRISP/Lib/ISP/ISPProtocol.h b/Projects/AVRISP/Lib/ISP/ISPProtocol.h
index 43c25c4fa391c1aa286229008d21c86c287dfa1b..abbbf569d6882727c6a5a1ec76bdd013b0c5f437 100644
--- a/Projects/AVRISP/Lib/ISP/ISPProtocol.h
+++ b/Projects/AVRISP/Lib/ISP/ISPProtocol.h
@@ -72,17 +72,20 @@
 		 */
 		static inline void ISPProtocol_DelayMS(uint8_t DelayMS)
 		{
-			TCNT0 = 0;
-			TIFR0 = (1 << OCF1A);
+			OCR2A  = ((F_CPU / 64) / 1000);
+			TCCR2A = (1 << WGM01);
+			TCCR2B = ((1 << CS01) | (1 << CS00));			
 
 			while (DelayMS)
 			{
-				if (TIFR0 & (1 << OCF1A))
+				if (TIFR2 & (1 << OCF2A))
 				{
-					TIFR0 = (1 << OCF1A);
+					TIFR2 = (1 << OCF2A);
 					DelayMS--;
 				}
 			}
+			
+			TCCR2B = 0;			
 		}
 
 	/* Function Prototypes: */
diff --git a/Projects/AVRISP/Lib/ISP/ISPTarget.c b/Projects/AVRISP/Lib/ISP/ISPTarget.c
index e99e3e53c9f0a4ae49768655d4e05b0ac2725a4a..29cb18e620157082e72a06f85176233634de4dcc 100644
--- a/Projects/AVRISP/Lib/ISP/ISPTarget.c
+++ b/Projects/AVRISP/Lib/ISP/ISPTarget.c
@@ -122,26 +122,15 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
 			break;
 		case PROG_MODE_WORD_VALUE_MASK:
 		case PROG_MODE_PAGED_VALUE_MASK:
-			TCNT0 = 0;
-			TIFR0 = (1 << OCF1A);
-			
-			uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;
-
 			do
 			{
 				SPI_SendByte(ReadMemCommand);
 				SPI_SendByte(PollAddress >> 8);
 				SPI_SendByte(PollAddress & 0xFF);
-
-				if (TIFR0 & (1 << OCF1A))
-				{
-					TIFR0 = (1 << OCF1A);
-					TimeoutMS--;
-				}
 			}
-			while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMS);
+			while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMSRemaining);
 
-			if (!(TimeoutMS))
+			if (!(TimeoutMSRemaining))
 			 ProgrammingStatus = STATUS_CMD_TOUT;
 			
 			break;		
@@ -161,27 +150,16 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
  */
 uint8_t ISPTarget_WaitWhileTargetBusy(void)
 {
-	TCNT0 = 0;
-	TIFR0 = (1 << OCF1A);
-			
-	uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;
-	
 	do
 	{
 		SPI_SendByte(0xF0);
 		SPI_SendByte(0x00);
 
 		SPI_SendByte(0x00);
-
-		if (TIFR0 & (1 << OCF1A))
-		{
-			TIFR0 = (1 << OCF1A);
-			TimeoutMS--;
-		}
 	}
-	while ((SPI_ReceiveByte() & 0x01) && TimeoutMS);
+	while ((SPI_ReceiveByte() & 0x01) && TimeoutMSRemaining);
 
-	if (!(TimeoutMS))
+	if (!(TimeoutMSRemaining))
 	  return STATUS_RDY_BSY_TOUT;
 	else
 	  return STATUS_CMD_OK;
diff --git a/Projects/AVRISP/Lib/ISP/ISPTarget.h b/Projects/AVRISP/Lib/ISP/ISPTarget.h
index 96f1a6476ed58f10533360bcae496076506b3bd3..c856ddde148d2f25b9d4c7c274dcdede5e34dcf0 100644
--- a/Projects/AVRISP/Lib/ISP/ISPTarget.h
+++ b/Projects/AVRISP/Lib/ISP/ISPTarget.h
@@ -57,10 +57,7 @@
 	/* Macros: */
 		/** Total number of allowable ISP programming speeds supported by the device */
 		#define TOTAL_ISP_PROGRAMMING_SPEEDS  7
-
-		/** Timeout in milliseconds of target busy-wait loops waiting for a command to complete */
-		#define TARGET_BUSY_TIMEOUT_MS        100
-
+		
 	/* Function Prototypes: */
 		uint8_t ISPTarget_GetSPIPrescalerMask(void);
 		void    ISPTarget_ChangeTargetResetLine(const bool ResetTarget);
diff --git a/Projects/AVRISP/Lib/V2Protocol.c b/Projects/AVRISP/Lib/V2Protocol.c
index 4f7904a217b11bd36ca2fbec627aec48e7fd9313..4fcb5aa00554cab5f4ffc0384b5a060a4204388c 100644
--- a/Projects/AVRISP/Lib/V2Protocol.c
+++ b/Projects/AVRISP/Lib/V2Protocol.c
@@ -43,6 +43,13 @@ uint32_t CurrentAddress;
 bool MustSetAddress;
 
 
+/** ISR for the management of the command execution timeout counter */
+ISR(TIMER0_COMPA_vect, ISR_BLOCK)
+{
+	if (TimeoutMSRemaining)
+	  TimeoutMSRemaining--;
+}
+
 /** Master V2 Protocol packet handler, for received V2 Protocol packets from a connected host.
  *  This routine decodes the issued command and passes off the handling of the command to the
  *  appropriate function.
@@ -51,6 +58,9 @@ void V2Protocol_ProcessCommand(void)
 {
 	uint8_t V2Command = Endpoint_Read_Byte();
 	
+	TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
+	TIMSK0 |= (1 << OCIE0A);
+
 	switch (V2Command)
 	{
 		case CMD_SIGN_ON:
@@ -110,7 +120,9 @@ void V2Protocol_ProcessCommand(void)
 			V2Protocol_UnknownCommand(V2Command);
 			break;
 	}
-	
+		
+	TIMSK0 &= ~(1 << OCIE0A);
+
 	Endpoint_WaitUntilReady();
 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT);
 }
diff --git a/Projects/AVRISP/Lib/V2Protocol.h b/Projects/AVRISP/Lib/V2Protocol.h
index db4d09f0a1a3e61cea7de46ae633281005ba1a46..76b08b022a0c456312add46866f66c5327000147 100644
--- a/Projects/AVRISP/Lib/V2Protocol.h
+++ b/Projects/AVRISP/Lib/V2Protocol.h
@@ -49,16 +49,21 @@
 	/* Preprocessor Checks: */
 		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
 			#undef ENABLE_ISP_PROTOCOL
-			#undef ENABLE_TPI_PROTOCOL
 			
-			#if !defined(ENABLE_PDI_PROTOCOL)
-				#define ENABLE_PDI_PROTOCOL
+			#if !defined(ENABLE_XPROG_PROTOCOL)
+				#define ENABLE_XPROG_PROTOCOL
 			#endif
 		#endif
 
 	/* Macros: */
 		/** Programmer ID string, returned to the host during the CMD_SIGN_ON command processing */
 		#define PROGRAMMER_ID     "AVRISP_MK2"
+		
+		/** Timeout period for each issued command from the host before it is aborted */
+		#define COMMAND_TIMEOUT_MS 200
+		
+		/** Command timeout counter register, GPIOR for speed */
+		#define TimeoutMSRemaining GPIOR1
 
 	/* External Variables: */
 		extern uint32_t CurrentAddress;
diff --git a/Projects/AVRISP/Lib/V2ProtocolParams.c b/Projects/AVRISP/Lib/V2ProtocolParams.c
index 6b7f84aa34d291c35f7a8ee1a1ff7c34debb14e4..eacff03944343aa5a391ee6ca8e4e12fddc57bf0 100644
--- a/Projects/AVRISP/Lib/V2ProtocolParams.c
+++ b/Projects/AVRISP/Lib/V2ProtocolParams.c
@@ -43,44 +43,44 @@ uint8_t EEMEM EEPROM_Rest_Polarity = 0x00;
 static ParameterItem_t ParameterTable[] = 
 	{
 		{ .ParamID          = PARAM_BUILD_NUMBER_LOW,
-		  .ParamValue       = (LUFA_VERSION_INTEGER >> 8),
-		  .ParamPrivileges  = PARAM_PRIV_READ                    },
+		  .ParamPrivileges  = PARAM_PRIV_READ,
+		  .ParamValue       = (LUFA_VERSION_INTEGER >> 8)        },
 
 		{ .ParamID          = PARAM_BUILD_NUMBER_HIGH,
-		  .ParamValue       = (LUFA_VERSION_INTEGER & 0xFF),
-		  .ParamPrivileges  = PARAM_PRIV_READ                    },
+		  .ParamPrivileges  = PARAM_PRIV_READ,
+		  .ParamValue       = (LUFA_VERSION_INTEGER & 0xFF),     },
 
 		{ .ParamID          = PARAM_HW_VER,
-		  .ParamValue       = 0x00,
-		  .ParamPrivileges  = PARAM_PRIV_READ                    },
+		  .ParamPrivileges  = PARAM_PRIV_READ,
+		  .ParamValue       = 0x00                               },
 
 		{ .ParamID          = PARAM_SW_MAJOR,
-		  .ParamValue       = 0x01,
-		  .ParamPrivileges  = PARAM_PRIV_READ                    },
+		  .ParamPrivileges  = PARAM_PRIV_READ,
+		  .ParamValue       = 0x01                               },
 
 		{ .ParamID          = PARAM_SW_MINOR,
-		  .ParamValue       = 0x0D,
-		  .ParamPrivileges  = PARAM_PRIV_READ                    },
+		  .ParamPrivileges  = PARAM_PRIV_READ,
+		  .ParamValue       = 0x0D                               },
 
 		{ .ParamID          = PARAM_VTARGET,
-		  .ParamValue       = 0x32,
-		  .ParamPrivileges  = PARAM_PRIV_READ                    },
+		  .ParamPrivileges  = PARAM_PRIV_READ,
+		  .ParamValue       = 0x32                               },
 
 		{ .ParamID          = PARAM_SCK_DURATION,
-		  .ParamValue       = (TOTAL_ISP_PROGRAMMING_SPEEDS - 1),
-		  .ParamPrivileges  = PARAM_PRIV_READ | PARAM_PRIV_WRITE },
+		  .ParamPrivileges  = PARAM_PRIV_READ | PARAM_PRIV_WRITE,
+		  .ParamValue       = (TOTAL_ISP_PROGRAMMING_SPEEDS - 1) },
 
 		{ .ParamID          = PARAM_RESET_POLARITY,
-		  .ParamValue       = 0x00,
-		  .ParamPrivileges  = PARAM_PRIV_WRITE                   },
+		  .ParamPrivileges  = PARAM_PRIV_WRITE,
+		  .ParamValue       = 0x00                               },
 
 		{ .ParamID          = PARAM_STATUS_TGT_CONN,
-		  .ParamValue       = 0x00,
-		  .ParamPrivileges  = PARAM_PRIV_READ                    },
+		  .ParamPrivileges  = PARAM_PRIV_READ,
+		  .ParamValue       = 0x00                               },
 
 		{ .ParamID          = PARAM_DISCHARGEDELAY,
-		  .ParamValue       = 0x00,
-		  .ParamPrivileges  = PARAM_PRIV_WRITE                   },
+		  .ParamPrivileges  = PARAM_PRIV_WRITE,
+		  .ParamValue       = 0x00                               },
 	};
 
 
diff --git a/Projects/AVRISP/Lib/V2ProtocolParams.h b/Projects/AVRISP/Lib/V2ProtocolParams.h
index 14ff56c71a168974e95e61e273d0c3eff6dafc7a..28d57c80bb258fa0a6bed4f6820aaece57c8dd75 100644
--- a/Projects/AVRISP/Lib/V2ProtocolParams.h
+++ b/Projects/AVRISP/Lib/V2ProtocolParams.h
@@ -62,8 +62,8 @@
 		typedef struct
 		{
 			const uint8_t ParamID; /**< Parameter ID number to uniquely identify the parameter within the device */
+			const uint8_t ParamPrivileges;  /**< Parameter privileges to allow the host to read or write the parameter's value */
 			uint8_t ParamValue; /**< Current parameter's value within the device */
-			uint8_t ParamPrivileges;  /**< Parameter privileges to allow the host to read or write the parameter's value */
 		} ParameterItem_t;
 
 	/* Function Prototypes: */
diff --git a/Projects/AVRISP/Lib/XPROG/TINYNVM.c b/Projects/AVRISP/Lib/XPROG/TINYNVM.c
index f4b90ffa58f4b5ff65807cee5e05aafa3ca5153e..3ddd2eda016084b2bd24cd6e34b19d5aa98e40f9 100644
--- a/Projects/AVRISP/Lib/XPROG/TINYNVM.c
+++ b/Projects/AVRISP/Lib/XPROG/TINYNVM.c
@@ -37,6 +37,7 @@
 #include "TINYNVM.h"
 
 #if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
+#warning TPI Protocol support is currently incomplete and is not suitable for general use.
 
 /** Busy-waits while the NVM controller is busy performing a NVM operation, such as a FLASH page read.
  *
@@ -44,24 +45,13 @@
  */
 bool TINYNVM_WaitWhileNVMBusBusy(void)
 {
-	TCNT0 = 0;
-	TIFR0 = (1 << OCF1A);
-			
-	uint8_t TimeoutMS = TINY_NVM_BUSY_TIMEOUT_MS;
-	
 	/* Poll the STATUS register to check to see if NVM access has been enabled */
-	while (TimeoutMS)
+	while (TimeoutMSRemaining)
 	{
 		/* Send the SLDCS command to read the TPI STATUS register to see the NVM bus is active */
 		XPROGTarget_SendByte(TPI_CMD_SLDCS | TPI_STATUS_REG);
 		if (XPROGTarget_ReceiveByte() & TPI_STATUS_NVM)
 		  return true;
-
-		if (TIFR0 & (1 << OCF1A))
-		{
-			TIFR0 = (1 << OCF1A);
-			TimeoutMS--;
-		}
 	}
 	
 	return false;
diff --git a/Projects/AVRISP/Lib/XPROG/TINYNVM.h b/Projects/AVRISP/Lib/XPROG/TINYNVM.h
index ecf429e774e1a62a4df54609ff237f111ebc4996..75d11293d51d0cf667d60763b470bbc59764a4ca 100644
--- a/Projects/AVRISP/Lib/XPROG/TINYNVM.h
+++ b/Projects/AVRISP/Lib/XPROG/TINYNVM.h
@@ -56,7 +56,13 @@
 		#endif
 
 	/* Defines: */
-		#define TINY_NVM_BUSY_TIMEOUT_MS       100
+		#define TINY_NVM_REG_NVMCSR            0x32
+		#define TINY_NVM_REG_NVMCMD            0x33
+
+		#define TINY_NVM_CMD_NOOP              0x00
+		#define TINY_NVM_CMD_CHIPERASE         0x10
+		#define TINY_NVM_CMD_SECTIONERASE      0x14
+		#define TINY_NVM_CMD_WORDWRITE         0x1D
 
 	/* Function Prototypes: */
 		bool TINYNVM_WaitWhileNVMBusBusy(void);
diff --git a/Projects/AVRISP/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP/Lib/XPROG/XMEGANVM.c
index 6280f60fbbbe45c6c86dd1aa3f8884a115003ae2..c83ae0115bf7e6aadd864e8f6e0c871f7bf9cd83 100644
--- a/Projects/AVRISP/Lib/XPROG/XMEGANVM.c
+++ b/Projects/AVRISP/Lib/XPROG/XMEGANVM.c
@@ -58,10 +58,10 @@ void XMEGANVM_SendNVMRegAddress(const uint8_t Register)
 void XMEGANVM_SendAddress(const uint32_t AbsoluteAddress)
 {
 	/* Send the given 32-bit address to the target, LSB first */
-	XPROGTarget_SendByte(AbsoluteAddress &  0xFF);
-	XPROGTarget_SendByte(AbsoluteAddress >> 8);
-	XPROGTarget_SendByte(AbsoluteAddress >> 16);
-	XPROGTarget_SendByte(AbsoluteAddress >> 24);
+	XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[0]);
+	XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[1]);
+	XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[2]);
+	XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[3]);
 }
 
 /** Busy-waits while the NVM controller is busy performing a NVM operation, such as a FLASH page read or CRC
@@ -71,24 +71,13 @@ void XMEGANVM_SendAddress(const uint32_t AbsoluteAddress)
  */
 bool XMEGANVM_WaitWhileNVMBusBusy(void)
 {
-	TCNT0 = 0;
-	TIFR0 = (1 << OCF1A);
-			
-	uint8_t TimeoutMS = XMEGA_NVM_BUSY_TIMEOUT_MS;
-	
 	/* Poll the STATUS register to check to see if NVM access has been enabled */
-	while (TimeoutMS)
+	while (TimeoutMSRemaining)
 	{
 		/* Send the LDCS command to read the PDI STATUS register to see the NVM bus is active */
 		XPROGTarget_SendByte(PDI_CMD_LDCS | PDI_STATUS_REG);
 		if (XPROGTarget_ReceiveByte() & PDI_STATUS_NVM)
 		  return true;
-
-		if (TIFR0 & (1 << OCF1A))
-		{
-			TIFR0 = (1 << OCF1A);
-			TimeoutMS--;
-		}
 	}
 	
 	return false;
@@ -101,13 +90,8 @@ bool XMEGANVM_WaitWhileNVMBusBusy(void)
  */
 bool XMEGANVM_WaitWhileNVMControllerBusy(void)
 {
-	TCNT0 = 0;
-	TIFR0 = (1 << OCF1A);
-			
-	uint8_t TimeoutMS = XMEGA_NVM_BUSY_TIMEOUT_MS;
-	
 	/* Poll the NVM STATUS register while the NVM controller is busy */
-	while (TimeoutMS)
+	while (TimeoutMSRemaining)
 	{
 		/* Send a LDS command to read the NVM STATUS register to check the BUSY flag */
 		XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
@@ -116,12 +100,6 @@ bool XMEGANVM_WaitWhileNVMControllerBusy(void)
 		/* Check to see if the BUSY flag is still set */
 		if (!(XPROGTarget_ReceiveByte() & (1 << 7)))
 		  return true;
-
-		if (TIFR0 & (1 << OCF1A))
-		{
-			TIFR0 = (1 << OCF1A);
-			TimeoutMS--;
-		}
 	}
 	
 	return false;
@@ -158,22 +136,24 @@ bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest)
 	if (!(XMEGANVM_WaitWhileNVMControllerBusy()))
 	  return false;
 	
-	*CRCDest = 0;
+	uint32_t MemoryCRC = 0;
 	
 	/* Read the first generated CRC byte value */
 	XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
 	XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_DAT0);
-	*CRCDest  = XPROGTarget_ReceiveByte();
+	MemoryCRC  = XPROGTarget_ReceiveByte();
 
 	/* Read the second generated CRC byte value */
 	XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
 	XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_DAT1);
-	*CRCDest |= ((uint16_t)XPROGTarget_ReceiveByte() << 8);
+	MemoryCRC |= ((uint16_t)XPROGTarget_ReceiveByte() << 8);
 
 	/* Read the third generated CRC byte value */
 	XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
 	XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_DAT2);
-	*CRCDest |= ((uint32_t)XPROGTarget_ReceiveByte() << 16);
+	MemoryCRC |= ((uint32_t)XPROGTarget_ReceiveByte() << 16);
+	
+	*CRCDest = MemoryCRC;
 	
 	return true;
 }
@@ -186,7 +166,7 @@ bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest)
  *
  *  \return Boolean true if the command sequence complete successfully
  */
-bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, const uint16_t ReadSize)
+bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_t ReadSize)
 {
 	/* Wait until the NVM controller is no longer busy */
 	if (!(XMEGANVM_WaitWhileNVMControllerBusy()))
@@ -207,7 +187,7 @@ bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, const
 		
 	/* Send a LD command with indirect access and postincrement to read out the bytes */
 	XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
-	for (uint16_t i = 0; i < ReadSize; i++)
+	while (ReadSize--)
 	  *(ReadBuffer++) = XPROGTarget_ReceiveByte();
 	
 	return true;
@@ -253,8 +233,8 @@ bool XMEGANVM_WriteByteMemory(const uint8_t WriteCommand, const uint32_t WriteAd
  *  \return Boolean true if the command sequence complete successfully
  */
 bool XMEGANVM_WritePageMemory(const uint8_t WriteBuffCommand, const uint8_t EraseBuffCommand,
-                               const uint8_t WritePageCommand, const uint8_t PageMode, const uint32_t WriteAddress,
-                               const uint8_t* WriteBuffer, const uint16_t WriteSize)
+                              const uint8_t WritePageCommand, const uint8_t PageMode, const uint32_t WriteAddress,
+                              const uint8_t* WriteBuffer, uint16_t WriteSize)
 {
 	if (PageMode & XPRG_PAGEMODE_ERASE)
 	{
@@ -294,7 +274,7 @@ bool XMEGANVM_WritePageMemory(const uint8_t WriteBuffCommand, const uint8_t Eras
 			
 		/* Send a ST command with indirect access and postincrement to write the bytes */
 		XPROGTarget_SendByte(PDI_CMD_ST | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
-		for (uint16_t i = 0; i < WriteSize; i++)
+		while (WriteSize--)
 		  XPROGTarget_SendByte(*(WriteBuffer++));
 	}
 	
diff --git a/Projects/AVRISP/Lib/XPROG/XMEGANVM.h b/Projects/AVRISP/Lib/XPROG/XMEGANVM.h
index 6a4de1fb127d3eb1ffee3418ea019cb8a8c9a242..d1a14abda7749331b3426947d2839738a079fb9e 100644
--- a/Projects/AVRISP/Lib/XPROG/XMEGANVM.h
+++ b/Projects/AVRISP/Lib/XPROG/XMEGANVM.h
@@ -56,8 +56,6 @@
 		#endif
 
 	/* Defines: */
-		#define XMEGA_NVM_BUSY_TIMEOUT_MS            100
-		
 		#define XMEGA_NVM_REG_ADDR0                  0x00
 		#define XMEGA_NVM_REG_ADDR1                  0x01
 		#define XMEGA_NVM_REG_ADDR2                  0x02
@@ -111,11 +109,11 @@
 		bool XMEGANVM_WaitWhileNVMBusBusy(void);
 		bool XMEGANVM_WaitWhileNVMControllerBusy(void);
 		bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest);
-		bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, const uint16_t ReadSize);
+		bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_t ReadSize);
 		bool XMEGANVM_WriteByteMemory(const uint8_t WriteCommand, const uint32_t WriteAddress, const uint8_t* WriteBuffer);
 		bool XMEGANVM_WritePageMemory(const uint8_t WriteBuffCommand, const uint8_t EraseBuffCommand,
 		                              const uint8_t WritePageCommand, const uint8_t PageMode, const uint32_t WriteAddress,
-		                              const uint8_t* WriteBuffer, const uint16_t WriteSize);
+		                              const uint8_t* WriteBuffer, uint16_t WriteSize);
 		bool XMEGANVM_EraseMemory(const uint8_t EraseCommand, const uint32_t Address);
 
 #endif
diff --git a/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c
index edcc874d745c7faee3d3c799e031b177ba62ce67..bccb96c2c10ab0272fb4c297dde5eb3918132457 100644
--- a/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c
+++ b/Projects/AVRISP/Lib/XPROG/XPROGProtocol.c
@@ -38,7 +38,7 @@
 
 #if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
 /** Base absolute address for the target's NVM controller */
-uint32_t XPROG_Param_NVMBase = 0x010001C0;
+uint32_t XPROG_Param_NVMBase    = 0x010001C0;
 
 /** Size in bytes of the target's EEPROM page */
 uint32_t XPROG_Param_EEPageSize;
@@ -46,7 +46,6 @@ uint32_t XPROG_Param_EEPageSize;
 /** Currently selected XPROG programming protocol */
 uint8_t  XPROG_SelectedProtocol = XPRG_PROTOCOL_PDI;
 
-
 /** Handler for the CMD_XPROG_SETMODE command, which sets the programmer-to-target protocol used for PDI/TPI
  *  programming.
  */
diff --git a/Projects/AVRISP/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP/Lib/XPROG/XPROGTarget.c
index 708b237efbd2adefb67813b8b1f03b633ab0583e..59c85f382c9e2935d4d8233a57dc3e10fdc88ee0 100644
--- a/Projects/AVRISP/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP/Lib/XPROG/XPROGTarget.c
@@ -174,7 +174,7 @@ void XPROGTarget_EnableTargetTPI(void)
 	BITBANG_TPIDATA_PORT |= BITBANG_TPIDATA_MASK;
 
 	/* Fire timer capture ISR every 100 cycles to manage the software USART */
-	OCR1A   = 80;
+	OCR1A   = 100;
 	TCCR1B  = (1 << WGM13) | (1 << WGM12) | (1 << CS10);
 	TIMSK1  = (1 << ICIE1);
 	
@@ -217,7 +217,7 @@ void XPROGTarget_EnableTargetPDI(void)
 	asm volatile ("NOP"::);
 
 	/* Fire timer compare ISR every 100 cycles to manage the software USART */
-	OCR1A   = 80;
+	OCR1A   = 100;
 	TCCR1B  = (1 << WGM12) | (1 << CS10);
 	TIMSK1  = (1 << OCIE1A);
 	
@@ -353,7 +353,7 @@ uint8_t XPROGTarget_ReceiveByte(void)
 	}
 
 	/* Wait until a byte has been received before reading */
-	while (!(UCSR1A & (1 << RXC1)));
+	while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining);
 	return UDR1;
 #else
 	/* Switch to Rx mode if currently in Tx mode */
@@ -369,8 +369,8 @@ uint8_t XPROGTarget_ReceiveByte(void)
 
 	/* Wait until a byte has been received before reading */
 	SoftUSART_BitCount = BITS_IN_USART_FRAME;
-	while (SoftUSART_BitCount);
-	
+	while (SoftUSART_BitCount && TimeoutMSRemaining);
+
 	/* Throw away the parity and stop bits to leave only the data (start bit is already discarded) */
 	return (uint8_t)SoftUSART_Data;
 #endif
diff --git a/Projects/AVRISP/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP/Lib/XPROG/XPROGTarget.h
index 58c1caa3774209db7bd53defe36d1828d018001c..44602164ee099de2a35c0d59e2c971ab4c4c31d4 100644
--- a/Projects/AVRISP/Lib/XPROG/XPROGTarget.h
+++ b/Projects/AVRISP/Lib/XPROG/XPROGTarget.h
@@ -42,6 +42,8 @@
 		#include <stdbool.h>
 		
 		#include <LUFA/Common/Common.h>
+		
+		#include "../V2Protocol.h"
 	
 	/* Preprocessor Checks: */
 		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
diff --git a/Projects/MissileLauncher/MissileLauncher.c b/Projects/MissileLauncher/MissileLauncher.c
index 26dd077cd75a2a4b11603b29f485f5712f0cc064..29ebd458a2967ca6d2430dd04faa4e512dbda0f2 100644
--- a/Projects/MissileLauncher/MissileLauncher.c
+++ b/Projects/MissileLauncher/MissileLauncher.c
@@ -1,11 +1,3 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2009.
-              
-  dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
-*/
-
 /*
          USB Missile Launcher Demo
 	 Copyright (C) Dave Fletcher, 2009.
@@ -158,7 +150,7 @@ void Read_Joystick_Status(void)
  *  \param[in] Report  Report data to send.
  *  \param[in] ReportSize  Report length in bytes.
  */
-void Send_Command_Report(uint8_t *Report, uint16_t ReportSize)
+void Send_Command_Report(uint8_t* const Report, const uint16_t ReportSize)
 {
 	memcpy(CmdBuffer, Report, 8);
 	WriteNextReport(CmdBuffer, ReportSize);
@@ -168,7 +160,7 @@ void Send_Command_Report(uint8_t *Report, uint16_t ReportSize)
  *
  *  \param[in] Command  One of the command constants.
  */
-void Send_Command(uint8_t* Command)
+void Send_Command(uint8_t* const Command)
 {
 	if ((CmdState == CMD_STOP && Command != CMD_STOP) ||
 		(CmdState != CMD_STOP && Command == CMD_STOP))
@@ -252,7 +244,7 @@ void DiscardNextReport(void)
  *  \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)
+void WriteNextReport(uint8_t* const ReportOUTData, const uint16_t ReportLength)
 {
 	/* Select and unfreeze HID data OUT pipe */
 	Pipe_SelectPipe(HID_DATA_OUT_PIPE);
diff --git a/Projects/MissileLauncher/MissileLauncher.h b/Projects/MissileLauncher/MissileLauncher.h
index e92fe743cfe7d0cd22cb7b3e905c0d0936981801..400ee26bb7b717972428444aa41e6b8c486b9367 100644
--- a/Projects/MissileLauncher/MissileLauncher.h
+++ b/Projects/MissileLauncher/MissileLauncher.h
@@ -82,8 +82,8 @@
 		void SetupHardware(void);
 
 		void Read_Joystick_Status(void);
-        void Send_Command_Report(uint8_t* Report, uint16_t ReportSize);
-        void Send_Command(uint8_t* Command);
+        void Send_Command_Report(uint8_t* const Report, const uint16_t ReportSize);
+        void Send_Command(uint8_t* const Command);
 
 		void HID_Host_Task(void);
 
@@ -94,6 +94,6 @@
 		void EVENT_USB_Host_DeviceEnumerationComplete(void);
 
 		void DiscardNextReport(void);
-		void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength);
+		void WriteNextReport(uint8_t* const ReportOUTData, const uint16_t ReportLength);
 		
 #endif