diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt
index 48dec12696e4d8b28f57af33199a9e8181397d97..3cab967e0af577686a71b30e043986f793c55678 100644
--- a/LUFA/DoxygenPages/ChangeLog.txt
+++ b/LUFA/DoxygenPages/ChangeLog.txt
@@ -22,6 +22,7 @@
   *  - Library Applications:
   *   - Raised the guard bits in the AVRISP-MKII clone project when in PDI and TPI to 32, to prevent communication errors on low quality connections to a target
   *   - Added additional bootloader API data to expose the bootloader start address and class to the DFU and CDC class bootloaders
+  *   - Reverted AVRISP-MKII clone project watchdog based command timeout patch in favour of a hardware timer, to allow for use in devices with WDTRST fuse programmed
   *
   *  <b>Fixed:</b>
   *  - Core:
diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
index ada9541d87e29cf23991439e6f2c6c41c9c43e90..f757ac14366dc7754807eb05ae32c0ff43da243f 100644
--- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
+++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c
@@ -73,7 +73,7 @@ void ISPProtocol_EnterISPMode(void)
 
 	/* Continuously attempt to synchronize with the target until either the number of attempts specified
 	 * by the host has exceeded, or the the device sends back the expected response values */
-	while (Enter_ISP_Params.SynchLoops-- && !(TimeoutExpired))
+	while (Enter_ISP_Params.SynchLoops-- && TimeoutTicksRemaining)
 	{
 		uint8_t ResponseBytes[4];
 
@@ -523,7 +523,7 @@ void ISPProtocol_SPIMulti(void)
  */
 void ISPProtocol_DelayMS(uint8_t DelayMS)
 {
-	while (DelayMS-- && !(TimeoutExpired))
+	while (DelayMS-- && TimeoutTicksRemaining)
 	  Delay_MS(1);
 }
 
diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
index e2b2301666a3e9a330f19c8a316c9d5e6f18221e..b77c18058111deeffff4a6821d30241230771129 100644
--- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
+++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c
@@ -254,7 +254,7 @@ uint8_t ISPTarget_TransferSoftSPIByte(const uint8_t Byte)
 
 	TCNT1  = 0;
 	TCCR1B = ((1 << WGM12) | (1 << CS11));
-	while (SoftSPI_BitsRemaining && !(TimeoutExpired));
+	while (SoftSPI_BitsRemaining && TimeoutTicksRemaining);
 	TCCR1B = 0;
 
 	return SoftSPI_Data;
@@ -296,9 +296,9 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void)
 		ISPTarget_SendByte(0x00);
 		ISPTarget_SendByte(0x00);
 	}
-	while ((ISPTarget_ReceiveByte() & 0x01) && !(TimeoutExpired));
+	while ((ISPTarget_ReceiveByte() & 0x01) && TimeoutTicksRemaining);
 
-	return (TimeoutExpired) ? STATUS_RDY_BSY_TOUT : STATUS_CMD_OK;
+	return (TimeoutTicksRemaining > 0) ? STATUS_CMD_OK : STATUS_RDY_BSY_TOUT;
 }
 
 /** Sends a low-level LOAD EXTENDED ADDRESS command to the target, for addressing of memory beyond the
@@ -348,10 +348,10 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode,
 				ISPTarget_SendByte(PollAddress >> 8);
 				ISPTarget_SendByte(PollAddress & 0xFF);
 			}
-			while ((ISPTarget_TransferByte(0x00) == PollValue) && !(TimeoutExpired));
+			while ((ISPTarget_TransferByte(0x00) == PollValue) && TimeoutTicksRemaining);
 
-			if (TimeoutExpired)
-			 ProgrammingStatus = STATUS_CMD_TOUT;
+			if (!(TimeoutTicksRemaining))
+			  ProgrammingStatus = STATUS_CMD_TOUT;
 
 			break;
 		case PROG_MODE_WORD_READYBUSY_MASK:
diff --git a/Projects/AVRISP-MKII/Lib/V2Protocol.c b/Projects/AVRISP-MKII/Lib/V2Protocol.c
index 780c48af483b663b9b8235fbeb9dd97315c3a5d4..f485810517edd9273064f6fba4b182abec9d4bd4 100644
--- a/Projects/AVRISP-MKII/Lib/V2Protocol.c
+++ b/Projects/AVRISP-MKII/Lib/V2Protocol.c
@@ -44,10 +44,12 @@ bool MustLoadExtendedAddress;
 
 
 /** ISR to manage timeouts whilst processing a V2Protocol command */
-ISR(WDT_vect, ISR_BLOCK)
+ISR(TIMER0_COMPA_vect, ISR_NOBLOCK)
 {
-	TimeoutExpired = true;
-	wdt_disable();
+	if (TimeoutTicksRemaining)
+	  TimeoutTicksRemaining--;
+	else
+	  TCCR0B = 0;
 }
 
 /** Initializes the hardware and software associated with the V2 protocol command handling. */
@@ -60,6 +62,11 @@ void V2Protocol_Init(void)
 	ADC_StartReading(VTARGET_REF_MASK | ADC_RIGHT_ADJUSTED | VTARGET_ADC_CHANNEL_MASK);
 	#endif
 
+	/* Timeout timer initialization (~10ms period) */
+	OCR0A  = (((F_CPU / 1024) / 100) - 1);
+	TCCR0A = (1 << WGM01);
+	TIMSK0 = (1 << OCIE0A);
+
 	V2Params_LoadNonVolatileParamValues();
 
 	#if defined(ENABLE_ISP_PROTOCOL)
@@ -75,10 +82,9 @@ void V2Protocol_ProcessCommand(void)
 {
 	uint8_t V2Command = Endpoint_Read_8();
 
-	/* Start the watchdog with timeout interrupt enabled to manage the timeout */
-	TimeoutExpired = false;
-	wdt_enable(WDTO_1S);
-	WDTCSR |= (1 << WDIE);
+	/* Reset timeout counter duration and start the timer */
+	TimeoutTicksRemaining = COMMAND_TIMEOUT_TICKS;
+	TCCR0B = ((1 << CS02) | (1 << CS00));	
 
 	switch (V2Command)
 	{
@@ -140,8 +146,8 @@ void V2Protocol_ProcessCommand(void)
 			break;
 	}
 
-	/* Disable the timeout management watchdog timer */
-	wdt_disable();
+	/* Disable the timeout management timer */
+	TCCR0B = 0;
 
 	Endpoint_WaitUntilReady();
 	Endpoint_SelectEndpoint(AVRISP_DATA_OUT_EPNUM);
diff --git a/Projects/AVRISP-MKII/Lib/V2Protocol.h b/Projects/AVRISP-MKII/Lib/V2Protocol.h
index 59d61b499049991d3988923176286cfffe5fc85a..dca97cb2a94a6b74984a633759036e82ed250629 100644
--- a/Projects/AVRISP-MKII/Lib/V2Protocol.h
+++ b/Projects/AVRISP-MKII/Lib/V2Protocol.h
@@ -78,8 +78,8 @@
 		/** Timeout period for each issued command from the host before it is aborted (in 10ms ticks). */
 		#define COMMAND_TIMEOUT_TICKS      100
 
-		/** Command timeout expiration flag, GPIOR for speed. */
-		#define TimeoutExpired             GPIOR1
+		/** Command timeout ticks remaining counter, GPIOR for speed. */
+		#define TimeoutTicksRemaining      GPIOR1
 
 		/** MUX mask for the VTARGET ADC channel number. */
 		#define VTARGET_ADC_CHANNEL_MASK   ADC_GET_CHANNEL_MASK(VTARGET_ADC_CHANNEL)
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
index b8832372f4963174edcd33dfb9ce3da4d3a8f98a..df0374dea8914401809f7051455ec66f0ce065fa 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
@@ -85,7 +85,7 @@ bool TINYNVM_WaitWhileNVMBusBusy(void)
 		uint8_t StatusRegister = XPROGTarget_ReceiveByte();
 
 		/* We might have timed out waiting for the status register read response, check here */
-		if (TimeoutExpired)
+		if (!(TimeoutTicksRemaining))
 		  return false;
 
 		/* Check the status register read response to see if the NVM bus is enabled */
@@ -110,7 +110,7 @@ bool TINYNVM_WaitWhileNVMControllerBusy(void)
 		uint8_t StatusRegister = XPROGTarget_ReceiveByte();
 
 		/* We might have timed out waiting for the status register read response, check here */
-		if (TimeoutExpired)
+		if (!(TimeoutTicksRemaining))
 		  return false;
 
 		/* Check to see if the BUSY flag is still set */
@@ -182,14 +182,14 @@ bool TINYNVM_ReadMemory(const uint16_t ReadAddress,
 	/* Send the address of the location to read from */
 	TINYNVM_SendPointerAddress(ReadAddress);
 
-	while (ReadSize-- && !(TimeoutExpired))
+	while (ReadSize-- && TimeoutTicksRemaining)
 	{
 		/* Read the byte of data from the target */
 		XPROGTarget_SendByte(TPI_CMD_SLD | TPI_POINTER_INDIRECT_PI);
 		*(ReadBuffer++) = XPROGTarget_ReceiveByte();
 	}
 
-	return (TimeoutExpired == false);
+	return (TimeoutTicksRemaining > 0);
 }
 
 /** Writes word addressed memory to the target's memory spaces.
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
index e1169d5f161fad62aba823326fa593dbda73d11f..97154ea1edad30a1e4c87eadf44f336b68eec7a0 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
@@ -80,7 +80,7 @@ bool XMEGANVM_WaitWhileNVMBusBusy(void)
 		uint8_t StatusRegister = XPROGTarget_ReceiveByte();
 
 		/* We might have timed out waiting for the status register read response, check here */
-		if (TimeoutExpired)
+		if (!(TimeoutTicksRemaining))
 		  return false;
 
 		/* Check the status register read response to see if the NVM bus is enabled */
@@ -109,7 +109,7 @@ bool XMEGANVM_WaitWhileNVMControllerBusy(void)
 		uint8_t StatusRegister = XPROGTarget_ReceiveByte();
 
 		/* We might have timed out waiting for the status register read response, check here */
-		if (TimeoutExpired)
+		if (!(TimeoutTicksRemaining))
 		  return false;
 
 		/* Check to see if the BUSY flag is still set */
@@ -209,7 +209,7 @@ bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest)
 	for (uint8_t i = 0; i < XMEGA_CRC_LENGTH_BYTES; i++)
 	  ((uint8_t*)CRCDest)[i] = XPROGTarget_ReceiveByte();
 
-	return (TimeoutExpired == false);
+	return (TimeoutTicksRemaining > 0);
 }
 
 /** Reads memory from the target's memory spaces.
@@ -241,10 +241,10 @@ bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, uint16
 
 	/* Send a LD command with indirect access and post-increment to read out the bytes */
 	XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
-	while (ReadSize-- && !(TimeoutExpired))
+	while (ReadSize-- && TimeoutTicksRemaining)
 	  *(ReadBuffer++) = XPROGTarget_ReceiveByte();
 
-	return (TimeoutExpired == false);
+	return (TimeoutTicksRemaining > 0);
 }
 
 /** Writes byte addressed memory to the target's memory spaces.
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
index b50ffbd1b5bcd93e8d4c35779419da15e447a461..b2f55520a6436d36bc5bbaf5efe4aea2e5c1f8a9 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
@@ -153,7 +153,7 @@ uint8_t XPROGTarget_ReceiveByte(void)
 	  XPROGTarget_SetRxMode();
 
 	/* Wait until a byte has been received before reading */
-	while (!(UCSR1A & (1 << RXC1)) && !(TimeoutExpired));
+	while (!(UCSR1A & (1 << RXC1)) && TimeoutTicksRemaining);
 
 	return UDR1;
 }