diff --git a/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c b/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c
index 7078f5e51318a97cfaf1ef14665c43e948751110..5a173d6f421fddf525a6020836b71aaba18b7135 100644
--- a/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c
+++ b/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c
@@ -145,10 +145,6 @@ uint8_t ProcessConfigurationDescriptor(void)
 			/* Check if the endpoint is a bulk IN or bulk OUT endpoint */
 			if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
 			{
-				/* Kill the configured OUT pipe if the data endpoints are bidirectional */
-				if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))
-				  Pipe_DisablePipe();
-
 				/* Configure the data IN pipe */
 				Pipe_ConfigurePipe(RNDIS_DATAPIPE_IN, EP_TYPE_BULK, PIPE_TOKEN_IN,
 								   EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
@@ -158,13 +154,9 @@ uint8_t ProcessConfigurationDescriptor(void)
 			}
 			else
 			{
-				/* Only configure the OUT data pipe if the data endpoints have not shown to be bidirectional */
-				if (!(Pipe_IsEndpointBound(EndpointData->EndpointAddress)))
-				{
-					/* Configure the data OUT pipe */
-					Pipe_ConfigurePipe(RNDIS_DATAPIPE_OUT, EP_TYPE_BULK, PIPE_TOKEN_OUT,
-									   EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
-				}
+				/* Configure the data OUT pipe */
+				Pipe_ConfigurePipe(RNDIS_DATAPIPE_OUT, EP_TYPE_BULK, PIPE_TOKEN_OUT,
+								   EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
 				
 				/* Set the flag indicating that the data OUT pipe has been found */
 				FoundEndpoints |= (1 << RNDIS_DATAPIPE_OUT);
diff --git a/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c b/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c
index c42cc0f76d71c1d0cc0e683a19a8925a2da3d490..853ad37e075662765e01f6e713b5e94b6069f205 100644
--- a/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c
+++ b/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c
@@ -145,10 +145,6 @@ uint8_t ProcessConfigurationDescriptor(void)
 			/* Check if the endpoint is a bulk IN or bulk OUT endpoint */
 			if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
 			{
-				/* Kill the configured OUT pipe if the data endpoints are bidirectional */
-				if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))
-				  Pipe_DisablePipe();
-
 				/* Configure the data IN pipe */
 				Pipe_ConfigurePipe(CDC_DATAPIPE_IN, EP_TYPE_BULK, PIPE_TOKEN_IN,
 								   EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
@@ -158,13 +154,9 @@ uint8_t ProcessConfigurationDescriptor(void)
 			}
 			else
 			{
-				/* Only configure the OUT data pipe if the data endpoints have not shown to be bidirectional */
-				if (!(Pipe_IsEndpointBound(EndpointData->EndpointAddress)))
-				{
-					/* Configure the data OUT pipe */
-					Pipe_ConfigurePipe(CDC_DATAPIPE_OUT, EP_TYPE_BULK, PIPE_TOKEN_OUT,
-									   EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
-				}
+				/* Configure the data OUT pipe */
+				Pipe_ConfigurePipe(CDC_DATAPIPE_OUT, EP_TYPE_BULK, PIPE_TOKEN_OUT,
+								   EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
 				
 				/* Set the flag indicating that the data OUT pipe has been found */
 				FoundEndpoints |= (1 << CDC_DATAPIPE_OUT);
diff --git a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c
index 98980e8f05e0c7a84a04dac8fd813365222e768a..4c521a48098036b3748bef2538429f56af5375b9 100644
--- a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c
+++ b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c
@@ -218,7 +218,6 @@ void CDC_Host_Task(void)
 		case HOST_STATE_Configured:
 			/* Select the data IN pipe */
 			Pipe_SelectPipe(CDC_DATAPIPE_IN);
-			Pipe_SetPipeToken(PIPE_TOKEN_IN);
 			Pipe_Unfreeze();
 
 			/* Check to see if a packet has been received */
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c
index 7f5bcb940452a70e6eee8e3b2572fc46ce5eaf14..8ad37de7326ccd83ba9578c53d48b65a39e207ac 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.c
+++ b/LUFA/Drivers/USB/Class/Host/CDC.c
@@ -110,32 +110,20 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
 		{
 			if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
 			{
-				if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))
-				{
-					CDCInterfaceInfo->State.BidirectionalDataEndpoints = true;
-					Pipe_DisablePipe();
-				}
-
 				Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,
 				                   EndpointData->EndpointAddress, EndpointData->EndpointSize, 
 				                   CDCInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
+
 				CDCInterfaceInfo->State.DataINPipeSize = EndpointData->EndpointSize;
 
 				FoundEndpoints |= CDC_FOUND_DATAPIPE_IN;
 			}
 			else
 			{
-				if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))
-				{
-					CDCInterfaceInfo->State.BidirectionalDataEndpoints = true;
-				}
-				else
-				{
-					Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,
-					                   EndpointData->EndpointAddress, EndpointData->EndpointSize, 
-					                   CDCInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
-				}
-				
+				Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,
+								   EndpointData->EndpointAddress, EndpointData->EndpointSize, 
+								   CDCInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
+			
 				CDCInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;
 				
 				FoundEndpoints |= CDC_FOUND_DATAPIPE_OUT;
@@ -277,22 +265,11 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, ch
 
 	uint8_t ErrorCode;
 
-	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
-	{
-		Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
-		Pipe_SetPipeToken(PIPE_TOKEN_OUT);
-	}
-	else
-	{
-		Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);	
-	}
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);	
 
 	Pipe_Unfreeze();
 	ErrorCode = Pipe_Write_Stream_LE(Data, Length, NO_STREAM_CALLBACK);
 	Pipe_Freeze();
-
-	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
-	  Pipe_SetPipeToken(PIPE_TOKEN_IN);
 	
 	return ErrorCode;
 }
@@ -304,16 +281,7 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, cons
 	  
 	uint8_t ErrorCode;
 
-	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
-	{
-		Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
-		Pipe_SetPipeToken(PIPE_TOKEN_OUT);
-	}
-	else
-	{
-		Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);	
-	}
-	
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);	
 	Pipe_Unfreeze();
 	
 	if (!(Pipe_IsReadWriteAllowed()))
@@ -326,9 +294,6 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, cons
 
 	Pipe_Write_Byte(Data);	
 	Pipe_Freeze();
-
-	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
-	  Pipe_SetPipeToken(PIPE_TOKEN_IN);
 	
 	return PIPE_READYWAIT_NoError;
 }
@@ -381,16 +346,7 @@ uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
 	  
 	uint8_t ErrorCode;
 
-	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
-	{
-		Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
-		Pipe_SetPipeToken(PIPE_TOKEN_OUT);
-	}
-	else
-	{
-		Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);	
-	}
-	
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);	
 	Pipe_Unfreeze();
 	
 	if (!(Pipe_BytesInPipe()))
@@ -409,9 +365,6 @@ uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
 	}
 
 	Pipe_Freeze();
-
-	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
-	  Pipe_SetPipeToken(PIPE_TOKEN_IN);
 	
 	return PIPE_READYWAIT_NoError;
 }
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h
index dbc1f9e4204074d3b281f7bf316b050f7bb53744..466f141db8345c6ad4dee541deee8b067b40ae81 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.h
+++ b/LUFA/Drivers/USB/Class/Host/CDC.h
@@ -89,11 +89,6 @@
 					uint16_t DataOUTPipeSize;  /**< Size in bytes of the CDC interface's OUT data pipe */
 					uint16_t NotificationPipeSize;  /**< Size in bytes of the CDC interface's IN notification pipe, if used */
 					
-					bool BidirectionalDataEndpoints; /**< Indicates if the attached CDC interface uses bidirectional data endpoints,
-					                                  *   and this has only the IN pipe configured (with \ref Pipe_SetPipeToken()
-					                                  *   used to switch the pipe's direction)
-					                                  */
-
 					struct
 					{
 						uint8_t HostToDevice; /**< Control line states from the host to device, as a set of CDC_CONTROL_LINE_OUT_*
diff --git a/LUFA/Drivers/USB/Class/Host/RNDIS.c b/LUFA/Drivers/USB/Class/Host/RNDIS.c
index fac569e9cadddac95d34a7c9c5516d1688073494..5966ed8516fe9655de87ff68b4bc43b41419152e 100644
--- a/LUFA/Drivers/USB/Class/Host/RNDIS.c
+++ b/LUFA/Drivers/USB/Class/Host/RNDIS.c
@@ -110,12 +110,6 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
 		{
 			if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
 			{
-				if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))
-				{
-					RNDISInterfaceInfo->State.BidirectionalDataEndpoints = true;
-					Pipe_DisablePipe();
-				}
-
 				Pipe_ConfigurePipe(RNDISInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,
 				                   EndpointData->EndpointAddress, EndpointData->EndpointSize, 
 				                   RNDISInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
@@ -125,17 +119,10 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
 			}
 			else
 			{
-				if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))
-				{
-					RNDISInterfaceInfo->State.BidirectionalDataEndpoints = true;
-				}
-				else
-				{
-					Pipe_ConfigurePipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,
-					                   EndpointData->EndpointAddress, EndpointData->EndpointSize, 
-					                   RNDISInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
-				}
-				
+				Pipe_ConfigurePipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,
+				                   EndpointData->EndpointAddress, EndpointData->EndpointSize, 
+				                   RNDISInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
+
 				RNDISInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;
 				
 				FoundEndpoints |= RNDIS_FOUND_DATAPIPE_OUT;
@@ -422,27 +409,11 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
 
 	RNDIS_Packet_Message_t DeviceMessage;
 	
-	if (Pipe_BytesInPipe() < sizeof(RNDIS_Packet_Message_t))
-	{
-		printf("*SIZE YARG: %d*\r\n", Pipe_BytesInPipe());
-		*PacketLength = 0;
-		Pipe_ClearIN();
-		return RNDIS_COMMAND_FAILED;	
-	}
-	
 	if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),
 	                                     NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
 	{
 		return ErrorCode;
 	}
-	
-	if (DeviceMessage.MessageType != REMOTE_NDIS_PACKET_MSG)
-	{
-		printf("****YARG****\r\n");
-		*PacketLength = 0;
-		Pipe_ClearIN();
-		return RNDIS_COMMAND_FAILED;
-	}
 
 	*PacketLength = (uint16_t)DeviceMessage.DataLength;
 	
@@ -466,16 +437,6 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
 	if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))
 	  return PIPE_READYWAIT_DeviceDisconnected;
 
-	if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)
-	{
-		Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipeNumber);
-		Pipe_SetPipeToken(PIPE_TOKEN_OUT);
-	}
-	else
-	{
-		Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);	
-	}
-
 	RNDIS_Packet_Message_t DeviceMessage;
 
 	memset(&DeviceMessage, 0, sizeof(RNDIS_Packet_Message_t));
@@ -484,14 +445,12 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
 	DeviceMessage.DataOffset    = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
 	DeviceMessage.DataLength    = PacketLength;
 	
+	Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);
 	Pipe_Unfreeze();
 
 	if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),
 	                                      NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
 	{
-		if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)
-		  Pipe_SetPipeToken(PIPE_TOKEN_IN);
-
 		return ErrorCode;
 	}
 
@@ -500,9 +459,6 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
 
 	Pipe_Freeze();
 	
-	if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)
-	  Pipe_SetPipeToken(PIPE_TOKEN_IN);
-	
 	return PIPE_RWSTREAM_NoError;
 }
 
diff --git a/LUFA/Drivers/USB/Class/Host/RNDIS.h b/LUFA/Drivers/USB/Class/Host/RNDIS.h
index fc9b4b325dc66c1e49ff1815a2776b556ea03d9c..0110b5a0d02b1030b3ea34cf3b4f9477525de717 100644
--- a/LUFA/Drivers/USB/Class/Host/RNDIS.h
+++ b/LUFA/Drivers/USB/Class/Host/RNDIS.h
@@ -90,12 +90,8 @@
 				
 					uint16_t DataINPipeSize; /**< Size in bytes of the RNDIS interface's IN data pipe */
 					uint16_t DataOUTPipeSize;  /**< Size in bytes of the RNDIS interface's OUT data pipe */
-					uint16_t NotificationPipeSize;  /**< Size in bytes of the RNDIS interface's IN notification pipe, if used */
-					
-					bool BidirectionalDataEndpoints; /**< Indicates if the attached RNDIS interface uses bidirectional data endpoints,
-					                                  *   and this has only the IN pipe configured (with \ref Pipe_SetPipeToken()
-					                                  *   used to switch the pipe's direction)
-					                                  */
+					uint16_t NotificationPipeSize;  /**< Size in bytes of the RNDIS interface's IN notification pipe, if used */					
+
 					uint32_t DeviceMaxPacketSize; /**< Maximum size of a packet which can be buffered by the attached RNDIS device */
 					
 					uint32_t RequestID; /**< Request ID counter to give a unique ID for each command/response pair */
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 8a46a5a1b01042324e4e94d7ec950911876f7a5f..cf37fa56d78e4c9b4ff86ce899942b20903cf109 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -45,6 +45,7 @@
   *  - Fixed Benito project not resetting the target AVR automatically when programming has completed
   *  - Fixed DFU bootloader programming not discarding the correct number of filler bytes from the host when non-aligned programming
   *    ranges are specified (thanks to Thomas Bleeker)
+  *  - Fixed CDC and RNDIS host demos and class drivers - bidirectional endpoints should use two seperate pipes, not one half-duplex pipe
   *
   *  \section Sec_ChangeLog091223 Version 091223
   *
diff --git a/Projects/Incomplete/Webserver/Lib/WebserverApp.c b/Projects/Incomplete/Webserver/Lib/WebserverApp.c
index 97218b2be444cd9e74678af32cded976ac83194e..11acec4b77a119366bc6b0620156f73bd8d3092a 100644
--- a/Projects/Incomplete/Webserver/Lib/WebserverApp.c
+++ b/Projects/Incomplete/Webserver/Lib/WebserverApp.c
@@ -65,7 +65,8 @@ char PROGMEM HTTPPage[]   =
 		"	<body>"
 		"		<h1>Hello from your USB AVR!</h1>"
 		"		<p>"
-		"			Hello! Welcome to the LUFA RNDIS Demo Webserver test page, running on your USB AVR via the LUFA library. This demonstrates the HTTP webserver, TCP/IP stack and RNDIS demo all running atop the LUFA USB stack."
+		"			Hello! Welcome to the LUFA RNDIS Demo Webserver test page, running on your USB AVR via the LUFA library and uIP TCP/IP network stack. This"
+		"           demonstrates a simple HTTP webserver serving out pages to HTTP clients."
 		"			<br /><br />"
 		"			<small>Project Information: <a href=\"http://www.fourwalledcubicle.com/LUFA.php\">http://www.fourwalledcubicle.com/LUFA.php</a>.</small>"
 		"			<hr />"
diff --git a/Projects/Incomplete/Webserver/Webserver.c b/Projects/Incomplete/Webserver/Webserver.c
index 74636b8a55488fef470c0852ab0ab86912c837c4..c0ceeed7821575e875a820310294453340b60c83 100644
--- a/Projects/Incomplete/Webserver/Webserver.c
+++ b/Projects/Incomplete/Webserver/Webserver.c
@@ -174,7 +174,7 @@ void ProcessIncommingPacket(void)
 		LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
 
 		/* Read the incomming packet straight into the UIP packet buffer */
-		printf("L=%d R=%d\r\n", uip_len, RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], &uip_len));
+		RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], &uip_len);
 
 		if (uip_len > 0)
 		{