diff --git a/Projects/Unfinished/AVRISP/AVRISP.c b/Projects/Unfinished/AVRISP/AVRISP.c
index 9826dbbd7ad2846196f1d7ae394441033999487d..e937253e392b76b969682025243096b11cbb5c7b 100644
--- a/Projects/Unfinished/AVRISP/AVRISP.c
+++ b/Projects/Unfinished/AVRISP/AVRISP.c
@@ -42,8 +42,8 @@
 int main(void)
 {
 	SetupHardware();
-	
-	V2Protocol_ConfigureHardware();
+
+	V2Protocol_Init();
 
 	printf("AVRISP-MKII Clone\r\n");
 	
diff --git a/Projects/Unfinished/AVRISP/AVRISP.txt b/Projects/Unfinished/AVRISP/AVRISP.txt
index 0eb26f4e9ef779ede3b661227f56ff3f1a4a1a1a..6ab346c2c9d9fd7393be681899b6a0b3bf98d9b8 100644
--- a/Projects/Unfinished/AVRISP/AVRISP.txt
+++ b/Projects/Unfinished/AVRISP/AVRISP.txt
@@ -55,9 +55,6 @@
  *  This device spoofs Atmel's official AVRISP-MKII device PID so that it remains compatible with Atmel's AVRISP-MKII
  *  drivers. When promted, direct your OS to install Atmel's AVRISP-MKII drivers provided with AVRStudio.
  *
- *  This demo contains both FLASH and EEPROM data, as compiled .HEX and .EEP files respectively. <b>Both</b> files must
- *  be loaded into the device for it to perform correctly.
- *
  *  \section SSec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
@@ -74,11 +71,6 @@
  *    <td>PORT register for the programmer's target RESET line.</td>
  *   </tr>
  *   <tr>
- *    <td>RESET_LINE_PIN</td>
- *    <td>Makefile CDEFS</td>
- *    <td>PIN register for the programmer's target RESET line.</td>
- *   </tr>
- *   <tr>
  *    <td>RESET_LINE_DDR</td>
  *    <td>Makefile CDEFS</td>
  *    <td>DDR register for the programmer's target RESET line.</td>
diff --git a/Projects/Unfinished/AVRISP/Lib/V2Protocol.c b/Projects/Unfinished/AVRISP/Lib/V2Protocol.c
index 27f6fa7dc7ea88ac948d623a926b9214b5a7f074..905214c6de06cb3c25b090817552f7af20254b28 100644
--- a/Projects/Unfinished/AVRISP/Lib/V2Protocol.c
+++ b/Projects/Unfinished/AVRISP/Lib/V2Protocol.c
@@ -36,47 +36,108 @@
 #define  INCLUDE_FROM_V2PROTOCOL_C
 #include "V2Protocol.h"
 
-ParameterItem_t ParameterTable[] EEMEM = 
+/* Table of masks for SPI_Init() from a given PARAM_SCK_DURATION value */
+static const uint8_t SPIMaskFromSCKDuration[] =
+	{
+		#if (F_CPU == 8000000)
+		SPI_SPEED_FCPU_DIV_2,
+		#endif
+		SPI_SPEED_FCPU_DIV_2, SPI_SPEED_FCPU_DIV_4, SPI_SPEED_FCPU_DIV_8,
+		SPI_SPEED_FCPU_DIV_16, SPI_SPEED_FCPU_DIV_32, SPI_SPEED_FCPU_DIV_64
+		#if (F_CPU == 16000000)										
+		, SPI_SPEED_FCPU_DIV_128
+		#endif
+	};
+	
+/* Non-Volatile Parameter Values for EEPROM storage */
+uint8_t EEMEM EEPROM_Rest_Polarity;
+
+/* Volatile Parameter Values for RAM storage */
+static ParameterItem_t ParameterTable[] = 
 	{
 		{ .ParameterID    = PARAM_BUILD_NUMBER_LOW,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = (LUFA_VERSION_INTEGER >> 8)    },
 		{ .ParameterID    = PARAM_BUILD_NUMBER_HIGH,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = (LUFA_VERSION_INTEGER & 0xFF)  },
 		{ .ParameterID    = PARAM_HW_VER,
-		  .ParameterValue = 0x01                    },
+		  .ParameterValue = 0x01                           },
 		{ .ParameterID    = PARAM_SW_MAJOR,
-		  .ParameterValue = 0x01                    },
+		  .ParameterValue = 0x01                           },
 		{ .ParameterID    = PARAM_SW_MINOR,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = 0x00                           },
 		{ .ParameterID    = PARAM_VTARGET,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = 0x00                           },
 		{ .ParameterID    = PARAM_SCK_DURATION,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = sizeof(SPIMaskFromSCKDuration) },
 		{ .ParameterID    = PARAM_RESET_POLARITY,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = 0x01                           },
 		{ .ParameterID    = PARAM_STATUS_TGT_CONN,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = 0x00                           },
 		{ .ParameterID    = PARAM_DISCHARGEDELAY,
-		  .ParameterValue = 0x00                    },
+		  .ParameterValue = 0x00                           },
 	};
-	
-void V2Protocol_ConfigureHardware(void)
+
+
+static void V2Protocol_ReconfigureSPI(void)
 {
-#if F_CPU == 8000000
-	uint8_t SPIMaskFromSCKDuration[] = {SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128,
-	                                    SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128};
-#else
-	uint8_t SPIMaskFromSCKDuration[] = {SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128,
-	                                    SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128};
-#endif
-
-	uint8_t SCKDuration = eeprom_read_byte(&V2Protocol_GetParameterItem(PARAM_SCK_DURATION)->ParameterValue);
-
-	if (SCKDuration > sizeof(SPIMaskFromSCKDuration))
-	  SCKDuration = SPIMaskFromSCKDuration;
+	uint8_t SCKDuration = V2Protocol_GetParameter(PARAM_SCK_DURATION);
+
+	if (SCKDuration >= sizeof(SPIMaskFromSCKDuration))
+	  SCKDuration = (sizeof(SPIMaskFromSCKDuration) - 1);
 	  
 	SPI_Init(SPIMaskFromSCKDuration[SCKDuration], true);	
 }
+
+static void V2Protocol_ChangeTargetResetLine(bool ResetTarget)
+{
+	if (ResetTarget)
+	{
+		RESET_LINE_DDR  |= RESET_LINE_MASK;
+		
+		if (!(V2Protocol_GetParameter(PARAM_RESET_POLARITY)))
+		  RESET_LINE_PORT |= RESET_LINE_MASK;
+	}
+	else
+	{
+		RESET_LINE_PORT &= ~RESET_LINE_MASK;	
+		RESET_LINE_DDR  &= ~RESET_LINE_MASK;
+	}
+}
+
+static uint8_t V2Protocol_GetParameter(uint8_t ParamID)
+{
+	/* Find the parameter in the parameter table and retrieve the value */
+	for (uint8_t TableIndex = 0; TableIndex < (sizeof(ParameterTable) / sizeof(ParameterTable[0])); TableIndex++)
+	{
+		if (ParamID == ParameterTable[TableIndex].ParameterID)
+		  return ParameterTable[TableIndex].ParameterValue;
+	}
+	
+	return 0;
+}
+
+static void V2Protocol_SetParameter(uint8_t ParamID, uint8_t Value)
+{
+	/* The target RESET line polarity is a non-volatile parameter, save to EEPROM when changed */
+	if (ParamID == PARAM_RESET_POLARITY)
+	  eeprom_write_byte(&EEPROM_Rest_Polarity, Value);
+
+	/* Find the parameter in the parameter table and store the new value */
+	for (uint8_t TableIndex = 0; TableIndex < (sizeof(ParameterTable) / sizeof(ParameterTable[0])); TableIndex++)
+	{
+		if (ParamID == ParameterTable[TableIndex].ParameterID)
+		{
+			ParameterTable[TableIndex].ParameterValue = Value;
+			return;
+		}
+	}
+}
+
+void V2Protocol_Init(void)
+{
+	/* Target RESET line polarity is a non-volatile value, retrieve current parameter value from EEPROM */
+	V2Protocol_SetParameter(PARAM_RESET_POLARITY, eeprom_read_byte(&EEPROM_Rest_Polarity));
+}
 
 void V2Protocol_ProcessCommand(void)
 {
@@ -85,28 +146,17 @@ void V2Protocol_ProcessCommand(void)
 	switch (V2Command)
 	{
 		case CMD_SIGN_ON:
-			V2Protocol_ProcessCmdSignOn();
+			V2Protocol_Command_SignOn();
 			break;
 		case CMD_SET_PARAMETER:
 		case CMD_GET_PARAMETER:
-			V2Protocol_ProcessCmdGetSetParam(V2Command);
+			V2Protocol_Command_GetSetParam(V2Command);
 			break;
 		case CMD_SPI_MULTI:
-			V2Protocol_ProcessCmdSPIMulti();
+			V2Protocol_Command_SPIMulti();
 			break;		
 		default:
-			while (Endpoint_BytesInEndpoint() == AVRISP_DATA_EPSIZE)
-			{
-				Endpoint_ClearOUT();
-				while (!(Endpoint_IsOUTReceived()));
-			}
-		
-			Endpoint_ClearOUT();
-			Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
-
-			Endpoint_Write_Byte(V2Command);
-			Endpoint_Write_Byte(STATUS_CMD_UNKNOWN);
-			Endpoint_ClearIN();
+			V2Protocol_Command_Unknown(V2Command);
 			break;
 	}
 	
@@ -114,26 +164,31 @@ void V2Protocol_ProcessCommand(void)
 
 	Endpoint_WaitUntilReady();	
 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT);	
-}
+}
 
-static ParameterItem_t* V2Protocol_GetParameterItem(uint8_t ParamID)
-{
-	for (uint8_t TableIndex = 0; TableIndex < (sizeof(ParameterTable) / sizeof(ParameterTable[0])); TableIndex++)
+static void V2Protocol_Command_Unknown(uint8_t V2Command)
+{	
+	while (Endpoint_BytesInEndpoint() == AVRISP_DATA_EPSIZE)
 	{
-		if (ParamID == eeprom_read_byte(&ParameterTable[TableIndex].ParameterID))
-		  return &ParameterTable[TableIndex];
+		Endpoint_ClearOUT();
+		while (!(Endpoint_IsOUTReceived()));
 	}
-	
-	return NULL;
-}
+
+	Endpoint_ClearOUT();
+	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
+
+	Endpoint_Write_Byte(V2Command);
+	Endpoint_Write_Byte(STATUS_CMD_UNKNOWN);
+	Endpoint_ClearIN();
+}
 
-static void V2Protocol_ProcessCmdSignOn(void)
+static void V2Protocol_Command_SignOn(void)
 {
 	Endpoint_ClearOUT();
 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 	Endpoint_WaitUntilReady();
 
-	V2Protocol_ConfigureHardware();
+	V2Protocol_ReconfigureSPI();
 
 	Endpoint_Write_Byte(CMD_SIGN_ON);
 	Endpoint_Write_Byte(STATUS_CMD_OK);
@@ -142,7 +197,7 @@ static void V2Protocol_ProcessCmdSignOn(void)
 	Endpoint_ClearIN();
 }
 
-static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command)
+static void V2Protocol_Command_GetSetParam(uint8_t V2Command)
 {
 	uint8_t ParamID    = Endpoint_Read_Byte();
 	uint8_t ParamValue = Endpoint_Read_Byte();
@@ -151,28 +206,18 @@ static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command)
 	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 	Endpoint_WaitUntilReady();
 	
-	ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID);
-	
 	Endpoint_Write_Byte(V2Command);
+	Endpoint_Write_Byte(STATUS_CMD_OK);
 
-	if (ParameterItem != NULL)
-	{
-		Endpoint_Write_Byte(STATUS_CMD_OK);
-
-		if (V2Command == CMD_SET_PARAMETER)
-		  eeprom_write_byte(&ParameterItem->ParameterValue, ParamValue);
-		else
-		  Endpoint_Write_Byte(eeprom_read_byte(&ParameterItem->ParameterValue));			
-	}
+	if (V2Command == CMD_SET_PARAMETER)
+	  V2Protocol_SetParameter(ParamID, ParamValue);
 	else
-	{
-		Endpoint_Write_Byte(STATUS_CMD_FAILED);
-	}
+	  Endpoint_Write_Byte(V2Protocol_GetParameter(ParamID));
 
 	Endpoint_ClearIN();
 }
 
-static void V2Protocol_ProcessCmdSPIMulti(void)
+static void V2Protocol_Command_SPIMulti(void)
 {
 	uint8_t TxBytes = Endpoint_Read_Byte();
 	uint8_t RxBytes = Endpoint_Read_Byte();
@@ -204,14 +249,9 @@ static void V2Protocol_ProcessCmdSPIMulti(void)
 	while (CurrRxPos < RxBytes)
 	{
 		if (CurrTxPos < TxBytes)
-		{
-			Endpoint_Write_Byte(SPI_TransferByte(TxData[CurrTxPos]));
-			CurrTxPos++;
-		}
+		  Endpoint_Write_Byte(SPI_TransferByte(TxData[CurrTxPos++]));
 		else
-		{
-			Endpoint_Write_Byte(SPI_ReceiveByte());
-		}
+		  Endpoint_Write_Byte(SPI_ReceiveByte());
 		
 		CurrRxPos++;
 	}	
diff --git a/Projects/Unfinished/AVRISP/Lib/V2Protocol.h b/Projects/Unfinished/AVRISP/Lib/V2Protocol.h
index 6c2ff606dd4afebc515280a86661f05c6623c7b6..7b9f1b12fc3cd3e742eca56e95639c2bffd18959 100644
--- a/Projects/Unfinished/AVRISP/Lib/V2Protocol.h
+++ b/Projects/Unfinished/AVRISP/Lib/V2Protocol.h
@@ -37,8 +37,10 @@
 #define _V2_PROTOCOL_
 
 	/* Includes: */
-		#include <avr/io.h>
-
+		#include <avr/io.h>
+		#include <avr/eeprom.h>
+
+		#include <LUFA/Version.h>
 		#include <LUFA/Drivers/USB/USB.h>
 		#include <LUFA/Drivers/Peripheral/SPI.h>
 		
@@ -56,15 +58,21 @@
 			uint8_t ParameterValue;
 		} ParameterItem_t;
 
-	/* Function Prototypes: */	
-		void V2Protocol_ConfigureHardware(void);
+	/* Function Prototypes: */
+		void V2Protocol_Init(void);
 		void V2Protocol_ProcessCommand(void);
 		
 		#if defined(INCLUDE_FROM_V2PROTOCOL_C)
-			static ParameterItem_t* V2Protocol_GetParameterItem(uint8_t ParamID);
-			static void V2Protocol_ProcessCmdSignOn(void);
-			static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command);
-			static void V2Protocol_ProcessCmdSPIMulti(void);
+			static void    V2Protocol_ReconfigureSPI(void);
+			static void    V2Protocol_ChangeTargetResetLine(bool ResetTarget);
+
+			static uint8_t V2Protocol_GetParameter(uint8_t ParamID);
+			static void    V2Protocol_SetParameter(uint8_t ParamID, uint8_t Value);
+
+			static void    V2Protocol_Command_Unknown(uint8_t V2Command);
+			static void    V2Protocol_Command_SignOn(void);
+			static void    V2Protocol_Command_GetSetParam(uint8_t V2Command);
+			static void    V2Protocol_Command_SPIMulti(void);
 		#endif
 
 #endif
diff --git a/Projects/Unfinished/AVRISP/makefile b/Projects/Unfinished/AVRISP/makefile
index 0877c5d77dcc18a02c0045d4fd48f482216d5630..d2128dcf39e38ae081adf5f9abb36ffb354ddb14 100644
--- a/Projects/Unfinished/AVRISP/makefile
+++ b/Projects/Unfinished/AVRISP/makefile
@@ -194,7 +194,6 @@ CSTANDARD = -std=gnu99
 # Place -D or -U options here for C sources
 CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) $(LUFA_OPTS)
 CDEFS += -DRESET_LINE_PORT=PORTA
-CDEFS += -DRESET_LINE_PIN=PINA
 CDEFS += -DRESET_LINE_DDR=DDRA
 CDEFS += -DRESET_LINE_MASK="(1 << 0)"