diff --git a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.h b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.h
index d31a8e6b659896ab404a16b460e2c37bcba9c701..bc4c632d85e9417aefde3df2be2f6f114876a45a 100644
--- a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.h
+++ b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.h
@@ -47,7 +47,6 @@
 		#include <LUFA/Version.h>
 		#include <LUFA/Drivers/Board/LEDs.h>
 		#include <LUFA/Drivers/Board/Joystick.h>
-		#include <LUFA/Drivers/Peripheral/ADC.h>
 		#include <LUFA/Drivers/USB/USB.h>
 		#include <LUFA/Drivers/USB/Class/Audio.h>
 	
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c
index fb6bb1aab9fd942531fcc7a82d3aea16c038e924..70033f52898464b99538c4119490cd441c2bac09 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c
@@ -59,7 +59,7 @@ const IP_Address_t  ClientIPAddress     = {CLIENT_IP_ADDRESS};
  */
 void Ethernet_ProcessPacket(Ethernet_Frame_Info_t* FrameIN, Ethernet_Frame_Info_t* FrameOUT)
 {
-	DecodeEthernetFrameHeader(FrameIN->FrameData);
+	DecodeEthernetFrameHeader(FrameIN);
 
 	/* Cast the incoming Ethernet frame to the Ethernet header type */
 	Ethernet_Frame_Header_t* FrameINHeader  = (Ethernet_Frame_Header_t*)&FrameIN->FrameData;
@@ -69,7 +69,8 @@ void Ethernet_ProcessPacket(Ethernet_Frame_Info_t* FrameIN, Ethernet_Frame_Info_
 	
 	/* Ensure frame is addressed to either all (broadcast) or the virtual webserver, and is a type II frame */
 	if ((MAC_COMPARE(&FrameINHeader->Destination, &ServerMACAddress) ||
-	     MAC_COMPARE(&FrameINHeader->Destination, &BroadcastMACAddress)))
+	     MAC_COMPARE(&FrameINHeader->Destination, &BroadcastMACAddress)) &&
+		 (SwapEndian_16(FrameIN->FrameLength) > ETHERNET_VER2_MINSIZE))
 	{
 		/* Process the packet depending on its protocol */
 		switch (SwapEndian_16(FrameINHeader->EtherType))
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h
index a867ff6f6e2c37a660094de8283774dc2444e633..1c85d6ca16dec416265c58871f5e2e27a5554ec5 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.h
@@ -53,7 +53,7 @@
 		
 	/* Macros: */
 		/** Physical MAC address of the USB RNDIS network adapter */
-		#define ADAPTER_MAC_ADDRESS              {0x00, 0x02, 0x00, 0x02, 0x00, 0x02}		
+		#define ADAPTER_MAC_ADDRESS              {0x02, 0x00, 0x02, 0x00, 0x02, 0x00}
 
 		/** Physical MAC address of the virtual server on the network */
 		#define SERVER_MAC_ADDRESS               {0x00, 0x01, 0x00, 0x01, 0x00, 0x01}		
@@ -70,6 +70,9 @@
 		 */
 		#define MAC_COMPARE(MAC1, MAC2)          (memcmp(MAC1, MAC2, sizeof(MAC_Address_t)) == 0)
 		
+		/** Minimum size of an Ethernet packet in bytes, to conform to the Ethernet V2 packet standard */
+		#define ETHERNET_VER2_MINSIZE            0x0600
+
 		/** Return value for all sub protocol handling routines, indicating that no response packet has been generated */
 		#define NO_RESPONSE                      0		
 
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c
index aac72ae51be0db728b3fd99d4bfd71a3bfd31126..d4e2ceb860f144d871cd9cb794e1bdd36a4068ae 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c
@@ -53,15 +53,15 @@
  *
  *  \param[in] InDataStart  Pointer to the start of an Ethernet frame header
  */
-void DecodeEthernetFrameHeader(void* InDataStart)
+void DecodeEthernetFrameHeader(Ethernet_Frame_Info_t* FrameINData)
 {
 	#if !defined(NO_DECODE_ETHERNET)
-	Ethernet_Frame_Header_t* FrameHeader = (Ethernet_Frame_Header_t*)InDataStart;
+	Ethernet_Frame_Header_t* FrameHeader = (Ethernet_Frame_Header_t*)FrameINData->FrameData;
 	
 	printf_P(PSTR("\r\n"));
 	
 	printf_P(PSTR("  ETHERNET\r\n"));
-	printf_P(PSTR("  + Frame Size: %u\r\n"), FrameIN.FrameLength);
+	printf_P(PSTR("  + Frame Size: %u\r\n"), FrameINData->FrameLength);
 
 	if (!(MAC_COMPARE(&FrameHeader->Destination, &ServerMACAddress)) &&
 	    !(MAC_COMPARE(&FrameHeader->Destination, &BroadcastMACAddress)))
@@ -84,7 +84,7 @@ void DecodeEthernetFrameHeader(void* InDataStart)
 	                                                                     FrameHeader->Destination.Octets[4],
 	                                                                     FrameHeader->Destination.Octets[5]);
 
-	if (SwapEndian_16(FrameIN.FrameLength) > ETHERNET_VER2_MINSIZE)
+	if (SwapEndian_16(FrameINData->FrameLength) > ETHERNET_VER2_MINSIZE)
 	  printf_P(PSTR("  + Protocol: 0x%04x\r\n"), SwapEndian_16(FrameHeader->EtherType));
 	else
 	  printf_P(PSTR("  + Protocol: UNKNOWN E1\r\n"));
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.h b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.h
index fa0a869ebb9625f0c62be9748b143cfb23ad1d4d..a1de406f3bf93369363fd5af88e6d458295d1eb5 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.h
@@ -39,13 +39,14 @@
 	/* Includes: */
 		#include <avr/io.h>
 		
+		#include <LUFA/Drivers/USB/Class/RNDIS.h>
 		#include <LUFA/Drivers/Peripheral/SerialStream.h>
 		
 		#include "EthernetProtocols.h"
 		#include "Ethernet.h"
 		
 	/* Function Prototypes: */
-		void DecodeEthernetFrameHeader(void* InDataStart);
+		void DecodeEthernetFrameHeader(Ethernet_Frame_Info_t* FrameINData);
 		void DecodeARPHeader(void* InDataStart);
 		void DecodeIPHeader(void* InDataStart);
 		void DecodeICMPHeader(void* InDataStart);
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
index c94495dc33fe6453e5d39e320c2a7b1ce0bd6143..2a626e97527a777ba1cd95e165568edcba909e98 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
@@ -58,25 +58,27 @@ TCP_ConnectionState_t  ConnectionStateTable[MAX_TCP_CONNECTIONS];
  */
 void TCP_TCPTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
 {
-	/* Task to hand off TCP packets to and from the listening applications. */
-
 	/* Run each application in sequence, to process incoming and generate outgoing packets */
 	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++)
 	{
 		/* Find the corresponding port entry in the port table */
-		for (uint8_t PTableEntry = 0; PTableEntry < MAX_TCP_CONNECTIONS; PTableEntry++)
+		for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++)
 		{
 			/* Run the application handler for the port */
 			if ((PortStateTable[PTableEntry].Port  == ConnectionStateTable[CSTableEntry].Port) && 
 			    (PortStateTable[PTableEntry].State == TCP_Port_Open))
 			{
-				PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry], &ConnectionStateTable[CSTableEntry].Info.Buffer);
+				PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry],
+				                                               &ConnectionStateTable[CSTableEntry].Info.Buffer);
 			}
 		}
 	}
 	
+	/* Get pointer to the output frame info struct for convenience */
+	Ethernet_Frame_Info_t* FrameOUT = (Ethernet_Frame_Info_t*)&RNDISInterfaceInfo->State.FrameOUT;
+	
 	/* Bail out early if there is already a frame waiting to be sent in the Ethernet OUT buffer */
-	if (RNDISInterfaceInfo->State.FrameOUT.FrameInBuffer)
+	if (FrameOUT->FrameInBuffer)
 	  return;
 	
 	/* Send response packets from each application as the TCP packet buffers are filled by the applications */
@@ -86,13 +88,13 @@ void TCP_TCPTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
 		if ((ConnectionStateTable[CSTableEntry].Info.Buffer.Direction == TCP_PACKETDIR_OUT) &&
 		    (ConnectionStateTable[CSTableEntry].Info.Buffer.Ready))
 		{
-			Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&RNDISInterfaceInfo->State.FrameOUT.FrameData;
-			IP_Header_t*    IPHeaderOUT  = (IP_Header_t*)&RNDISInterfaceInfo->State.FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)];
-			TCP_Header_t*   TCPHeaderOUT = (TCP_Header_t*)&RNDISInterfaceInfo->State.FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +
-			                                                                                      sizeof(IP_Header_t)];						
-			void*           TCPDataOUT     = &RNDISInterfaceInfo->State.FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +
-			                                                                         sizeof(IP_Header_t) +
-			                                                                         sizeof(TCP_Header_t)];
+			Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&FrameOUT->FrameData;
+			IP_Header_t*             IPHeaderOUT    = (IP_Header_t*)&FrameOUT->FrameData[sizeof(Ethernet_Frame_Header_t)];
+			TCP_Header_t*            TCPHeaderOUT   = (TCP_Header_t*)&FrameOUT->FrameData[sizeof(Ethernet_Frame_Header_t) +
+			                                                                              sizeof(IP_Header_t)];
+			void*                    TCPDataOUT     = &FrameOUT->FrameData[sizeof(Ethernet_Frame_Header_t) +
+			                                                               sizeof(IP_Header_t) +
+			                                                               sizeof(TCP_Header_t)];
 
 			uint16_t PacketSize = ConnectionStateTable[CSTableEntry].Info.Buffer.Length;
 
@@ -145,8 +147,8 @@ void TCP_TCPTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
 			PacketSize += sizeof(Ethernet_Frame_Header_t);
 
 			/* Set the response length in the buffer and indicate that a response is ready to be sent */
-			RNDISInterfaceInfo->State.FrameOUT.FrameLength   = PacketSize;
-			RNDISInterfaceInfo->State.FrameOUT.FrameInBuffer = true;
+			FrameOUT->FrameLength           = PacketSize;
+			FrameOUT->FrameInBuffer         = true;
 			
 			ConnectionStateTable[CSTableEntry].Info.Buffer.Ready = false;
 			
@@ -367,11 +369,12 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, void* TCPHeaderInStart, void
 		/* Detect RST from host to abort existing connection */
 		if (TCPHeaderIN->Flags & TCP_FLAG_RST)
 		{
-			TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK);				
-			PacketResponse = true;
-			
-			TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
-			                       TCPHeaderIN->SourcePort, TCP_Connection_Closed);			
+			if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+			                           TCPHeaderIN->SourcePort, TCP_Connection_Closed))
+			{
+				TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK);				
+				PacketResponse = true;			
+			}
 		}
 		else
 		{
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c
index dbd33d15d4ab27f2a74e79f373c43931b74f6236..ea679512bc13c4d9f30143ec927ab7adc92ea5c8 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.c
@@ -55,12 +55,13 @@ int16_t UDP_ProcessUDPPacket(void* IPHeaderInStart, void* UDPHeaderInStart, void
 	
 	DecodeUDPHeader(UDPHeaderInStart);
 	
-	/* Check to see if the UDP packet is a DHCP packet */
-	if (SwapEndian_16(UDPHeaderIN->DestinationPort) == UDP_PORT_DHCP_REQUEST)
+	switch (SwapEndian_16(UDPHeaderIN->DestinationPort))
 	{
-		RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,
-		                                 &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],
-	                                     &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);
+		case UDP_PORT_DHCP_REQUEST:
+			RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,
+			                                 &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],
+		                                     &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);
+			break;
 	}
 	
 	/* Check to see if the protocol processing routine has filled out a response */
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.h b/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.h
index 60bbe2185b859eb18b54d1c6ed11502986daa604..737a6fd540463ab4cfabc39714947375caac04e4 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/UDP.h
@@ -42,6 +42,7 @@
 		#include "EthernetProtocols.h"
 		#include "Ethernet.h"
 		#include "ProtocolDecoders.h"
+		#include "DHCP.h"
 	
 	/* Macros: */
 		/** Source UDP port for a DHCP request */
@@ -49,7 +50,7 @@
 
 		/** Destination UDP port for a DHCP reply */
 		#define UDP_PORT_DHCP_REPLY   68
-			
+
 	/* Type Defines: */
 		/** Type define for a UDP packet header */
 		typedef struct
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/makefile b/Demos/Device/ClassDriver/RNDISEthernet/makefile
index eb03d62ac8b821c9001a7d67c50c77787c05bbfa..c39703e6df1698d50bd750ac7dfa5fab8e496de2 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/makefile
+++ b/Demos/Device/ClassDriver/RNDISEthernet/makefile
@@ -202,7 +202,8 @@ 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 += -DNO_DECODE_ETHERNET -DNO_DECODE_ARP -DNO_DECODE_ICMP -DNO_DECODE_IP -DNO_DECODE_TCP -DNO_DECODE_UDP -DNO_DECODE_DHCP
+CDEFS += -DNO_DECODE_ETHERNET -DNO_DECODE_ARP -DNO_DECODE_ICMP
+CDEFS += -DNO_DECODE_IP -DNO_DECODE_TCP -DNO_DECODE_UDP -DNO_DECODE_DHCP -DNO_DECODE_DNS
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h b/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h
index b91a56ba20ddea8cacb6bcb5fc678eb1bf1ec10b..5b140a1ba9a64829c3fb6a6ff83f15e775bb00cd 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h
@@ -50,6 +50,9 @@
 		#include "IP.h"
 		
 	/* Macros: */
+		/** Physical MAC address of the USB RNDIS network adapter */
+		#define ADAPTER_MAC_ADDRESS              {0x02, 0x00, 0x02, 0x00, 0x02, 0x00}
+	
 		/** Physical MAC address of the virtual server on the network */
 		#define SERVER_MAC_ADDRESS               {0x00, 0x01, 0x00, 0x01, 0x00, 0x01}		
 
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c
index aac72ae51be0db728b3fd99d4bfd71a3bfd31126..53bd8bfed3538d6ecb01f45e4b8bb722b090d039 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c
@@ -275,6 +275,5 @@ void DecodeDHCPHeader(void* InDataStart)
 		
 		DHCPOptions += ((DHCPOptions[0] == DHCP_OPTION_PAD) ? 1 : (DHCPOptions[1] + 2));
 	}
-
 	#endif
 }
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.h b/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.h
index 104cac780ec37b6d60e45afacf287f371cae3170..72f9f5f47f5959b218afd5ad4ed7c1bf25ffed69 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.h
@@ -45,9 +45,6 @@
 		#include "Ethernet.h"
 
 	/* Macros: */
-		/** Physical MAC Address of the USB network adapter */
-		#define ADAPTER_MAC_ADDRESS                   {0x02, 0x00, 0x02, 0x00, 0x02, 0x00}
-	
 		/** Implemented RNDIS Version Major */
 		#define REMOTE_NDIS_VERSION_MAJOR             0x01
 
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
index 57b3f3a8cf5d20cdf003cc3cc88e8a7e1386814c..2537286b761801d0dcfb1ceb9eed89a14a07d068 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
@@ -58,19 +58,18 @@ TCP_ConnectionState_t  ConnectionStateTable[MAX_TCP_CONNECTIONS];
  */
 void TCP_Task(void)
 {
-	/* Task to hand off TCP packets to and from the listening applications. */
-
 	/* Run each application in sequence, to process incoming and generate outgoing packets */
 	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++)
 	{
 		/* Find the corresponding port entry in the port table */
-		for (uint8_t PTableEntry = 0; PTableEntry < MAX_TCP_CONNECTIONS; PTableEntry++)
+		for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++)
 		{
 			/* Run the application handler for the port */
 			if ((PortStateTable[PTableEntry].Port  == ConnectionStateTable[CSTableEntry].Port) && 
 			    (PortStateTable[PTableEntry].State == TCP_Port_Open))
 			{
-				PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry], &ConnectionStateTable[CSTableEntry].Info.Buffer);
+				PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry],
+				                                               &ConnectionStateTable[CSTableEntry].Info.Buffer);
 			}
 		}
 	}
@@ -89,7 +88,7 @@ void TCP_Task(void)
 			Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&FrameOUT.FrameData;
 			IP_Header_t*             IPHeaderOUT    = (IP_Header_t*)&FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)];
 			TCP_Header_t*            TCPHeaderOUT   = (TCP_Header_t*)&FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +
-			                                                                             sizeof(IP_Header_t)];						
+			                                                                             sizeof(IP_Header_t)];
 			void*                    TCPDataOUT     = &FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +
 			                                                              sizeof(IP_Header_t) +
 			                                                              sizeof(TCP_Header_t)];
@@ -367,11 +366,12 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, void* TCPHeaderInStart, void
 		/* Detect RST from host to abort existing connection */
 		if (TCPHeaderIN->Flags & TCP_FLAG_RST)
 		{
-			TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK);				
-			PacketResponse = true;
-			
-			TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
-			                       TCPHeaderIN->SourcePort, TCP_Connection_Closed);			
+			if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+			                           TCPHeaderIN->SourcePort, TCP_Connection_Closed))
+			{
+				TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK);				
+				PacketResponse = true;			
+			}
 		}
 		else
 		{
@@ -584,10 +584,10 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, void* TCPHeaderInStart, void
 /** Calculates the appropriate TCP checksum, consisting of the addition of the one's compliment of each word,
  *  complimented.
  *
- *  \param[in] TCPHeaderOutStart  Pointer to the start of the packet's outgoing TCP header
- *  \param[in] SourceAddress      Source protocol IP address of the outgoing IP header
- *  \param[in] DestinationAddress Destination protocol IP address of the outgoing IP header
- *  \param[in] TCPOutSize         Size in bytes of the TCP data header and payload
+ *  \param[in] TCPHeaderOutStart   Pointer to the start of the packet's outgoing TCP header
+ *  \param[in] SourceAddress       Source protocol IP address of the outgoing IP header
+ *  \param[in] DestinationAddress  Destination protocol IP address of the outgoing IP header
+ *  \param[in] TCPOutSize          Size in bytes of the TCP data header and payload
  *
  *  \return A 16-bit TCP checksum value
  */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c
index dbd33d15d4ab27f2a74e79f373c43931b74f6236..ea679512bc13c4d9f30143ec927ab7adc92ea5c8 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c
@@ -55,12 +55,13 @@ int16_t UDP_ProcessUDPPacket(void* IPHeaderInStart, void* UDPHeaderInStart, void
 	
 	DecodeUDPHeader(UDPHeaderInStart);
 	
-	/* Check to see if the UDP packet is a DHCP packet */
-	if (SwapEndian_16(UDPHeaderIN->DestinationPort) == UDP_PORT_DHCP_REQUEST)
+	switch (SwapEndian_16(UDPHeaderIN->DestinationPort))
 	{
-		RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,
-		                                 &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],
-	                                     &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);
+		case UDP_PORT_DHCP_REQUEST:
+			RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,
+			                                 &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],
+		                                     &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);
+			break;
 	}
 	
 	/* Check to see if the protocol processing routine has filled out a response */
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.h b/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.h
index 60bbe2185b859eb18b54d1c6ed11502986daa604..e3e75a0482218e684af9361f06280d5c20ff6b4b 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.h
@@ -42,6 +42,7 @@
 		#include "EthernetProtocols.h"
 		#include "Ethernet.h"
 		#include "ProtocolDecoders.h"
+		#include "DHCP.h"
 	
 	/* Macros: */
 		/** Source UDP port for a DHCP request */
@@ -49,7 +50,10 @@
 
 		/** Destination UDP port for a DHCP reply */
 		#define UDP_PORT_DHCP_REPLY   68
-			
+
+		/** Source UDP port for a DNS request/response */
+		#define UDP_PORT_DNS          53
+
 	/* Type Defines: */
 		/** Type define for a UDP packet header */
 		typedef struct
diff --git a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c
index f6afb6901759396d81c4c5b8bd7bdecaa64a74c4..a2a0c3bd59855eabdf3817ea118cec68d8f83863 100644
--- a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c
+++ b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c
@@ -1,12 +1,8 @@
 uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length)
 {
-	uint8_t* DataStream     = (uint8_t*)(Buffer + TEMPLATE_BUFFER_OFFSET(Length));
-	bool     LastPacketFull = false;
+	uint8_t* DataStream = (uint8_t*)(Buffer + TEMPLATE_BUFFER_OFFSET(Length));
 	
-	if (Length > USB_ControlRequest.wLength)
-	  Length = USB_ControlRequest.wLength;
-
-	while (Length || LastPacketFull)
+	while (Length)
 	{
 		if (Endpoint_IsSETUPReceived())
 		  return ENDPOINT_RWCSTREAM_HostAborted;
@@ -16,8 +12,6 @@ uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length)
 		  
 		if (Endpoint_IsOUTReceived())
 		{
-			LastPacketFull = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);
-		
 			while (Length && Endpoint_BytesInEndpoint())
 			{
 				TEMPLATE_TRANSFER_BYTE(DataStream);
@@ -25,9 +19,6 @@ uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length)
 			}
 			
 			Endpoint_ClearOUT();
-			
-			if (!(LastPacketFull))
-			  Length = 0;
 		}		  
 	}