diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c
index e87d4717255038f0abb3d68dc792bb1b9765efa6..cb2672c75814ef000d38f80c7991e0b15b00e61f 100644
--- a/Bootloaders/CDC/BootloaderCDC.c
+++ b/Bootloaders/CDC/BootloaderCDC.c
@@ -90,7 +90,7 @@ int main(void)
 	Endpoint_SelectEndpoint(CDC_TX_EPNUM);
 
 	/* Wait until any pending transmissions have completed before shutting down */
-	while (!(Endpoint_ReadWriteAllowed()));
+	while (!(Endpoint_IsINReady()));
 	
 	/* Shut down the USB subsystem */
 	USB_ShutDown();
@@ -160,45 +160,45 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 		case REQ_GetLineEncoding:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				for (uint8_t i = 0; i < sizeof(LineCoding); i++)
 				  Endpoint_Write_Byte(*(LineCodingData++));	
 				
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
 		case REQ_SetLineEncoding:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
-				while (!(Endpoint_IsSetupOUTReceived()));
+				while (!(Endpoint_IsOUTReceived()));
 
 				for (uint8_t i = 0; i < sizeof(LineCoding); i++)
 				  *(LineCodingData++) = Endpoint_Read_Byte();
 
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 	
 			break;
 		case REQ_SetControlLineState:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 	
 			break;
@@ -332,10 +332,10 @@ static uint8_t FetchNextCommandByte(void)
 	Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 	
 	/* If OUT endpoint empty, clear it and wait for the next packet from the host */
-	if (!(Endpoint_ReadWriteAllowed()))
+	while (!(Endpoint_IsReadWriteAllowed()))
 	{
-		Endpoint_ClearCurrentBank();
-		while (!(Endpoint_ReadWriteAllowed()));
+		Endpoint_ClearOUT();
+		while (!(Endpoint_IsOUTReceived()));
 	}
 	
 	/* Fetch the next byte from the OUT endpoint */
@@ -353,10 +353,10 @@ static void WriteNextResponseByte(const uint8_t Response)
 	Endpoint_SelectEndpoint(CDC_TX_EPNUM);
 	
 	/* If OUT endpoint empty, clear it and wait for the next packet from the host */
-	if (!(Endpoint_ReadWriteAllowed()))
+	if (!(Endpoint_IsReadWriteAllowed()))
 	{
-		Endpoint_ClearCurrentBank();
-		while (!(Endpoint_ReadWriteAllowed()));
+		Endpoint_ClearIN();
+		while (!(Endpoint_IsINReady()));
 	}
 	
 	/* Write the next byte to the OUT endpoint */
@@ -372,7 +372,7 @@ TASK(CDC_Task)
 	Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 	
 	/* Check if endpoint has a command in it sent from the host */
-	if (Endpoint_ReadWriteAllowed())
+	if (Endpoint_IsOUTReceived())
 	{
 		/* Read in the bootloader command (first byte sent from host) */
 		uint8_t Command = FetchNextCommandByte();
@@ -557,22 +557,22 @@ TASK(CDC_Task)
 		Endpoint_SelectEndpoint(CDC_TX_EPNUM);
 
 		/* Remember if the endpoint is completely full before clearing it */
-		bool IsEndpointFull = !(Endpoint_ReadWriteAllowed());
+		bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed());
 
 		/* Send the endpoint data to the host */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 		
 		/* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */
 		if (IsEndpointFull)
 		{
-			while (!(Endpoint_ReadWriteAllowed()));
-			Endpoint_ClearCurrentBank();
+			while (!(Endpoint_IsINReady()));
+			Endpoint_ClearIN();
 		}
 		
 		/* Select the OUT endpoint */
 		Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 
 		/* Acknowledge the command from the host */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearOUT();
 	}
 }
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index 5375b9c9db90e7412bcaa0b31c522de64ab65272..f3580163e33544d73d274843a1049fc81144ac7b 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -163,7 +163,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 	switch (bRequest)
 	{
 		case DFU_DNLOAD:
-			Endpoint_ClearSetupReceived();
+			Endpoint_ClearControlSETUP();
 			
 			/* Check if bootloader is waiting to terminate */
 			if (WaitForExit)
@@ -178,7 +178,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			/* If the request has a data stage, load it into the command struct */
 			if (SentCommand.DataSize)
 			{
-				while (!(Endpoint_IsSetupOUTReceived()));
+				while (!(Endpoint_IsOUTReceived()));
 
 				/* First byte of the data stage is the DNLOAD request's command */
 				SentCommand.Command = Endpoint_Read_Byte();
@@ -235,8 +235,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 							/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
 							if (!(Endpoint_BytesInEndpoint()))
 							{
-								Endpoint_ClearSetupOUT();
-								while (!(Endpoint_IsSetupOUTReceived()));
+								Endpoint_ClearControlOUT();
+								while (!(Endpoint_IsOUTReceived()));
 							}
 
 							/* Write the next word into the current flash page */
@@ -279,8 +279,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 							/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
 							if (!(Endpoint_BytesInEndpoint()))
 							{
-								Endpoint_ClearSetupOUT();
-								while (!(Endpoint_IsSetupOUTReceived()));
+								Endpoint_ClearControlOUT();
+								while (!(Endpoint_IsOUTReceived()));
 							}
 
 							/* Read the byte from the USB interface and write to to the EEPROM */
@@ -296,17 +296,17 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				}
 			}
 
-			Endpoint_ClearSetupOUT();
+			Endpoint_ClearControlOUT();
 
 			/* Acknowledge status stage */
-			while (!(Endpoint_IsSetupINReady()));
-			Endpoint_ClearSetupIN();
+			while (!(Endpoint_IsINReady()));
+			Endpoint_ClearControlIN();
 				
 			break;
 		case DFU_UPLOAD:
-			Endpoint_ClearSetupReceived();
+			Endpoint_ClearControlSETUP();
 
-			while (!(Endpoint_IsSetupINReady()));
+			while (!(Endpoint_IsINReady()));
 
 			if (DFU_State != dfuUPLOAD_IDLE)
 			{
@@ -343,8 +343,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 						/* Check if endpoint is full - if so clear it and wait until ready for next packet */
 						if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE)
 						{
-							Endpoint_ClearSetupIN();
-							while (!(Endpoint_IsSetupINReady()));
+							Endpoint_ClearControlIN();
+							while (!(Endpoint_IsINReady()));
 						}
 
 						/* Read the flash word and send it via USB to the host */
@@ -368,8 +368,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 						/* Check if endpoint is full - if so clear it and wait until ready for next packet */
 						if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE)
 						{
-							Endpoint_ClearSetupIN();
-							while (!(Endpoint_IsSetupINReady()));
+							Endpoint_ClearControlIN();
+							while (!(Endpoint_IsINReady()));
 						}
 
 						/* Read the EEPROM byte and send it via USB to the host */
@@ -384,15 +384,15 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				DFU_State = dfuIDLE;
 			}
 
-			Endpoint_ClearSetupIN();
+			Endpoint_ClearControlIN();
 
 			/* Acknowledge status stage */
-			while (!(Endpoint_IsSetupOUTReceived()));
-			Endpoint_ClearSetupOUT();
+			while (!(Endpoint_IsOUTReceived()));
+			Endpoint_ClearControlOUT();
 
 			break;
 		case DFU_GETSTATUS:
-			Endpoint_ClearSetupReceived();
+			Endpoint_ClearControlSETUP();
 			
 			/* Write 8-bit status value */
 			Endpoint_Write_Byte(DFU_Status);
@@ -407,46 +407,46 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			/* Write 8-bit state string ID number */
 			Endpoint_Write_Byte(0);
 
-			Endpoint_ClearSetupIN();
+			Endpoint_ClearControlIN();
 			
 			/* Acknowledge status stage */
-			while (!(Endpoint_IsSetupOUTReceived()));
-			Endpoint_ClearSetupOUT();
+			while (!(Endpoint_IsOUTReceived()));
+			Endpoint_ClearControlOUT();
 	
 			break;		
 		case DFU_CLRSTATUS:
-			Endpoint_ClearSetupReceived();
+			Endpoint_ClearControlSETUP();
 			
 			/* Reset the status value variable to the default OK status */
 			DFU_Status = OK;
 
 			/* Acknowledge status stage */
-			while (!(Endpoint_IsSetupINReady()));
-			Endpoint_ClearSetupIN();
+			while (!(Endpoint_IsINReady()));
+			Endpoint_ClearControlIN();
 			
 			break;
 		case DFU_GETSTATE:
-			Endpoint_ClearSetupReceived();
+			Endpoint_ClearControlSETUP();
 			
 			/* Write the current device state to the endpoint */
 			Endpoint_Write_Byte(DFU_State);
 		
-			Endpoint_ClearSetupIN();
+			Endpoint_ClearControlIN();
 			
 			/* Acknowledge status stage */
-			while (!(Endpoint_IsSetupOUTReceived()));
-			Endpoint_ClearSetupOUT();
+			while (!(Endpoint_IsOUTReceived()));
+			Endpoint_ClearControlOUT();
 
 			break;
 		case DFU_ABORT:
-			Endpoint_ClearSetupReceived();
+			Endpoint_ClearControlSETUP();
 			
 			/* Reset the current state variable to the default idle state */
 			DFU_State = dfuIDLE;
 			
 			/* Acknowledge status stage */
-			while (!(Endpoint_IsSetupINReady()));
-			Endpoint_ClearSetupIN();
+			while (!(Endpoint_IsINReady()));
+			Endpoint_ClearControlIN();
 
 			break;
 	}
@@ -463,10 +463,10 @@ static void DiscardFillerBytes(uint8_t NumberOfBytes)
 	{
 		if (!(Endpoint_BytesInEndpoint()))
 		{
-			Endpoint_ClearSetupOUT();
+			Endpoint_ClearControlOUT();
 
 			/* Wait until next data packet received */
-			while (!(Endpoint_IsSetupOUTReceived()));
+			while (!(Endpoint_IsOUTReceived()));
 		}
 
 		Endpoint_Discard_Byte();						
diff --git a/Bootloaders/TeensyHID/TeensyHID.c b/Bootloaders/TeensyHID/TeensyHID.c
index 93f062195b324f02e6e09b22651b0bd61ec9e223..f82e28e729941c8ee5828e3bff704bc835c959fa 100644
--- a/Bootloaders/TeensyHID/TeensyHID.c
+++ b/Bootloaders/TeensyHID/TeensyHID.c
@@ -101,10 +101,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 		case REQ_SetReport:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Wait until the command (report) has been sent by the host */
-				while (!(Endpoint_IsSetupOUTReceived()));
+				while (!(Endpoint_IsOUTReceived()));
 
 				/* Read in the write destination address */
 				uint16_t PageAddress = Endpoint_Read_Word_LE();
@@ -126,8 +126,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 						/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
 						if (!(Endpoint_BytesInEndpoint()))
 						{
-							Endpoint_ClearSetupOUT();
-							while (!(Endpoint_IsSetupOUTReceived()));
+							Endpoint_ClearControlOUT();
+							while (!(Endpoint_IsOUTReceived()));
 						}
 
 						/* Write the next data word to the FLASH page */
@@ -142,11 +142,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 					boot_rww_enable();
 				}
 
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
diff --git a/Demos/Device/AudioInput/AudioInput.c b/Demos/Device/AudioInput/AudioInput.c
index fca24c360e7ad7644ef3857d8a5b0d85322f26f0..c0166944b5d211dcf7d6f3888e01c2ed0cdea694 100644
--- a/Demos/Device/AudioInput/AudioInput.c
+++ b/Demos/Device/AudioInput/AudioInput.c
@@ -36,12 +36,6 @@
 
 #include "AudioInput.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA AudioIn App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -145,7 +139,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			{
 				uint16_t wValue = Endpoint_Read_Word_LE();
 				
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
 				if (wValue)
@@ -160,8 +154,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				}
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 
 			break;
@@ -201,8 +195,8 @@ TASK(USB_Audio_Task)
 	/* Select the audio stream endpoint */
 	Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM);
 	
-	/* Check if the current endpoint can be read from (contains a packet) and that the next sample should be stored */
-	if (Endpoint_ReadWriteAllowed() && (TIFR0 & (1 << OCF0A)))
+	/* Check if the current endpoint can be written to and that the next sample should be stored */
+	if (Endpoint_IsINReady() && (TIFR0 & (1 << OCF0A)))
 	{
 		/* Clear the sample reload timer */
 		TIFR0 |= (1 << OCF0A);
@@ -219,10 +213,10 @@ TASK(USB_Audio_Task)
 		Endpoint_Write_Word_LE(AudioSample);
 
 		/* Check to see if the bank is now full */
-		if (!(Endpoint_ReadWriteAllowed()))
+		if (!(Endpoint_IsReadWriteAllowed()))
 		{
 			/* Send the full packet to the host */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 		}
 	}
 }
diff --git a/Demos/Device/AudioInput/AudioInput.h b/Demos/Device/AudioInput/AudioInput.h
index 02c838039c66a8b648b01de656559310ff7ed14e..c068baff99ea7ddb31b080bfb9f56402190050bd 100644
--- a/Demos/Device/AudioInput/AudioInput.h
+++ b/Demos/Device/AudioInput/AudioInput.h
@@ -44,7 +44,6 @@
 		#include "Descriptors.h"
 				
 		#include <LUFA/Version.h>                      // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>           // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>              // USB Functionality
 		#include <LUFA/Drivers/Board/LEDs.h>           // LEDs driver
 		#include <LUFA/Drivers/AT90USBXXX/ADC.h>       // ADC driver
diff --git a/Demos/Device/AudioOutput/AudioOutput.c b/Demos/Device/AudioOutput/AudioOutput.c
index ffeee418ee4fdf6bc92ecf03cfdc3c3fec2c47ec..fcd8812777721cebf3aefd1df5d772f21bcb0ff3 100644
--- a/Demos/Device/AudioOutput/AudioOutput.c
+++ b/Demos/Device/AudioOutput/AudioOutput.c
@@ -36,12 +36,6 @@
  
 #include "AudioOutput.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA AudioOut App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -172,7 +166,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			{
 				uint16_t wValue = Endpoint_Read_Word_LE();
 				
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
 				if (wValue)
@@ -187,8 +181,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				}
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 
 			break;
@@ -231,7 +225,7 @@ TASK(USB_Audio_Task)
 	Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM);
 	
 	/* Check if the current endpoint can be read from (contains a packet) and that the next sample should be read */
-	if (Endpoint_ReadWriteAllowed() && (TIFR0 & (1 << OCF0A)))
+	if (Endpoint_IsOUTReceived() && (TIFR0 & (1 << OCF0A)))
 	{
 		/* Clear the sample reload timer */
 		TIFR0 |= (1 << OCF0A);
@@ -241,10 +235,10 @@ TASK(USB_Audio_Task)
 		int16_t RightSample_16Bit = (int16_t)Endpoint_Read_Word_LE();
 
 		/* Check to see if the bank is now empty */
-		if (!(Endpoint_ReadWriteAllowed()))
+		if (!(Endpoint_IsReadWriteAllowed()))
 		{
 			/* Acknowledge the packet, clear the bank ready for the next packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 		}
 
 		/* Massage signed 16-bit left and right audio samples into signed 8-bit */
diff --git a/Demos/Device/AudioOutput/AudioOutput.h b/Demos/Device/AudioOutput/AudioOutput.h
index 0ad9e5bf9d347240d8fbabf0127cfeb2f4824f81..05b24ad07fcb1f5ef248b8840ce1d663a5632ffe 100644
--- a/Demos/Device/AudioOutput/AudioOutput.h
+++ b/Demos/Device/AudioOutput/AudioOutput.h
@@ -44,7 +44,6 @@
 		#include "Descriptors.h"
 		
 		#include <LUFA/Version.h>                    // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver
 		#include <LUFA/Scheduler/Scheduler.h>        // Simple scheduler for task management
diff --git a/Demos/Device/CDC/CDC.c b/Demos/Device/CDC/CDC.c
index 5e153f6524d0ba3552066d0508dbc25f9e9af9a7..3dc624057dbb764b8232e08cbb21e6e175fd6556 100644
--- a/Demos/Device/CDC/CDC.c
+++ b/Demos/Device/CDC/CDC.c
@@ -36,12 +36,6 @@
 
 #include "CDC.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA CDC App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -172,13 +166,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{	
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Write the line coding data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
@@ -186,13 +180,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Read the line coding data in from the host into the global struct */
 				Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
 
 				/* Finalize the stream transfer to clear the last packet from the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 			}
 	
 			break;
@@ -211,11 +205,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 #endif
 				
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 	
 			break;
@@ -276,7 +270,7 @@ TASK(CDC_Task)
 	Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM);
 	Endpoint_Write_Stream_LE(&Notification, sizeof(Notification));
 	Endpoint_Write_Stream_LE(&LineStateMask, sizeof(LineStateMask));
-	Endpoint_ClearCurrentBank();
+	Endpoint_ClearIN();
 #endif
 
 	/* Determine if a joystick action has occurred */
@@ -307,19 +301,19 @@ TASK(CDC_Task)
 		Endpoint_Write_Stream_LE(ReportString, strlen(ReportString));
 		
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 
 		/* Wait until the endpoint is ready for another packet */
-		while (!(Endpoint_ReadWriteAllowed()));
+		while (!(Endpoint_IsINReady()));
 		
 		/* Send an empty packet to ensure that the host does not buffer data sent to it */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 	}
 
 	/* Select the Serial Rx Endpoint */
 	Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 	
 	/* Throw away any received data from the host */
-	if (Endpoint_ReadWriteAllowed())
-	  Endpoint_ClearCurrentBank();
+	if (Endpoint_IsOUTReceived())
+	  Endpoint_ClearOUT();
 }
diff --git a/Demos/Device/CDC/CDC.h b/Demos/Device/CDC/CDC.h
index a36fdc9217c8e098814ce49ff08a56106c1cac7f..1537f0ba3cb080bc31313563327cad4174f48b28 100644
--- a/Demos/Device/CDC/CDC.h
+++ b/Demos/Device/CDC/CDC.h
@@ -45,7 +45,6 @@
 		#include "Descriptors.h"
 
 		#include <LUFA/Version.h>                        // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>             // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>                // USB Functionality
 		#include <LUFA/Drivers/Board/Joystick.h>         // Joystick driver
 		#include <LUFA/Drivers/Board/LEDs.h>             // LEDs driver
diff --git a/Demos/Device/DualCDC/DualCDC.c b/Demos/Device/DualCDC/DualCDC.c
index fecbaff605084c45fb1a331d743313262696daf8..56eebb305b40a3fc3614f2e267bbf7084ac58058 100644
--- a/Demos/Device/DualCDC/DualCDC.c
+++ b/Demos/Device/DualCDC/DualCDC.c
@@ -36,12 +36,6 @@
  
 #include "DualCDC.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA DualCDC App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -195,7 +189,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 	uint8_t* LineCodingData;
 
 	/* Discard the unused wValue parameter */
-	Endpoint_Ignore_Word();
+	Endpoint_Discard_Word();
 
 	/* wIndex indicates the interface being controlled */
 	uint16_t wIndex = Endpoint_Read_Word_LE();
@@ -210,13 +204,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{	
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Write the line coding data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
@@ -224,13 +218,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Read the line coding data in from the host into the global struct */
 				Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
 
 				/* Finalize the stream transfer to clear the last packet from the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 			}
 	
 			break;
@@ -238,11 +232,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 	
 			break;
@@ -313,15 +307,21 @@ TASK(CDC1_Task)
 		Endpoint_Write_Stream_LE(ReportString, strlen(ReportString));
 		
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
+
+		/* Wait until the endpoint is ready for another packet */
+		while (!(Endpoint_IsINReady()));
+		
+		/* Send an empty packet to ensure that the host does not buffer data sent to it */
+		Endpoint_ClearIN();
 	}
 
 	/* Select the Serial Rx Endpoint */
 	Endpoint_SelectEndpoint(CDC1_RX_EPNUM);
 	
 	/* Throw away any received data from the host */
-	if (Endpoint_ReadWriteAllowed())
-	  Endpoint_ClearCurrentBank();
+	if (Endpoint_IsOUTReceived())
+	  Endpoint_ClearOUT();
 }
 
 /** Function to manage CDC data transmission and reception to and from the host for the second CDC interface, which echoes back
@@ -333,7 +333,7 @@ TASK(CDC2_Task)
 	Endpoint_SelectEndpoint(CDC2_RX_EPNUM);
 	
 	/* Check to see if any data has been received */
-	if (Endpoint_ReadWriteAllowed())
+	if (Endpoint_IsOUTReceived())
 	{
 		/* Create a temp buffer big enough to hold the incoming endpoint packet */
 		uint8_t  Buffer[Endpoint_BytesInEndpoint()];
@@ -345,7 +345,7 @@ TASK(CDC2_Task)
 		Endpoint_Read_Stream_LE(&Buffer, DataLength);
 
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearOUT();
 
 		/* Select the Serial Tx Endpoint */
 		Endpoint_SelectEndpoint(CDC2_TX_EPNUM);
@@ -354,6 +354,12 @@ TASK(CDC2_Task)
 		Endpoint_Write_Stream_LE(&Buffer, DataLength);
 
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
+
+		/* Wait until the endpoint is ready for the next packet */
+		while (!(Endpoint_IsINReady()));
+
+		/* Send an empty packet to prevent host buffering */
+		Endpoint_ClearIN();
 	}
 }
diff --git a/Demos/Device/DualCDC/DualCDC.h b/Demos/Device/DualCDC/DualCDC.h
index 84be114e9fa93fb5e05f2bd09833885296a1d3c9..65f661f97c96a34a5dc716f94bcbe9027293dc81 100644
--- a/Demos/Device/DualCDC/DualCDC.h
+++ b/Demos/Device/DualCDC/DualCDC.h
@@ -45,7 +45,6 @@
 		#include "Descriptors.h"
 
 		#include <LUFA/Version.h>                        // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>             // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>                // USB Functionality
 		#include <LUFA/Drivers/Board/Joystick.h>         // Joystick driver
 		#include <LUFA/Drivers/Board/LEDs.h>             // LEDs driver
diff --git a/Demos/Device/GenericHID/GenericHID.c b/Demos/Device/GenericHID/GenericHID.c
index 3b5f97267fce940e21fbb328fca7460cf9a90edc..a9ecfa7d7299fd0794cb08fccd8d5d324c8fb6bc 100644
--- a/Demos/Device/GenericHID/GenericHID.c
+++ b/Demos/Device/GenericHID/GenericHID.c
@@ -36,12 +36,6 @@
 
 #include "GenericHID.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA GenHID App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -171,7 +165,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 		case REQ_GetReport:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 	
 				uint8_t GenericData[GENERIC_REPORT_SIZE];
 				
@@ -181,32 +175,32 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				Endpoint_Write_Control_Stream_LE(&GenericData, sizeof(GenericData));
 
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 		
 			break;
 		case REQ_SetReport:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Wait until the generic report has been sent by the host */
-				while (!(Endpoint_IsSetupOUTReceived()));
+				while (!(Endpoint_IsOUTReceived()));
 
 				uint8_t GenericData[GENERIC_REPORT_SIZE];
 
-				Endpoint_Read_Control_Stream(&GenericData, sizeof(GenericData));
+				Endpoint_Read_Control_Stream_LE(&GenericData, sizeof(GenericData));
 
 				ProcessGenericHIDReport(GenericData);
 			
 				/* Clear the endpoint data */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 
 				/* Wait until the host is ready to receive the request confirmation */
-				while (!(Endpoint_IsSetupINReady()));
+				while (!(Endpoint_IsINReady()));
 				
 				/* Handshake the request by sending an empty IN packet */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
@@ -280,24 +274,30 @@ TASK(USB_HID_Report)
 	{
 		Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
 		
-		if (Endpoint_ReadWriteAllowed())
+		/* Check to see if a packet has been sent from the host */
+		if (Endpoint_IsOUTReceived())
 		{
-			/* Create a temporary buffer to hold the read in report from the host */
-			uint8_t GenericData[GENERIC_REPORT_SIZE];
-			
-			/* Read Generic Report Data */
-			Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData));
-			
-			/* Process Generic Report Data */
-			ProcessGenericHIDReport(GenericData);
+			/* Check to see if the packet contains data */
+			if (Endpoint_IsReadWriteAllowed())
+			{
+				/* Create a temporary buffer to hold the read in report from the host */
+				uint8_t GenericData[GENERIC_REPORT_SIZE];
+				
+				/* Read Generic Report Data */
+				Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData));
+				
+				/* Process Generic Report Data */
+				ProcessGenericHIDReport(GenericData);
+			}
 
 			/* Finalize the stream transfer to send the last packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 		}	
 
 		Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
 		
-		if (Endpoint_ReadWriteAllowed())
+		/* Check to see if the host is ready to accept another packet */
+		if (Endpoint_IsINReady())
 		{
 			/* Create a temporary buffer to hold the report to send to the host */
 			uint8_t GenericData[GENERIC_REPORT_SIZE];
@@ -309,7 +309,7 @@ TASK(USB_HID_Report)
 			Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData));
 
 			/* Finalize the stream transfer to send the last packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 		}
 	}
 }
@@ -363,7 +363,7 @@ ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
 		Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData));
 
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 	}
 
 	/* Check if Generic OUT endpoint has interrupted */
@@ -388,7 +388,7 @@ ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
 		ProcessGenericHIDReport(GenericData);
 
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearOUT();
 	}
 	#endif
 
diff --git a/Demos/Device/GenericHID/GenericHID.h b/Demos/Device/GenericHID/GenericHID.h
index d13e6debfea660159bc2801d4f0e5bbbe7847254..817d3774811ffa00df5cea1783a9abb51add60ab 100644
--- a/Demos/Device/GenericHID/GenericHID.h
+++ b/Demos/Device/GenericHID/GenericHID.h
@@ -48,7 +48,6 @@
 
 		#include <LUFA/Version.h>                    // Library Version Information
 		#include <LUFA/Scheduler/Scheduler.h>        // Simple scheduler for task management
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver
 			
diff --git a/Demos/Device/Joystick/Joystick.c b/Demos/Device/Joystick/Joystick.c
index cd8822705b560369c4a66a672749b9a7c47ca720..c5d90e76fcc45163f3fc677369f998fcd787cddc 100644
--- a/Demos/Device/Joystick/Joystick.c
+++ b/Demos/Device/Joystick/Joystick.c
@@ -36,12 +36,6 @@
 
 #include "Joystick.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA Joystick App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -151,13 +145,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				if (wLength > sizeof(JoystickReportData))
 				  wLength = sizeof(JoystickReportData);
 
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 	
 				/* Write the report data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(&JoystickReportData, wLength);
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 		
 			break;
@@ -241,8 +235,8 @@ TASK(USB_Joystick_Report)
 		/* Select the Joystick Report Endpoint */
 		Endpoint_SelectEndpoint(JOYSTICK_EPNUM);
 
-		/* Check if Joystick Endpoint Ready for Read/Write */
-		if (Endpoint_ReadWriteAllowed())
+		/* Check to see if the host is ready for another packet */
+		if (Endpoint_IsINReady())
 		{
 			USB_JoystickReport_Data_t JoystickReportData;
 			
@@ -253,12 +247,10 @@ TASK(USB_Joystick_Report)
 			Endpoint_Write_Stream_LE(&JoystickReportData, sizeof(JoystickReportData));
 
 			/* Finalize the stream transfer to send the last packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 			
 			/* Clear the report data afterwards */
-			JoystickReportData.X      = 0;
-			JoystickReportData.Y      = 0;
-			JoystickReportData.Button = 0;
+			memset(&JoystickReportData, 0, sizeof(JoystickReportData));
 		}
 	}
 }
diff --git a/Demos/Device/Joystick/Joystick.h b/Demos/Device/Joystick/Joystick.h
index 79c7e498fb09ea7bb2fb51ff652ec082eab7a1e7..2a5cc25882872e2ca25387a566674d289f260ddc 100644
--- a/Demos/Device/Joystick/Joystick.h
+++ b/Demos/Device/Joystick/Joystick.h
@@ -45,7 +45,6 @@
 		#include "Descriptors.h"
 
 		#include <LUFA/Version.h>                    // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Drivers/Board/Joystick.h>     // Joystick driver
 		#include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver
diff --git a/Demos/Device/Keyboard/Keyboard.c b/Demos/Device/Keyboard/Keyboard.c
index d118edea6f448868314c57c4fbb341ab208f2e78..8c4157a56f27b0de1fc72744748932aa6097ac7c 100644
--- a/Demos/Device/Keyboard/Keyboard.c
+++ b/Demos/Device/Keyboard/Keyboard.c
@@ -37,12 +37,6 @@
  
 #include "Keyboard.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA Keyboard App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -222,23 +216,23 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				if (wLength > sizeof(KeyboardReportData))
 				  wLength = sizeof(KeyboardReportData);
 
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 	
 				/* Write the report data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(&KeyboardReportData, wLength);
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 		
 			break;
 		case REQ_SetReport:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Wait until the LED report has been sent by the host */
-				while (!(Endpoint_IsSetupOUTReceived()));
+				while (!(Endpoint_IsOUTReceived()));
 
 				/* Read in the LED report from the host */
 				uint8_t LEDStatus = Endpoint_Read_Byte();
@@ -247,28 +241,28 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				ProcessLEDReport(LEDStatus);
 			
 				/* Clear the endpoint data */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
 		case REQ_GetProtocol:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Write the current protocol flag to the host */
 				Endpoint_Write_Byte(UsingReportProtocol);
 				
 				/* Send the flag to the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
@@ -278,14 +272,14 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				/* Read in the wValue parameter containing the new protocol mode */
 				uint16_t wValue = Endpoint_Read_Word_LE();
 								
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Set or clear the flag depending on what the host indicates that the current Protocol should be */
 				UsingReportProtocol = (wValue != 0x0000);
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
@@ -295,31 +289,31 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				/* Read in the wValue parameter containing the idle period */
 				uint16_t wValue = Endpoint_Read_Word_LE();
 				
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Get idle period in MSB */
 				IdleCount = (wValue >> 8);
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
 		case REQ_GetIdle:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{		
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Write the current idle duration to the host */
 				Endpoint_Write_Byte(IdleCount);
 				
 				/* Send the flag to the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 
 			break;
@@ -415,13 +409,13 @@ static inline void SendNextReport(void)
 	Endpoint_SelectEndpoint(KEYBOARD_EPNUM);
 
 	/* Check if Keyboard Endpoint Ready for Read/Write, and if we should send a report */
-	if (Endpoint_ReadWriteAllowed() && SendReport)
+	if (Endpoint_IsReadWriteAllowed() && SendReport)
 	{
 		/* Write Keyboard Report Data */
 		Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));
 
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 	}
 }
 
@@ -431,18 +425,22 @@ static inline void ReceiveNextReport(void)
 	/* Select the Keyboard LED Report Endpoint */
 	Endpoint_SelectEndpoint(KEYBOARD_LEDS_EPNUM);
 
-	/* Check if Keyboard LED Endpoint Ready for Read/Write */
-	if (!(Endpoint_ReadWriteAllowed()))
-	  return;
-
-	/* Read in the LED report from the host */
-	uint8_t LEDReport = Endpoint_Read_Byte();
+	/* Check if Keyboard LED Endpoint contains a packet */
+	if (Endpoint_IsOUTReceived())
+	{
+		/* Check to see if the packet contains data */
+		if (Endpoint_IsReadWriteAllowed())
+		{
+			/* Read in the LED report from the host */
+			uint8_t LEDReport = Endpoint_Read_Byte();
 
-	/* Handshake the OUT Endpoint - clear endpoint and ready for next report */
-	Endpoint_ClearCurrentBank();
+			/* Process the read LED report from the host */
+			ProcessLEDReport(LEDReport);
+		}
 
-	/* Process the read LED report from the host */
-	ProcessLEDReport(LEDReport);
+		/* Handshake the OUT Endpoint - clear endpoint and ready for next report */
+		Endpoint_ClearOUT();
+	}
 }
 
 /** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to
diff --git a/Demos/Device/Keyboard/Keyboard.h b/Demos/Device/Keyboard/Keyboard.h
index 143ffc654b617d7abe5127c87d829e1d2f978009..76b770582b98fa41157b695843027f854a49bd4e 100644
--- a/Demos/Device/Keyboard/Keyboard.h
+++ b/Demos/Device/Keyboard/Keyboard.h
@@ -49,7 +49,6 @@
 
 		#include <LUFA/Version.h>                    // Library Version Information
 		#include <LUFA/Scheduler/Scheduler.h>        // Simple scheduler for task management
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Drivers/Board/Joystick.h>     // Joystick driver
 		#include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver
diff --git a/Demos/Device/KeyboardMouse/KeyboardMouse.c b/Demos/Device/KeyboardMouse/KeyboardMouse.c
index 3ee101b8db3c58a2f4ef5bef78ad411958cebb16..71e23ab1ed2efb511c9d6aec5256125a1a214dcc 100644
--- a/Demos/Device/KeyboardMouse/KeyboardMouse.c
+++ b/Demos/Device/KeyboardMouse/KeyboardMouse.c
@@ -37,12 +37,6 @@
  
 #include "KeyboardMouse.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA MouseKBD App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -150,7 +144,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 		case REQ_GetReport:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_Ignore_Word();
+				Endpoint_Discard_Word();
 			
 				uint16_t wIndex = Endpoint_Read_Word_LE();
 				
@@ -173,7 +167,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				if (wLength > ReportSize)
 				  wLength = ReportSize;
 
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 	
 				/* Write the report data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(ReportData, wLength);
@@ -182,17 +176,17 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				memset(ReportData, 0, ReportSize);
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 		
 			break;
 		case REQ_SetReport:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Wait until the LED report has been sent by the host */
-				while (!(Endpoint_IsSetupOUTReceived()));
+				while (!(Endpoint_IsOUTReceived()));
 
 				/* Read in the LED report from the host */
 				uint8_t LEDStatus = Endpoint_Read_Byte();
@@ -211,11 +205,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				LEDs_SetAllLEDs(LEDMask);
 
 				/* Clear the endpoint data */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
@@ -281,13 +275,13 @@ TASK(USB_Keyboard)
 		Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
 
 		/* Check if Keyboard Endpoint Ready for Read/Write */
-		if (Endpoint_ReadWriteAllowed())
+		if (Endpoint_IsReadWriteAllowed())
 		{
 			/* Write Keyboard Report Data */
 			Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));
 
 			/* Finalize the stream transfer to send the last packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 
 			/* Clear the report data afterwards */
 			memset(&KeyboardReportData, 0, sizeof(KeyboardReportData));
@@ -297,7 +291,7 @@ TASK(USB_Keyboard)
 		Endpoint_SelectEndpoint(KEYBOARD_OUT_EPNUM);
 
 		/* Check if Keyboard LED Endpoint Ready for Read/Write */
-		if (Endpoint_ReadWriteAllowed())
+		if (Endpoint_IsReadWriteAllowed())
 		{		
 			/* Read in the LED report from the host */
 			uint8_t LEDStatus = Endpoint_Read_Byte();
@@ -316,7 +310,7 @@ TASK(USB_Keyboard)
 			LEDs_SetAllLEDs(LEDMask);
 
 			/* Handshake the OUT Endpoint - clear endpoint and ready for next report */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 		}
 	}
 }
@@ -352,13 +346,13 @@ TASK(USB_Mouse)
 		Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
 
 		/* Check if Mouse Endpoint Ready for Read/Write */
-		if (Endpoint_ReadWriteAllowed())
+		if (Endpoint_IsReadWriteAllowed())
 		{
 			/* Write Mouse Report Data */
 			Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData));
 
 			/* Finalize the stream transfer to send the last packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 
 			/* Clear the report data afterwards */
 			memset(&MouseReportData, 0, sizeof(MouseReportData));
diff --git a/Demos/Device/KeyboardMouse/KeyboardMouse.h b/Demos/Device/KeyboardMouse/KeyboardMouse.h
index 9794159fc35ef90264eedadc7913648ebf9ef4b3..a69293c412d19dab164a870ef91e65f614546fdc 100644
--- a/Demos/Device/KeyboardMouse/KeyboardMouse.h
+++ b/Demos/Device/KeyboardMouse/KeyboardMouse.h
@@ -42,7 +42,6 @@
 		#include "Descriptors.h"
 
 		#include <LUFA/Version.h>                    // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Drivers/Board/Joystick.h>     // Joystick driver
 		#include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver
diff --git a/Demos/Device/MIDI/MIDI.c b/Demos/Device/MIDI/MIDI.c
index c0e4f9df9fd67b46da6a6b7f495eed1b8e7c1473..e286dcbd6b8d5a82cdd78e3ad3f5f0ed7a8ff011 100644
--- a/Demos/Device/MIDI/MIDI.c
+++ b/Demos/Device/MIDI/MIDI.c
@@ -36,12 +36,6 @@
 
 #include "MIDI.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA MIDI App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -134,7 +128,7 @@ TASK(USB_MIDI_Task)
 	Endpoint_SelectEndpoint(MIDI_STREAM_IN_EPNUM);
 
 	/* Check if endpoint is ready to be written to */
-	if (Endpoint_ReadWriteAllowed())
+	if (Endpoint_IsINReady())
 	{
 		/* Get current joystick mask, XOR with previous to detect joystick changes */
 		uint8_t JoystickStatus  = Joystick_GetStatus();
@@ -166,8 +160,8 @@ TASK(USB_MIDI_Task)
 	Endpoint_SelectEndpoint(MIDI_STREAM_OUT_EPNUM);
 
 	/* Check if endpoint is ready to be read from, if so discard its (unused) data */
-	if (Endpoint_ReadWriteAllowed())
-	  Endpoint_ClearCurrentBank();
+	if (Endpoint_IsOUTReceived())
+	  Endpoint_ClearOUT();
 }
 
 /** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to
@@ -207,7 +201,7 @@ void UpdateStatus(uint8_t CurrentStatus)
 void SendMIDINoteChange(const uint8_t Pitch, const bool OnOff, const uint8_t CableID, const uint8_t Channel)
 {
 	/* Wait until endpoint ready for more data */
-	while (!(Endpoint_ReadWriteAllowed()));
+	while (!(Endpoint_IsReadWriteAllowed()));
 
 	/* Check if the message should be a Note On or Note Off command */
 	uint8_t Command = ((OnOff)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
@@ -221,5 +215,5 @@ void SendMIDINoteChange(const uint8_t Pitch, const bool OnOff, const uint8_t Cab
 	Endpoint_Write_Byte(MIDI_STANDARD_VELOCITY);
 	
 	/* Send the data in the endpoint to the host */
-	Endpoint_ClearCurrentBank();
+	Endpoint_ClearIN();
 }
diff --git a/Demos/Device/MIDI/MIDI.h b/Demos/Device/MIDI/MIDI.h
index 733a7baedfe038b729dc79f7d7bca91f0fc2d731..4e81c8c2ad1287d854faba5eca75fb10532b3a40 100644
--- a/Demos/Device/MIDI/MIDI.h
+++ b/Demos/Device/MIDI/MIDI.h
@@ -45,7 +45,6 @@
 		#include "Descriptors.h"
 				
 		#include <LUFA/Version.h>                            // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                 // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>                    // USB Functionality
 		#include <LUFA/Drivers/Board/Joystick.h>             // Joystick driver
 		#include <LUFA/Drivers/Board/LEDs.h>                 // LEDs driver
diff --git a/Demos/Device/MassStorage/DataflashManager.c b/Demos/Device/MassStorage/DataflashManager.c
index 7b02ed6c8b93672e26e9dc4cc0de6f5cce3bd329..4b624190f90b87bd2d776768b84204aee6ae87f9 100644
--- a/Demos/Device/MassStorage/DataflashManager.c
+++ b/Demos/Device/MassStorage/DataflashManager.c
@@ -64,7 +64,7 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo
 	Dataflash_SendAddressBytes(0, CurrDFPageByte);
 
 	/* Wait until endpoint is ready before continuing */
-	while (!(Endpoint_ReadWriteAllowed()));
+	while (!(Endpoint_IsReadWriteAllowed()));
 
 	while (TotalBlocks)
 	{
@@ -74,13 +74,13 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo
 		while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4))
 		{
 			/* Check if the endpoint is currently empty */
-			if (!(Endpoint_ReadWriteAllowed()))
+			if (!(Endpoint_IsReadWriteAllowed()))
 			{
 				/* Clear the current endpoint bank */
-				Endpoint_ClearCurrentBank();
+				Endpoint_ClearOUT();
 				
 				/* Wait until the host has sent another packet */
-				while (!(Endpoint_ReadWriteAllowed()));
+				while (!(Endpoint_IsReadWriteAllowed()));
 			}
 
 			/* Check if end of dataflash page reached */
@@ -157,8 +157,8 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo
 	Dataflash_WaitWhileBusy();
 
 	/* If the endpoint is empty, clear it ready for the next packet from the host */
-	if (!(Endpoint_ReadWriteAllowed()))
-	  Endpoint_ClearCurrentBank();
+	if (!(Endpoint_IsReadWriteAllowed()))
+	  Endpoint_ClearOUT();
 
 	/* Deselect all dataflash chips */
 	Dataflash_DeselectChip();
@@ -187,7 +187,7 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc
 	Dataflash_SendByte(0x00);
 	
 	/* Wait until endpoint is ready before continuing */
-	while (!(Endpoint_ReadWriteAllowed()));
+	while (!(Endpoint_IsReadWriteAllowed()));
 	
 	while (TotalBlocks)
 	{
@@ -197,13 +197,13 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc
 		while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4))
 		{
 			/* Check if the endpoint is currently full */
-			if (!(Endpoint_ReadWriteAllowed()))
+			if (!(Endpoint_IsReadWriteAllowed()))
 			{
 				/* Clear the endpoint bank to send its contents to the host */
-				Endpoint_ClearCurrentBank();
+				Endpoint_ClearIN();
 				
 				/* Wait until the endpoint is ready for more data */
-				while (!(Endpoint_ReadWriteAllowed()));
+				while (!(Endpoint_IsReadWriteAllowed()));
 			}
 			
 			/* Check if end of dataflash page reached */
@@ -259,8 +259,8 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc
 	}
 	
 	/* If the endpoint is full, send its contents to the host */
-	if (!(Endpoint_ReadWriteAllowed()))
-	  Endpoint_ClearCurrentBank();
+	if (!(Endpoint_IsReadWriteAllowed()))
+	  Endpoint_ClearIN();
 
 	/* Deselect all dataflash chips */
 	Dataflash_DeselectChip();
diff --git a/Demos/Device/MassStorage/MassStorage.c b/Demos/Device/MassStorage/MassStorage.c
index 56bc19a94375ba23bc37ac6f3719b8e74d31db05..48ce5f34d802796ce350d9dc1a99968676196405 100644
--- a/Demos/Device/MassStorage/MassStorage.c
+++ b/Demos/Device/MassStorage/MassStorage.c
@@ -37,12 +37,6 @@
 #define  INCLUDE_FROM_MASSSTORAGE_C
 #include "MassStorage.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA MassStore App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -159,30 +153,30 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 		case REQ_MassStorageReset:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Indicate that the current transfer should be aborted */
 				IsMassStoreReset = true;			
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 
 			break;
 		case REQ_GetMaxLUN:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				/* Indicate to the host the number of supported LUNs (virtual disks) on the device */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
+				/* Indicate to the host the number of supported LUNs (virtual disks) on the device */
 				Endpoint_Write_Byte(TOTAL_LUNS - 1);
 				
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
@@ -234,7 +228,7 @@ TASK(USB_MassStorage)
 		Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
 		
 		/* Check to see if a command from the host has been issued */
-		if (Endpoint_ReadWriteAllowed())
+		if (Endpoint_IsReadWriteAllowed())
 		{	
 			/* Indicate busy */
 			UpdateStatus(Status_ProcessingCommandBlock);
@@ -326,7 +320,7 @@ static bool ReadInCommandBlock(void)
 	  return false;
 
 	/* Finalize the stream transfer to send the last packet */
-	Endpoint_ClearCurrentBank();
+	Endpoint_ClearOUT();
 	
 	return true;
 }
@@ -367,7 +361,7 @@ static void ReturnCommandStatus(void)
 	  return;
 
 	/* Finalize the stream transfer to send the last packet */
-	Endpoint_ClearCurrentBank();
+	Endpoint_ClearIN();
 }
 
 /** Stream callback function for the Endpoint stream read and write functions. This callback will abort the current stream transfer
diff --git a/Demos/Device/MassStorage/MassStorage.h b/Demos/Device/MassStorage/MassStorage.h
index a30e7f74664fa15371320ee04ac9c5d051a23c4c..17acca6b7ff5068d640bedcbdb2a3c3230e83708 100644
--- a/Demos/Device/MassStorage/MassStorage.h
+++ b/Demos/Device/MassStorage/MassStorage.h
@@ -46,7 +46,6 @@
 		#include "DataflashManager.h"
 
 		#include <LUFA/Version.h>                    // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver
 		#include <LUFA/Drivers/Board/Dataflash.h>    // Dataflash chip driver
diff --git a/Demos/Device/MassStorage/SCSI.c b/Demos/Device/MassStorage/SCSI.c
index d50f63d91a2dfdf67612b4ba2fe2d99d0ec095a8..e92be7ff83870371e33bcbbdb297e5e334ea3462 100644
--- a/Demos/Device/MassStorage/SCSI.c
+++ b/Demos/Device/MassStorage/SCSI.c
@@ -174,7 +174,7 @@ static bool SCSI_Command_Inquiry(void)
 	Endpoint_Write_Stream_LE(&PadBytes, (AllocationLength - BytesTransferred), AbortOnMassStoreReset);
 
 	/* Finalize the stream transfer to send the last packet */
-	Endpoint_ClearCurrentBank();
+	Endpoint_ClearIN();
 
 	/* Succeed the command and update the bytes transferred counter */
 	CommandBlock.DataTransferLength -= BytesTransferred;
@@ -201,7 +201,7 @@ static bool SCSI_Command_Request_Sense(void)
 	Endpoint_Write_Stream_LE(&PadBytes, (AllocationLength - BytesTransferred), AbortOnMassStoreReset);
 
 	/* Finalize the stream transfer to send the last packet */
-	Endpoint_ClearCurrentBank();
+	Endpoint_ClearIN();
 
 	/* Succeed the command and update the bytes transferred counter */
 	CommandBlock.DataTransferLength -= BytesTransferred;
@@ -227,7 +227,7 @@ static bool SCSI_Command_Read_Capacity_10(void)
 	  return false;
 
 	/* Send the endpoint data packet to the host */
-	Endpoint_ClearCurrentBank();
+	Endpoint_ClearIN();
 
 	/* Succeed the command and update the bytes transferred counter */
 	CommandBlock.DataTransferLength -= 8;
diff --git a/Demos/Device/Mouse/Mouse.c b/Demos/Device/Mouse/Mouse.c
index 076ac5bbdc9aea6bd720ab119a2c4bedbaf8ac42..e74002b7c4012a0a4b44b6432b20ed306ad4df3b 100644
--- a/Demos/Device/Mouse/Mouse.c
+++ b/Demos/Device/Mouse/Mouse.c
@@ -36,12 +36,6 @@
  
 #include "Mouse.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA Mouse App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -212,7 +206,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				if (wLength > sizeof(MouseReportData))
 				  wLength = sizeof(MouseReportData);
 
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 	
 				/* Write the report data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(&MouseReportData, wLength);
@@ -221,24 +215,24 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				memset(&MouseReportData, 0, sizeof(MouseReportData));
 
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 		
 			break;
 		case REQ_GetProtocol:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Write the current protocol flag to the host */
 				Endpoint_Write_Byte(UsingReportProtocol);
 				
 				/* Send the flag to the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
@@ -248,14 +242,14 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				/* Read in the wValue parameter containing the new protocol mode */
 				uint16_t wValue = Endpoint_Read_Word_LE();
 				
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Set or clear the flag depending on what the host indicates that the current Protocol should be */
 				UsingReportProtocol = (wValue != 0x0000);
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
@@ -265,31 +259,31 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				/* Read in the wValue parameter containing the idle period */
 				uint16_t wValue = Endpoint_Read_Word_LE();
 				
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Get idle period in MSB */
 				IdleCount = (wValue >> 8);
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
 		case REQ_GetIdle:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{		
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Write the current idle duration to the host */
 				Endpoint_Write_Byte(IdleCount);
 				
 				/* Send the flag to the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 
 			break;
@@ -367,13 +361,13 @@ static inline void SendNextReport(void)
 	Endpoint_SelectEndpoint(MOUSE_EPNUM);
 
 	/* Check if Mouse Endpoint Ready for Read/Write and if we should send a new report */
-	if (Endpoint_ReadWriteAllowed() && SendReport)
+	if (Endpoint_IsReadWriteAllowed() && SendReport)
 	{
 		/* Write Mouse Report Data */
 		Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData));
 		
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 	}
 }
 
diff --git a/Demos/Device/Mouse/Mouse.h b/Demos/Device/Mouse/Mouse.h
index c9854a8f92871fcdc7cf3d4a2b28c46f20deb302..714f8d6e832897858c2e55dba8d074d1c1e73461 100644
--- a/Demos/Device/Mouse/Mouse.h
+++ b/Demos/Device/Mouse/Mouse.h
@@ -47,7 +47,6 @@
 		#include "Descriptors.h"
 
 		#include <LUFA/Version.h>                    // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Drivers/Board/Joystick.h>     // Joystick driver
 		#include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver
diff --git a/Demos/Device/RNDISEthernet/RNDISEthernet.c b/Demos/Device/RNDISEthernet/RNDISEthernet.c
index d573a769bc4337c8bda2d9601076f8e2381e5b41..5e14bb76a3f7983690c1e0ce1c60ed225955d880 100644
--- a/Demos/Device/RNDISEthernet/RNDISEthernet.c
+++ b/Demos/Device/RNDISEthernet/RNDISEthernet.c
@@ -36,12 +36,6 @@
 
 #include "RNDISEthernet.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA RNDIS App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -162,13 +156,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
 				/* Clear the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Read in the RNDIS message into the message buffer */
 				Endpoint_Read_Control_Stream_LE(RNDISMessageBuffer, wLength);
 
 				/* Finalize the stream transfer to clear the last packet from the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 
 				/* Process the RNDIS message */
 				ProcessRNDISControlMessage();
@@ -191,13 +185,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				  wLength = MessageHeader->MessageLength;
 
 				/* Clear the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Write the message response data to the endpoint */
 				Endpoint_Write_Control_Stream_LE(RNDISMessageBuffer, wLength);
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 
 				/* Reset the message header once again after transmission */
 				MessageHeader->MessageLength = 0;
@@ -247,7 +241,7 @@ TASK(RNDIS_Task)
 	Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM);
 
 	/* Check if a message response is ready for the host */
-	if (Endpoint_ReadWriteAllowed() && ResponseReady)
+	if (Endpoint_IsINReady() && ResponseReady)
 	{
 		USB_Notification_t Notification = (USB_Notification_t)
 			{
@@ -262,7 +256,7 @@ TASK(RNDIS_Task)
 		Endpoint_Write_Stream_LE(&Notification, sizeof(Notification));
 
 		/* Finalize the stream transfer to send the last packet */
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 
 		/* Indicate a response is no longer ready */
 		ResponseReady = false;
@@ -278,7 +272,7 @@ TASK(RNDIS_Task)
 		Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 		
 		/* Check if the data OUT endpoint contains data, and that the IN buffer is empty */
-		if (Endpoint_ReadWriteAllowed() && !(FrameIN.FrameInBuffer))
+		if (Endpoint_IsOUTReceived() && !(FrameIN.FrameInBuffer))
 		{
 			/* Read in the packet message header */
 			Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_PACKET_MSG_t));
@@ -294,7 +288,7 @@ TASK(RNDIS_Task)
 			Endpoint_Read_Stream_LE(FrameIN.FrameData, RNDISPacketHeader.DataLength);
 
 			/* Finalize the stream transfer to send the last packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 			
 			/* Store the size of the Ethernet frame */
 			FrameIN.FrameLength = RNDISPacketHeader.DataLength;
@@ -307,7 +301,7 @@ TASK(RNDIS_Task)
 		Endpoint_SelectEndpoint(CDC_TX_EPNUM);
 		
 		/* Check if the data IN endpoint is ready for more data, and that the IN buffer is full */
-		if (Endpoint_ReadWriteAllowed() && FrameOUT.FrameInBuffer)
+		if (Endpoint_IsINReady() && FrameOUT.FrameInBuffer)
 		{
 			/* Clear the packet header with all 0s so that the relevant fields can be filled */
 			memset(&RNDISPacketHeader, 0, sizeof(RNDIS_PACKET_MSG_t));
@@ -325,7 +319,7 @@ TASK(RNDIS_Task)
 			Endpoint_Write_Stream_LE(FrameOUT.FrameData, RNDISPacketHeader.DataLength);
 			
 			/* Finalize the stream transfer to send the last packet */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 			
 			/* Indicate Ethernet OUT buffer no longer full */
 			FrameOUT.FrameInBuffer = false;
diff --git a/Demos/Device/RNDISEthernet/RNDISEthernet.h b/Demos/Device/RNDISEthernet/RNDISEthernet.h
index 83e49ce84c210563aa7cd8456095608a76fed57e..f21ace774b792498d040a4c787aba98bc987d0bf 100644
--- a/Demos/Device/RNDISEthernet/RNDISEthernet.h
+++ b/Demos/Device/RNDISEthernet/RNDISEthernet.h
@@ -52,7 +52,6 @@
 		#include "Webserver.h"
 
 		#include <LUFA/Version.h>                        // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>             // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>                // USB Functionality
 		#include <LUFA/Drivers/Board/LEDs.h>             // LEDs driver
 		#include <LUFA/Scheduler/Scheduler.h>            // Simple scheduler for task management
diff --git a/Demos/Device/USBtoSerial/USBtoSerial.c b/Demos/Device/USBtoSerial/USBtoSerial.c
index a9f0434cb7bd51697cd5844ff40eda42713a5037..87d531c4d4ba070b6b3fdb8ffcf3e941bc3a2d93 100644
--- a/Demos/Device/USBtoSerial/USBtoSerial.c
+++ b/Demos/Device/USBtoSerial/USBtoSerial.c
@@ -30,12 +30,6 @@
 
 #include "USBtoSerial.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA USB RS232 App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -165,13 +159,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{	
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Write the line coding data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(LineCoding));
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
@@ -179,13 +173,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Read the line coding data in from the host into the global struct */
 				Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(LineCoding));
 
 				/* Finalize the stream transfer to clear the last packet from the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 				
 				/* Reconfigure the USART with the new settings */
 				ReconfigureUSART();
@@ -207,11 +201,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 #endif
 				
 				/* Acknowledge the SETUP packet, ready for data transfer */
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 	
 			break;
@@ -244,13 +238,13 @@ TASK(CDC_Task)
 		Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM);
 		Endpoint_Write_Stream_LE(&Notification, sizeof(Notification));
 		Endpoint_Write_Stream_LE(&LineStateMask, sizeof(LineStateMask));
-		Endpoint_ClearCurrentBank();
+		Endpoint_ClearIN();
 #endif
 
 		/* Select the Serial Rx Endpoint */
 		Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 		
-		if (Endpoint_ReadWriteAllowed())
+		if (Endpoint_IsOUTReceived())
 		{
 			/* Read the received data endpoint into the transmission buffer */
 			while (Endpoint_BytesInEndpoint())
@@ -263,7 +257,7 @@ TASK(CDC_Task)
 			}
 			
 			/* Clear the endpoint buffer */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 		}
 		
 		/* Check if Rx buffer contains data */
@@ -284,27 +278,20 @@ TASK(CDC_Task)
 		if (Tx_Buffer.Elements)
 		{
 			/* Wait until Serial Tx Endpoint Ready for Read/Write */
-			while (!(Endpoint_ReadWriteAllowed()));
-			
-			/* Check before sending the data if the endpoint is completely full */
-			bool IsFull = (Endpoint_BytesInEndpoint() == CDC_TXRX_EPSIZE);
+			while (!(Endpoint_IsReadWriteAllowed()));
 			
 			/* Write the transmission buffer contents to the received data endpoint */
 			while (Tx_Buffer.Elements && (Endpoint_BytesInEndpoint() < CDC_TXRX_EPSIZE))
 			  Endpoint_Write_Byte(Buffer_GetElement(&Tx_Buffer));
 			
 			/* Send the data */
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 
-			/* If a full endpoint was sent, we need to send an empty packet afterwards to terminate the transfer */
-			if (IsFull)
-			{
-				/* Wait until Serial Tx Endpoint Ready for Read/Write */
-				while (!(Endpoint_ReadWriteAllowed()));
+			/* Wait until Serial Tx Endpoint Ready for Read/Write */
+			while (!(Endpoint_IsReadWriteAllowed()));
 
-				/* Send an empty packet to terminate the transfer */
-				Endpoint_ClearCurrentBank();
-			}
+			/* Send an empty packet to terminate the transfer */
+			Endpoint_ClearIN();
 		}
 	}
 }
diff --git a/Demos/Device/USBtoSerial/USBtoSerial.h b/Demos/Device/USBtoSerial/USBtoSerial.h
index 0926600695216b17343c576658cd158a2546ecd2..8fb2c16176ae53f53dd7fb8e6e6b38e62474c872 100644
--- a/Demos/Device/USBtoSerial/USBtoSerial.h
+++ b/Demos/Device/USBtoSerial/USBtoSerial.h
@@ -46,7 +46,6 @@
 		#include "RingBuff.h"
 
 		#include <LUFA/Version.h>                         // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>              // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>                 // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial.h>       // USART driver
 		#include <LUFA/Drivers/Board/LEDs.h>              // LEDs driver
diff --git a/Demos/Host/CDCHost/CDCHost.c b/Demos/Host/CDCHost/CDCHost.c
index 9ecf060b3fad4f229103b642c6291f91171e8373..80d993953be1997889f6f36e5f3af17e822d7b84 100644
--- a/Demos/Host/CDCHost/CDCHost.c
+++ b/Demos/Host/CDCHost/CDCHost.c
@@ -36,12 +36,6 @@
  
 #include "CDCHost.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA CDC Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -244,33 +238,37 @@ TASK(USB_CDC_Host)
 			/* Select and the data IN pipe */
 			Pipe_SelectPipe(CDC_DATAPIPE_IN);
 
-			/* Check if data is in the pipe */
-			if (Pipe_ReadWriteAllowed())
+			/* Check to see if a packet has been received */
+			if (Pipe_IsINReceived())
 			{
-				/* Get the length of the pipe data, and create a new buffer to hold it */
-				uint16_t BufferLength = Pipe_BytesInPipe();
-				uint8_t Buffer[BufferLength];
-				
-				/* Read in the pipe data to the temporary buffer */
-				Pipe_Read_Stream_LE(Buffer, BufferLength);
-				
+				/* Check if data is in the pipe */
+				if (Pipe_IsReadWriteAllowed())
+				{
+					/* Get the length of the pipe data, and create a new buffer to hold it */
+					uint16_t BufferLength = Pipe_BytesInPipe();
+					uint8_t Buffer[BufferLength];
+					
+					/* Read in the pipe data to the temporary buffer */
+					Pipe_Read_Stream_LE(Buffer, BufferLength);
+									
+					/* Print out the buffer contents to the USART */
+					for (uint16_t BufferByte = 0; BufferByte < BufferLength; BufferByte++)
+					  putchar(Buffer[BufferByte]);
+				}
+
 				/* Clear the pipe after it is read, ready for the next packet */
-				Pipe_ClearCurrentBank();
-				
-				/* Print out the buffer contents to the USART */
-				for (uint16_t BufferByte = 0; BufferByte < BufferLength; BufferByte++)
-				  putchar(Buffer[BufferByte]);
+				Pipe_ClearIN();
 			}
 
 			/* Select and unfreeze the notification pipe */
 			Pipe_SelectPipe(CDC_NOTIFICATIONPIPE);
 			Pipe_Unfreeze();
 			
-			/* Check if data is in the pipe */
-			if (Pipe_ReadWriteAllowed())
+			/* Check if a packet has been received */
+			if (Pipe_IsINReceived())
 			{
 				/* Discard the event notification */
-				Pipe_ClearCurrentBank();
+				Pipe_ClearIN();
 			}
 			
 			/* Freeze notification IN pipe after use */
diff --git a/Demos/Host/CDCHost/CDCHost.h b/Demos/Host/CDCHost/CDCHost.h
index 21b9d67edab1cbb01baa6a4e4af5eba76e75816f..c348acaefe748b8efdbcf23e1a19035e36544f5e 100644
--- a/Demos/Host/CDCHost/CDCHost.h
+++ b/Demos/Host/CDCHost/CDCHost.h
@@ -44,7 +44,6 @@
 		#include <stdio.h>
 
 		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
diff --git a/Demos/Host/CDCHost/ConfigDescriptor.h b/Demos/Host/CDCHost/ConfigDescriptor.h
index 9db4b6505c51ea8190e115cfe2f0ceaecd870381..ea00f610f324af3f0ee5f269cd3407cf29706e78 100644
--- a/Demos/Host/CDCHost/ConfigDescriptor.h
+++ b/Demos/Host/CDCHost/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "CDCHost.h"
 		
diff --git a/Demos/Host/GenericHIDHost/ConfigDescriptor.h b/Demos/Host/GenericHIDHost/ConfigDescriptor.h
index e35801a0168799a6ce0cf7dc445b1156d065653c..fac772979c244728a0a413603e7eb6f4b3075faf 100644
--- a/Demos/Host/GenericHIDHost/ConfigDescriptor.h
+++ b/Demos/Host/GenericHIDHost/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "GenericHIDHost.h"
 		
diff --git a/Demos/Host/GenericHIDHost/GenericHIDHost.c b/Demos/Host/GenericHIDHost/GenericHIDHost.c
index 716f1c333d24f43dbf980404eba343408e30b0a1..b047841f6f0f7be5d1c2f42679d22b3daa3c5fed 100644
--- a/Demos/Host/GenericHIDHost/GenericHIDHost.c
+++ b/Demos/Host/GenericHIDHost/GenericHIDHost.c
@@ -36,12 +36,6 @@
  
 #include "GenericHIDHost.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA GenHid Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -185,30 +179,34 @@ void ReadNextReport(void)
 	Pipe_SelectPipe(HID_DATA_IN_PIPE);
 	Pipe_Unfreeze();
 
-	/* Ensure pipe contains data and is ready to be read before continuing */
-	if (!(Pipe_ReadWriteAllowed()))
+	/* Check to see if a packet has been received */
+	if (!(Pipe_IsINReceived()))
 	{
 		#if !defined(INTERRUPT_DATA_PIPE)
 		/* Refreeze HID data IN pipe */
 		Pipe_Freeze();
 		#endif
-		
+			
 		return;
 	}
 	
-	uint8_t ReportINData[Pipe_BytesInPipe()];
+	/* Ensure pipe contains data before trying to read from it */
+	if (Pipe_IsReadWriteAllowed())
+	{
+		uint8_t ReportINData[Pipe_BytesInPipe()];
 
-	/* Read in HID report data */
-	Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData));				
+		/* Read in HID report data */
+		Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData));
+	
+		/* Print report data through the serial port */
+		for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++)
+		  printf_P(PSTR("0x%02X "), ReportINData[CurrByte]);
+		
+		puts_P(PSTR("\r\n"));
+	}
 		
 	/* Clear the IN endpoint, ready for next data packet */
-	Pipe_ClearCurrentBank();
-	
-	/* Print report data through the serial port */
-	for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++)
-	  printf_P(PSTR("0x%02X "), ReportINData[CurrByte]);
-	
-	puts_P(PSTR("\r\n"));
+	Pipe_ClearIN();
 	
 	#if !defined(INTERRUPT_DATA_PIPE)
 	/* Refreeze HID data IN pipe */
@@ -235,7 +233,7 @@ void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t Report
 		Pipe_Unfreeze();
 
 		/* Ensure pipe is ready to be written to before continuing */
-		if (!(Pipe_ReadWriteAllowed()))
+		if (!(Pipe_IsOUTReady()))
 		{
 			/* Refreeze the data OUT pipe */
 			Pipe_Freeze();
@@ -251,7 +249,7 @@ void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t Report
 		Pipe_Write_Stream_LE(ReportOUTData, ReportLength);				
 			
 		/* Clear the OUT endpoint, send last data packet */
-		Pipe_ClearCurrentBank();
+		Pipe_ClearOUT();
 
 		/* Refreeze the data OUT pipe */
 		Pipe_Freeze();
diff --git a/Demos/Host/GenericHIDHost/GenericHIDHost.h b/Demos/Host/GenericHIDHost/GenericHIDHost.h
index 99b4599f1a2a8b13dee8a43bc6a3d9231efe5a54..8483fa6863dfc2dc766c178b38d2d6ee96767438 100644
--- a/Demos/Host/GenericHIDHost/GenericHIDHost.h
+++ b/Demos/Host/GenericHIDHost/GenericHIDHost.h
@@ -45,7 +45,6 @@
 		#include <stdio.h>
 
 		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
@@ -94,6 +93,6 @@
 	/* Function Prototypes: */
 		void UpdateStatus(uint8_t CurrentStatus);
 		void ReadNextReport(void);
-		void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength);
+		void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t ReportType, uint16_t ReportLength);
 		
 #endif
diff --git a/Demos/Host/KeyboardHost/ConfigDescriptor.h b/Demos/Host/KeyboardHost/ConfigDescriptor.h
index 1d168b45328bd4e09ec7b076c486ce9464da39cd..416315b97b16235e050e25cd968b916103357eda 100644
--- a/Demos/Host/KeyboardHost/ConfigDescriptor.h
+++ b/Demos/Host/KeyboardHost/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "KeyboardHost.h"
 		
diff --git a/Demos/Host/KeyboardHost/KeyboardHost.c b/Demos/Host/KeyboardHost/KeyboardHost.c
index 947f23281a03822fab866439f76a102e192f3388..35055ca7971db8ba8fc1415fdaea47598ebd5b01 100644
--- a/Demos/Host/KeyboardHost/KeyboardHost.c
+++ b/Demos/Host/KeyboardHost/KeyboardHost.c
@@ -36,12 +36,6 @@
  
 #include "KeyboardHost.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA KBD Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -191,52 +185,57 @@ void ReadNextReport(void)
 	Pipe_Unfreeze();
 	#endif
 
-	/* Ensure pipe contains data and is ready to be read before continuing */
-	if (!(Pipe_ReadWriteAllowed()))
+	/* Check to see if a packet has been received */
+	if (!(Pipe_IsINReceived()))
 	{
 		#if !defined(INTERRUPT_DATA_PIPE)
-		/* Refreeze keyboard data pipe */
+		/* Refreeze HID data IN pipe */
 		Pipe_Freeze();
 		#endif
-
+			
 		return;
 	}
 	
-	/* Read in keyboard report data */
-	Pipe_Read_Stream_LE(&KeyboardReport, sizeof(KeyboardReport));
-					
-	/* Clear the IN endpoint, ready for next data packet */
-	Pipe_ClearCurrentBank();
-
-	/* Indicate if the modifier byte is non-zero (special key such as shift is being pressed) */
-	LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
-	
-	/* Check if a key has been pressed */
-	if (KeyboardReport.KeyCode)
+	/* Ensure pipe contains data before trying to read from it */
+	if (Pipe_IsReadWriteAllowed())
 	{
-		/* Toggle status LED to indicate keypress */
-		if (LEDs_GetLEDs() & LEDS_LED2)
-		  LEDs_TurnOffLEDs(LEDS_LED2);
-		else
-		  LEDs_TurnOnLEDs(LEDS_LED2);
-			  
-		char PressedKey = 0;
-
-		/* Retrieve pressed key character if alphanumeric */
-		if ((KeyboardReport.KeyCode >= 0x04) && (KeyboardReport.KeyCode <= 0x1D))
-		  PressedKey = (KeyboardReport.KeyCode - 0x04) + 'A';
-		else if ((KeyboardReport.KeyCode >= 0x1E) && (KeyboardReport.KeyCode <= 0x27))
-		  PressedKey = (KeyboardReport.KeyCode - 0x1E) + '0';
-		else if (KeyboardReport.KeyCode == 0x2C)
-		  PressedKey = ' ';						
-		else if (KeyboardReport.KeyCode == 0x28)
-		  PressedKey = '\n';
-			 
-		/* Print the pressed key character out through the serial port if valid */
-		if (PressedKey)
-		  putchar(PressedKey);
+		/* Read in keyboard report data */
+		Pipe_Read_Stream_LE(&KeyboardReport, sizeof(KeyboardReport));
+
+		/* Indicate if the modifier byte is non-zero (special key such as shift is being pressed) */
+		LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
+		
+		/* Check if a key has been pressed */
+		if (KeyboardReport.KeyCode)
+		{
+			/* Toggle status LED to indicate keypress */
+			if (LEDs_GetLEDs() & LEDS_LED2)
+			  LEDs_TurnOffLEDs(LEDS_LED2);
+			else
+			  LEDs_TurnOnLEDs(LEDS_LED2);
+				  
+			char PressedKey = 0;
+
+			/* Retrieve pressed key character if alphanumeric */
+			if ((KeyboardReport.KeyCode >= 0x04) && (KeyboardReport.KeyCode <= 0x1D))
+			  PressedKey = (KeyboardReport.KeyCode - 0x04) + 'A';
+			else if ((KeyboardReport.KeyCode >= 0x1E) && (KeyboardReport.KeyCode <= 0x27))
+			  PressedKey = (KeyboardReport.KeyCode - 0x1E) + '0';
+			else if (KeyboardReport.KeyCode == 0x2C)
+			  PressedKey = ' ';						
+			else if (KeyboardReport.KeyCode == 0x28)
+			  PressedKey = '\n';
+				 
+			/* Print the pressed key character out through the serial port if valid */
+			if (PressedKey)
+			  putchar(PressedKey);
+		}
 	}
 	
+						
+	/* Clear the IN endpoint, ready for next data packet */
+	Pipe_ClearIN();
+
 	#if !defined(INTERRUPT_DATA_PIPE)
 	/* Refreeze keyboard data pipe */
 	Pipe_Freeze();
diff --git a/Demos/Host/KeyboardHost/KeyboardHost.h b/Demos/Host/KeyboardHost/KeyboardHost.h
index 8c1a709154e804749b7401dbf0297e21e349d365..2c541f6a534dc77a50213f8284ade4b7d61c389f 100644
--- a/Demos/Host/KeyboardHost/KeyboardHost.h
+++ b/Demos/Host/KeyboardHost/KeyboardHost.h
@@ -45,7 +45,6 @@
 		#include <stdio.h>
 
 		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
diff --git a/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h b/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h
index e007a942aff4bc75336d1e04d2af6652348f9bd8..1deff6328bf6783f0c7c2157c2e690716bcb0f4e 100644
--- a/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h
+++ b/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "HIDReport.h"
 		
diff --git a/Demos/Host/KeyboardHostWithParser/HIDReport.h b/Demos/Host/KeyboardHostWithParser/HIDReport.h
index 7c59138c2765d5f4ca094fe0590c3276b387de32..a128b8e97c4baed971afc9bc4478b625ee477853 100644
--- a/Demos/Host/KeyboardHostWithParser/HIDReport.h
+++ b/Demos/Host/KeyboardHostWithParser/HIDReport.h
@@ -37,7 +37,7 @@
 #define _HID_REPORT_H_
 
 	/* Includes: */
-		#include <LUFA/Drivers/USB/Class/HIDParser.h>            // HID Class Report Parser
+		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		
 		#include "KeyboardHostWithParser.h"
 
diff --git a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c
index d19929d4d1eb3dd44155813537d4f816ea728cda..d7d5f941437a027f3d2e670ff86bea2da1e9f01b 100644
--- a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c
+++ b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c
@@ -36,12 +36,6 @@
  
 #include "KeyboardHostWithParser.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA KBD Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -270,70 +264,24 @@ TASK(USB_Keyboard_Host)
 			Pipe_SelectPipe(KEYBOARD_DATAPIPE);	
 			Pipe_Unfreeze();
 
-			/* Check if data has been received from the attached keyboard */
-			if (Pipe_ReadWriteAllowed())
+			/* Check to see if a packet has been received */
+			if (Pipe_IsINReceived())
 			{
-				/* Create buffer big enough for the report */
-				uint8_t KeyboardReport[Pipe_BytesInPipe()];
+				/* Check if data has been received from the attached keyboard */
+				if (Pipe_IsReadWriteAllowed())
+				{
+					/* Create buffer big enough for the report */
+					uint8_t KeyboardReport[Pipe_BytesInPipe()];
 
-				/* Load in the keyboard report */
-				Pipe_Read_Stream_LE(KeyboardReport, Pipe_BytesInPipe());
+					/* Load in the keyboard report */
+					Pipe_Read_Stream_LE(KeyboardReport, Pipe_BytesInPipe());
 				
-				/* Clear the IN endpoint, ready for next data packet */
-				Pipe_ClearCurrentBank();
-
-				/* Check each HID report item in turn, looking for keyboard scan code reports */
-				for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
-				{
-					/* Create a temporary item pointer to the next report item */
-					HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
-
-					/* Check if the current report item is a keyboard scancode */
-					if ((ReportItem->Attributes.Usage.Page      == USAGE_PAGE_KEYBOARD) &&
-					    (ReportItem->Attributes.BitSize         == 8)                   &&
-					    (ReportItem->Attributes.Logical.Maximum > 1)                    &&
-					    (ReportItem->ItemType                   == REPORT_ITEM_TYPE_In))
-					{
-						/* Retrieve the keyboard scancode from the report data retrieved from the device */
-						bool FoundData = GetReportItemInfo(KeyboardReport, ReportItem);
-						
-						/* For multi-report devices - if the requested data was not in the issued report, continue */
-						if (!(FoundData))
-						  continue;
-						
-						/* Key code is an unsigned char in length, cast to the appropriate type */
-						uint8_t KeyCode = (uint8_t)ReportItem->Value;
-
-						/* If scancode is non-zero, a key is being pressed */
-						if (KeyCode)
-						{
-							/* Toggle status LED to indicate keypress */
-							if (LEDs_GetLEDs() & LEDS_LED2)
-							  LEDs_TurnOffLEDs(LEDS_LED2);
-							else
-							  LEDs_TurnOnLEDs(LEDS_LED2);
-
-							char PressedKey = 0;
-
-							/* Convert scancode to printable character if alphanumeric */
-							if ((KeyCode >= 0x04) && (KeyCode <= 0x1D))
-							  PressedKey = (KeyCode - 0x04) + 'A';
-							else if ((KeyCode >= 0x1E) && (KeyCode <= 0x27))
-							  PressedKey = (KeyCode - 0x1E) + '0';
-							else if (KeyCode == 0x2C)
-							  PressedKey = ' ';						
-							else if (KeyCode == 0x28)
-							  PressedKey = '\n';
-								 
-							/* Print the pressed key character out through the serial port if valid */
-							if (PressedKey)
-							  putchar(PressedKey);
-						}
-						
-						/* Once a scancode is found, stop scanning through the report items */
-						break;
-					}
+					/* Process the read in keyboard report from the device */
+					ProcessKeyboardReport(KeyboardReport);
 				}
+				
+				/* Clear the IN endpoint, ready for next data packet */
+				Pipe_ClearIN();
 			}
 
 			/* Freeze keyboard data pipe */
@@ -341,3 +289,64 @@ TASK(USB_Keyboard_Host)
 			break;
 	}
 }
+
+/** Processes a read HID report from an attached keyboard, extracting out elements via the HID parser results
+ *  as required and prints pressed characters to the serial port. Each time a key is typed, a board LED is toggled.
+ *
+ *  \param KeyboardReport  Pointer to a HID report from an attached keyboard device
+ */
+void ProcessKeyboardReport(uint8_t* KeyboardReport)
+{
+	/* Check each HID report item in turn, looking for keyboard scan code reports */
+	for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
+	{
+		/* Create a temporary item pointer to the next report item */
+		HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
+
+		/* Check if the current report item is a keyboard scancode */
+		if ((ReportItem->Attributes.Usage.Page      == USAGE_PAGE_KEYBOARD) &&
+			(ReportItem->Attributes.BitSize         == 8)                   &&
+			(ReportItem->Attributes.Logical.Maximum > 1)                    &&
+			(ReportItem->ItemType                   == REPORT_ITEM_TYPE_In))
+		{
+			/* Retrieve the keyboard scancode from the report data retrieved from the device */
+			bool FoundData = GetReportItemInfo(KeyboardReport, ReportItem);
+			
+			/* For multi-report devices - if the requested data was not in the issued report, continue */
+			if (!(FoundData))
+			  continue;
+			
+			/* Key code is an unsigned char in length, cast to the appropriate type */
+			uint8_t KeyCode = (uint8_t)ReportItem->Value;
+
+			/* If scancode is non-zero, a key is being pressed */
+			if (KeyCode)
+			{
+				/* Toggle status LED to indicate keypress */
+				if (LEDs_GetLEDs() & LEDS_LED2)
+				  LEDs_TurnOffLEDs(LEDS_LED2);
+				else
+				  LEDs_TurnOnLEDs(LEDS_LED2);
+
+				char PressedKey = 0;
+
+				/* Convert scancode to printable character if alphanumeric */
+				if ((KeyCode >= 0x04) && (KeyCode <= 0x1D))
+				  PressedKey = (KeyCode - 0x04) + 'A';
+				else if ((KeyCode >= 0x1E) && (KeyCode <= 0x27))
+				  PressedKey = (KeyCode - 0x1E) + '0';
+				else if (KeyCode == 0x2C)
+				  PressedKey = ' ';						
+				else if (KeyCode == 0x28)
+				  PressedKey = '\n';
+					 
+				/* Print the pressed key character out through the serial port if valid */
+				if (PressedKey)
+				  putchar(PressedKey);
+			}
+			
+			/* Once a scancode is found, stop scanning through the report items */
+			break;
+		}
+	}
+}
diff --git a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h
index fece6797182d6300699a33753d722724ab6d8e14..112dbfdecf00eedec907c5e22218a36f5da79c20 100644
--- a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h
+++ b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h
@@ -39,7 +39,6 @@
 		#include <stdio.h>
 
 		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
@@ -77,5 +76,6 @@
 
 	/* Function Prototypes: */
 		void UpdateStatus(uint8_t CurrentStatus);
+		void ProcessKeyboardReport(uint8_t* KeyboardReport);
 		
 #endif
diff --git a/Demos/Host/MassStorageHost/ConfigDescriptor.h b/Demos/Host/MassStorageHost/ConfigDescriptor.h
index 908cc2ba5713951ea4596702bd5651f2e2e40d8e..b02e088284f7812424d69ab039d01916600e1e45 100644
--- a/Demos/Host/MassStorageHost/ConfigDescriptor.h
+++ b/Demos/Host/MassStorageHost/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "MassStorageHost.h"
 		
diff --git a/Demos/Host/MassStorageHost/MassStorageHost.c b/Demos/Host/MassStorageHost/MassStorageHost.c
index ec5bc6107bc735640bfc90ed49e72d4d2e0cf472..1c56e6eedba0b2a0dc269ba5e2ab9f13d8117f59 100644
--- a/Demos/Host/MassStorageHost/MassStorageHost.c
+++ b/Demos/Host/MassStorageHost/MassStorageHost.c
@@ -36,12 +36,6 @@
 
 #include "MassStorageHost.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA MS Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
diff --git a/Demos/Host/MassStorageHost/MassStorageHost.h b/Demos/Host/MassStorageHost/MassStorageHost.h
index 33e2d25389a695fbe06b47aece59ed5e5c844c99..73a69c0d8d79aa195b88da82f07693806f843501 100644
--- a/Demos/Host/MassStorageHost/MassStorageHost.h
+++ b/Demos/Host/MassStorageHost/MassStorageHost.h
@@ -48,7 +48,6 @@
 		#include "MassStoreCommands.h"
 
 		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
diff --git a/Demos/Host/MassStorageHost/MassStoreCommands.c b/Demos/Host/MassStorageHost/MassStoreCommands.c
index bf736e79c470ad2aabfec4ebd475e08f8052cd83..41c59dc4318586df138d55d6a283529284761074 100644
--- a/Demos/Host/MassStorageHost/MassStoreCommands.c
+++ b/Demos/Host/MassStorageHost/MassStoreCommands.c
@@ -88,7 +88,7 @@ static uint8_t MassStore_SendCommand(void)
 	  return ErrorCode;
 
 	/* Send the data in the OUT pipe to the attached device */
-	Pipe_ClearCurrentBank();
+	Pipe_ClearOUT();
 
 	/* Some buggy devices require a delay here before the pipe freezing or they will lock up */
 	USB_Host_WaitMS(1);
@@ -117,7 +117,7 @@ static uint8_t MassStore_WaitForDataReceived(void)
 	Pipe_Unfreeze();
 
 	/* Wait until data received in the IN pipe */
-	while (!(Pipe_ReadWriteAllowed()))
+	while (!(Pipe_IsINReceived()))
 	{
 		/* Check to see if a new frame has been issued (1ms elapsed) */
 		if (USB_INT_HasOccurred(USB_INT_HSOFI))
@@ -183,6 +183,9 @@ static uint8_t MassStore_SendReceiveData(void* BufferPtr)
 		/* Read in the block data from the pipe */
 		if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_ERROR_NoError)
 		  return ErrorCode;
+
+		/* Acknowledge the packet */
+		Pipe_ClearIN();
 	}
 	else
 	{
@@ -193,10 +196,10 @@ static uint8_t MassStore_SendReceiveData(void* BufferPtr)
 		/* Write the block data to the pipe */
 		if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_ERROR_NoError)
 		  return ErrorCode;
+
+		/* Acknowledge the packet */
+		Pipe_ClearOUT();
 	}
-	
-	/* Acknowledge the packet */
-	Pipe_ClearCurrentBank();
 
 	/* Some buggy devices require a delay here before the pipe freezing or they will lock up */
 	USB_Host_WaitMS(1);
@@ -216,8 +219,8 @@ static uint8_t MassStore_GetReturnedStatus(void)
 	uint8_t ErrorCode = PIPE_RWSTREAM_ERROR_NoError;
 
 	/* If an error in the command ocurred, abort */
-	if (MassStore_WaitForDataReceived() != NoError)
-	  return;
+	if ((ErrorCode == MassStore_WaitForDataReceived()) != PIPE_RWSTREAM_ERROR_NoError)
+	  return ErrorCode;
 
 	/* Select the IN data pipe for data reception */
 	Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
@@ -228,7 +231,7 @@ static uint8_t MassStore_GetReturnedStatus(void)
 	  return ErrorCode;
 	  
 	/* Clear the data ready for next reception */
-	Pipe_ClearCurrentBank();
+	Pipe_ClearIN();
 
 	/* Some buggy devices require a delay here before the pipe freezing or they will lock up */
 	USB_Host_WaitMS(1);
diff --git a/Demos/Host/MouseHost/ConfigDescriptor.h b/Demos/Host/MouseHost/ConfigDescriptor.h
index 22e7337148ab21c47b7c08c2850dcd1a3da96842..40286e546e4d00469f66a6bd36c419a39799f963 100644
--- a/Demos/Host/MouseHost/ConfigDescriptor.h
+++ b/Demos/Host/MouseHost/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "MouseHost.h"
 		
diff --git a/Demos/Host/MouseHost/MouseHost.c b/Demos/Host/MouseHost/MouseHost.c
index ff2542834e65ddb192cbdee1515f7ae31628e980..6a59b4d596ec4ab5ffd01530d6241e543dd1d047 100644
--- a/Demos/Host/MouseHost/MouseHost.c
+++ b/Demos/Host/MouseHost/MouseHost.c
@@ -36,12 +36,6 @@
  
 #include "MouseHost.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA Mouse Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -188,49 +182,53 @@ void ReadNextReport(void)
 	Pipe_SelectPipe(MOUSE_DATAPIPE);	
 
 	#if !defined(INTERRUPT_DATA_PIPE)
-	/* Unfreeze mouse data pipe */
+	/* Unfreeze keyboard data pipe */
 	Pipe_Unfreeze();
 	#endif
 
-	/* Ensure pipe contains data and is ready to be read before continuing */
-	if (!(Pipe_ReadWriteAllowed()))
+	/* Check to see if a packet has been received */
+	if (!(Pipe_IsINReceived()))
 	{
 		#if !defined(INTERRUPT_DATA_PIPE)
-		/* Refreeze mouse data pipe */
+		/* Refreeze HID data IN pipe */
 		Pipe_Freeze();
 		#endif
-
+			
 		return;
 	}
 
-	/* Read in mouse report data */
-	Pipe_Read_Stream_LE(&MouseReport, sizeof(MouseReport));				
-		
-	/* Clear the IN endpoint, ready for next data packet */
-	Pipe_ClearCurrentBank();
+	/* Ensure pipe contains data before trying to read from it */
+	if (Pipe_IsReadWriteAllowed())
+	{
+		/* Read in mouse report data */
+		Pipe_Read_Stream_LE(&MouseReport, sizeof(MouseReport));				
+
+		/* Alter status LEDs according to mouse X movement */
+		if (MouseReport.X > 0)
+		  LEDMask |= LEDS_LED1;
+		else if (MouseReport.X < 0)
+		  LEDMask |= LEDS_LED2;
+			
+		/* Alter status LEDs according to mouse Y movement */
+		if (MouseReport.Y > 0)
+		  LEDMask |= LEDS_LED3;
+		else if (MouseReport.Y < 0)
+		  LEDMask |= LEDS_LED4;
+
+		/* Alter status LEDs according to mouse button position */
+		if (MouseReport.Button)
+		  LEDMask  = LEDS_ALL_LEDS;
 		
-	/* Alter status LEDs according to mouse X movement */
-	if (MouseReport.X > 0)
-	  LEDMask |= LEDS_LED1;
-	else if (MouseReport.X < 0)
-	  LEDMask |= LEDS_LED2;
+		LEDs_SetAllLEDs(LEDMask);
 		
-	/* Alter status LEDs according to mouse Y movement */
-	if (MouseReport.Y > 0)
-	  LEDMask |= LEDS_LED3;
-	else if (MouseReport.Y < 0)
-	  LEDMask |= LEDS_LED4;
-
-	/* Alter status LEDs according to mouse button position */
-	if (MouseReport.Button)
-	  LEDMask  = LEDS_ALL_LEDS;
-	
-	LEDs_SetAllLEDs(LEDMask);
-	
-	/* Print mouse report data through the serial port */
-	printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X,
-												  MouseReport.Y,
-												  MouseReport.Button);
+		/* Print mouse report data through the serial port */
+		printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X,
+													  MouseReport.Y,
+													  MouseReport.Button);
+	}
+
+	/* Clear the IN endpoint, ready for next data packet */
+	Pipe_ClearIN();
 
 	#if !defined(INTERRUPT_DATA_PIPE)
 	/* Refreeze mouse data pipe */
diff --git a/Demos/Host/MouseHost/MouseHost.h b/Demos/Host/MouseHost/MouseHost.h
index b72e09cd27832f588b90d90acf4c08ffee34e0fa..c7e5d2be2ceec97e4a151e14317392d8f24fa4a5 100644
--- a/Demos/Host/MouseHost/MouseHost.h
+++ b/Demos/Host/MouseHost/MouseHost.h
@@ -45,7 +45,6 @@
 		#include <stdio.h>
 
 		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
diff --git a/Demos/Host/MouseHostWithParser/ConfigDescriptor.h b/Demos/Host/MouseHostWithParser/ConfigDescriptor.h
index 971bdfeef968ed6415984e14889e27bca44c9597..7cb12dbca9ac7e049033959fb50b2e02bedfcba0 100644
--- a/Demos/Host/MouseHostWithParser/ConfigDescriptor.h
+++ b/Demos/Host/MouseHostWithParser/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "HIDReport.h"
 		
diff --git a/Demos/Host/MouseHostWithParser/HIDReport.h b/Demos/Host/MouseHostWithParser/HIDReport.h
index aa259a1145a019c7358afdd03b95bf84eeecb25a..f5ad40be310ce7db07e6b035bd563a02921f3fee 100644
--- a/Demos/Host/MouseHostWithParser/HIDReport.h
+++ b/Demos/Host/MouseHostWithParser/HIDReport.h
@@ -37,7 +37,7 @@
 #define _HID_REPORT_H_
 
 	/* Includes: */
-		#include <LUFA/Drivers/USB/Class/HIDParser.h>            // HID Class Report Parser
+		#include <LUFA/Drivers/USB/USB.h>            // HID Class Report Parser
 		
 		#include "MouseHostWithParser.h"
 
diff --git a/Demos/Host/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/MouseHostWithParser/MouseHostWithParser.c
index 6aeca4ba56c3d888d180038774420ed28d73daf4..259da2a60e8aa45b636b9683eda3541fd465e5cf 100644
--- a/Demos/Host/MouseHostWithParser/MouseHostWithParser.c
+++ b/Demos/Host/MouseHostWithParser/MouseHostWithParser.c
@@ -36,12 +36,6 @@
  
 #include "MouseHostWithParser.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA Mouse Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -271,79 +265,24 @@ TASK(USB_Mouse_Host)
 			Pipe_SelectPipe(MOUSE_DATAPIPE);	
 			Pipe_Unfreeze();
 
-			/* Check if data has been received from the attached mouse */
-			if (Pipe_ReadWriteAllowed())
+			/* Check to see if a packet has been received */
+			if (Pipe_IsINReceived())
 			{
-				uint8_t LEDMask = LEDS_NO_LEDS;
-
-				/* Create buffer big enough for the report */
-				uint8_t MouseReport[Pipe_BytesInPipe()];
+				/* Check if data has been received from the attached mouse */
+				if (Pipe_IsReadWriteAllowed())
+				{
+					/* Create buffer big enough for the report */
+					uint8_t MouseReport[Pipe_BytesInPipe()];
 
-				/* Load in the mouse report */
-				Pipe_Read_Stream_LE(MouseReport, Pipe_BytesInPipe());
+					/* Load in the mouse report */
+					Pipe_Read_Stream_LE(MouseReport, Pipe_BytesInPipe());
 				
-				/* Clear the IN endpoint, ready for next data packet */
-				Pipe_ClearCurrentBank();
-
-				/* Check each HID report item in turn, looking for mouse X/Y/button reports */
-				for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
-				{
-					/* Create a temporary item pointer to the next report item */
-					HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
-					
-					bool FoundData;
-
-					if ((ReportItem->Attributes.Usage.Page       == USAGE_PAGE_BUTTON) &&
-					    (ReportItem->ItemType                    == REPORT_ITEM_TYPE_In))
-					{
-						/* Get the mouse button value */
-						FoundData = GetReportItemInfo(MouseReport, ReportItem);
-						
-						/* For multi-report devices - if the requested data was not in the issued report, continue */
-						if (!(FoundData))
-						  continue;
-
-						/* If button is pressed, all LEDs are turned on */
-						if (ReportItem->Value)
-						  LEDMask = LEDS_ALL_LEDS;
-					}
-					else if ((ReportItem->Attributes.Usage.Page   == USAGE_PAGE_GENERIC_DCTRL) &&
-					         ((ReportItem->Attributes.Usage.Usage == USAGE_X)                  ||
-					          (ReportItem->Attributes.Usage.Usage == USAGE_Y))                 &&
-					         (ReportItem->ItemType                == REPORT_ITEM_TYPE_In))
-					{
-						/* Get the mouse relative position value */
-						FoundData = GetReportItemInfo(MouseReport, ReportItem);
-						
-						/* For multi-report devices - if the requested data was not in the issued report, continue */
-						if (!(FoundData))
-						  continue;
-						  
-						int16_t DeltaMovement;
-						
-						if (ReportItem->Attributes.BitSize > 8)
-						  DeltaMovement = (int16_t)ReportItem->Value;
-						else
-						  DeltaMovement = (int8_t)ReportItem->Value;
-						
-						/* Determine if the report is for the X or Y delta movement */
-						if (ReportItem->Attributes.Usage.Usage == USAGE_X)
-						{
-							/* Turn on the appropriate LED according to direction if the delta is non-zero */
-							if (DeltaMovement)
-							  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2);
-						}
-						else
-						{
-							/* Turn on the appropriate LED according to direction if the delta is non-zero */
-							if (DeltaMovement)
-							  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4);
-						}
-					}
+					/* Process the read in mouse report from the device */
+					ProcessMouseReport(MouseReport);
 				}
 				
-				/* Display the button information on the board LEDs */
-				LEDs_SetAllLEDs(LEDMask);
+				/* Clear the IN endpoint, ready for next data packet */
+				Pipe_ClearIN();
 			}
 
 			/* Freeze mouse data pipe */
@@ -352,3 +291,72 @@ TASK(USB_Mouse_Host)
 	}
 }
 
+/** Processes a read HID report from an attached mouse, extracting out elements via the HID parser results
+ *  as required and displays movement and button presses on the board LEDs.
+ *
+ *  \param MouseReport  Pointer to a HID report from an attached mouse device
+ */
+void ProcessMouseReport(uint8_t* MouseReport)
+{
+	uint8_t LEDMask = LEDS_NO_LEDS;
+
+	/* Check each HID report item in turn, looking for mouse X/Y/button reports */
+	for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
+	{
+		/* Create a temporary item pointer to the next report item */
+		HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
+		
+		bool FoundData;
+
+		if ((ReportItem->Attributes.Usage.Page       == USAGE_PAGE_BUTTON) &&
+			(ReportItem->ItemType                    == REPORT_ITEM_TYPE_In))
+		{
+			/* Get the mouse button value */
+			FoundData = GetReportItemInfo(MouseReport, ReportItem);
+			
+			/* For multi-report devices - if the requested data was not in the issued report, continue */
+			if (!(FoundData))
+			  continue;
+
+			/* If button is pressed, all LEDs are turned on */
+			if (ReportItem->Value)
+			  LEDMask = LEDS_ALL_LEDS;
+		}
+		else if ((ReportItem->Attributes.Usage.Page   == USAGE_PAGE_GENERIC_DCTRL) &&
+				 ((ReportItem->Attributes.Usage.Usage == USAGE_X)                  ||
+				  (ReportItem->Attributes.Usage.Usage == USAGE_Y))                 &&
+				 (ReportItem->ItemType                == REPORT_ITEM_TYPE_In))
+		{
+			/* Get the mouse relative position value */
+			FoundData = GetReportItemInfo(MouseReport, ReportItem);
+			
+			/* For multi-report devices - if the requested data was not in the issued report, continue */
+			if (!(FoundData))
+			  continue;
+			  
+			int16_t DeltaMovement;
+			
+			if (ReportItem->Attributes.BitSize > 8)
+			  DeltaMovement = (int16_t)ReportItem->Value;
+			else
+			  DeltaMovement = (int8_t)ReportItem->Value;
+			
+			/* Determine if the report is for the X or Y delta movement */
+			if (ReportItem->Attributes.Usage.Usage == USAGE_X)
+			{
+				/* Turn on the appropriate LED according to direction if the delta is non-zero */
+				if (DeltaMovement)
+				  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2);
+			}
+			else
+			{
+				/* Turn on the appropriate LED according to direction if the delta is non-zero */
+				if (DeltaMovement)
+				  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4);
+			}
+		}
+	}
+	
+	/* Display the button information on the board LEDs */
+	LEDs_SetAllLEDs(LEDMask);
+}
\ No newline at end of file
diff --git a/Demos/Host/MouseHostWithParser/MouseHostWithParser.h b/Demos/Host/MouseHostWithParser/MouseHostWithParser.h
index b59ab9a7898aa7df1b829dec5f07b08ca44c7124..f808745d752cbd55b0be3ac9178b61c76e1a9a2a 100644
--- a/Demos/Host/MouseHostWithParser/MouseHostWithParser.h
+++ b/Demos/Host/MouseHostWithParser/MouseHostWithParser.h
@@ -39,7 +39,6 @@
 		#include <stdio.h>
 
 		#include <LUFA/Version.h>                                // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
@@ -77,5 +76,6 @@
 
 	/* Function Prototypes: */
 		void UpdateStatus(uint8_t CurrentStatus);
-		
+		void ProcessMouseReport(uint8_t* MouseReport);
+
 #endif
diff --git a/Demos/Host/StillImageHost/ConfigDescriptor.h b/Demos/Host/StillImageHost/ConfigDescriptor.h
index f791488b110a5d351afa7fe6c4ba7e940d4a0eb2..cb4de5f46386496225f274becea943b69620e819 100644
--- a/Demos/Host/StillImageHost/ConfigDescriptor.h
+++ b/Demos/Host/StillImageHost/ConfigDescriptor.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
-		#include <LUFA/Drivers/USB/Class/ConfigDescriptor.h>     // Configuration Descriptor Parser
 		
 		#include "StillImageHost.h"
 		
diff --git a/Demos/Host/StillImageHost/StillImageCommands.c b/Demos/Host/StillImageHost/StillImageCommands.c
index 43e57e126ebcdb1d9aaf3ef7ec19c1589c2ab3bb..ebf20b0b29e54d6b850b714e8bc303d058f1197a 100644
--- a/Demos/Host/StillImageHost/StillImageCommands.c
+++ b/Demos/Host/StillImageHost/StillImageCommands.c
@@ -72,7 +72,7 @@ void SImage_SendBlockHeader(void)
 		}
 		
 		/* Send the PIMA command block to the attached device */
-		Pipe_ClearCurrentBank();
+		Pipe_ClearOUT();
 	}
 					
 	/* Freeze pipe after use */
@@ -90,7 +90,7 @@ void SImage_RecieveEventHeader(void)
 	Pipe_Read_Stream_LE(&PIMA_EventBlock, sizeof(PIMA_EventBlock));
 	
 	/* Clear the pipe after read complete to prepare for next event */
-	Pipe_ClearCurrentBank();
+	Pipe_ClearIN();
 	
 	/* Freeze the event pipe again after use */
 	Pipe_Freeze();
@@ -106,7 +106,7 @@ uint8_t SImage_RecieveBlockHeader(void)
 	Pipe_Unfreeze();
 	
 	/* Wait until data received on the IN pipe */
-	while (!(Pipe_ReadWriteAllowed()))
+	while (!(Pipe_IsReadWriteAllowed()))
 	{
 		/* Check to see if a new frame has been issued (1ms elapsed) */
 		if (USB_INT_HasOccurred(USB_INT_HSOFI))
@@ -179,7 +179,7 @@ uint8_t SImage_RecieveBlockHeader(void)
 		}
 		
 		/* Clear pipe bank after use */
-		Pipe_ClearCurrentBank();
+		Pipe_ClearIN();
 	}
 	
 	/* Freeze the IN pipe after use */
@@ -203,7 +203,7 @@ void SImage_SendData(void* Buffer, uint16_t Bytes)
 	Pipe_Write_Stream_LE(Buffer, Bytes);
 
 	/* Send the last packet to the attached device */
-	Pipe_ClearCurrentBank();
+	Pipe_ClearOUT();
 
 	/* Freeze the pipe again after use */
 	Pipe_Freeze();
diff --git a/Demos/Host/StillImageHost/StillImageHost.c b/Demos/Host/StillImageHost/StillImageHost.c
index 1694322ee86b6d01b91b1b733bc63fc61f0f3fa2..d9dd7ce3f98b2e8d090627dd0ad00cec3bcc54de 100644
--- a/Demos/Host/StillImageHost/StillImageHost.c
+++ b/Demos/Host/StillImageHost/StillImageHost.c
@@ -36,11 +36,6 @@
 
 #include "StillImageHost.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA SIMG Host App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -243,7 +238,7 @@ TASK(USB_SImage_Host)
 			SImage_ReadData(DeviceInfo, DeviceInfoSize);
 			
 			/* Once all the data has been read, the pipe must be cleared before the response can be sent */
-			Pipe_ClearCurrentBank();
+			Pipe_ClearIN();
 			
 			/* Create a pointer for walking through the info dataset */
 			uint8_t* DeviceInfoPos = DeviceInfo;
diff --git a/Demos/Host/StillImageHost/StillImageHost.h b/Demos/Host/StillImageHost/StillImageHost.h
index 7757b080773940005bc01200ba35e03de738fcb4..e4d2e85f88b3aba82d04206bb8e5b4026b87feea 100644
--- a/Demos/Host/StillImageHost/StillImageHost.h
+++ b/Demos/Host/StillImageHost/StillImageHost.h
@@ -46,7 +46,6 @@
 		#include "PIMACodes.h"
 		#include "StillImageCommands.h"
 
-		#include <LUFA/Common/ButtLoadTag.h>                     // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>             // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/USB/USB.h>                        // USB Functionality
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>       // Serial stream driver
diff --git a/Demos/OTG/TestApp/TestApp.c b/Demos/OTG/TestApp/TestApp.c
index 49fdf678273c1f269012936bdd4333fcb1497791..e72c191b3a8a3871030def23e0a77e8a1e95d897 100644
--- a/Demos/OTG/TestApp/TestApp.c
+++ b/Demos/OTG/TestApp/TestApp.c
@@ -36,12 +36,6 @@
 
 #include "TestApp.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "LUFA Test App");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
diff --git a/Demos/OTG/TestApp/TestApp.h b/Demos/OTG/TestApp/TestApp.h
index cb262397dd332696b47e55d31c8fb9c91cb25e1c..bf2d56098e7d73e55793957331cddddb48a38b6b 100644
--- a/Demos/OTG/TestApp/TestApp.h
+++ b/Demos/OTG/TestApp/TestApp.h
@@ -46,7 +46,6 @@
 		#include <LUFA/Drivers/USB/USB.h>                       // USB Functionality
 		#include <LUFA/Scheduler/Scheduler.h>                   // Simple scheduler for task management
 		#include <LUFA/MemoryAllocator/DynAlloc.h>              // Auto-defragmenting Dynamic Memory allocation
-		#include <LUFA/Common/ButtLoadTag.h>                    // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/Misc/TerminalCodes.h>            // ANSI Terminal Escape Codes
 		#include <LUFA/Drivers/AT90USBXXX/ADC.h>                // ADC driver
 		#include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h>      // USART Stream driver
diff --git a/LUFA.pnproj b/LUFA.pnproj
index d2007eac4ec4320a23ae04d44905c4fe919ff62f..d5bb11eeb65492f85d598f1b9b7c8e01398c51cb 100644
--- a/LUFA.pnproj
+++ b/LUFA.pnproj
@@ -1 +1 @@
-<Project name="LUFA"><Folder name="Demos"><Folder name="Device"><Folder name="AudioInput"><File path="Demos\Device\AudioInput\AudioInput.c"></File><File path="Demos\Device\AudioInput\AudioInput.h"></File><File path="Demos\Device\AudioInput\AudioInput.txt"></File><File path="Demos\Device\AudioInput\Descriptors.c"></File><File path="Demos\Device\AudioInput\Descriptors.h"></File><File path="Demos\Device\AudioInput\Doxygen.conf"></File><File path="Demos\Device\AudioInput\makefile"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\AudioOutput\Descriptors.c"></File><File path="Demos\Device\AudioOutput\Descriptors.h"></File><File path="Demos\Device\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\AudioOutput\makefile"></File></Folder><Folder name="CDC"><File path="Demos\Device\CDC\CDC.c"></File><File path="Demos\Device\CDC\CDC.h"></File><File path="Demos\Device\CDC\CDC.txt"></File><File path="Demos\Device\CDC\Descriptors.c"></File><File path="Demos\Device\CDC\Descriptors.h"></File><File path="Demos\Device\CDC\Doxygen.conf"></File><File path="Demos\Device\CDC\LUFA CDC.inf"></File><File path="Demos\Device\CDC\makefile"></File></Folder><Folder name="DualCDC"><File path="Demos\Device\DualCDC\Descriptors.c"></File><File path="Demos\Device\DualCDC\Descriptors.h"></File><File path="Demos\Device\DualCDC\Doxygen.conf"></File><File path="Demos\Device\DualCDC\DualCDC.c"></File><File path="Demos\Device\DualCDC\DualCDC.h"></File><File path="Demos\Device\DualCDC\DualCDC.txt"></File><File path="Demos\Device\DualCDC\LUFA DualCDC.inf"></File><File path="Demos\Device\DualCDC\makefile"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\GenericHID\Descriptors.c"></File><File path="Demos\Device\GenericHID\Descriptors.h"></File><File path="Demos\Device\GenericHID\GenericHID.c"></File><File path="Demos\Device\GenericHID\GenericHID.h"></File><File path="Demos\Device\GenericHID\makefile"></File><File path="Demos\Device\GenericHID\GenericHID.txt"></File><File path="Demos\Device\GenericHID\Doxygen.conf"></File></Folder><Folder name="Joystick"><File path="Demos\Device\Joystick\Descriptors.c"></File><File path="Demos\Device\Joystick\Descriptors.h"></File><File path="Demos\Device\Joystick\Doxygen.conf"></File><File path="Demos\Device\Joystick\Joystick.c"></File><File path="Demos\Device\Joystick\Joystick.h"></File><File path="Demos\Device\Joystick\Joystick.txt"></File><File path="Demos\Device\Joystick\makefile"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\Keyboard\Descriptors.c"></File><File path="Demos\Device\Keyboard\Descriptors.h"></File><File path="Demos\Device\Keyboard\Doxygen.conf"></File><File path="Demos\Device\Keyboard\Keyboard.c"></File><File path="Demos\Device\Keyboard\Keyboard.h"></File><File path="Demos\Device\Keyboard\Keyboard.txt"></File><File path="Demos\Device\Keyboard\makefile"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\KeyboardMouse\makefile"></File></Folder><Folder name="MassStorage"><File path="Demos\Device\MassStorage\DataflashManager.c"></File><File path="Demos\Device\MassStorage\DataflashManager.h"></File><File path="Demos\Device\MassStorage\Descriptors.c"></File><File path="Demos\Device\MassStorage\Descriptors.h"></File><File path="Demos\Device\MassStorage\Doxygen.conf"></File><File path="Demos\Device\MassStorage\makefile"></File><File path="Demos\Device\MassStorage\MassStorage.c"></File><File path="Demos\Device\MassStorage\MassStorage.h"></File><File path="Demos\Device\MassStorage\MassStorage.txt"></File><File path="Demos\Device\MassStorage\SCSI.c"></File><File path="Demos\Device\MassStorage\SCSI.h"></File><File path="Demos\Device\MassStorage\SCSI_Codes.h"></File></Folder><Folder name="MIDI"><File path="Demos\Device\MIDI\Descriptors.c"></File><File path="Demos\Device\MIDI\Descriptors.h"></File><File path="Demos\Device\MIDI\Doxygen.conf"></File><File path="Demos\Device\MIDI\makefile"></File><File path="Demos\Device\MIDI\MIDI.c"></File><File path="Demos\Device\MIDI\MIDI.h"></File><File path="Demos\Device\MIDI\MIDI.txt"></File></Folder><Folder name="Mouse"><File path="Demos\Device\Mouse\Descriptors.c"></File><File path="Demos\Device\Mouse\Descriptors.h"></File><File path="Demos\Device\Mouse\Doxygen.conf"></File><File path="Demos\Device\Mouse\makefile"></File><File path="Demos\Device\Mouse\Mouse.c"></File><File path="Demos\Device\Mouse\Mouse.h"></File><File path="Demos\Device\Mouse\Mouse.txt"></File></Folder><Folder name="RNDISEthernet"><File path="Demos\Device\RNDISEthernet\ARP.c"></File><File path="Demos\Device\RNDISEthernet\ARP.h"></File><File path="Demos\Device\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\RNDISEthernet\DHCP.c"></File><File path="Demos\Device\RNDISEthernet\DHCP.h"></File><File path="Demos\Device\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\RNDISEthernet\Ethernet.c"></File><File path="Demos\Device\RNDISEthernet\Ethernet.h"></File><File path="Demos\Device\RNDISEthernet\EthernetProtocols.h"></File><File path="Demos\Device\RNDISEthernet\ICMP.c"></File><File path="Demos\Device\RNDISEthernet\ICMP.h"></File><File path="Demos\Device\RNDISEthernet\IP.c"></File><File path="Demos\Device\RNDISEthernet\IP.h"></File><File path="Demos\Device\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\RNDISEthernet\makefile"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.c"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.h"></File><File path="Demos\Device\RNDISEthernet\RNDIS.c"></File><File path="Demos\Device\RNDISEthernet\RNDIS.h"></File><File path="Demos\Device\RNDISEthernet\RNDISConstants.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\RNDISEthernet\TCP.c"></File><File path="Demos\Device\RNDISEthernet\TCP.h"></File><File path="Demos\Device\RNDISEthernet\UDP.c"></File><File path="Demos\Device\RNDISEthernet\UDP.h"></File><File path="Demos\Device\RNDISEthernet\Webserver.c"></File><File path="Demos\Device\RNDISEthernet\Webserver.h"></File></Folder><Folder name="USBtoSerial"><File path="Demos\Device\USBtoSerial\Descriptors.c"></File><File path="Demos\Device\USBtoSerial\Descriptors.h"></File><File path="Demos\Device\USBtoSerial\Doxygen.conf"></File><File path="Demos\Device\USBtoSerial\LUFA USBtoSerial.inf"></File><File path="Demos\Device\USBtoSerial\makefile"></File><File path="Demos\Device\USBtoSerial\RingBuff.c"></File><File path="Demos\Device\USBtoSerial\RingBuff.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.c"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.txt"></File></Folder><File path="Demos\Device\makefile"></File></Folder><Folder name="Host"><Folder name="CDCHost"><File path="Demos\Host\CDCHost\CDCHost.c"></File><File path="Demos\Host\CDCHost\CDCHost.h"></File><File path="Demos\Host\CDCHost\CDCHost.txt"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.c"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.h"></File><File path="Demos\Host\CDCHost\Doxygen.conf"></File><File path="Demos\Host\CDCHost\makefile"></File></Folder><Folder name="GenericHIDHost"><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.c"></File><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.h"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.c"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.h"></File><File path="Demos\Host\GenericHIDHost\makefile"></File><File path="Demos\Host\GenericHIDHost\Doxygen.conf"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\KeyboardHost\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHost\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\KeyboardHost\makefile"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.c"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\KeyboardHostWithParser\makefile"></File></Folder><Folder name="MassStorageHost"><File path="Demos\Host\MassStorageHost\ConfigDescriptor.c"></File><File path="Demos\Host\MassStorageHost\ConfigDescriptor.h"></File><File path="Demos\Host\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\MassStorageHost\makefile"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.c"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.h"></File><File path="Demos\Host\MassStorageHost\SCSI_Codes.h"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\MouseHost\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHost\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHost\Doxygen.conf"></File><File path="Demos\Host\MouseHost\makefile"></File><File path="Demos\Host\MouseHost\MouseHost.c"></File><File path="Demos\Host\MouseHost\MouseHost.h"></File><File path="Demos\Host\MouseHost\MouseHost.txt"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.c"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.h"></File><File path="Demos\Host\MouseHostWithParser\makefile"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.txt"></File></Folder><Folder name="StillImageHost"><File path="Demos\Host\StillImageHost\ConfigDescriptor.c"></File><File path="Demos\Host\StillImageHost\ConfigDescriptor.h"></File><File path="Demos\Host\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\StillImageHost\makefile"></File><File path="Demos\Host\StillImageHost\PIMACodes.h"></File><File path="Demos\Host\StillImageHost\StillImageCommands.c"></File><File path="Demos\Host\StillImageHost\StillImageCommands.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.txt"></File></Folder><File path="Demos\Host\makefile"></File></Folder><Folder name="OTG"><Folder name="TestApp"><File path="Demos\OTG\TestApp\Descriptors.c"></File><File path="Demos\OTG\TestApp\Descriptors.h"></File><File path="Demos\OTG\TestApp\Doxygen.conf"></File><File path="Demos\OTG\TestApp\makefile"></File><File path="Demos\OTG\TestApp\TestApp.c"></File><File path="Demos\OTG\TestApp\TestApp.h"></File><File path="Demos\OTG\TestApp\TestApp.txt"></File><File path="Demos\OTG\TestApp\TestEvents.c"></File><File path="Demos\OTG\TestApp\TestEvents.h"></File></Folder><File path="Demos\OTG\makefile"></File></Folder><File path="Demos\makefile"></File></Folder><Folder name="LUFA"><Folder name="Common"><File path="LUFA\Common\Common.h"></File><File path="LUFA\Common\FunctionAttributes.h"></File><File path="LUFA\Common\ButtLoadTag.h"></File><File path="LUFA\Common\BoardTypes.h"></File></Folder><Folder name="Drivers"><Folder name="USB"><Folder name="LowLevel"><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.c"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.h"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.c"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.h"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\Device.h"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.c"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.h"></File><File path="LUFA\Drivers\USB\LowLevel\Host.c"></File><File path="LUFA\Drivers\USB\LowLevel\Host.h"></File><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\OTG.h"></File></Folder><Folder name="HighLevel"><File path="LUFA\Drivers\USB\HighLevel\USBTask.h"></File><File path="LUFA\Drivers\USB\HighLevel\Events.c"></File><File path="LUFA\Drivers\USB\HighLevel\Events.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.c"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBTask.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.h"></File><File path="LUFA\Drivers\USB\HighLevel\StdRequestType.h"></File><File path="LUFA\Drivers\USB\HighLevel\StreamCallbacks.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBMode.h"></File></Folder><Folder name="Class"><File path="LUFA\Drivers\USB\Class\HIDParser.c"></File><File path="LUFA\Drivers\USB\Class\HIDParser.h"></File><File path="LUFA\Drivers\USB\Class\HIDReportData.h"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.c"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.h"></File></Folder><File path="LUFA\Drivers\USB\USB.h"></File></Folder><Folder name="Misc"><File path="LUFA\Drivers\Misc\TerminalCodes.h"></File></Folder><Folder name="AT90USBXXX"><Folder name="AT90USBXXX67"><File path="LUFA\Drivers\AT90USBXXX\AT90USBXXX67\ADC.h"></File></Folder><File path="LUFA\Drivers\AT90USBXXX\Serial_Stream.h"></File><File path="LUFA\Drivers\AT90USBXXX\ADC.h"></File><File path="LUFA\Drivers\AT90USBXXX\Serial.c"></File><File path="LUFA\Drivers\AT90USBXXX\Serial.h"></File><File path="LUFA\Drivers\AT90USBXXX\Serial_Stream.c"></File><File path="LUFA\Drivers\AT90USBXXX\SPI.h"></File></Folder><Folder name="Board"><Folder name="USBKEY"><File path="LUFA\Drivers\Board\USBKEY\Dataflash.h"></File><File path="LUFA\Drivers\Board\USBKEY\Joystick.h"></File><File path="LUFA\Drivers\Board\USBKEY\HWB.h"></File><File path="LUFA\Drivers\Board\USBKEY\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\USBKEY\LEDs.h"></File></Folder><Folder name="STK526"><File path="LUFA\Drivers\Board\STK526\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK526\Joystick.h"></File><File path="LUFA\Drivers\Board\STK526\HWB.h"></File><File path="LUFA\Drivers\Board\STK526\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\STK526\LEDs.h"></File></Folder><Folder name="STK525"><File path="LUFA\Drivers\Board\STK525\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK525\Joystick.h"></File><File path="LUFA\Drivers\Board\STK525\HWB.h"></File><File path="LUFA\Drivers\Board\STK525\AT45DB321C.h"></File><File path="LUFA\Drivers\Board\STK525\LEDs.h"></File></Folder><Folder name="RZUSBSTICK"><File path="LUFA\Drivers\Board\RZUSBSTICK\LEDs.h"></File></Folder><Folder name="ATAVRUSBRF01"><File path="LUFA\Drivers\Board\ATAVRUSBRF01\LEDs.h"></File><File path="LUFA\Drivers\Board\ATAVRUSBRF01\HWB.h"></File></Folder><File path="LUFA\Drivers\Board\Temperature.h"></File><File path="LUFA\Drivers\Board\Dataflash.h"></File><File path="LUFA\Drivers\Board\HWB.h"></File><File path="LUFA\Drivers\Board\Joystick.h"></File><File path="LUFA\Drivers\Board\Temperature.c"></File><File path="LUFA\Drivers\Board\LEDs.h"></File></Folder></Folder><Folder name="Scheduler"><File path="LUFA\Scheduler\Scheduler.h"></File><File path="LUFA\Scheduler\Scheduler.c"></File></Folder><Folder name="MemoryAllocator"><File path="LUFA\MemoryAllocator\DynAlloc.h"></File><File path="LUFA\MemoryAllocator\DynAlloc.c"></File></Folder><Folder name="DriverStubs"><File path="LUFA\DriverStubs\Dataflash.h"></File><File path="LUFA\DriverStubs\HWB.h"></File><File path="LUFA\DriverStubs\Joystick.h"></File><File path="LUFA\DriverStubs\LEDs.h"></File></Folder><File path="LUFA\makefile"></File><File path="LUFA\Version.h"></File><File path="LUFA\BuildingLinkableLibraries.txt"></File><File path="LUFA\GettingStarted.txt"></File><File path="LUFA\MainPage.txt"></File><File path="LUFA\SchedulerOverview.txt"></File><File path="LUFA\VIDAndPIDValues.txt"></File><File path="LUFA\ChangeLog.txt"></File><File path="LUFA\CompileTimeTokens.txt"></File><File path="LUFA\MigrationInformation.txt"></File><File path="LUFA\DirectorySummaries.txt"></File><File path="LUFA\Doxygen.conf"></File><File path="LUFA\WritingBoardDrivers.txt"></File><File path="LUFA\LUFAPoweredProjects.txt"></File></Folder><Folder name="Projects"><Folder name="MagStripe"><File path="Projects\Magstripe\Descriptors.c"></File><File path="Projects\Magstripe\Descriptors.h"></File><File path="Projects\Magstripe\Magstripe.c"></File><File path="Projects\Magstripe\Magstripe.h"></File><File path="Projects\Magstripe\MagstripeHW.h"></File><File path="Projects\Magstripe\makefile"></File><File path="Projects\Magstripe\Magstripe.txt"></File><File path="Projects\Magstripe\Doxygen.conf"></File><File path="Projects\Magstripe\CircularBitBuffer.c"></File><File path="Projects\Magstripe\CircularBitBuffer.h"></File></Folder><File path="Projects\makefile"></File></Folder><Folder name="Bootloaders"><Folder name="DFU"><File path="Bootloaders\DFU\BootloaderDFU.c"></File><File path="Bootloaders\DFU\BootloaderDFU.h"></File><File path="Bootloaders\DFU\Descriptors.c"></File><File path="Bootloaders\DFU\Descriptors.h"></File><File path="Bootloaders\DFU\makefile"></File><File path="Bootloaders\DFU\BootloaderDFU.txt"></File><File path="Bootloaders\DFU\Doxygen.conf"></File></Folder><Folder name="CDC"><File path="Bootloaders\CDC\BootloaderCDC.c"></File><File path="Bootloaders\CDC\BootloaderCDC.h"></File><File path="Bootloaders\CDC\Descriptors.c"></File><File path="Bootloaders\CDC\Descriptors.h"></File><File path="Bootloaders\CDC\makefile"></File><File path="Bootloaders\CDC\LUFA CDC Bootloader.inf"></File><File path="Bootloaders\CDC\Doxygen.conf"></File><File path="Bootloaders\CDC\BootloaderCDC.txt"></File></Folder><Folder name="TeensyHID"><File path="Bootloaders\TeensyHID\Descriptors.c"></File><File path="Bootloaders\TeensyHID\Descriptors.h"></File><File path="Bootloaders\TeensyHID\makefile"></File><File path="Bootloaders\TeensyHID\TeensyHID.c"></File><File path="Bootloaders\TeensyHID\TeensyHID.h"></File><File path="Bootloaders\TeensyHID\TeensyHID.txt"></File></Folder><File path="Bootloaders\makefile"></File></Folder><File path="makefile"></File></Project>
\ No newline at end of file
+<Project name="LUFA"><Folder name="Demos"><Folder name="Device"><Folder name="AudioInput"><File path="Demos\Device\AudioInput\AudioInput.c"></File><File path="Demos\Device\AudioInput\AudioInput.h"></File><File path="Demos\Device\AudioInput\AudioInput.txt"></File><File path="Demos\Device\AudioInput\Descriptors.c"></File><File path="Demos\Device\AudioInput\Descriptors.h"></File><File path="Demos\Device\AudioInput\Doxygen.conf"></File><File path="Demos\Device\AudioInput\makefile"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\AudioOutput\Descriptors.c"></File><File path="Demos\Device\AudioOutput\Descriptors.h"></File><File path="Demos\Device\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\AudioOutput\makefile"></File></Folder><Folder name="CDC"><File path="Demos\Device\CDC\CDC.c"></File><File path="Demos\Device\CDC\CDC.h"></File><File path="Demos\Device\CDC\CDC.txt"></File><File path="Demos\Device\CDC\Descriptors.c"></File><File path="Demos\Device\CDC\Descriptors.h"></File><File path="Demos\Device\CDC\Doxygen.conf"></File><File path="Demos\Device\CDC\LUFA CDC.inf"></File><File path="Demos\Device\CDC\makefile"></File></Folder><Folder name="DualCDC"><File path="Demos\Device\DualCDC\Descriptors.c"></File><File path="Demos\Device\DualCDC\Descriptors.h"></File><File path="Demos\Device\DualCDC\Doxygen.conf"></File><File path="Demos\Device\DualCDC\DualCDC.c"></File><File path="Demos\Device\DualCDC\DualCDC.h"></File><File path="Demos\Device\DualCDC\DualCDC.txt"></File><File path="Demos\Device\DualCDC\LUFA DualCDC.inf"></File><File path="Demos\Device\DualCDC\makefile"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\GenericHID\Descriptors.c"></File><File path="Demos\Device\GenericHID\Descriptors.h"></File><File path="Demos\Device\GenericHID\GenericHID.c"></File><File path="Demos\Device\GenericHID\GenericHID.h"></File><File path="Demos\Device\GenericHID\makefile"></File><File path="Demos\Device\GenericHID\GenericHID.txt"></File><File path="Demos\Device\GenericHID\Doxygen.conf"></File></Folder><Folder name="Joystick"><File path="Demos\Device\Joystick\Descriptors.c"></File><File path="Demos\Device\Joystick\Descriptors.h"></File><File path="Demos\Device\Joystick\Doxygen.conf"></File><File path="Demos\Device\Joystick\Joystick.c"></File><File path="Demos\Device\Joystick\Joystick.h"></File><File path="Demos\Device\Joystick\Joystick.txt"></File><File path="Demos\Device\Joystick\makefile"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\Keyboard\Descriptors.c"></File><File path="Demos\Device\Keyboard\Descriptors.h"></File><File path="Demos\Device\Keyboard\Doxygen.conf"></File><File path="Demos\Device\Keyboard\Keyboard.c"></File><File path="Demos\Device\Keyboard\Keyboard.h"></File><File path="Demos\Device\Keyboard\Keyboard.txt"></File><File path="Demos\Device\Keyboard\makefile"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\KeyboardMouse\makefile"></File></Folder><Folder name="MassStorage"><File path="Demos\Device\MassStorage\DataflashManager.c"></File><File path="Demos\Device\MassStorage\DataflashManager.h"></File><File path="Demos\Device\MassStorage\Descriptors.c"></File><File path="Demos\Device\MassStorage\Descriptors.h"></File><File path="Demos\Device\MassStorage\Doxygen.conf"></File><File path="Demos\Device\MassStorage\makefile"></File><File path="Demos\Device\MassStorage\MassStorage.c"></File><File path="Demos\Device\MassStorage\MassStorage.h"></File><File path="Demos\Device\MassStorage\MassStorage.txt"></File><File path="Demos\Device\MassStorage\SCSI.c"></File><File path="Demos\Device\MassStorage\SCSI.h"></File><File path="Demos\Device\MassStorage\SCSI_Codes.h"></File></Folder><Folder name="MIDI"><File path="Demos\Device\MIDI\Descriptors.c"></File><File path="Demos\Device\MIDI\Descriptors.h"></File><File path="Demos\Device\MIDI\Doxygen.conf"></File><File path="Demos\Device\MIDI\makefile"></File><File path="Demos\Device\MIDI\MIDI.c"></File><File path="Demos\Device\MIDI\MIDI.h"></File><File path="Demos\Device\MIDI\MIDI.txt"></File></Folder><Folder name="Mouse"><File path="Demos\Device\Mouse\Descriptors.c"></File><File path="Demos\Device\Mouse\Descriptors.h"></File><File path="Demos\Device\Mouse\Doxygen.conf"></File><File path="Demos\Device\Mouse\makefile"></File><File path="Demos\Device\Mouse\Mouse.c"></File><File path="Demos\Device\Mouse\Mouse.h"></File><File path="Demos\Device\Mouse\Mouse.txt"></File></Folder><Folder name="RNDISEthernet"><File path="Demos\Device\RNDISEthernet\ARP.c"></File><File path="Demos\Device\RNDISEthernet\ARP.h"></File><File path="Demos\Device\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\RNDISEthernet\DHCP.c"></File><File path="Demos\Device\RNDISEthernet\DHCP.h"></File><File path="Demos\Device\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\RNDISEthernet\Ethernet.c"></File><File path="Demos\Device\RNDISEthernet\Ethernet.h"></File><File path="Demos\Device\RNDISEthernet\EthernetProtocols.h"></File><File path="Demos\Device\RNDISEthernet\ICMP.c"></File><File path="Demos\Device\RNDISEthernet\ICMP.h"></File><File path="Demos\Device\RNDISEthernet\IP.c"></File><File path="Demos\Device\RNDISEthernet\IP.h"></File><File path="Demos\Device\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\RNDISEthernet\makefile"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.c"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.h"></File><File path="Demos\Device\RNDISEthernet\RNDIS.c"></File><File path="Demos\Device\RNDISEthernet\RNDIS.h"></File><File path="Demos\Device\RNDISEthernet\RNDISConstants.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\RNDISEthernet\TCP.c"></File><File path="Demos\Device\RNDISEthernet\TCP.h"></File><File path="Demos\Device\RNDISEthernet\UDP.c"></File><File path="Demos\Device\RNDISEthernet\UDP.h"></File><File path="Demos\Device\RNDISEthernet\Webserver.c"></File><File path="Demos\Device\RNDISEthernet\Webserver.h"></File></Folder><Folder name="USBtoSerial"><File path="Demos\Device\USBtoSerial\Descriptors.c"></File><File path="Demos\Device\USBtoSerial\Descriptors.h"></File><File path="Demos\Device\USBtoSerial\Doxygen.conf"></File><File path="Demos\Device\USBtoSerial\LUFA USBtoSerial.inf"></File><File path="Demos\Device\USBtoSerial\makefile"></File><File path="Demos\Device\USBtoSerial\RingBuff.c"></File><File path="Demos\Device\USBtoSerial\RingBuff.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.c"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.txt"></File></Folder><File path="Demos\Device\makefile"></File></Folder><Folder name="Host"><Folder name="CDCHost"><File path="Demos\Host\CDCHost\CDCHost.c"></File><File path="Demos\Host\CDCHost\CDCHost.h"></File><File path="Demos\Host\CDCHost\CDCHost.txt"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.c"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.h"></File><File path="Demos\Host\CDCHost\Doxygen.conf"></File><File path="Demos\Host\CDCHost\makefile"></File></Folder><Folder name="GenericHIDHost"><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.c"></File><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.h"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.c"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.h"></File><File path="Demos\Host\GenericHIDHost\makefile"></File><File path="Demos\Host\GenericHIDHost\Doxygen.conf"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\KeyboardHost\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHost\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\KeyboardHost\makefile"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.c"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\KeyboardHostWithParser\makefile"></File></Folder><Folder name="MassStorageHost"><File path="Demos\Host\MassStorageHost\ConfigDescriptor.c"></File><File path="Demos\Host\MassStorageHost\ConfigDescriptor.h"></File><File path="Demos\Host\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\MassStorageHost\makefile"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.c"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.h"></File><File path="Demos\Host\MassStorageHost\SCSI_Codes.h"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\MouseHost\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHost\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHost\Doxygen.conf"></File><File path="Demos\Host\MouseHost\makefile"></File><File path="Demos\Host\MouseHost\MouseHost.c"></File><File path="Demos\Host\MouseHost\MouseHost.h"></File><File path="Demos\Host\MouseHost\MouseHost.txt"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.c"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.h"></File><File path="Demos\Host\MouseHostWithParser\makefile"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.txt"></File></Folder><Folder name="StillImageHost"><File path="Demos\Host\StillImageHost\ConfigDescriptor.c"></File><File path="Demos\Host\StillImageHost\ConfigDescriptor.h"></File><File path="Demos\Host\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\StillImageHost\makefile"></File><File path="Demos\Host\StillImageHost\PIMACodes.h"></File><File path="Demos\Host\StillImageHost\StillImageCommands.c"></File><File path="Demos\Host\StillImageHost\StillImageCommands.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.txt"></File></Folder><File path="Demos\Host\makefile"></File></Folder><Folder name="OTG"><Folder name="TestApp"><File path="Demos\OTG\TestApp\Descriptors.c"></File><File path="Demos\OTG\TestApp\Descriptors.h"></File><File path="Demos\OTG\TestApp\Doxygen.conf"></File><File path="Demos\OTG\TestApp\makefile"></File><File path="Demos\OTG\TestApp\TestApp.c"></File><File path="Demos\OTG\TestApp\TestApp.h"></File><File path="Demos\OTG\TestApp\TestApp.txt"></File><File path="Demos\OTG\TestApp\TestEvents.c"></File><File path="Demos\OTG\TestApp\TestEvents.h"></File></Folder><File path="Demos\OTG\makefile"></File></Folder><File path="Demos\makefile"></File></Folder><Folder name="LUFA"><Folder name="Common"><File path="LUFA\Common\Common.h"></File><File path="LUFA\Common\FunctionAttributes.h"></File><File path="LUFA\Common\BoardTypes.h"></File></Folder><Folder name="Drivers"><Folder name="USB"><Folder name="LowLevel"><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.c"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.h"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.c"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.h"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\Device.h"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.c"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.h"></File><File path="LUFA\Drivers\USB\LowLevel\Host.c"></File><File path="LUFA\Drivers\USB\LowLevel\Host.h"></File><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\OTG.h"></File></Folder><Folder name="HighLevel"><File path="LUFA\Drivers\USB\HighLevel\USBTask.h"></File><File path="LUFA\Drivers\USB\HighLevel\Events.c"></File><File path="LUFA\Drivers\USB\HighLevel\Events.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.c"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBTask.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.h"></File><File path="LUFA\Drivers\USB\HighLevel\StdRequestType.h"></File><File path="LUFA\Drivers\USB\HighLevel\StreamCallbacks.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBMode.h"></File></Folder><Folder name="Class"><File path="LUFA\Drivers\USB\Class\HIDParser.c"></File><File path="LUFA\Drivers\USB\Class\HIDParser.h"></File><File path="LUFA\Drivers\USB\Class\HIDReportData.h"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.c"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.h"></File></Folder><File path="LUFA\Drivers\USB\USB.h"></File></Folder><Folder name="Misc"><File path="LUFA\Drivers\Misc\TerminalCodes.h"></File></Folder><Folder name="AT90USBXXX"><Folder name="AT90USBXXX67"><File path="LUFA\Drivers\AT90USBXXX\AT90USBXXX67\ADC.h"></File></Folder><File path="LUFA\Drivers\AT90USBXXX\Serial_Stream.h"></File><File path="LUFA\Drivers\AT90USBXXX\ADC.h"></File><File path="LUFA\Drivers\AT90USBXXX\Serial.c"></File><File path="LUFA\Drivers\AT90USBXXX\Serial.h"></File><File path="LUFA\Drivers\AT90USBXXX\Serial_Stream.c"></File><File path="LUFA\Drivers\AT90USBXXX\SPI.h"></File></Folder><Folder name="Board"><Folder name="USBKEY"><File path="LUFA\Drivers\Board\USBKEY\Dataflash.h"></File><File path="LUFA\Drivers\Board\USBKEY\Joystick.h"></File><File path="LUFA\Drivers\Board\USBKEY\HWB.h"></File><File path="LUFA\Drivers\Board\USBKEY\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\USBKEY\LEDs.h"></File></Folder><Folder name="STK526"><File path="LUFA\Drivers\Board\STK526\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK526\Joystick.h"></File><File path="LUFA\Drivers\Board\STK526\HWB.h"></File><File path="LUFA\Drivers\Board\STK526\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\STK526\LEDs.h"></File></Folder><Folder name="STK525"><File path="LUFA\Drivers\Board\STK525\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK525\Joystick.h"></File><File path="LUFA\Drivers\Board\STK525\HWB.h"></File><File path="LUFA\Drivers\Board\STK525\AT45DB321C.h"></File><File path="LUFA\Drivers\Board\STK525\LEDs.h"></File></Folder><Folder name="RZUSBSTICK"><File path="LUFA\Drivers\Board\RZUSBSTICK\LEDs.h"></File></Folder><Folder name="ATAVRUSBRF01"><File path="LUFA\Drivers\Board\ATAVRUSBRF01\LEDs.h"></File><File path="LUFA\Drivers\Board\ATAVRUSBRF01\HWB.h"></File></Folder><File path="LUFA\Drivers\Board\Temperature.h"></File><File path="LUFA\Drivers\Board\Dataflash.h"></File><File path="LUFA\Drivers\Board\HWB.h"></File><File path="LUFA\Drivers\Board\Joystick.h"></File><File path="LUFA\Drivers\Board\Temperature.c"></File><File path="LUFA\Drivers\Board\LEDs.h"></File></Folder></Folder><Folder name="Scheduler"><File path="LUFA\Scheduler\Scheduler.h"></File><File path="LUFA\Scheduler\Scheduler.c"></File></Folder><Folder name="MemoryAllocator"><File path="LUFA\MemoryAllocator\DynAlloc.h"></File><File path="LUFA\MemoryAllocator\DynAlloc.c"></File></Folder><Folder name="DriverStubs"><File path="LUFA\DriverStubs\Dataflash.h"></File><File path="LUFA\DriverStubs\HWB.h"></File><File path="LUFA\DriverStubs\Joystick.h"></File><File path="LUFA\DriverStubs\LEDs.h"></File></Folder><File path="LUFA\makefile"></File><File path="LUFA\Version.h"></File><File path="LUFA\BuildingLinkableLibraries.txt"></File><File path="LUFA\GettingStarted.txt"></File><File path="LUFA\MainPage.txt"></File><File path="LUFA\SchedulerOverview.txt"></File><File path="LUFA\VIDAndPIDValues.txt"></File><File path="LUFA\ChangeLog.txt"></File><File path="LUFA\CompileTimeTokens.txt"></File><File path="LUFA\MigrationInformation.txt"></File><File path="LUFA\DirectorySummaries.txt"></File><File path="LUFA\Doxygen.conf"></File><File path="LUFA\WritingBoardDrivers.txt"></File><File path="LUFA\LUFAPoweredProjects.txt"></File><File path="LUFA\Groups.txt"></File></Folder><Folder name="Projects"><Folder name="MagStripe"><File path="Projects\Magstripe\Descriptors.c"></File><File path="Projects\Magstripe\Descriptors.h"></File><File path="Projects\Magstripe\Magstripe.c"></File><File path="Projects\Magstripe\Magstripe.h"></File><File path="Projects\Magstripe\MagstripeHW.h"></File><File path="Projects\Magstripe\makefile"></File><File path="Projects\Magstripe\Magstripe.txt"></File><File path="Projects\Magstripe\Doxygen.conf"></File><File path="Projects\Magstripe\CircularBitBuffer.c"></File><File path="Projects\Magstripe\CircularBitBuffer.h"></File></Folder><File path="Projects\makefile"></File></Folder><Folder name="Bootloaders"><Folder name="DFU"><File path="Bootloaders\DFU\BootloaderDFU.c"></File><File path="Bootloaders\DFU\BootloaderDFU.h"></File><File path="Bootloaders\DFU\Descriptors.c"></File><File path="Bootloaders\DFU\Descriptors.h"></File><File path="Bootloaders\DFU\makefile"></File><File path="Bootloaders\DFU\BootloaderDFU.txt"></File><File path="Bootloaders\DFU\Doxygen.conf"></File></Folder><Folder name="CDC"><File path="Bootloaders\CDC\BootloaderCDC.c"></File><File path="Bootloaders\CDC\BootloaderCDC.h"></File><File path="Bootloaders\CDC\Descriptors.c"></File><File path="Bootloaders\CDC\Descriptors.h"></File><File path="Bootloaders\CDC\makefile"></File><File path="Bootloaders\CDC\LUFA CDC Bootloader.inf"></File><File path="Bootloaders\CDC\Doxygen.conf"></File><File path="Bootloaders\CDC\BootloaderCDC.txt"></File></Folder><Folder name="TeensyHID"><File path="Bootloaders\TeensyHID\Descriptors.c"></File><File path="Bootloaders\TeensyHID\Descriptors.h"></File><File path="Bootloaders\TeensyHID\makefile"></File><File path="Bootloaders\TeensyHID\TeensyHID.c"></File><File path="Bootloaders\TeensyHID\TeensyHID.h"></File><File path="Bootloaders\TeensyHID\TeensyHID.txt"></File></Folder><File path="Bootloaders\makefile"></File></Folder><File path="makefile"></File></Project>
\ No newline at end of file
diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt
index 0b4b6d659deba708447e1a196944fe789ef72bf9..4aa75cbf508b3e1d238e6bcdbe8b626830ddca52 100644
--- a/LUFA/ChangeLog.txt
+++ b/LUFA/ChangeLog.txt
@@ -34,7 +34,20 @@
   *  - The USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0), so that other control type
   *    pipes can be used with the function
   *  - The USB Host management task now saves and restores the currently selected pipe before and after the task completes
-  *  - Fixed GenericHIDHost demo report write routine incorrect for control type requests (thanks to Andrei)
+  *  - Fixed GenericHIDHost demo report write routine incorrect for control type requests (thanks to Andrei Krainev)
+  *  - Removed Endpoint_ClearCurrentBank() and Pipe_ClearCurrentBank() in favour of new Endpoint_ClearIN(), Endpoint_ClearOUT(),
+  *    Endpoint_ClearControlIN(), Endpoint_ClearControlOUT(), Pipe_ClearIN(), Pipe_ClearOUT(), Pipe_ClearControlIN() and
+  *    Pipe_ClearControlOUT() macros (done to allow for the detection of packets of zero length)
+  *  - Renamed *_ReadWriteAllowed() macros to *_IsReadWriteAllowed() to remain consistent with the rest of the LUFA API
+  *  - Endpoint_IsSetupReceived() macro has been renamed to Endpoint_IsSETUPReceived(), Endpoint_ClearSetupReceived() macro has been
+  *    renamed to Endpoint_ClearControlSETUP(), the Pipe_IsSetupSent() macro has been renamed to Pipe_IsSETUPSent() and the
+  *    Pipe_ClearSetupSent() macro is no longer applicable and should be removed - changes made to compliment the new endpoint and pipe
+  *    bank management API
+  *  - Updated all demos, bootloaders and projects to use the new endpoint and pipe management APIs (thanks to Roman Thiel)
+  *  - Updated library doxygen documentation, added groups, changed documentation macro functions to real functions for clarity
+  *  - Removed old endpoint and pipe aliased read/write/discard routines which did not have an explicit endian specifier for clarity
+  *  - Removed the ButtLoadTag.h header file, as no one used for its intended purpose anyway
+  *    
   *
   *  \section Sec_ChangeLog090401 Version 090401
   *
diff --git a/LUFA/Common/BoardTypes.h b/LUFA/Common/BoardTypes.h
index d4a36550ee4e9df2ea04185bf9b2a622ee3cbaac..a4daa187731f46e57a0bc0da8cea87de0e5a716b 100644
--- a/LUFA/Common/BoardTypes.h
+++ b/LUFA/Common/BoardTypes.h
@@ -36,6 +36,15 @@
  *  \note Do not include this file directly, rather include the Common.h header file instead to gain this file's
  *        functionality.
  */
+
+/** \ingroup Group_Common
+ *  @defgroup Group_BoardTypes Board Types
+ *
+ *  Macros for indicating the chosen physical board hardware to the library. These macros should be used when
+ *  defining the BOARD token to the chosen hardware via the -D switch in the project makefile.
+ *
+ *  @{
+ */
 	
 #ifndef __BOARDTYPES_H__
 #define __BOARDTYPES_H__
@@ -70,3 +79,5 @@
 			#define BOARD_USER          5
 
 #endif
+
+/** @} */
diff --git a/LUFA/Common/ButtLoadTag.h b/LUFA/Common/ButtLoadTag.h
deleted file mode 100644
index 54fab0f02f4d290037f6792833cef8fdbb47860a..0000000000000000000000000000000000000000
--- a/LUFA/Common/ButtLoadTag.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2009.
-              
-  dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
-*/
-
-/*
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
-  Permission to use, copy, modify, and distribute this software
-  and its documentation for any purpose and without fee is hereby
-  granted, provided that the above copyright notice appear in all
-  copies and that both that the copyright notice and this
-  permission notice and warranty disclaimer appear in supporting
-  documentation, and that the name of the author not be used in
-  advertising or publicity pertaining to distribution of the
-  software without specific, written prior permission.
-
-  The author disclaim all warranties with regard to this
-  software, including all implied warranties of merchantability
-  and fitness.  In no event shall the author be liable for any
-  special, indirect or consequential damages or any damages
-  whatsoever resulting from loss of use, data or profits, whether
-  in an action of contract, negligence or other tortious action,
-  arising out of or in connection with the use or performance of
-  this software.
-*/
-
-/** \file
- *
- *  This file contains macros for the embedding of compile-time strings into the resultant project binary for
- *  identification purposes. It is designed to prefix "tags" with the magic string of "@(#)" so that the tags
- *  can easily be identified in the binary data.
- *
- *  These tags are compatible with the ButtLoad project at http://www.fourwalledcubicle.com/ButtLoad.php .
- */
-
-#ifndef __BUTTLOADTAG_H__
-#define __BUTTLOADTAG_H__
-
-	/* Includes: */
-		#include <avr/io.h>
-		#include <avr/pgmspace.h>
-
-	/* Public Interface - May be used in end-application: */
-		/* Macros: */
-			/** Creates a new tag in the resultant binary, containing the specified data array. The macro id
-			 *  parameter is only for identification purposes (so that the tag data can be referenced in code)
-			 *  and is not visible in the compiled binary.
-			 */
-			#define BUTTLOADTAG(id, data)  const struct ButtLoadTagData BUTTTAG_##id \
-			                               PROGMEM __attribute__((used, externally_visible)) = \
-			                               {MagicString: BT_TAGHEADER, TagData: data}
-			
-			/** Macro for retrieving a reference to the specified tag's contents. The tag data is located in
-			 *  the program memory (FLASH) space, and so must be read out with the macros in avr-libc which
-			 *  deal with embedded data.
-			 */
-			#define BUTTLOADTAG_DATA(id)  BUTTTAG_##id.TagData
-
-		/* Structures: */
-			/** Structure for ButtLoad compatible binary tags. */
-			struct ButtLoadTagData
-			{
-				char MagicString[4]; /**< Magic tag header, containing the string "@(#)". */
-				char TagData[];      /**< Tag contents as a char array. */
-			};										  
-
-	/* Private Interface - For use in library only: */	
-	#if !defined(__DOXYGEN__)
-		/* Macros: */
-			#define BT_TAGHEADER          {'@','(','#',')'}
-	#endif
-	
-#endif
diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h
index 36d9e3f6f59812189e7371e8246b0b40b2d6b483..0923d513bbdf39888e6d30bda4f8d0536b1b8021 100644
--- a/LUFA/Common/Common.h
+++ b/LUFA/Common/Common.h
@@ -33,6 +33,24 @@
  *  This file contains macros which are common to all library elements, and which may be useful in user code. It
  *  also includes other common headers, such as Atomic.h, FunctionAttributes.h and BoardTypes.h.
  */
+ 
+/** @defgroup Group_Common Common Utility Headers - LUFA/Drivers/Common/Common.h
+ *
+ *  Common utility headers containing macros, functions, enums and types which are common to all
+ *  aspects of the library.
+ *
+ *  @{
+ */
+
+/** @defgroup Group_Debugging Debugging Macros
+ *
+ *  Macros for debugging use.
+ */
+ 
+/** @defgroup Group_BitManip Endian and Bit Macros
+ *
+ *  Functions for swapping endianness and reversing bit orders.
+ */
 
 #ifndef __COMMON_H__
 #define __COMMON_H__
@@ -66,14 +84,22 @@
 			/** Defines a volatile NOP statement which cannot be optimized out by the compiler, and thus can always
 			 *  be set as a breakpoint in the resulting code. Useful for debugging purposes, where the optimizer
 			 *  removes/reorders code to the point where break points cannot reliably be set.
+			 *
+			 *  \ingroup Group_Debugging
 			 */
 			#define JTAG_DEBUG_POINT()      asm volatile ("NOP" ::)
 
 			/** Defines an explicit JTAG break point in the resulting binary via the ASM BREAK statement. When
-			 *  a JTAG is used, this causes the program execution to halt when reached until manually resumed. */
+			 *  a JTAG is used, this causes the program execution to halt when reached until manually resumed.
+			 *
+			 *  \ingroup Group_Debugging
+			 */
 			#define JTAG_DEBUG_BREAK()      asm volatile ("BREAK" ::)
 			
-			/** Macro for testing condition "x" and breaking via JTAG_DEBUG_BREAK() if the condition is false. */
+			/** Macro for testing condition "x" and breaking via JTAG_DEBUG_BREAK() if the condition is false.
+			 *
+			 *  \ingroup Group_Debugging
+			*/
 			#define JTAG_DEBUG_ASSERT(x)    MACROS{ if (!(x)) { JTAG_DEBUG_BREAK(); } }MACROE
 
 			/** Macro for testing condition "x" and writing debug data to the serial stream if false. As a
@@ -81,6 +107,8 @@
 			 *
 			 *  The serial output takes the form "{FILENAME}: Function {FUNCTION NAME}, Line {LINE NUMBER}: Assertion
 			 *  {x} failed."
+			 *
+			 *  \ingroup Group_Debugging
 			 */
 			#define SERIAL_STREAM_ASSERT(x) MACROS{ if (!(x)) { printf_P(PSTR("%s: Function \"%s\", Line %d: "   \
 																"Assertion \"%s\" failed.\r\n"),   \
@@ -91,6 +119,8 @@
 			/** Function to reverse the individual bits in a byte - i.e. bit 7 is moved to bit 0, bit 6 to bit 1,
 			 *  etc.
 			 *
+			 *  \ingroup Group_BitManip
+			 *
 			 *  \param Byte   Byte of data whose bits are to be reversed
 			 */
 			static inline uint8_t BitReverse(uint8_t Byte) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
@@ -104,6 +134,8 @@
 			}
 			
 			/** Function to reverse the byte ordering of the individual bytes in a 16 bit number.
+			 *
+			 *  \ingroup Group_BitManip
 			 *
 			 *  \param Word   Word of data whose bytes are to be swapped
 			 */
@@ -114,6 +146,8 @@
 			}
 
 			/** Function to reverse the byte ordering of the individual bytes in a 32 bit number.
+			 *
+			 *  \ingroup Group_BitManip
 			 *
 			 *  \param DWord   Double word of data whose bytes are to be swapped
 			 */
@@ -127,6 +161,8 @@
 			}
 
 			/** Function to reverse the byte ordering of the individual bytes in a n byte number.
+			 *
+			 *  \ingroup Group_BitManip
 			 *
 			 *  \param Data   Pointer to a number containing an even number of bytes to be reversed
 			 *  \param Bytes  Length of the data in bytes
@@ -148,3 +184,5 @@
 			}
 
 #endif
+
+/** @} */
diff --git a/LUFA/Common/FunctionAttributes.h b/LUFA/Common/FunctionAttributes.h
index cd406734d14c1f1ff248b6f25b3636f59734af26..9efa440e5eba20cd6e177a42eeb0028e6b3894eb 100644
--- a/LUFA/Common/FunctionAttributes.h
+++ b/LUFA/Common/FunctionAttributes.h
@@ -37,6 +37,14 @@
  *  \note Do not include this file directly, rather include the Common.h header file instead to gain this file's
  *        functionality.
  */
+ 
+/** \ingroup Group_Common
+ *  @defgroup Group_FuncAttr Function Attributes
+ *
+ *  Macros for easy access GCC function attributes, which can be applied to function prototypes.
+ *
+ *  @{
+ */
 
 #ifndef __FUNCATTR_H__
 #define __FUNCATTR_H__
@@ -108,3 +116,5 @@
 			#define ATTR_ALIAS(x)               __attribute__ ((alias( #x )))
 		
 #endif
+
+/** @} */
diff --git a/LUFA/Doxygen.conf b/LUFA/Doxygen.conf
index 7cb1c71e585de357e7606fee5e9ff05b8beb44be..136a72335b75a75aea2cac3fe1a75aa2760f84dc 100644
--- a/LUFA/Doxygen.conf
+++ b/LUFA/Doxygen.conf
@@ -408,7 +408,7 @@ SORT_BRIEF_DOCS        = NO
 # hierarchy of group names into alphabetical order. If set to NO (the default) 
 # the group names will appear in their defined order.
 
-SORT_GROUP_NAMES       = NO
+SORT_GROUP_NAMES       = YES
 
 # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
 # sorted by fully-qualified names, including namespaces. If set to 
@@ -607,7 +607,7 @@ EXCLUDE_SYMLINKS       = NO
 # against the file with absolute path, so to exclude all test directories 
 # for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = */LowLevel/USBMode.h
+EXCLUDE_PATTERNS       = 
 
 # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
 # (namespaces, classes, functions, etc.) that should be excluded from the 
@@ -936,7 +936,7 @@ GENERATE_TREEVIEW      = YES
 # used to set the initial width (in pixels) of the frame in which the tree 
 # is shown.
 
-TREEVIEW_WIDTH         = 250
+TREEVIEW_WIDTH         = 300
 
 # Use this tag to change the font size of Latex formulas included 
 # as images in the HTML documentation. The default is 10. Note that 
@@ -1228,7 +1228,7 @@ PREDEFINED             = __DOXYGEN__
 # The macro definition that is found in the sources will be used. 
 # Use the PREDEFINED tag if you want to use a different macro definition.
 
-EXPAND_AS_DEFINED      = BUTTLOADTAG
+EXPAND_AS_DEFINED      = 
 
 # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
 # doxygen's preprocessor will remove all function-like macros that are alone 
@@ -1356,7 +1356,7 @@ COLLABORATION_GRAPH    = NO
 # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
 # will generate a graph for groups, showing the direct groups dependencies
 
-GROUP_GRAPHS           = NO
+GROUP_GRAPHS           = YES
 
 # If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
 # collaboration diagrams in a style similar to the OMG's Unified Modeling 
@@ -1374,14 +1374,14 @@ TEMPLATE_RELATIONS     = NO
 # file showing the direct and indirect include dependencies of the file with 
 # other documented files.
 
-INCLUDE_GRAPH          = NO
+INCLUDE_GRAPH          = YES
 
 # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
 # HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
 # documented header file showing the documented files that directly or 
 # indirectly include this file.
 
-INCLUDED_BY_GRAPH      = NO
+INCLUDED_BY_GRAPH      = YES
 
 # If the CALL_GRAPH and HAVE_DOT options are set to YES then 
 # doxygen will generate a call dependency graph for every global function 
@@ -1389,7 +1389,7 @@ INCLUDED_BY_GRAPH      = NO
 # the time of a run. So in most cases it will be better to enable call graphs 
 # for selected functions only using the \callgraph command.
 
-CALL_GRAPH             = NO
+CALL_GRAPH             = YES
 
 # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
 # doxygen will generate a caller dependency graph for every global function 
@@ -1409,7 +1409,7 @@ GRAPHICAL_HIERARCHY    = NO
 # in a graphical way. The dependency relations are determined by the #include
 # relations between the files in the directories.
 
-DIRECTORY_GRAPH        = NO
+DIRECTORY_GRAPH        = YES
 
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
 # generated by dot. Possible values are png, jpg, or gif
diff --git a/LUFA/Drivers/AT90USBXXX/ADC.h b/LUFA/Drivers/AT90USBXXX/ADC.h
index 341b4e194074131f68c0e2b85f81776a45ce6459..12e168834deab106820298f0b58e1a85c6f3f93f 100644
--- a/LUFA/Drivers/AT90USBXXX/ADC.h
+++ b/LUFA/Drivers/AT90USBXXX/ADC.h
@@ -35,6 +35,10 @@
  *  User code should include this file, which will in turn include the correct ADC driver header file for the
  *  currently selected AVR model.
  */
+
+/** \ingroup Group_SubsystemDrivers
+ *  @defgroup Group_ADC ADC Driver - LUFA/Drivers/AT90USBXXX/ADC.h
+ */
  
 #ifndef __ADC_H__
 #define __ADC_H__
@@ -55,4 +59,29 @@
 			#error "ADC is not available for the currently selected AVR model."
 		#endif
 
+	/* Public Interface - May be used in end-application: */
+		/* Inline Functions: */
+			/** Starts the reading of the given channel, but does not wait until the conversion has completed.
+			 *  Once executed, the conversion status can be determined via the ADC_IsReadingComplete() macro and
+			 *  the result read via the ADC_GetResult() macro.
+			 *
+			 *  \param MUXMask  Mask comprising of an ADC channel number, reference mask and adjustment mask
+			 */
+			static inline void ADC_StartReading(const uint8_t MUXMask);
+
+			/** Performs a complete single reading from channel, including a polling spinloop to wait for the
+			 *  conversion to complete, and the returning of the converted value.
+			 *
+			 *  \param MUXMask  Mask comprising of an ADC channel number, reference mask and adjustment mask
+			 */
+			static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask) ATTR_WARN_UNUSED_RESULT;
+
+			/** Configures the given ADC channel, ready for ADC conversions. This function sets the
+			 *  associated port pin as an input and disables the digital portion of the I/O to reduce
+			 *  power consumption.
+			 *
+			 *  \param Channel  ADC channel number to set up for conversions
+			 */
+			static inline void ADC_SetupChannel(const uint8_t Channel);
+			
 #endif
diff --git a/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h b/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h
index c86203fe0066a5a3d968d721ce30635933d6a65b..c6169c18ae496a27f029ae35e07ad85852b89e55 100644
--- a/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h
+++ b/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h
@@ -36,15 +36,21 @@
  *        dispatch header located in LUFA/Drivers/AT90USBXXX/ADC.h.
  */
 
+/** \ingroup Group_ADC
+ *  @defgroup Group_ADC_AT90USBXXX67 AT90USBXXX6 and AT90USBXXX7 Models
+ *
+ *  @{
+ */
+ 
 #ifndef __ADC_AT90USBXXX67_H__
 #define __ADC_AT90USBXXX67_H__
 
 	/* Includes: */
+		#include "../../../Common/Common.h"
+		
 		#include <avr/io.h>
 		#include <stdbool.h>
 		
-		#include "../../../Common/Common.h"
-		
 	/* Enable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
 			extern "C" {
@@ -175,3 +181,5 @@
 		#endif
 		
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/AT90USBXXX/SPI.h b/LUFA/Drivers/AT90USBXXX/SPI.h
index d1c9cede44205cc6dd37fead9f459f0439612460..f0b43e0df9a688f756f5207790a22217bf3af483 100644
--- a/LUFA/Drivers/AT90USBXXX/SPI.h
+++ b/LUFA/Drivers/AT90USBXXX/SPI.h
@@ -33,6 +33,14 @@
  *  Hardware SPI subsystem driver for the supported USB AVRs models.
  */
 
+/** \ingroup Group_SubsystemDrivers
+ *  @defgroup Group_SPI SPI Driver - LUFA/Drivers/AT90USBXXX/SPI.h
+ *
+ *  Functions, macros, variables, enums and types related to the setup of a the SPI port.
+ *
+ *  @{
+ */
+
 #ifndef __SPI_H__
 #define __SPI_H__
 
@@ -137,3 +145,5 @@
 		#endif
 		
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/AT90USBXXX/Serial.h b/LUFA/Drivers/AT90USBXXX/Serial.h
index bbf3044faa4e01a663e3f9fb6596288740677088..f08f9a03941b3ce962c7a746ff1ad7fad82a4533 100644
--- a/LUFA/Drivers/AT90USBXXX/Serial.h
+++ b/LUFA/Drivers/AT90USBXXX/Serial.h
@@ -33,6 +33,14 @@
  *  Driver for the USART subsystem on supported USB AVRs.
  */
  
+/** \ingroup Group_SubsystemDrivers
+ *  @defgroup Group_Serial Serial USART Driver - LUFA/Drivers/AT90USBXXX/Serial.h
+ *
+ *  Functions, macros, variables, enums and types related to the setup of the USART for serial communications.
+ *
+ *  @{
+ */
+ 
 #ifndef __SERIAL_H__
 #define __SERIAL_H__
 
@@ -113,3 +121,5 @@
 		#endif
 		
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/AT90USBXXX/Serial_Stream.h b/LUFA/Drivers/AT90USBXXX/Serial_Stream.h
index adde5b95e51f26bcabfc863815fa3e13323ad915..d5034bb5313d3ad3326ab969358fb9770bd3114e 100644
--- a/LUFA/Drivers/AT90USBXXX/Serial_Stream.h
+++ b/LUFA/Drivers/AT90USBXXX/Serial_Stream.h
@@ -35,6 +35,15 @@
  *  USART.
  **/
 
+/** \ingroup Group_SubsystemDrivers
+ *  @defgroup Group_SerialStream Serial Stream Driver - LUFA/Drivers/AT90USBXXX/Serial_Stream.h
+ *
+ *  Functions, macros, variables, enums and types related to the setup of a serial stream, so that standard printf and other
+ *  C stream functions can be used on the serial port.
+ *
+ *  @{
+ */
+
 #ifndef __SERIAL_STREAM_H__
 #define __SERIAL_STREAM_H__
 
@@ -80,3 +89,5 @@
 		#endif
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h b/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h
index edf4f8c50df4ad8b1242b76c4041e595d2ce91c6..9d9982ba224982ef1b25d1d13224ea71ab416cc0 100644
--- a/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h
+++ b/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h
@@ -35,6 +35,12 @@
  *  \note This file should not be included directly. It is automatically included as needed by the HWB driver
  *        dispatch header located in LUFA/Drivers/Board/HWB.h.
  */
+
+/** \ingroup Group_HWB
+ *  @defgroup Group_HWB_ATAVRUSBRF01 ATAVRUSBRF01
+ *
+ *  @{
+ */
  
 #ifndef __HWB_ATAVRUSBRF01_H__
 #define __HWB_ATAVRUSBRF01_H__
@@ -77,3 +83,5 @@
 		#endif
 			
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h b/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h
index 626d8cecf3c43153ddb556483f57be91b11197cd..a073d2ef55e4f6f6ebdd35b045dc162f0f977b2b 100644
--- a/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h
+++ b/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
  */
  
+/** \ingroup Group_LEDs
+ *  @defgroup Group_LEDs_ATAVRUSBRF01 ATAVRUSBRF01
+ *
+ *  @{
+ */
+ 
 #ifndef __LEDS_ATAVRUSBRF01_H__
 #define __LEDS_ATAVRUSBRF01_H__
 
@@ -118,3 +124,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/Dataflash.h b/LUFA/Drivers/Board/Dataflash.h
index aa0c0892f1073e22189ae927a03f4ab2cc52389c..4e61a6bce5c55c02f906380e44d701e82f39fad9 100644
--- a/LUFA/Drivers/Board/Dataflash.h
+++ b/LUFA/Drivers/Board/Dataflash.h
@@ -40,6 +40,14 @@
  *  directory.
  */
  
+/** \ingroup Group_BoardDrivers
+ *  @defgroup Group_Dataflash Dataflash Driver - LUFA/Drivers/Board/Dataflash.h
+ *
+ *  Functions, macros, variables, enums and types related to the control of board Dataflash ICs.
+ *
+ *  @{
+ */
+ 
 #ifndef __DATAFLASH_H__
 #define __DATAFLASH_H__
 
@@ -59,21 +67,33 @@
 		#endif
 
 	/* Public Interface - May be used in end-application: */
-		/* Macros: */
-			/** Returns the mask of the currently selected Dataflash chip, either DATAFLASH_NO_CHIP or a
-			 *  DATAFLASH_CHIPn mask (where n is the chip number).
-			 */
-			#define Dataflash_GetSelectedChip()          (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK)
+		/* Psuedo-Function Macros: */
+			#if defined(__DOXYGEN__)
+				/** Determines the currently selected dataflash chip.
+				 *
+				 *  \return Mask of the currently selected Dataflash chip, either DATAFLASH_NO_CHIP if no chip is selected
+				 *  or a DATAFLASH_CHIPn mask (where n is the chip number).
+				 */
+				static inline uint8_t Dataflash_GetSelectedChip(void);
+
+				/** Selects the given dataflash chip.
+				 *
+				 *  \param  ChipMask  Mask of the Dataflash IC to select, in the form of DATAFLASH_CHIPn mask (where n is
+				 *          the chip number).
+				 */
+				static inline void Dataflash_SelectChip(uint8_t ChipMask);
+
+				/** Deselects the current dataflash chip, so that no dataflash is selected. */
+				static inline void Dataflash_DeselectChip(void);
+			#else
+				#define Dataflash_GetSelectedChip()          (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK)
 
-			/** Selects the dataflash chip given as a chip mask, in the form of DATAFLASH_CHIPn (where n
-			 *  is the chip number).
-			 */
-			#define Dataflash_SelectChip(mask)   MACROS{ DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT \
-			                                             & ~DATAFLASH_CHIPCS_MASK) | mask);              }MACROE
+				#define Dataflash_SelectChip(mask)   MACROS{ DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT \
+															 & ~DATAFLASH_CHIPCS_MASK) | mask);              }MACROE
+				
+				#define Dataflash_DeselectChip()             Dataflash_SelectChip(DATAFLASH_NO_CHIP)
+			#endif
 			
-			/** Deselects the current dataflash chip, so that no dataflash is selected. */
-			#define Dataflash_DeselectChip()             Dataflash_SelectChip(DATAFLASH_NO_CHIP)
-
 		/* Inline Functions: */
 			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
 			 *
@@ -182,3 +202,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/HWB.h b/LUFA/Drivers/Board/HWB.h
index 6ad2fa821b7bc4af44f1dc1828fd37ec414e9845..049fd2378d03fa2f250a8bf9c365add6359149b3 100644
--- a/LUFA/Drivers/Board/HWB.h
+++ b/LUFA/Drivers/Board/HWB.h
@@ -39,7 +39,15 @@
  *  If the BOARD value is set to BOARD_USER, this will include the /Board/HWB.h file in the user project
  *  directory.
  */
- 
+
+/** \ingroup Group_BoardDrivers
+ *  @defgroup Group_HWB HWB Driver - LUFA/Drivers/Board/HWB.h
+ *
+ *  Functions, macros, variables, enums and types related to the control of board HWB.
+ *
+ *  @{
+ */
+
 #ifndef __HWB_H__
 #define __HWB_H__
 
@@ -85,3 +93,5 @@
 	#endif
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/Joystick.h b/LUFA/Drivers/Board/Joystick.h
index a3f70b8a451cb4e131da3a3598d710ce1cd74f0a..86a02cfe726801d999242e360a339d24c4da0864 100644
--- a/LUFA/Drivers/Board/Joystick.h
+++ b/LUFA/Drivers/Board/Joystick.h
@@ -40,6 +40,14 @@
  *  directory.
  */
  
+/** \ingroup Group_BoardDrivers
+ *  @defgroup Group_Joystick Joystick Driver - LUFA/Drivers/Board/Joystick.h
+ *
+ *  Functions, macros, variables, enums and types related to the control of board joystick.
+ *
+ *  @{
+ */
+
 #ifndef __JOYSTICK_H__
 #define __JOYSTICK_H__
 
@@ -83,3 +91,5 @@
 	#endif
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/LEDs.h b/LUFA/Drivers/Board/LEDs.h
index 03e0db5e84d50148547170a2082c57244694e773..c40042ddc9839ca54d6463b3a9ee028fe1e31dda 100644
--- a/LUFA/Drivers/Board/LEDs.h
+++ b/LUFA/Drivers/Board/LEDs.h
@@ -39,7 +39,15 @@
  *  If the BOARD value is set to BOARD_USER, this will include the /Board/LEDs.h file in the user project
  *  directory.
  */
- 
+
+/** \ingroup Group_BoardDrivers
+ *  @defgroup Group_LEDs LEDs Driver - LUFA/Drivers/Board/LEDs.h
+ *
+ *  Functions, macros, variables, enums and types related to the control of board LEDs.
+ *
+ *  @{
+ */
+
 #ifndef __LEDS_H__
 #define __LEDS_H__
 
@@ -111,3 +119,5 @@
 	#endif
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h b/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h
index 38cbed0cffb2b317499573e105e7ec4c618a9c18..24977ea5e5323c3594332fc63056971dcd8dbb3a 100644
--- a/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h
+++ b/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h
@@ -35,6 +35,12 @@
  *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
  *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
  */
+
+/** \ingroup Group_LEDs
+ *  @defgroup Group_LEDs_RZUSBSTICK RZUSBSTICK
+ *
+ *  @{
+ */
  
 #ifndef __LEDS_RZUSBSTICK_H__
 #define __LEDS_RZUSBSTICK_H__
@@ -139,3 +145,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK525/AT45DB321C.h b/LUFA/Drivers/Board/STK525/AT45DB321C.h
index ac29967e6b76fd0810ffba0fb2fb362daa99b6f4..6879c103555b0b28d808a9e64669383eb00e07e1 100644
--- a/LUFA/Drivers/Board/STK525/AT45DB321C.h
+++ b/LUFA/Drivers/Board/STK525/AT45DB321C.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
  */
 
+/** \ingroup Group_Dataflash_STK525
+ *  @defgroup Group_Dataflash_STK525_AT45DB321C AT45DB321C
+ *
+ *  @{
+ */
+ 
 #ifndef __DATAFLASH_CMDS_H__
 #define __DATAFLASH_CMDS_H__
 
@@ -82,3 +88,5 @@
 			#define DF_CMD_READMANUFACTURERDEVICEINFO       0x9F
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK525/Dataflash.h b/LUFA/Drivers/Board/STK525/Dataflash.h
index e4e2f52371768316b50352c853bbf39bf22fa227..b2ea1b8e9ee7bf57d84ea40bbc7411bc515ccab2 100644
--- a/LUFA/Drivers/Board/STK525/Dataflash.h
+++ b/LUFA/Drivers/Board/STK525/Dataflash.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
  */
 
+/** \ingroup Group_Dataflash
+ *  @defgroup Group_Dataflash_STK525 STK525
+ *
+ *  @{
+ */
+
 #ifndef __DATAFLASH_STK525_H__
 #define __DATAFLASH_STK525_H__
 
@@ -106,3 +112,5 @@
 			}
 			
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK525/HWB.h b/LUFA/Drivers/Board/STK525/HWB.h
index a0ff72de13aa9061681cb90c0161202b5bdaed66..a91890cd35011f3089915df8d91c703ee2785c3a 100644
--- a/LUFA/Drivers/Board/STK525/HWB.h
+++ b/LUFA/Drivers/Board/STK525/HWB.h
@@ -35,7 +35,13 @@
  *  \note This file should not be included directly. It is automatically included as needed by the HWB driver
  *        dispatch header located in LUFA/Drivers/Board/HWB.h.
  */
- 
+
+/** \ingroup Group_HWB
+ *  @defgroup Group_HWB_STK525 STK525
+ *
+ *  @{
+ */
+
 #ifndef __HWB_STK525_H__
 #define __HWB_STK525_H__
 
@@ -77,3 +83,5 @@
 		#endif
 				
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK525/Joystick.h b/LUFA/Drivers/Board/STK525/Joystick.h
index 58aed4f80dea1f1d88c302ec2b0665b639a156a2..b74655ecae66dd9f4da35a75cc2214ea90f35841 100644
--- a/LUFA/Drivers/Board/STK525/Joystick.h
+++ b/LUFA/Drivers/Board/STK525/Joystick.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
  */
  
+/** \ingroup Group_Joystick
+ *  @defgroup Group_Joystick_STK525 STK525
+ *
+ *  @{
+ */
+ 
 #ifndef __JOYSTICK_STK525_H__
 #define __JOYSTICK_STK525_H__
 
@@ -102,3 +108,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK525/LEDs.h b/LUFA/Drivers/Board/STK525/LEDs.h
index 13f626c2b0290c88d11714f2cbd43a2486076914..a769f16d088a3589b34e7318325625ac66101186 100644
--- a/LUFA/Drivers/Board/STK525/LEDs.h
+++ b/LUFA/Drivers/Board/STK525/LEDs.h
@@ -35,6 +35,12 @@
  *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
  *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
  */
+
+/** \ingroup Group_LEDs
+ *  @defgroup Group_LEDs_STK525 STK525
+ *
+ *  @{
+ */
  
 #ifndef __LEDS_STK525_H__
 #define __LEDS_STK525_H__
@@ -115,3 +121,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK526/AT45DB642D.h b/LUFA/Drivers/Board/STK526/AT45DB642D.h
index dd38ed1dfefe4df80cb92a27765a6ab3f1106ff6..d6974659fc132512a8c2059c3ad53864ff93e66c 100644
--- a/LUFA/Drivers/Board/STK526/AT45DB642D.h
+++ b/LUFA/Drivers/Board/STK526/AT45DB642D.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
  */
 
+/** \ingroup Group_Dataflash_STK526
+ *  @defgroup Group_Dataflash_STK526_AT45DB642D AT45DB642D
+ *
+ *  @{
+ */
+
 #ifndef __DATAFLASH_CMDS_H__
 #define __DATAFLASH_CMDS_H__
 
@@ -92,3 +98,5 @@
 			#define DF_CMD_READMANUFACTURERDEVICEINFO       0x9F
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK526/Dataflash.h b/LUFA/Drivers/Board/STK526/Dataflash.h
index 443c1a754d2316c730c0ace7a98411c5dedc92ed..65c5e202cd71a6cdd55fbf4455495f306a704968 100644
--- a/LUFA/Drivers/Board/STK526/Dataflash.h
+++ b/LUFA/Drivers/Board/STK526/Dataflash.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
  */
 
+/** \ingroup Group_Dataflash
+ *  @defgroup Group_Dataflash_STK526 STK526
+ *
+ *  @{
+ */
+
 #ifndef __DATAFLASH_STK526_H__
 #define __DATAFLASH_STK526_H__
 
@@ -106,3 +112,5 @@
 			}
 			
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK526/HWB.h b/LUFA/Drivers/Board/STK526/HWB.h
index 3bd2f9952f08a04c7d3e652e2d9b2195cf5b7f8b..0d4fd7e03df67c29ab37ecc357ea45fb222220eb 100644
--- a/LUFA/Drivers/Board/STK526/HWB.h
+++ b/LUFA/Drivers/Board/STK526/HWB.h
@@ -35,7 +35,13 @@
  *  \note This file should not be included directly. It is automatically included as needed by the HWB driver
  *        dispatch header located in LUFA/Drivers/Board/HWB.h.
  */
- 
+
+/** \ingroup Group_HWB
+ *  @defgroup Group_HWB_STK526 STK526
+ *
+ *  @{
+ */
+
 #ifndef __HWB_STK526_H__
 #define __HWB_STK526_H__
 
@@ -77,3 +83,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK526/Joystick.h b/LUFA/Drivers/Board/STK526/Joystick.h
index e5cd2e47c6eef4e5a3ea59a12af7a24be6b9feb1..c15b21284c1c04b65f14bcf845bde0af445caa5b 100644
--- a/LUFA/Drivers/Board/STK526/Joystick.h
+++ b/LUFA/Drivers/Board/STK526/Joystick.h
@@ -35,6 +35,12 @@
  *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
  *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
  */
+
+/** \ingroup Group_Joystick
+ *  @defgroup Group_Joystick_STK526 STK526
+ *
+ *  @{
+ */
  
 #ifndef __JOYSTICK_STK526_H__
 #define __JOYSTICK_STK526_H__
@@ -99,3 +105,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/STK526/LEDs.h b/LUFA/Drivers/Board/STK526/LEDs.h
index fc88a57339ebdbc378ddfe83d6a120eec6ed1092..6b17ab1c8c12459074d162189067d8d651872145 100644
--- a/LUFA/Drivers/Board/STK526/LEDs.h
+++ b/LUFA/Drivers/Board/STK526/LEDs.h
@@ -35,6 +35,12 @@
  *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
  *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
  */
+
+/** \ingroup Group_LEDs
+ *  @defgroup Group_LEDs_STK526 STK526
+ *
+ *  @{
+ */
  
 #ifndef __LEDS_STK526_H__
 #define __LEDS_STK526_H__
@@ -115,3 +121,5 @@
 		#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/Temperature.h b/LUFA/Drivers/Board/Temperature.h
index 17b8acfe150e69fdd4d24c85b3be194a8d74584e..6e1827edd09b80b71f08accb961f305359dbdb0c 100644
--- a/LUFA/Drivers/Board/Temperature.h
+++ b/LUFA/Drivers/Board/Temperature.h
@@ -33,6 +33,14 @@
  *  Temperature sensor board driver for the USB boards which contain a temperature sensor.
  */
 
+/** \ingroup Group_BoardDrivers
+ *  @defgroup Group_Temperature Temperature Driver - LUFA/Drivers/Board/Temperature.h
+ *
+ *  Functions, macros, variables, enums and types related to the control of board temperature sensors.
+ *
+ *  @{
+ */
+
 #ifndef __TEMPERATURE_H__
 #define __TEMPERATURE_H__
 
@@ -68,14 +76,19 @@
 
 			/** Maximum returnable temperature from the Temperature_GetTemperature() function. */
 			#define TEMP_MAX_TEMP      ((TEMP_TABLE_SIZE - 1) + TEMP_TABLE_OFFSET)
-			
-			/** Initializes the temperature sensor driver, including setting up the appropriate ADC channel.
-			 *  This must be called before any other temperature sensor routines.
-			 *
-			 *  The ADC itself (not the ADC channel) must be configured separately before calling the temperature
-			 *  sensor functions.
-			 */
-			#define Temperature_Init() ADC_SetupChannel(TEMP_ADC_CHANNEL);
+		
+		/* Psuedo-Functions: */
+			#if defined(__DOXYGEN__)
+				/** Initializes the temperature sensor driver, including setting up the appropriate ADC channel.
+				 *  This must be called before any other temperature sensor routines.
+				 *
+				 *  The ADC itself (not the ADC channel) must be configured separately before calling the temperature
+				 *  sensor functions.
+				 */
+				static inline void Temperature_Init(void);
+			#else
+				#define Temperature_Init() ADC_SetupChannel(TEMP_ADC_CHANNEL);
+			#endif
 
 		/* Function Prototypes: */
 			/** Performs a complete ADC on the temperature sensor channel, and converts the result into a
@@ -98,3 +111,5 @@
 		#endif
 		
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/USBKEY/AT45DB642D.h b/LUFA/Drivers/Board/USBKEY/AT45DB642D.h
index 197be1c618682578bd645eb16526e97af7d02016..672dd7c3d7c6a646dbee7298b89c5737cea53320 100644
--- a/LUFA/Drivers/Board/USBKEY/AT45DB642D.h
+++ b/LUFA/Drivers/Board/USBKEY/AT45DB642D.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
  */
 
+/** \ingroup Group_Dataflash_USBKEY
+ *  @defgroup Group_Dataflash_USBKEY_AT45DB642D AT45DB642D
+ *
+ *  @{
+ */
+ 
 #ifndef __DATAFLASH_CMDS_H__
 #define __DATAFLASH_CMDS_H__
 
@@ -92,3 +98,5 @@
 			#define DF_CMD_READMANUFACTURERDEVICEINFO       0x9F
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/USBKEY/Dataflash.h b/LUFA/Drivers/Board/USBKEY/Dataflash.h
index 2b3956f04d8a1f31da71f00f3d80796c713f6dfb..cae62fd490df837916a22f8289df0f0534d6464e 100644
--- a/LUFA/Drivers/Board/USBKEY/Dataflash.h
+++ b/LUFA/Drivers/Board/USBKEY/Dataflash.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
  */
 
+/** \ingroup Group_Dataflash
+ *  @defgroup Group_Dataflash_USBKEY USBKEY
+ *
+ *  @{
+ */
+
 #ifndef __DATAFLASH_USBKEY_H__
 #define __DATAFLASH_USBKEY_H__
 
@@ -114,3 +120,5 @@
 			}		
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/USBKEY/HWB.h b/LUFA/Drivers/Board/USBKEY/HWB.h
index 750368b19a8d816a5c8c48e5a6db741d9df10f93..bfbaa4940c77bfa7d30450139870a58ac9a4272a 100644
--- a/LUFA/Drivers/Board/USBKEY/HWB.h
+++ b/LUFA/Drivers/Board/USBKEY/HWB.h
@@ -35,7 +35,13 @@
  *  \note This file should not be included directly. It is automatically included as needed by the HWB driver
  *        dispatch header located in LUFA/Drivers/Board/HWB.h.
  */
- 
+
+/** \ingroup Group_HWB
+ *  @defgroup Group_HWB_USBKEY USBKEY
+ *
+ *  @{
+ */
+
 #ifndef __HWB_USBKEY_H__
 #define __HWB_USBKEY_H__
 
@@ -77,3 +83,5 @@
 		#endif
 			
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/USBKEY/Joystick.h b/LUFA/Drivers/Board/USBKEY/Joystick.h
index 6c2d72aee5a7781ed3eac0f06d1f772ab8066822..332dd56a304d4d76b604c3b908deda19beb2a61e 100644
--- a/LUFA/Drivers/Board/USBKEY/Joystick.h
+++ b/LUFA/Drivers/Board/USBKEY/Joystick.h
@@ -35,7 +35,13 @@
  *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
  *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
  */
- 
+
+/** \ingroup Group_Joystick
+ *  @defgroup Group_Joystick_USBKEY USBKEY
+ *
+ *  @{
+ */
+
 #ifndef __JOYSTICK_USBKEY_H__
 #define __JOYSTICK_USBKEY_H__
 
@@ -102,3 +108,5 @@
 		#endif
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/USBKEY/LEDs.h b/LUFA/Drivers/Board/USBKEY/LEDs.h
index 07a2b7501a71851d5de1cbe9f7a71ce7a17bcb01..68df3172f444f6b8c2def792a244457f8ae0bad5 100644
--- a/LUFA/Drivers/Board/USBKEY/LEDs.h
+++ b/LUFA/Drivers/Board/USBKEY/LEDs.h
@@ -36,6 +36,12 @@
  *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
  */
 
+/** \ingroup Group_LEDs
+ *  @defgroup Group_LEDs_USBKEY USBKEY
+ *
+ *  @{
+ */
+
 #ifndef __LEDS_USBKEY_H__
 #define __LEDS_USBKEY_H__
 
@@ -115,3 +121,5 @@
 		#endif
 		
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/Misc/TerminalCodes.h b/LUFA/Drivers/Misc/TerminalCodes.h
index d6e58708a8a2103869cf30914931cd525392e793..1206ade2679e383888e4c723a38bc7ce84155838 100644
--- a/LUFA/Drivers/Misc/TerminalCodes.h
+++ b/LUFA/Drivers/Misc/TerminalCodes.h
@@ -43,6 +43,14 @@
  *  \endcode
  */
  
+/** \ingroup Group_MiscDrivers
+ *  @defgroup Group_Terminal ANSI Terminal Escape Codes - LUFA/Drivers/Misc/TerminalCodes.h
+ *
+ *  Escape code macros for ANSI compliant text terminals.
+ *
+ *  @{
+ */
+ 
 #ifndef __TERMINALCODES_H__
 #define __TERMINALCODES_H__
 
@@ -174,3 +182,5 @@
 			#define ESC_ERASE_LINE           ANSI_ESCAPE_SEQUENCE("K")
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/Class/ConfigDescriptor.h b/LUFA/Drivers/USB/Class/ConfigDescriptor.h
index bd92b51f3a568dbf07cd04aa6fea5a9d3daee36e..d5fcbb0bb0ae2e203b1bd82b3082c7b8d536dc50 100644
--- a/LUFA/Drivers/USB/Class/ConfigDescriptor.h
+++ b/LUFA/Drivers/USB/Class/ConfigDescriptor.h
@@ -35,6 +35,14 @@
  *  and other descriptor data can be extracted and used as needed.
  */
 
+/** \ingroup Group_Descriptors
+ *  @defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser
+ *
+ *  Functions, macros, variables, enums and types related to the parsing of Configuration Descriptors.
+ *
+ *  @{
+ */
+
 #ifndef __CONFIGDESCRIPTOR_H__
 #define __CONFIGDESCRIPTOR_H__
 
@@ -109,7 +117,7 @@
 			 *  for certain descriptors matching unique criteria.
 			 *
 			 *  Comparator routines are passed in a single pointer named CurrentDescriptor, and should return a value
-			 *  of a member of the DSEARCH_Return_ErrorCodes_t enum.
+			 *  of a member of the DSearch_Return_ErrorCodes_t enum.
 			 */
 			#define DESCRIPTOR_COMPARATOR(name)           uint8_t DCOMP_##name (void* const CurrentDescriptor)
 
@@ -124,7 +132,7 @@
 			 *  \param DPos     Pointer to the current position in the configuration descriptor
 			 *  \param DSearch  Name of the comparator search function to use on the configuration descriptor
 			 *
-			 *  \return Value of one of the members of the DSEARCH_Comp_Return_ErrorCodes_t enum
+			 *  \return Value of one of the members of the DSearch_Comp_Return_ErrorCodes_t enum
 			 *
 			 *  Usage Example:
 			 *  \code
@@ -151,7 +159,7 @@
 			                                              USB_Host_GetNextDescriptorComp_P(DSize, DPos, DCOMP_##DSearch)
 		/* Enums: */
 			/** Enum for return values of a descriptor comparator made with DESCRIPTOR_COMPARATOR. */
-			enum DSEARCH_Return_ErrorCodes_t
+			enum DSearch_Return_ErrorCodes_t
 			{
 				Descriptor_Search_Found                = 0, /**< Current descriptor matches comparator criteria. */
 				Descriptor_Search_Fail                 = 1, /**< No further descriptor could possibly match criteria, fail the search. */
@@ -159,7 +167,7 @@
 			};
 
 			/** Enum for return values of USB_Host_GetNextDescriptorComp() */
-			enum DSEARCH_Comp_Return_ErrorCodes_t
+			enum DSearch_Comp_Return_ErrorCodes_t
 			{
 				Descriptor_Search_Comp_Found           = 0, /**< Configuration descriptor now points to descriptor which matches
 				                                             *   search criteria of the given comparator function. */
@@ -259,5 +267,7 @@
 		#if defined(__cplusplus)
 			}
 		#endif
-		
+
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/Class/HIDParser.h b/LUFA/Drivers/USB/Class/HIDParser.h
index 47a678b9bc8d8d0a4571bd6e319ea34b6a8773b4..ad242fe5655ed8edd791965dcd633d578f825b0e 100644
--- a/LUFA/Drivers/USB/Class/HIDParser.h
+++ b/LUFA/Drivers/USB/Class/HIDParser.h
@@ -44,6 +44,14 @@
  *  HID_INCLUDE_CONSTANT_DATA_ITEMS tokens in the user project makefile, passing them to the compiler via the -D
  *  switch.
  */
+ 
+/** \ingroup Group_USB
+ *  @defgroup Group_HIDParser HID Report Parser
+ *
+ *  Functions, macros, variables, enums and types related to the parsing of HID class device report descriptors.
+ *
+ *  @{
+ */
 
 #ifndef __HIDPARSER_H__
 #define __HIDPARSER_H__
@@ -250,3 +258,5 @@
 		#endif
 
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/Class/HIDReportData.h b/LUFA/Drivers/USB/Class/HIDReportData.h
index b1468a31a69fee6b9dbe0d6b48dfd0e084e057d1..eee38be04d1fc013e339a514bd90d85837a171db 100644
--- a/LUFA/Drivers/USB/Class/HIDReportData.h
+++ b/LUFA/Drivers/USB/Class/HIDReportData.h
@@ -34,6 +34,14 @@
  *  flag's meaning when applied to an IN, OUT or FEATURE item.
  */
 
+/** \ingroup Group_HIDParser
+ *  @defgroup Group_HIDIOFConst Input/Output/Feature Masks
+ *
+ *  Masks indicating the type of Input, Output of Feature HID report item.
+ *
+ *  @{
+ */
+ 
 #ifndef __HIDREPORTDATA_H__
 #define __HIDREPORTDATA_H__
 
@@ -126,5 +134,7 @@
 			#define TAG_LOCAL_USAGEMIN       0x10
 			#define TAG_LOCAL_USAGEMAX       0x20
 	#endif
+
+/** @} */
 		
 #endif
diff --git a/LUFA/Drivers/USB/HighLevel/Events.h b/LUFA/Drivers/USB/HighLevel/Events.h
index c9882cfc06d775fae715bb3e4a0322cf2e36d186..480e824a78f9fe3deb42f5203515b66da871e091 100644
--- a/LUFA/Drivers/USB/HighLevel/Events.h
+++ b/LUFA/Drivers/USB/HighLevel/Events.h
@@ -39,6 +39,14 @@
  *
  *  Each event must only have one associated event handler, but can be raised by multiple sources.
  */
+
+/** \ingroup Group_USB
+ *  @defgroup Group_Events USB Events
+ *
+ *  Functions, macros, variables, enums and types related to the management of events from the USB kernel.
+ *
+ *  @{
+ */
  
 #ifndef __USBEVENTS_H__
 #define __USBEVENTS_H__
@@ -436,5 +444,7 @@
 		#if defined(__cplusplus)
 			}
 		#endif
-		
+	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
index d628363219ad6b40da621842d938b038432fb1ce..a1a051824bdfe876032337b1d5614cbe0d064510 100644
--- a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
+++ b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
@@ -44,6 +44,14 @@
  *  named counterparts, thus they can be correlated easily with the official USB specification.
  */
 
+/** \ingroup Group_USB
+ *  @defgroup Group_Descriptors USB Descriptors
+ *
+ *  Functions, macros, variables, enums and types related to standard USB descriptors.
+ *
+ *  @{
+ */
+ 
 #ifndef __USBDESCRIPTORS_H__
 #define __USBDESCRIPTORS_H__
 
@@ -472,12 +480,6 @@
 				int16_t                 bString[];
 				#endif
 			} USB_Descriptor_String_t;
-			
-			typedef struct
-			{
-				uint16_t Size;
-				void*    Address;
-			} USB_Descriptor_Details_t;
 
 		/* Function Prototypes: */
 			/** Function to retrieve a given descriptor's size and memory location from the given descriptor type value,
@@ -519,5 +521,7 @@
 		#if defined(__cplusplus)
 			}
 		#endif
-		
+	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/HighLevel/StdRequestType.h b/LUFA/Drivers/USB/HighLevel/StdRequestType.h
index 423de6d9c95a44c963583766b228fe2d8d3e957c..bf9ef8aeeab3f42924af06c4de69e42a6c6f146a 100644
--- a/LUFA/Drivers/USB/HighLevel/StdRequestType.h
+++ b/LUFA/Drivers/USB/HighLevel/StdRequestType.h
@@ -34,6 +34,14 @@
  *  direction, request recipient, etc.) can be extracted via masking.
  */
  
+/** \ingroup Group_USB
+ *  @defgroup Group_StdRequest Standard USB Requests
+ *
+ *  Functions, macros, variables, enums and types related to standard USB requests to USB devices.
+ *
+ *  @{
+ */
+
 #ifndef __STDREQTYPE_H__
 #define __STDREQTYPE_H__
 
@@ -181,11 +189,13 @@
 				                              *   device mode. */
 			};
 
-/* Private Interface - For use in library only: */
-	#if !defined(__DOXYGEN__)
-		/* Macros: */
-			#define FEATURE_SELFPOWERED_ENABLED     (1 << 0)
-			#define FEATURE_REMOTE_WAKEUP_ENABLED   (1 << 1)
-	#endif
-	
+	/* Private Interface - For use in library only: */
+		#if !defined(__DOXYGEN__)
+			/* Macros: */
+				#define FEATURE_SELFPOWERED_ENABLED     (1 << 0)
+				#define FEATURE_REMOTE_WAKEUP_ENABLED   (1 << 1)
+		#endif
+
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h b/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h
index 5c2dad637917dbcb37411fbd1407bee90c9acf3e..300a3f217e470e0e35b6f767887aa1a6f45c650f 100644
--- a/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h
+++ b/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h
@@ -35,6 +35,14 @@
  *  stream read/write process.
  */
  
+/** \ingroup Group_USB
+ *  @defgroup Group_StreamCallbacks Endpoint and Pipe Stream Callbacks
+ *
+ *  Functions, macros, variables, enums and types related to endpoint and pipe stream callback functions.
+ *
+ *  @{
+ */
+ 
 #ifndef __STREAMCALLBACK_H__
 #define __STREAMCALLBACK_H__
 
@@ -85,3 +93,5 @@
 			};
 			
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/HighLevel/USBInterrupt.h b/LUFA/Drivers/USB/HighLevel/USBInterrupt.h
index d54de39205c54293da2d8a1ea974f73dd58caba4..65e0b5fb17993e7b89f5d299f8878d30334826bd 100644
--- a/LUFA/Drivers/USB/HighLevel/USBInterrupt.h
+++ b/LUFA/Drivers/USB/HighLevel/USBInterrupt.h
@@ -34,6 +34,14 @@
  *  events as VBUS interrupts (on supported USB AVR models), device connections and disconnections, etc.
  */
 
+/** \ingroup Group_USB
+ *  @defgroup Group_USBInterrupt Endpoint and Pipe Interrupts
+ *
+ *  Functions, macros, variables, enums and types related to endpoint and pipe interrupts.
+ *
+ *  @{
+ */
+
 #ifndef __USBINTERRUPT_H__
 #define __USBINTERRUPT_H__
 
@@ -220,5 +228,7 @@
 		#if defined(__cplusplus)
 			}
 		#endif
-		
+
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c
index e62ac687fcb332ed652b94db88665ff6d6b81645..80731ac194835d9e1ee2e6eda516dbbabc03758d 100644
--- a/LUFA/Drivers/USB/HighLevel/USBTask.c
+++ b/LUFA/Drivers/USB/HighLevel/USBTask.c
@@ -64,7 +64,7 @@ static void USB_DeviceTask(void)
 	
 		Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
 
-		if (Endpoint_IsSetupReceived())
+		if (Endpoint_IsSETUPReceived())
 		{
 			ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
 			{
diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.h b/LUFA/Drivers/USB/HighLevel/USBTask.h
index e0ca8ede827c9f55b195e090e30f54071f6a62f4..bcf117ddb4f49b2d995dad35f15c3df396ab049b 100644
--- a/LUFA/Drivers/USB/HighLevel/USBTask.h
+++ b/LUFA/Drivers/USB/HighLevel/USBTask.h
@@ -73,6 +73,8 @@
 			 *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by
 			 *        passing the NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
 			 *        and disconnection events may be manually fired by RAISE_EVENT(), and the USB_IsConnected global changed manually.
+			 *
+			 *  \ingroup Group_USBManagement
 			 */
 			extern volatile bool USB_IsConnected;
 
@@ -81,6 +83,8 @@
 			 *
 			 *  \note This variable should be treated as read-only in the user application, and never manually
 			 *        changed in value.
+			 *
+			 *  \ingroup Group_USBManagement
 			 */
 			extern volatile bool USB_IsInitialized;
 
@@ -94,6 +98,8 @@
 			 *
 			 *  \note This variable should be treated as read-only in the user application, and never manually
 			 *        changed in value.
+			 *
+			 *  \ingroup Group_Device
 			 */
 			extern volatile bool USB_IsSuspended;
 			#endif
@@ -107,6 +113,8 @@
 			 *  by the library.
 			 *
 			 *  \note This global is only present if the user application can be a USB host.
+			 *
+			 *  \ingroup Group_Host
 			 */
 			extern volatile uint8_t USB_HostState;
 			#endif
@@ -173,6 +181,8 @@
 			 *    event and disabled again on the firing of the USB_DeviceUnattached event.
 			 *
 			 *  \see Events.h for more information on the USB events.
+			 *
+			 *  \ingroup Group_USBManagement
 			 */
 			TASK(USB_USBTask);
 
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.c b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
index 765627b151cae8cb2d288e0c8b50ecbef13fafde..19d72983b63b6f001921fbd6e6e449c91c6a48a2 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.c
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
@@ -105,10 +105,10 @@ void USB_Device_ProcessControlPacket(void)
 	if (!(RequestHandled))
 	  RAISE_EVENT(USB_UnhandledControlPacket, bRequest, bmRequestType);
 	  
-	if (Endpoint_IsSetupReceived())
+	if (Endpoint_IsSETUPReceived())
 	{
 		Endpoint_StallTransaction();
-		Endpoint_ClearSetupReceived();		
+		Endpoint_ClearControlSETUP();		
 	}
 }
 
@@ -116,13 +116,13 @@ static void USB_Device_SetAddress(void)
 {
 	uint8_t wValue_LSB = Endpoint_Read_Byte();
 
-	Endpoint_ClearSetupReceived();
+	Endpoint_ClearControlSETUP();
 	
-	while (!(Endpoint_IsSetupINReady()));
+	while (!(Endpoint_IsINReady()));
 	
-	Endpoint_ClearSetupIN();
+	Endpoint_ClearControlIN();
 	
-	while (!(Endpoint_IsSetupINReady()));
+	while (!(Endpoint_IsINReady()));
 
 	UDADDR = ((1 << ADDEN) | (wValue_LSB & 0x7F));
 
@@ -152,11 +152,11 @@ static void USB_Device_SetConfiguration(void)
 		return;
 	}
 	
-	Endpoint_ClearSetupReceived();
+	Endpoint_ClearControlSETUP();
 
 	USB_ConfigurationNumber = wValue_LSB;
 
-	Endpoint_ClearSetupIN();
+	Endpoint_ClearControlIN();
 
 	if (!(AlreadyConfigured) && USB_ConfigurationNumber)
 	  RAISE_EVENT(USB_DeviceEnumerationComplete);
@@ -166,14 +166,14 @@ static void USB_Device_SetConfiguration(void)
 
 void USB_Device_GetConfiguration(void)
 {
-	Endpoint_ClearSetupReceived();	
+	Endpoint_ClearControlSETUP();	
 
 	Endpoint_Write_Byte(USB_ConfigurationNumber);
 	
-	Endpoint_ClearSetupIN();
+	Endpoint_ClearControlIN();
 
-	while (!(Endpoint_IsSetupOUTReceived()));
-	Endpoint_ClearSetupOUT();
+	while (!(Endpoint_IsOUTReceived()));
+	Endpoint_ClearControlOUT();
 }
 
 static void USB_Device_GetDescriptor(void)
@@ -190,18 +190,18 @@ static void USB_Device_GetDescriptor(void)
 	if ((DescriptorSize = USB_GetDescriptor(wValue, wIndex, &DescriptorPointer)) == NO_DESCRIPTOR)
 	  return;
 	
-	Endpoint_ClearSetupReceived();
+	Endpoint_ClearControlSETUP();	
 	
 	if (wLength > DescriptorSize)
 	  wLength = DescriptorSize;
 	
 	while (wLength)
 	{
-		while (!(Endpoint_IsSetupINReady()))
+		while (!(Endpoint_IsINReady()))
 		{
-			if (Endpoint_IsSetupOUTReceived())
+			if (Endpoint_IsOUTReceived())
 			{
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 				return;
 			}		
 		}
@@ -220,17 +220,17 @@ static void USB_Device_GetDescriptor(void)
 		}
 		
 		SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);
-		Endpoint_ClearSetupIN();
+		Endpoint_ClearControlIN();
 	}
 	
 	if (SendZLP)
 	{
-		while (!(Endpoint_IsSetupINReady()));
-		Endpoint_ClearSetupIN();
+		while (!(Endpoint_IsINReady()));
+		Endpoint_ClearControlIN();
 	}
 
-	while (!(Endpoint_IsSetupOUTReceived()));
-	Endpoint_ClearSetupOUT();
+	while (!(Endpoint_IsOUTReceived()));
+	Endpoint_ClearControlOUT();
 }
 
 static void USB_Device_GetStatus(const uint8_t bmRequestType)
@@ -264,13 +264,14 @@ static void USB_Device_GetStatus(const uint8_t bmRequestType)
 	}
 	
 	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);			  
-	Endpoint_ClearSetupReceived();
+	Endpoint_ClearControlSETUP();
+
 	Endpoint_Write_Word_LE(CurrentStatus);
 
-	Endpoint_ClearSetupIN();
+	Endpoint_ClearControlIN();
 	
-	while (!(Endpoint_IsSetupOUTReceived()));
-	Endpoint_ClearSetupOUT();
+	while (!(Endpoint_IsOUTReceived()));
+	Endpoint_ClearControlOUT();
 }
 
 #if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)
@@ -305,8 +306,8 @@ static void USB_Device_ClearSetFeature(const uint8_t bRequest, const uint8_t bmR
 					}
 
 					Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-					Endpoint_ClearSetupReceived();
-					Endpoint_ClearSetupIN();
+					Endpoint_ClearControlSETUP();
+					Endpoint_ClearControlIN();
 				}
 			}
 			
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.h b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
index 2b425e7e626fff440dcbd671db811adebd9ef14e..6571659c1f3cdba95397f913711549097cdee0e3 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.h
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
@@ -66,6 +66,8 @@
 			 *
 			 *  \note This variable should be treated as read-only in the user application, and never manually
 			 *        changed in value.
+			 *
+			 *  \ingroup Group_Device
 			 */
 			extern uint8_t USB_ConfigurationNumber;
 			
@@ -74,12 +76,16 @@
 			 *
 			 *  \note This variable should be treated as read-only in the user application, and never manually
 			 *        changed in value.
+			 *
+			 *  \ingroup Group_Device
 			 */
 			extern bool USB_RemoteWakeupEnabled;
 			
 			/** Indicates if the device is currently being powered by its own power supply, rather than being
 			 *  powered by the host's USB supply. This flag should remain cleared if the device does not
 			 *  support self powered mode, as indicated in the device descriptors.
+			 *
+			 *  \ingroup Group_Device
 			 */
 			extern bool USB_CurrentlySelfPowered;
 
diff --git a/LUFA/Drivers/USB/LowLevel/Device.h b/LUFA/Drivers/USB/LowLevel/Device.h
index c6e5f7f5a671755cc1938f2de3dea6053f49ac6e..8a2ee00c3307bd96afdd0cc8dfe0604e32a0aef6 100644
--- a/LUFA/Drivers/USB/LowLevel/Device.h
+++ b/LUFA/Drivers/USB/LowLevel/Device.h
@@ -33,6 +33,14 @@
  *  USB Device mode related macros and enums. This module contains macros and enums which are used when
  *  the USB controller is initialized in device mode.
  */
+ 
+/** \ingroup Group_USB
+ *  @defgroup Group_Device Device Management
+ *
+ *  Functions, macros, variables, enums and types related to the management of a USB device when in Device mode.
+ *
+ *  @{
+ */
 
 #ifndef __USBDEVICE_H__
 #define __USBDEVICE_H__
@@ -64,42 +72,52 @@
 			 */
 			#define USB_DEVICE_OPT_FULLSPEED               (0 << 0)
 			
-			/** Sends a Remote Wakeup request to the host. This signals to the host that the device should
-			 *  be taken out of suspended mode, and communications should resume.
-			 *
-			 *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
-			 *  host computer when the host has suspended all USB devices to enter a low power state.
-			 *
-			 *  \note This macro should only be used if the device has indicated to the host that it
-			 *        supports the Remote Wakeup feature in the device descriptors, and should only be
-			 *        issued if the host is currently allowing remote wakeup events from the device (i.e.,
-			 *        the USB_RemoteWakeupEnabled flag is set, see DevChapter9.h documentation).
-			 *
-			 *  \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors.
-			 */
-			#define USB_Device_SendRemoteWakeup()   MACROS{ UDCON |= (1 << RMWKUP); }MACROE
+		/* Psuedo-Function Macros: */
+			#if defined(__DOXYGEN__)
+				/** Sends a Remote Wakeup request to the host. This signals to the host that the device should
+				 *  be taken out of suspended mode, and communications should resume.
+				 *
+				 *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
+				 *  host computer when the host has suspended all USB devices to enter a low power state.
+				 *
+				 *  \note This macro should only be used if the device has indicated to the host that it
+				 *        supports the Remote Wakeup feature in the device descriptors, and should only be
+				 *        issued if the host is currently allowing remote wakeup events from the device (i.e.,
+				 *        the USB_RemoteWakeupEnabled flag is set, see DevChapter9.h documentation).
+				 *
+				 *  \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors.
+				 */
+				static inline void USB_Device_SendRemoteWakeup(void);
+				
+				/** Indicates if a Remote Wakeup request is being sent to the host. This returns true if a
+				 *  remote wakeup is currently being sent, false otherwise.
+				 *
+				 *  This can be used in conjunction with the USB_Device_IsUSBSuspended() macro to determine if
+				 *  a sent RMWAKEUP request was accepted or rejected by the host.
+				 *
+				 *  \note This macro should only be used if the device has indicated to the host that it
+				 *        supports the Remote Wakeup feature in the device descriptors.
+				 *
+				 *  \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors.
+				 *
+				 *  \return Boolean true if no Remote Wakeup request is currently being sent, false otherwise
+				 */
+				static inline bool USB_Device_IsRemoteWakeupSent(void);
+				
+				/** Indicates if the device is currently suspended by the host. While suspended, the device is
+				 *  to enter a low power state until resumed by the host. While suspended no USB traffic to or
+				 *  from the device can occur (except for Remote Wakeup requests).
+				 *
+				 *  \return Boolean true if the USB communications have been suspended by the host, false otherwise.
+				 */
+				static inline bool USB_Device_IsUSBSuspended(void);
+			#else
+				#define USB_Device_SendRemoteWakeup()   MACROS{ UDCON |= (1 << RMWKUP); }MACROE
 
-			/** Indicates if a Remote Wakeup request is being sent to the host. This returns true if a
-			 *  remote wakeup is currently being sent, false otherwise.
-			 *
-			 *  This can be used in conjunction with the USB_Device_IsUSBSuspended() macro to determine if
-			 *  a sent RMWAKEUP request was accepted or rejected by the host.
-			 *
-			 *  \note This macro should only be used if the device has indicated to the host that it
-			 *        supports the Remote Wakeup feature in the device descriptors.
-			 *
-			 *  \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors.
-			 */
-			#define USB_Device_IsRemoteWakeupSent()       ((UDCON &  (1 << RMWKUP)) ? false : true)
+				#define USB_Device_IsRemoteWakeupSent()       ((UDCON &  (1 << RMWKUP)) ? false : true)
 
-			/** Indicates if the device is currently suspended by the host. While suspended, the device is
-			 *  to enter a low power state until resumed by the host. While suspended no USB traffic to or
-			 *  from the device can occur (except for Remote Wakeup requests).
-			 *
-			 *  This macro returns true if the USB communications have been suspended by the host, false
-			 *  otherwise.
-			 */
-			#define USB_Device_IsUSBSuspended()           ((UDINT &  (1 << SUSPI)) ? true : false)
+				#define USB_Device_IsUSBSuspended()           ((UDINT &  (1 << SUSPI)) ? true : false)
+			#endif
 
 		/* Enums: */
 			/** Enum for the ErrorCode parameter of the USB_DeviceError event.
@@ -122,5 +140,7 @@
 			#define USB_Device_SetLowSpeed()        MACROS{ UDCON |=  (1 << LSM);   }MACROE
 			#define USB_Device_SetHighSpeed()       MACROS{ UDCON &= ~(1 << LSM);   }MACROE
 	#endif
-	
+
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c
index aa18358c8e2917c5303c7111d452e09662065929..b88547177c5a58ba488c86b6974394f2fffe27d8 100644
--- a/LUFA/Drivers/USB/LowLevel/Endpoint.c
+++ b/LUFA/Drivers/USB/LowLevel/Endpoint.c
@@ -88,8 +88,19 @@ uint8_t Endpoint_WaitUntilReady(void)
 
 	USB_INT_Clear(USB_INT_SOFI);
 
-	while (!(Endpoint_ReadWriteAllowed()))
+	for (;;)
 	{
+		if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
+		{
+			if (Endpoint_IsINReady())
+			  return ENDPOINT_READYWAIT_NoError;
+		}
+		else
+		{
+			if (Endpoint_IsOUTReceived())
+			  return ENDPOINT_READYWAIT_NoError;		
+		}
+		
 		if (!(USB_IsConnected))
 		  return ENDPOINT_READYWAIT_DeviceDisconnected;
 		else if (Endpoint_IsStalled())
@@ -103,8 +114,6 @@ uint8_t Endpoint_WaitUntilReady(void)
 			  return ENDPOINT_READYWAIT_Timeout;
 		}
 	}
-	
-	return ENDPOINT_READYWAIT_NoError;
 }
 
 uint8_t Endpoint_Discard_Stream(uint16_t Length
@@ -120,9 +129,9 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Endpoint_ReadWriteAllowed()))
+		if (!(Endpoint_IsReadWriteAllowed()))
 		{
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -132,8 +141,10 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length
 			if ((ErrorCode = Endpoint_WaitUntilReady()))
 			  return ErrorCode;
 		}
-
-		Endpoint_Discard_Byte();
+		else
+		{
+			Endpoint_Discard_Byte();
+		}
 	}
 	
 	return ENDPOINT_RWSTREAM_ERROR_NoError;
@@ -153,9 +164,9 @@ uint8_t Endpoint_Write_Stream_LE(const void* Buffer, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Endpoint_ReadWriteAllowed()))
+		if (!(Endpoint_IsReadWriteAllowed()))
 		{
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 			
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -165,8 +176,10 @@ uint8_t Endpoint_Write_Stream_LE(const void* Buffer, uint16_t Length
 			if ((ErrorCode = Endpoint_WaitUntilReady()))
 			  return ErrorCode;
 		}
-
-		Endpoint_Write_Byte(*(DataStream++));
+		else
+		{
+			Endpoint_Write_Byte(*(DataStream++));
+		}
 	}
 	
 	return ENDPOINT_RWSTREAM_ERROR_NoError;
@@ -186,9 +199,9 @@ uint8_t Endpoint_Write_Stream_BE(const void* Buffer, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Endpoint_ReadWriteAllowed()))
+		if (!(Endpoint_IsReadWriteAllowed()))
 		{
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearIN();
 
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -198,8 +211,10 @@ uint8_t Endpoint_Write_Stream_BE(const void* Buffer, uint16_t Length
 			if ((ErrorCode = Endpoint_WaitUntilReady()))
 			  return ErrorCode;
 		}
-
-		Endpoint_Write_Byte(*(DataStream--));
+		else
+		{
+			Endpoint_Write_Byte(*(DataStream--));
+		}
 	}
 	
 	return ENDPOINT_RWSTREAM_ERROR_NoError;
@@ -219,9 +234,9 @@ uint8_t Endpoint_Read_Stream_LE(void* Buffer, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Endpoint_ReadWriteAllowed()))
+		if (!(Endpoint_IsReadWriteAllowed()))
 		{
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -231,8 +246,10 @@ uint8_t Endpoint_Read_Stream_LE(void* Buffer, uint16_t Length
 			if ((ErrorCode = Endpoint_WaitUntilReady()))
 			  return ErrorCode;
 		}
-		
-		*(DataStream++) = Endpoint_Read_Byte();
+		else
+		{
+			*(DataStream++) = Endpoint_Read_Byte();
+		}
 	}
 	
 	return ENDPOINT_RWSTREAM_ERROR_NoError;
@@ -252,9 +269,9 @@ uint8_t Endpoint_Read_Stream_BE(void* Buffer, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Endpoint_ReadWriteAllowed()))
+		if (!(Endpoint_IsReadWriteAllowed()))
 		{
-			Endpoint_ClearCurrentBank();
+			Endpoint_ClearOUT();
 
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -264,8 +281,10 @@ uint8_t Endpoint_Read_Stream_BE(void* Buffer, uint16_t Length
 			if ((ErrorCode = Endpoint_WaitUntilReady()))
 			  return ErrorCode;
 		}
-		
-		*(DataStream--) = Endpoint_Read_Byte();
+		else
+		{
+			*(DataStream--) = Endpoint_Read_Byte();
+		}
 	}
 	
 	return ENDPOINT_RWSTREAM_ERROR_NoError;
@@ -276,9 +295,9 @@ uint8_t Endpoint_Write_Control_Stream_LE(const void* Buffer, uint16_t Length)
 	uint8_t* DataStream = (uint8_t*)Buffer;
 	bool     SendZLP    = true;
 	
-	while (Length && !(Endpoint_IsSetupOUTReceived()))
+	while (Length && !(Endpoint_IsOUTReceived()))
 	{
-		while (!(Endpoint_IsSetupINReady()));
+		while (!(Endpoint_IsINReady()));
 		
 		while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize))
 		{
@@ -288,19 +307,19 @@ uint8_t Endpoint_Write_Control_Stream_LE(const void* Buffer, uint16_t Length)
 		}
 		
 		SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);
-		Endpoint_ClearSetupIN();
+		Endpoint_ClearControlIN();
 	}
 	
-	if (Endpoint_IsSetupOUTReceived())
+	if (Endpoint_IsOUTReceived())
 	  return ENDPOINT_RWCSTREAM_ERROR_HostAborted;
 	
 	if (SendZLP)
 	{
-		while (!(Endpoint_IsSetupINReady()));
-		Endpoint_ClearSetupIN();
+		while (!(Endpoint_IsINReady()));
+		Endpoint_ClearControlIN();
 	}
 	
-	while (!(Endpoint_IsSetupOUTReceived()));
+	while (!(Endpoint_IsOUTReceived()));
 
 	return ENDPOINT_RWCSTREAM_ERROR_NoError;
 }
@@ -310,9 +329,9 @@ uint8_t Endpoint_Write_Control_Stream_BE(const void* Buffer, uint16_t Length)
 	uint8_t* DataStream = (uint8_t*)(Buffer + Length - 1);
 	bool     SendZLP    = true;
 	
-	while (Length && !(Endpoint_IsSetupOUTReceived()))
+	while (Length && !(Endpoint_IsOUTReceived()))
 	{
-		while (!(Endpoint_IsSetupINReady()));
+		while (!(Endpoint_IsINReady()));
 		
 		while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize))
 		{
@@ -322,19 +341,19 @@ uint8_t Endpoint_Write_Control_Stream_BE(const void* Buffer, uint16_t Length)
 		}
 		
 		SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);
-		Endpoint_ClearSetupIN();
+		Endpoint_ClearControlIN();
 	}
 	
-	if (Endpoint_IsSetupOUTReceived())
+	if (Endpoint_IsOUTReceived())
 	  return ENDPOINT_RWCSTREAM_ERROR_HostAborted;
 	
 	if (SendZLP)
 	{
-		while (!(Endpoint_IsSetupINReady()));
-		Endpoint_ClearSetupIN();
+		while (!(Endpoint_IsINReady()));
+		Endpoint_ClearControlIN();
 	}
 	
-	while (!(Endpoint_IsSetupOUTReceived()));
+	while (!(Endpoint_IsOUTReceived()));
 
 	return ENDPOINT_RWCSTREAM_ERROR_NoError;
 }
@@ -345,7 +364,7 @@ uint8_t Endpoint_Read_Control_Stream_LE(void* Buffer, uint16_t Length)
 	
 	while (Length)
 	{
-		while (!(Endpoint_IsSetupOUTReceived()));
+		while (!(Endpoint_IsOUTReceived()));
 		
 		while (Length && Endpoint_BytesInEndpoint())
 		{
@@ -354,10 +373,10 @@ uint8_t Endpoint_Read_Control_Stream_LE(void* Buffer, uint16_t Length)
 			Length--;
 		}
 		
-		Endpoint_ClearSetupOUT();
+		Endpoint_ClearControlOUT();
 	}
 	
-	while (!(Endpoint_IsSetupINReady()));
+	while (!(Endpoint_IsINReady()));
 	
 	return ENDPOINT_RWCSTREAM_ERROR_NoError;
 }
@@ -368,7 +387,7 @@ uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length)
 	
 	while (Length)
 	{
-		while (!(Endpoint_IsSetupOUTReceived()));
+		while (!(Endpoint_IsOUTReceived()));
 		
 		while (Length && Endpoint_BytesInEndpoint())
 		{
@@ -377,10 +396,10 @@ uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length)
 			Length--;
 		}
 		
-		Endpoint_ClearSetupOUT();
+		Endpoint_ClearControlOUT();
 	}
 	
-	while (!(Endpoint_IsSetupINReady()));
+	while (!(Endpoint_IsINReady()));
 
 	return ENDPOINT_RWCSTREAM_ERROR_NoError;
 }
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.h b/LUFA/Drivers/USB/LowLevel/Endpoint.h
index c0eab3584eba5b2bfe8d6ce2660ee36e7abcbc4a..2223f0ca4ab9f6dee045c1a2311c85535a000553 100644
--- a/LUFA/Drivers/USB/LowLevel/Endpoint.h
+++ b/LUFA/Drivers/USB/LowLevel/Endpoint.h
@@ -34,7 +34,25 @@
  *  module contains the endpoint management macros, as well as endpoint interrupt and data
  *  send/recieve functions for various data types.
  */
+
+/** \ingroup Group_USB
+ *  @defgroup Group_EndpointManagement Endpoint Management
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of endpoints while in USB Device mode.
+ *
+ *  @{
+ */
+
+/** @defgroup Group_EndpointRW Endpoint Data Reading and Writing
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
  
+/** @defgroup Group_EndpointPacketManagement Endpoint Packet Management
+ *
+ *  Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
 #ifndef __ENDPOINT_H__
 #define __ENDPOINT_H__
 
@@ -85,10 +103,10 @@
 			 */
 			#define ENDPOINT_CONTROLEP                    0
 
-			/** Default size of the default control endpoint's bank, until altered by the Endpoint0Size value 
-			 *  in the device descriptor. Not available if the FIXED_CONTROL_ENDPOINT_SIZE token is defined.
-			 */
 			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+				/** Default size of the default control endpoint's bank, until altered by the Endpoint0Size value 
+				 *  in the device descriptor. Not available if the FIXED_CONTROL_ENDPOINT_SIZE token is defined.
+				 */
 				#define ENDPOINT_CONTROLEP_DEFAULT_SIZE   8
 			#endif
 			
@@ -165,125 +183,271 @@
 			 */
 			#define ENDPOINT_INT_OUT                      UEIENX, (1 << RXOUTE), UEINTX, (1 << RXOUTI)
 			
-			#if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__)
-				/** Indicates the number of bytes currently stored in the current endpoint's selected bank. */
-				#define Endpoint_BytesInEndpoint()        UEBCX
-			#else
-				#define Endpoint_BytesInEndpoint()        UEBCLX
-			#endif
-			
-			/** Returns the endpoint address of the currently selected endpoint. This is typically used to save
-			 *  the currently selected endpoint number so that it can be restored after another endpoint has
-			 *  been manipulated.
-			 */
-			#define Endpoint_GetCurrentEndpoint()         (UENUM & ENDPOINT_EPNUM_MASK)
+		/* Psuedo-Function Macros: */
+			#if defined(__DOXYGEN__)
+				/** Indicates the number of bytes currently stored in the current endpoint's selected bank.
+				 *
+				 *  \note The return width of this function may differ, depending on the maximum endpoint bank size
+				 *        of the selected AVR model.
+				 *
+				 *  \ingroup Group_EndpointRW
+				 *
+				 *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer
+				 */
+				static inline uint16_t Endpoint_BytesInEndpoint(void);
 			
-			/** Selects the given endpoint number. If the address from the device descriptors is used, the
-			 *  value should be masked with the ENDPOINT_EPNUM_MASK constant to extract only the endpoint
-			 *  number (and discarding the endpoint direction bit).
-			 *
-			 *  Any endpoint operations which do not require the endpoint number to be indicated will operate on
-			 *  the currently selected endpoint.
-			 */
-			#define Endpoint_SelectEndpoint(epnum)        MACROS{ UENUM = epnum; }MACROE
+				/** Get the endpoint address of the currently selected endpoint. This is typically used to save
+				 *  the currently selected endpoint number so that it can be restored after another endpoint has
+				 *  been manipulated.
+				 *
+				 *  \return Index of the currently selected endpoint
+				 */
+				static inline uint8_t Endpoint_GetCurrentEndpoint(void);
+				
+				/** Selects the given endpoint number. If the address from the device descriptors is used, the
+				 *  value should be masked with the ENDPOINT_EPNUM_MASK constant to extract only the endpoint
+				 *  number (and discarding the endpoint direction bit).
+				 *
+				 *  Any endpoint operations which do not require the endpoint number to be indicated will operate on
+				 *  the currently selected endpoint.
+				 *
+				 *  \param EndpointNumber Endpoint number to select
+				 */
+				static inline void Endpoint_SelectEndpoint(uint8_t EndpointNumber);
+				
+				/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
+				 *  In and Out pointers to the bank's contents.
+				 *
+				 *  \param EndpointNumber Endpoint number whose FIFO buffers are to be reset
+				 */
+				static inline void Endpoint_ResetFIFO(uint8_t EndpointNumber);
+				
+				/** Enables the currently selected endpoint so that data can be sent and received through it to
+				 *  and from a host.
+				 *
+				 *  \note Endpoints must first be configured properly rather than just being enabled via the
+				 *        Endpoint_ConfigureEndpoint() macro, which calls Endpoint_EnableEndpoint() automatically.
+				 */
+				static inline void Endpoint_EnableEndpoint(void);
 
-			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
-			 *  In and Out pointers to the bank's contents.
-			 */
-			#define Endpoint_ResetFIFO(epnum)             MACROS{ UERST = (1 << epnum); UERST = 0; }MACROE
+				/** Disables the currently selected endpoint so that data cannot be sent and received through it
+				 *  to and from a host.
+				 */
+				static inline void Endpoint_DisableEndpoint(void);
+				
+				/** Determines if the currently selected endpoint is enabled, but not necessarily configured.
+				 *
+				 * \return Boolean True if the currently selected endpoint is enabled, false otherwise
+				 */
+				static inline bool Endpoint_IsEnabled(void);
+				
+				/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
+				 *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN
+				 *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint
+				 *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN
+				 *  direction and the endpoint bank is full.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \return Boolean true if the currently selected endpoint may be read from or written to, depending on its direction
+				 */
+				static inline bool Endpoint_IsReadWriteAllowed(void);
+				
+				/** Determines if the currently selected endpoint is configured.
+				 *
+				 *  \return Boolean true if the currently selected endpoint has been configured, false otherwise
+				 */
+				static inline bool Endpoint_IsConfigured(void);
+				
+				/** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
+				 *  interrupt duration has elapsed. Which endpoints have interrupted can be determined by
+				 *  masking the return value against (1 << {Endpoint Number}).
+				 *
+				 *  \return Mask whose bits indicate which endpoints have interrupted
+				 */
+				static inline uint8_t Endpoint_GetEndpointInterrupts(void);
+				
+				/** Clears the endpoint interrupt flag. This clears the specified endpoint number's interrupt
+				 *  mask in the endpoint interrupt flag register.
+				 *
+				 *  \param EndpointNumber  Index of the endpoint whose interrupt flag should be cleared
+				 */
+				static inline void Endpoint_ClearEndpointInterrupt(uint8_t EndpointNumber);
+				
+				/** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
+				 *  endpoints).
+				 *
+				 *  \param EndpointNumber  Index of the endpoint whose interrupt flag should be tested
+				 *
+				 *  \return Boolean true if the specified endpoint has interrupted, false otherwise
+				 */
+				static inline bool Endpoint_HasEndpointInterrupted(uint8_t EndpointNumber);
+				
+				/** Determines if the selected IN endpoint is ready for a new packet.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \return Boolean true if the current endpoint is ready for an IN packet, false otherwise.
+				 */
+				static inline bool Endpoint_IsINReady(void);
+				
+				/** Determines if the selected OUT endpoint has received new packet.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \return Boolean true if current endpoint is has received an OUT packet, false otherwise.
+				 */
+				static inline bool Endpoint_IsOUTReceived(void);
+				
+				/** Determines if the current CONTROL type endpoint has received a SETUP packet.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \return Boolean true if the selected endpoint has received a SETUP packet, false otherwise.
+				 */
+				static inline bool Endpoint_IsSETUPReceived(void);
+				
+				/** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
+				 *  endpoint for the next packet.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \note This is not applicable for non CONTROL type endpoints.			 
+				 */
+				static inline void Endpoint_ClearControlSETUP(void);
+				
+				/** Sends an IN packet to the host on the currently selected CONTROL type endpoint, freeing up the
+				 *  endpoint for the next packet.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \note For non CONTROL type endpoints, use Endpoint_ClearIN() instead.			 
+				 */
+				static inline void Endpoint_ClearControlIN(void);
+				
+				/** Acknowledges an OUT packet to the host on the currently selected CONTROL type endpoint, freeing
+				 *  up the endpoint for the next packet.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \note For non CONTROL type endpoints, use Endpoint_ClearOUT() instead.
+				 */
+				static inline void Endpoint_ClearControlOUT(void);
+				
+				/** Sends an IN packet to the host on the currently selected non CONTROL type endpoint, freeing
+				 *  up the endpoint for the next packet and switching to the alternative endpoint bank if double banked.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \note For CONTROL type endpoints, use Endpoint_ClearControlIN() instead.
+				 */
+				static inline void Endpoint_ClearIN(void);
+				
+				/** Acknowledges an OUT packet to the host on the currently selected non CONTROL type endpoint, freeing
+				 *  up the endpoint for the next packet and switching to the alternative endpoint bank if double banked.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \note For CONTROL type endpoints, use Endpoint_ClearControlOUT() instead.
+				 */
+				static inline void Endpoint_ClearOUT(void);
+				
+				/** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
+				 *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
+				 *  way for devices to indicate invalid commands to the host so that the current transfer can be
+				 *  aborted and the host can begin its own recovery sequence.
+				 *
+				 *  The currently selected endpoint remains stalled until either the Endpoint_ClearStall() macro
+				 *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
+				 *  endpoint.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 */
+				static inline void Endpoint_StallTransaction(void);
+				
+				/** Clears the STALL condition on the currently selected endpoint.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 */
+				static inline void Endpoint_ClearStall(void);
+				
+				/** Determines if the currently selected endpoint is stalled, false otherwise.
+				 *
+				 *  \ingroup Group_EndpointPacketManagement
+				 *
+				 *  \return Boolean true if the currently selected endpoint is stalled, false otherwise
+				 */
+				static inline bool Endpoint_IsStalled(void);
+				
+				/** Resets the data toggle of the currently selected endpoint. */
+				static inline void Endpoint_ResetDataToggle(void);
+				
+				/** Determines the currently selected endpoint's direction.
+				 *
+				 *  \return The currently selected endpoint's direction, as a ENDPOINT_DIR_* mask.
+				 */
+				static inline uint8_t Endpoint_GetEndpointDirection(void);
+			#else
+				#if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__)
+					#define Endpoint_BytesInEndpoint()        UEBCX
+				#else
+					#define Endpoint_BytesInEndpoint()        UEBCLX
+				#endif
+				
+				#define Endpoint_GetCurrentEndpoint()         (UENUM & ENDPOINT_EPNUM_MASK)
+				
+				#define Endpoint_SelectEndpoint(epnum)        MACROS{ UENUM = epnum; }MACROE
 
-			/** Enables the currently selected endpoint so that data can be sent and received through it to
-			 *  and from a host.
-			 *
-			 *  \note Endpoints must first be configured properly rather than just being enabled via the
-			 *        Endpoint_ConfigureEndpoint() macro, which calls Endpoint_EnableEndpoint() automatically.
-			 */
-			#define Endpoint_EnableEndpoint()             MACROS{ UECONX |= (1 << EPEN); }MACROE
+				#define Endpoint_ResetFIFO(epnum)             MACROS{ UERST = (1 << epnum); UERST = 0; }MACROE
 
-			/** Disables the currently selected endpoint so that data cannot be sent and received through it
-			 *  to and from a host.
-			 */
-			#define Endpoint_DisableEndpoint()            MACROS{ UECONX &= ~(1 << EPEN); }MACROE
+				#define Endpoint_EnableEndpoint()             MACROS{ UECONX |= (1 << EPEN); }MACROE
 
-			/** Returns true if the currently selected endpoint is enabled, false otherwise. */
-			#define Endpoint_IsEnabled()                  ((UECONX & (1 << EPEN)) ? true : false)
+				#define Endpoint_DisableEndpoint()            MACROS{ UECONX &= ~(1 << EPEN); }MACROE
 
-			/** Returns true if the currently selected endpoint may be read from (if data is waiting in the endpoint
-			 *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an
-			 *  IN direction). This function will return false if an error has occurred in the endpoint, or if
-			 *  the endpoint is an OUT direction and no packet has been received, or if the endpoint is an IN
-			 *  direction and the endpoint bank is full.
-			 */
-			#define Endpoint_ReadWriteAllowed()           ((UEINTX & (1 << RWAL)) ? true : false)
+				#define Endpoint_IsEnabled()                  ((UECONX & (1 << EPEN)) ? true : false)
 
-			/** Returns true if the currently selected endpoint is configured, false otherwise. */
-			#define Endpoint_IsConfigured()               ((UESTA0X & (1 << CFGOK)) ? true : false)
+				#define Endpoint_IsReadWriteAllowed()         ((UEINTX & (1 << RWAL)) ? true : false)
 
-			/** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
-			 *  interrupt duration has elapsed. Which endpoints have interrupted can be determined by
-			 *  masking the return value against (1 << {Endpoint Number}).
-			 */
-			#define Endpoint_GetEndpointInterrupts()      UEINT
+				#define Endpoint_IsConfigured()               ((UESTA0X & (1 << CFGOK)) ? true : false)
 
-			/** Clears the endpoint interrupt flag. This clears the specified endpoint number's interrupt
-			 *  mask in the endpoint interrupt flag register.
-			 */
-			#define Endpoint_ClearEndpointInterrupt(n)    MACROS{ UEINT &= ~(1 << n); }MACROE
+				#define Endpoint_GetEndpointInterrupts()      UEINT
 
-			/** Returns true if the specified endpoint number has interrupted (valid only for INTERRUPT type
-			 *  endpoints), false otherwise.
-			 */
-			#define Endpoint_HasEndpointInterrupted(n)    ((UEINT & (1 << n)) ? true : false)
+				#define Endpoint_ClearEndpointInterrupt(n)    MACROS{ UEINT &= ~(1 << n); }MACROE
 
-			/** Clears the currently selected endpoint bank, and switches to the alternate bank if the currently
-			 *  selected endpoint is dual-banked. When cleared, this either frees the bank up for the next packet
-			 *  from the host (if the endpoint is of the OUT direction) or sends the packet contents to the host
-			 *  (if the endpoint is of the IN direction).
-			 */
-			#define Endpoint_ClearCurrentBank()           MACROS{ UEINTX &= ~(1 << FIFOCON); }MACROE
-			
-			/** Returns true if the current CONTROL type endpoint is ready for an IN packet, false otherwise. */
-			#define Endpoint_IsSetupINReady()             ((UEINTX & (1 << TXINI))  ? true : false)
+				#define Endpoint_HasEndpointInterrupted(n)    ((UEINT & (1 << n)) ? true : false)
+				
+				#define Endpoint_IsINReady()                 ((UEINTX & (1 << TXINI))  ? true : false)
+				
+				#define Endpoint_IsOUTReceived()             ((UEINTX & (1 << RXOUTI)) ? true : false)
 
-			/** Returns true if the current CONTROL type endpoint is ready for an OUT packet, false otherwise. */
-			#define Endpoint_IsSetupOUTReceived()         ((UEINTX & (1 << RXOUTI)) ? true : false)
+				#define Endpoint_IsSETUPReceived()            ((UEINTX & (1 << RXSTPI)) ? true : false)
 
-			/** Returns true if the current CONTROL type endpoint is ready for a SETUP packet, false otherwise. */
-			#define Endpoint_IsSetupReceived()            ((UEINTX & (1 << RXSTPI)) ? true : false)
+				#define Endpoint_ClearControlSETUP()          MACROS{ UEINTX &= ~(1 << RXSTPI); }MACROE
 
-			/** Clears a received SETUP packet on the currently selected CONTROL type endpoint. */
-			#define Endpoint_ClearSetupReceived()         MACROS{ UEINTX &= ~(1 << RXSTPI); }MACROE
+				#define Endpoint_ClearControlIN()             MACROS{ UEINTX &= ~(1 << TXINI); }MACROE
 
-			/** Sends an IN packet to the host on the currently selected CONTROL type endpoint. */
-			#define Endpoint_ClearSetupIN()               MACROS{ UEINTX &= ~(1 << TXINI); }MACROE
+				#define Endpoint_ClearControlOUT()            MACROS{ UEINTX &= ~(1 << RXOUTI); }MACROE
 
-			/** Acknowledges an OUT packet to the host on the currently selected CONTROL type endpoint, freeing
-			 *  up the endpoint for the next packet.
-			 */
-			#define Endpoint_ClearSetupOUT()              MACROS{ UEINTX &= ~(1 << RXOUTI); }MACROE
+				#define Endpoint_ClearIN()                    MACROS{ UEINTX &= ~(1 << TXINI); UEINTX &= ~(1 << FIFOCON); }MACROE
 
-			/** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
-			 *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
-			 *  way for devices to indicate invalid commands to the host so that the current transfer can be
-			 *  aborted and the host can begin its own recovery sequence.
-			 *
-			 *  The currently selected endpoint remains stalled until either the Endpoint_ClearStall() macro
-			 *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
-			 *  endpoint.
-			 */
-			#define Endpoint_StallTransaction()           MACROS{ UECONX |= (1 << STALLRQ); }MACROE
+				#define Endpoint_ClearOUT()                   MACROS{ UEINTX &= ~(1 << RXOUTI); UEINTX &= ~(1 << FIFOCON); }MACROE
 
-			/** Clears the stall on the currently selected endpoint. */
-			#define Endpoint_ClearStall()                 MACROS{ UECONX |= (1 << STALLRQC); }MACROE
+				#define Endpoint_StallTransaction()           MACROS{ UECONX |= (1 << STALLRQ); }MACROE
 
-			/** Returns true if the currently selected endpoint is stalled, false otherwise. */
-			#define Endpoint_IsStalled()                  ((UECONX & (1 << STALLRQ)) ? true : false)
+				#define Endpoint_ClearStall()                 MACROS{ UECONX |= (1 << STALLRQC); }MACROE
 
-			/** Resets the data toggle of the currently selected endpoint. */
-			#define Endpoint_ResetDataToggle()            MACROS{ UECONX |= (1 << RSTDT); }MACROE
+				#define Endpoint_IsStalled()                  ((UECONX & (1 << STALLRQ)) ? true : false)
+
+				#define Endpoint_ResetDataToggle()            MACROS{ UECONX |= (1 << RSTDT); }MACROE
+				
+				#define Endpoint_GetEndpointDirection()       (UECFG0X & ENDPOINT_DIR_IN)
+			#endif
 
 		/* Enums: */
-			/** Enum for the possible error return codes of the Endpoint_WaitUntilReady function */
+			/** Enum for the possible error return codes of the Endpoint_WaitUntilReady function.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 */
 			enum Endpoint_WaitUntilReady_ErrorCodes_t
 			{
 				ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */
@@ -299,7 +463,10 @@
 				                                                 */
 			};
 		
-			/** Enum for the possible error return codes of the Endpoint_*_Stream_* functions. */
+			/** Enum for the possible error return codes of the Endpoint_*_Stream_* functions.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 */
 			enum Endpoint_Stream_RW_ErrorCodes_t
 			{
 				ENDPOINT_RWSTREAM_ERROR_NoError            = 0, /**< Command completed successfully, no error. */
@@ -318,7 +485,10 @@
 				                                                 */
 			};
 			
-			/** Enum for the possible error return codes of the Endpoint_*_Control_Stream_* functions. */
+			/** Enum for the possible error return codes of the Endpoint_*_Control_Stream_* functions..
+			 *
+			 *  \ingroup Group_EndpointRW
+			 */
 			enum Endpoint_ControlStream_RW_ErrorCodes_t
 			{
 				ENDPOINT_RWCSTREAM_ERROR_NoError            = 0, /**< Command completed successfully, no error. */
@@ -326,21 +496,34 @@
 			};
 
 		/* Inline Functions: */
-			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints. */
+			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \return Next byte in the currently selected endpoint's FIFO buffer
+			 */
 			static inline uint8_t Endpoint_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint8_t Endpoint_Read_Byte(void)
 			{
 				return UEDATX;
 			}
 
-			/** Writes one byte from the currently selected endpoint's bank, for IN direction endpoints. */
+			/** Writes one byte from the currently selected endpoint's bank, for IN direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \param Byte  Next byte to write into the the currently selected endpoint's FIFO buffer
+			 */
 			static inline void Endpoint_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_Byte(const uint8_t Byte)
 			{
 				UEDATX = Byte;
 			}
 
-			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints. */
+			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 */
 			static inline void Endpoint_Discard_Byte(void) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Discard_Byte(void)
 			{
@@ -351,6 +534,10 @@
 			
 			/** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \return Next word in the currently selected endpoint's FIFO buffer
 			 */
 			static inline uint16_t Endpoint_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint16_t Endpoint_Read_Word_LE(void)
@@ -365,6 +552,10 @@
 
 			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \return Next word in the currently selected endpoint's FIFO buffer
 			 */
 			static inline uint16_t Endpoint_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint16_t Endpoint_Read_Word_BE(void)
@@ -379,6 +570,10 @@
 
 			/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \param Word  Next word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_Word_LE(const uint16_t Word)
@@ -389,6 +584,10 @@
 			
 			/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \param Word  Next word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_Word_BE(const uint16_t Word)
@@ -397,7 +596,10 @@
 				UEDATX = (Word & 0xFF);
 			}
 
-			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints. */
+			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 */
 			static inline void Endpoint_Discard_Word(void) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Discard_Word(void)
 			{
@@ -409,6 +611,10 @@
 
 			/** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \return Next double word in the currently selected endpoint's FIFO buffer
 			 */
 			static inline uint32_t Endpoint_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint32_t Endpoint_Read_DWord_LE(void)
@@ -429,6 +635,10 @@
 
 			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \return Next double word in the currently selected endpoint's FIFO buffer
 			 */
 			static inline uint32_t Endpoint_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint32_t Endpoint_Read_DWord_BE(void)
@@ -449,6 +659,10 @@
 
 			/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \param DWord  Next double word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_DWord_LE(const uint32_t DWord)
@@ -461,6 +675,10 @@
 			
 			/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
 			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW
+			 *
+			 *  \param DWord  Next double word to write to the currently selected endpoint's FIFO buffer
 			 */
 			static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Write_DWord_BE(const uint32_t DWord)
@@ -471,7 +689,10 @@
 				UEDATX = (DWord &  0xFF);
 			}
 
-			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints. */
+			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.	
+			 *
+			 *  \ingroup Group_EndpointRW
+			 */
 			static inline void Endpoint_Discard_DWord(void) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_Discard_DWord(void)
 			{
@@ -539,6 +760,8 @@
 			 *
 			 *  \note This routine should not be called on CONTROL type endpoints.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \return A value from the Endpoint_WaitUntilReady_ErrorCodes_t enum.
 			 */
 			uint8_t Endpoint_WaitUntilReady(void);
@@ -546,7 +769,7 @@
 			/** Reads and discards the given number of bytes from the endpoint from the given buffer,
 			 *  discarding fully read packets from the host as needed. The last packet is not automatically
 			 *  discarded once the remaining bytes has been read; the user is responsible for manually
-			 *  discarding the last packet from the host via the Endpoint_ClearCurrentBank() macro. Between
+			 *  discarding the last packet from the host via the Endpoint_ClearOUT() macro. Between
 			 *  each USB packet, the given stream callback function is executed repeatedly until the next
 			 *  packet is ready, allowing for early aborts of stream transfers.
 			 *
@@ -556,6 +779,8 @@
 			 *
 			 *  \note This routine should not be used on CONTROL type endpoints.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Length    Number of bytes to send via the currently selected endpoint.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
@@ -570,7 +795,7 @@
 			/** Writes the given number of bytes to the endpoint from the given buffer in little endian,
 			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
 			 *  the user is responsible for manually sending the last written packet to the host via the
-			 *  Endpoint_ClearCurrentBank() macro. Between each USB packet, the given stream callback function
+			 *  Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function
 			 *  is executed repeatedly until the endpoint is ready to accept the next packet, allowing for early
 			 *  aborts of stream transfers.
 			 *
@@ -580,6 +805,8 @@
 			 *
 			 *  \note This routine should not be used on CONTROL type endpoints.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer    Pointer to the source data buffer to read from.
 			 *  \param Length    Number of bytes to read for the currently selected endpoint into the buffer.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -595,7 +822,7 @@
 			/** Writes the given number of bytes to the endpoint from the given buffer in big endian,
 			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
 			 *  the user is responsible for manually sending the last written packet to the host via the
-			 *  Endpoint_ClearCurrentBank() macro. Between each USB packet, the given stream callback function
+			 *  Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function
 			 *  is executed repeatedly until the endpoint is ready to accept the next packet, allowing for early
 			 *  aborts of stream transfers.
 			 *
@@ -605,6 +832,8 @@
 			 *
 			 *  \note This routine should not be used on CONTROL type endpoints.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer    Pointer to the source data buffer to read from.
 			 *  \param Length    Number of bytes to read for the currently selected endpoint into the buffer.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -620,7 +849,7 @@
 			/** Reads the given number of bytes from the endpoint from the given buffer in little endian,
 			 *  discarding fully read packets from the host as needed. The last packet is not automatically
 			 *  discarded once the remaining bytes has been read; the user is responsible for manually
-			 *  discarding the last packet from the host via the Endpoint_ClearCurrentBank() macro. Between
+			 *  discarding the last packet from the host via the Endpoint_ClearOUT() macro. Between
 			 *  each USB packet, the given stream callback function is executed repeatedly until the endpoint
 			 *  is ready to accept the next packet, allowing for early aborts of stream transfers.
 			 *
@@ -630,6 +859,8 @@
 			 *
 			 *  \note This routine should not be used on CONTROL type endpoints.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer    Pointer to the destination data buffer to write to.
 			 *  \param Length    Number of bytes to send via the currently selected endpoint.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -645,7 +876,7 @@
 			/** Reads the given number of bytes from the endpoint from the given buffer in big endian,
 			 *  discarding fully read packets from the host as needed. The last packet is not automatically
 			 *  discarded once the remaining bytes has been read; the user is responsible for manually
-			 *  discarding the last packet from the host via the Endpoint_ClearCurrentBank() macro. Between
+			 *  discarding the last packet from the host via the Endpoint_ClearOUT() macro. Between
 			 *  each USB packet, the given stream callback function is executed repeatedly until the endpoint
 			 *  is ready to accept the next packet, allowing for early aborts of stream transfers.
 			 *
@@ -655,6 +886,8 @@
 			 *
 			 *  \note This routine should not be used on CONTROL type endpoints.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer    Pointer to the destination data buffer to write to.
 			 *  \param Length    Number of bytes to send via the currently selected endpoint.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -670,13 +903,15 @@
 			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,
 			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
 			 *  in both failure and success states; the user is responsible for manually clearing the setup OUT to
-			 *  finalize the transfer via the Endpoint_ClearSetupOUT() macro.
+			 *  finalize the transfer via the Endpoint_ClearControlOUT() macro.
 			 *
 			 *  \note This routine should only be used on CONTROL type endpoints.
 			 *
 			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 			 *           together; i.e. the entire stream data must be read or written at the one time.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer  Pointer to the source data buffer to read from.
 			 *  \param Length  Number of bytes to read for the currently selected endpoint into the buffer.
 			 *
@@ -687,13 +922,15 @@
 			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,
 			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
 			 *  in both failure and success states; the user is responsible for manually clearing the setup OUT to
-			 *  finalize the transfer via the Endpoint_ClearSetupOUT() macro.
+			 *  finalize the transfer via the Endpoint_ClearControlOUT() macro.
 			 *
 			 *  \note This routine should only be used on CONTROL type endpoints.
 			 *
 			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 			 *           together; i.e. the entire stream data must be read or written at the one time.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer  Pointer to the source data buffer to read from.
 			 *  \param Length  Number of bytes to read for the currently selected endpoint into the buffer.
 			 *
@@ -704,13 +941,15 @@
 			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,
 			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
 			 *  automatically sent after success or failure states; the user is responsible for manually sending the
-			 *  setup IN to finalize the transfer via the Endpoint_ClearSetupIN() macro.
+			 *  setup IN to finalize the transfer via the Endpoint_ClearControlIN() macro.
 			 *
 			 *  \note This routine should only be used on CONTROL type endpoints.
 			 *
 			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 			 *           together; i.e. the entire stream data must be read or written at the one time.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer  Pointer to the destination data buffer to write to.
 			 *  \param Length  Number of bytes to send via the currently selected endpoint.
 			 *
@@ -721,80 +960,21 @@
 			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,
 			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
 			 *  automatically sent after success or failure states; the user is responsible for manually sending the
-			 *  setup IN to finalize the transfer via the Endpoint_ClearSetupIN() macro.
+			 *  setup IN to finalize the transfer via the Endpoint_ClearControlIN() macro.
 			 *
 			 *  \note This routine should only be used on CONTROL type endpoints.
 			 *
 			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 			 *           together; i.e. the entire stream data must be read or written at the one time.
 			 *
+			 *  \ingroup Group_EndpointRW
+			 *
 			 *  \param Buffer  Pointer to the destination data buffer to write to.
 			 *  \param Length  Number of bytes to send via the currently selected endpoint.
 			 *
 			 *  \return A value from the Endpoint_ControlStream_RW_ErrorCodes_t enum.
 			 */
-			uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length)  ATTR_NON_NULL_PTR_ARG(1);
-
-		/* Function Aliases: */
-			/** Alias for Endpoint_Discard_Byte().
-			 */
-			#define Endpoint_Ignore_Byte()                      Endpoint_Discard_Byte()
-
-			/** Alias for Endpoint_Discard_Word().
-			 */
-			#define Endpoint_Ignore_Word()                      Endpoint_Discard_Word()		
-
-			/** Alias for Endpoint_Discard_DWord().
-			 */
-			#define Endpoint_Ignore_DWord()                     Endpoint_Discard_DWord()
-		
-			/** Alias for Endpoint_Read_Word_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Endpoint_Read_Word()                        Endpoint_Read_Word_LE()   
-
-			/** Alias for Endpoint_Write_Word_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Endpoint_Write_Word(Word)                   Endpoint_Write_Word_LE(Word)
-
-			/** Alias for Endpoint_Read_DWord_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Endpoint_Read_DWord()                       Endpoint_Read_DWord_LE()
-
-			/** Alias for Endpoint_Write_DWord_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Endpoint_Write_DWord(DWord)                 Endpoint_Write_DWord_LE(DWord)
-
-			/** Alias for Endpoint_Read_Stream_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#if !defined(NO_STREAM_CALLBACKS)
-				#define Endpoint_Read_Stream(Buffer, Length, Callback) Endpoint_Read_Stream_LE(Buffer, Length, Callback)
-			#else
-				#define Endpoint_Read_Stream(Buffer, Length)           Endpoint_Read_Stream_LE(Buffer, Length)
-			#endif
-
-			/** Alias for Endpoint_Write_Stream_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#if !defined(NO_STREAM_CALLBACKS)
-				#define Endpoint_Write_Stream(Buffer, Length, Callback) Endpoint_Write_Stream_LE(Buffer, Length, Callback)
-			#else
-				#define Endpoint_Write_Stream(Buffer, Length)           Endpoint_Write_Stream_LE(Buffer, Length)
-			#endif
-
-			/** Alias for Endpoint_Read_Control_Stream_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Endpoint_Read_Control_Stream(Data, Length)  Endpoint_Read_Control_Stream_LE(Data, Length)
-
-			/** Alias for Endpoint_Write_Control_Stream_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Endpoint_Write_Control_Stream(Data, Length) Endpoint_Write_Control_Stream_LE(Data, Length)			
+			uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length)  ATTR_NON_NULL_PTR_ARG(1);		
 			
 	/* Private Interface - For use in library only: */
 	#if !defined(__DOXYGEN__)
@@ -868,3 +1048,5 @@
 		#endif
 		
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c
index 52f19a5fd75ab6ffb821826c4038a344064757f6..fe02f7cd15dd11c3b68738a9f6de97a593ec816b 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.c
+++ b/LUFA/Drivers/USB/LowLevel/Host.c
@@ -87,7 +87,7 @@ void USB_Host_ResetDevice(void)
 	USB_INT_Disable(USB_INT_DDISCI);
 	
 	USB_Host_ResetBus();
-	while (!(USB_Host_IsResetBusDone()));
+	while (!(USB_Host_IsBusResetComplete()));
 
 	USB_INT_Clear(USB_INT_HSOFI);
 	USB_Host_ResumeBus();	
diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h
index 18eebfec1dbece4ed0cd8eec9727abe33fdc6ad5..1ff2d7ab2d6d4ce0e2e8adf56214f999572898e8 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.h
+++ b/LUFA/Drivers/USB/LowLevel/Host.h
@@ -34,6 +34,14 @@
  *  the USB controller is initialized in host mode.
  */
 
+/** \ingroup Group_USB
+ *  @defgroup Group_Host Host Management
+ *
+ *  Functions, macros, variables, enums and types related to the management of a USB host when in Host mode.
+ *
+ *  @{
+ */
+ 
 #ifndef __USBHOST_H__
 #define __USBHOST_H__
 
@@ -81,64 +89,94 @@
 				 */
 				#define HOST_DEVICE_SETTLE_DELAY_MS        1500
 			#endif
-			
-			/** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
-			 *  USB bus resets leave the default control pipe configured (if already configured).
-			 *
-			 *  If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
-			 *  woken up automatically and the bus resumed after the reset has been correctly issued.
-			 */
-			#define USB_Host_ResetBus()                MACROS{ UHCON |=  (1 << RESET);          }MACROE
+		
+		/* Psuedo-Function Macros: */
+			#if defined(__DOXYGEN__)
+				/** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
+				 *  USB bus resets leave the default control pipe configured (if already configured).
+				 *
+				 *  If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
+				 *  woken up automatically and the bus resumed after the reset has been correctly issued.
+				 */
+				static inline void USB_Host_ResetBus(void);
 
-			/** Determines if a previously issued bus reset (via the USB_Host_ResetBus() macro) has
-			 *  completed. This macro returns true if no bus reset is currently being sent, false
-			 *  otherwise.
-			 */
-			#define USB_Host_IsResetBusDone()                ((UHCON &   (1 << RESET)) ? false : true)
-			
-			/** Resumes USB communications with an attached and enumerated device, by resuming the transmission
-			 *  of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
-			 *  host and attached device may occur.
-			 */
-			#define USB_Host_ResumeBus()               MACROS{ UHCON |=  (1 << SOFEN);          }MACROE 
+				/** Determines if a previously issued bus reset (via the USB_Host_ResetBus() macro) has
+				 *  completed.
+				 *
+				 *  \return Boolean true if no bus reset is currently being sent, false otherwise.
+				 */
+				static inline void USB_Host_IsBusResetComplete(void);
 
-			/** Suspends the USB bus, preventing any communications from occurring between the host and attached
-			 *  device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
-			 *  messages to the device.
-			 */
-			#define USB_Host_SuspendBus()              MACROS{ UHCON &= ~(1 << SOFEN);          }MACROE 
-			
-			/** Returns true if the USB bus has been suspended via the use of the USB_Host_SuspendBus() macro,
-			 *  false otherwise. While suspended, no USB communications can occur until the bus is resumed,
-			 *  except for the Remote Wakeup event from the device if supported.
-			 */
-			#define USB_Host_IsBusSuspended()                ((UHCON &   (1 << SOFEN)) ? false : true)
-		
-			/** Returns true if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
-			 *  false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
-			 */
-			#define USB_Host_IsDeviceFullSpeed()             ((USBSTA &  (1 << SPEED)) ? true : false)
+				/** Resumes USB communications with an attached and enumerated device, by resuming the transmission
+				 *  of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
+				 *  host and attached device may occur.
+				 */
+				static inline void USB_Host_ResumeBus(void);
 
-			/** Returns true if the attached device is currently issuing a Remote Wakeup request, requesting
-			 *  that the host resume the USB bus and wake up the device, false otherwise.
-			 */
-			#define USB_Host_IsRemoteWakeupSent()            ((UHINT &   (1 << RXRSMI)) ? true : false)
+				/** Suspends the USB bus, preventing any communications from occurring between the host and attached
+				 *  device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
+				 *  messages to the device.
+				 */
+				static inline void USB_Host_SuspendBus(void);
+				
+				/** Determines if the USB bus has been suspended via the use of the USB_Host_SuspendBus() macro,
+				 *  false otherwise. While suspended, no USB communications can occur until the bus is resumed,
+				 *  except for the Remote Wakeup event from the device if supported.
+				 *
+				 *  \return Boolean true if the bus is currently suspended, false otherwise
+				 */
+				 static inline bool USB_Host_IsBusSuspended(void);
+				 
+				/** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
+				 *  false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
+				 *
+				 *  \return Boolean true if the attached device is enumerated in Full Speed mode, false otherwise
+				 */
+				static inline bool USB_Host_IsDeviceFullSpeed(void);
 
-			/** Clears the flag indicating that a Remote Wakeup request has been issued by an attached
-			 *  device.
-			 */
-			#define USB_Host_ClearRemoteWakeupSent()   MACROS{ UHINT &= ~(1 << RXRSMI);         }MACROE
+				/** Determines if the attached device is currently issuing a Remote Wakeup request, requesting
+				 *  that the host resume the USB bus and wake up the device, false otherwise.
+				 *
+				 *  \return Boolean true if the attached device has sent a Remote Wakeup request, false otherwise
+				 */
+				static inline bool USB_Host_IsRemoteWakeupSent(void);
 
-			/** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
-			 *  a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
-			 *  be resumed.
-			 */
-			#define USB_Host_ResumeFromWakeupRequest() MACROS{ UHCON |=  (1 << RESUME);         }MACROE
+				/** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */
+				static inline void USB_Host_ClearRemoteWakeupSent(void);
+
+				/** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
+				 *  a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
+				 *  be resumed.
+				 */
+				static inline void USB_Host_ResumeFromWakeupRequest(void);
+				
+				/** Determines if a resume from Remote Wakeup request is currently being sent to an attached
+				 *  device.
+				 *
+				 *  \return Boolean true if no resume request is currently being sent, false otherwise
+				 */
+				static inline bool USB_Host_IsResumeFromWakeupRequestSent(void);
+			#else
+				#define USB_Host_ResetBus()                MACROS{ UHCON |=  (1 << RESET);          }MACROE
+
+				#define USB_Host_IsBusResetComplete()      ((UHCON &   (1 << RESET)) ? false : true)
+
+				#define USB_Host_ResumeBus()               MACROS{ UHCON |=  (1 << SOFEN);          }MACROE 
+
+				#define USB_Host_SuspendBus()              MACROS{ UHCON &= ~(1 << SOFEN);          }MACROE 
+				
+				#define USB_Host_IsBusSuspended()                ((UHCON &   (1 << SOFEN)) ? false : true)
 			
-			/** Returns true if no resume from Remote Wakeup request is currently being sent to an attached
-			 *  device, false otherwise.
-			 */
-			#define USB_Host_IsResumeFromWakeupRequestSent() ((UHCON &   (1 << RESUME)) ? false : true)
+				#define USB_Host_IsDeviceFullSpeed()             ((USBSTA &  (1 << SPEED)) ? true : false)
+
+				#define USB_Host_IsRemoteWakeupSent()            ((UHINT &   (1 << RXRSMI)) ? true : false)
+
+				#define USB_Host_ClearRemoteWakeupSent()   MACROS{ UHINT &= ~(1 << RXRSMI);         }MACROE
+
+				#define USB_Host_ResumeFromWakeupRequest() MACROS{ UHCON |=  (1 << RESUME);         }MACROE
+				
+				#define USB_Host_IsResumeFromWakeupRequestSent() ((UHCON &   (1 << RESUME)) ? false : true)
+			#endif
 
 		/* Enums: */
 			/** Enum for the various states of the USB Host state machine. Only some states are
@@ -241,5 +279,7 @@
 		#if defined(__cplusplus)
 			}
 		#endif
-
+	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.c b/LUFA/Drivers/USB/LowLevel/HostChapter9.c
index 5367c984cb1ac37fc45d9a12e9aeb3b0f7914b0c..c89910e63004cb1f2e176c3737ce37005ec01ef1 100644
--- a/LUFA/Drivers/USB/LowLevel/HostChapter9.c
+++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.c
@@ -52,19 +52,17 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
 
 	Pipe_SetToken(PIPE_TOKEN_SETUP);
 	Pipe_ClearErrorFlags();
-	Pipe_ClearSetupSent();
 
 	Pipe_Unfreeze();
 
 	for (uint8_t HeaderByte = 0; HeaderByte < sizeof(USB_Host_Request_Header_t); HeaderByte++)
 	  Pipe_Write_Byte(*(HeaderStream++));
 
-	Pipe_ClearSetupOUT();
+	Pipe_ClearControlSETUP();
 	
 	if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_SetupSent)))
 	  goto End_Of_Control_Send;
 
-	Pipe_ClearSetupSent();
 	Pipe_Freeze();
 
 	if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
@@ -93,7 +91,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
 				}
 
 				Pipe_Freeze();
-				Pipe_ClearSetupIN();
+				Pipe_ClearControlIN();
 			}
 		}
 
@@ -103,7 +101,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
 		if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady)))
 		  goto End_Of_Control_Send;
 
-		Pipe_ClearSetupOUT();
+		Pipe_ClearControlOUT();
 
 		if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady)))
 		  goto End_Of_Control_Send;
@@ -126,7 +124,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
 					DataLen--;
 				}
 				
-				Pipe_ClearSetupOUT();
+				Pipe_ClearControlOUT();
 			}
 
 			if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady)))
@@ -141,7 +139,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
 		if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_InReceived)))
 		  goto End_Of_Control_Send;
 
-		Pipe_ClearSetupIN();
+		Pipe_ClearControlIN();
 	}
 
 End_Of_Control_Send:
@@ -159,9 +157,9 @@ static uint8_t USB_Host_Wait_For_Setup_IOS(const uint8_t WaitType)
 {
 	uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
 	
-	while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSetupSent())       ||
-	         ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsSetupINReceived()) ||
-	         ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsSetupOUTReady())))
+	while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSETUPSent())       ||
+	         ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
+	         ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsOUTReady())))
 	{
 		uint8_t ErrorCode;
 
diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.h b/LUFA/Drivers/USB/LowLevel/HostChapter9.h
index 7ced889b33a3a05281ffa98e5c7efc0d72bf154b..8e7695b34ea0f25635257e933e445ecd79c123b1 100644
--- a/LUFA/Drivers/USB/LowLevel/HostChapter9.h
+++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.h
@@ -58,6 +58,8 @@
 			 *
 			 *  \see StdRequestType.h for information on the request type and data.
 			 *  \see The USB 2.0 specification for more information on standard control requests.
+			 *
+			 *  \ingroup Group_PipeControlReq
 			 */
 			typedef struct
 			{
@@ -71,6 +73,8 @@
 		/* Enums: */
 			/** Enum for the USB_Host_SendControlRequest() return code, indicating the reason for the error
 			 *  if the transfer of the request is unsuccessful.
+			 *
+			 *  \ingroup Group_PipeControlReq
 			 */
 			enum USB_Host_SendControlErrorCodes_t
 			{
@@ -89,6 +93,8 @@
 			/** Global for the request to send via the USB_Host_SendControlRequest() function. This
 			 *  global should be filled with the correct control request data before sending the request to
 			 *  the attached device while in host mode.
+			 *
+			 *  \ingroup Group_PipeControlReq
 			 */
 			extern USB_Host_Request_Header_t USB_HostRequest;
 			
@@ -97,6 +103,8 @@
 			 *  and transfers the data stored in the buffer to the device, or from the device to the buffer
 			 *  as requested. The transfer is made on the currently selected pipe.
 			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
 			 *  \param BufferPtr  Pointer to the start of the data buffer if the request has a data stage, or
 			 *                    NULL if the request transfers no data to or from the device.
 			 *
diff --git a/LUFA/Drivers/USB/LowLevel/LowLevel.h b/LUFA/Drivers/USB/LowLevel/LowLevel.h
index 07be4396d2cd1e9af79741e0e288b0a235f34b30..a6f506f3b0ec8c218e4bbded6b4d375f5acd145d 100644
--- a/LUFA/Drivers/USB/LowLevel/LowLevel.h
+++ b/LUFA/Drivers/USB/LowLevel/LowLevel.h
@@ -34,6 +34,14 @@
  *  USB interface in either device or (if supported) host mode.
  */
 
+/** \ingroup Group_USB
+ *  @defgroup Group_USBManagement USB Interface Management
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ *  @{
+ */
+
 #ifndef __USBLOWLEVEL_H__
 #define __USBLOWLEVEL_H__
 
@@ -70,7 +78,6 @@
 	/* Preprocessor Checks and Defines: */
 		#if !defined(F_CLOCK)
 			#error F_CLOCK is not defined. You must device F_CLOCK to the frequency of the unprescaled input clock in your project makefile.
-			#define F_CLOCK 0
 		#endif
 	
 		#if (F_CLOCK == 8000000)
@@ -376,3 +383,5 @@
 		#endif
 			
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/LowLevel/OTG.h b/LUFA/Drivers/USB/LowLevel/OTG.h
index 88a955403938dcf7a8d4d59a6e1b9e74f129742e..caef82cb6b09bd3b1fff04950b76a405b12b414d 100644
--- a/LUFA/Drivers/USB/LowLevel/OTG.h
+++ b/LUFA/Drivers/USB/LowLevel/OTG.h
@@ -35,6 +35,14 @@
  *
  *  \note These macros are only for AVRs which support the OTG protocol, and do not exist for device-only AVRs.
  */
+ 
+/** \ingroup Group_USB
+ *  @defgroup Group_OTGManagement USB On The Go (OTG) Management
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of dual role devices.
+ *
+ *  @{
+ */
 
 #ifndef __USBOTG_H__
 #define __USBOTG_H__
@@ -47,46 +55,6 @@
 
 	/* Public Interface - May be used in end-application: */
 		/* Macros: */
-			/** Initiate a Host Negotiation Protocol request. This indicates to the other connected device
-			 *  that the device wishes to change device/host roles.
-			 */
-			#define USB_OTG_DEV_Request_HNP()          MACROS{ OTGCON |=  (1 << HNPREQ); }MACROE
-
-			/** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other
-			 *  connected device.
-			 */
-			#define USB_OTG_DEV_Cancel_HNP_Request()   MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE
-
-			/** Returns boolean false if not currently sending a HNP to the other connected device, or true
-			 *  if a HNP is currently being issued.
-			 */
-			#define USB_OTG_DEV_IsSendingHNP()               ((OTGCON &   (1 << HNPREQ)) ? true : false)
-			
-			/** Accepts a HNP from a connected device, indicating that both devices should exchange
-			 *  device/host roles.
-			 */
-			#define USB_OTG_HOST_Accept_HNP()          USB_OTG_DEV_Request_HNP()
-
-			/** Rejects a HNP from a connected device, indicating that both devices should remain in their
-			 *  current device/host roles.
-			 */
-			#define USB_OTG_HOST_Reject_HNP()          USB_OTG_DEV_Cancel_HNP_Request()
-			
-			/** Returns boolean false if the connected device is not currently sending a HNP request, or true
-			 *  if a HNP is currently being issued by the connected device.
-			 */
-			#define USB_OTG_HOST_IsHNPReceived()             ((OTGCON &   (1 << HNPREQ)) ? true : false)
-			
-			/** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB
-			 *  interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in
-			 *  host mode indicates that VBUS should be applied and a session started.
-			 *
-			 *  There are two different methods of sending a SRP - either pulses on the VBUS line, or by
-			 *  pulsing the Data + line via the internal pull-up resistor. The SRP mode is given as the
-			 *  "type" parameter, and can be either USB_OTG_SRP_VBUS or USB_OTG_STP_DATA.
-			 */
-			#define USB_OTG_DEV_Initiate_SRP(type)     MACROS{ OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (type | (1 << SRPREQ))); }MACROE
-
 			/** Mask for the VBUS pulsing method of SRP, supported by some OTG devices.
 			 *
 			 *  \see USB_OTG_DEV_Initiate_SRP()
@@ -99,4 +67,67 @@
 			 */			 
 			#define USB_OTG_STP_DATA                   0
 
+		/* Psuedo-Function Macros: */
+			#if defined(__DOXYGEN__)
+				/** Initiate a Host Negotiation Protocol request. This indicates to the other connected device
+				 *  that the device wishes to change device/host roles.
+				 */
+				static inline void USB_OTG_DEV_Request_HNP(void);
+				
+				/** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other
+				 *  connected device.
+				 */
+				static inline void USB_OTG_DEV_Cancel_HNP_Request(void);
+				
+				/** Determines if the device is currently sending a HNP to an attached host.
+				 *
+				 *  \return Boolean true if currently sending a HNP to the other connected device, false otherwise
+				 */
+				static inline bool USB_OTG_DEV_IsSendingHNP(void);
+				
+				/** Accepts a HNP from a connected device, indicating that both devices should exchange
+				 *  device/host roles.
+				 */
+				static inline void USB_OTG_HOST_Accept_HNP(void);
+				
+				/** Rejects a HNP from a connected device, indicating that both devices should remain in their
+				 *  current device/host roles.
+				 */
+				static inline void USB_OTG_HOST_Reject_HNP(void);
+				
+				/** Indicates if the connected device is not currently sending a HNP request.
+				 *
+				 *  \return Boolean true if a HNP is currently being issued by the connected device, false otherwise.
+				 */
+				static inline bool USB_OTG_HOST_IsHNPReceived(void);
+				
+				/** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB
+				 *  interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in
+				 *  host mode indicates that VBUS should be applied and a session started.
+				 *
+				 *  There are two different methods of sending a SRP - either pulses on the VBUS line, or by
+				 *  pulsing the Data + line via the internal pull-up resistor.
+				 *
+				 *  \param SRPTypeMask  Mask indicating the type of SRP to use, either USB_OTG_SRP_VBUS or USB_OTG_STP_DATA.
+				 */
+				static inline void USB_OTG_DEV_Initiate_SRP(uint8_t SRPTypeMask);
+			#else
+
+				#define USB_OTG_DEV_Request_HNP()          MACROS{ OTGCON |=  (1 << HNPREQ); }MACROE
+
+				#define USB_OTG_DEV_Cancel_HNP_Request()   MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE
+
+				#define USB_OTG_DEV_IsSendingHNP()               ((OTGCON &   (1 << HNPREQ)) ? true : false)
+				
+				#define USB_OTG_HOST_Accept_HNP()          MACROS{ OTGCON |=  (1 << HNPREQ); }MACROE
+
+				#define USB_OTG_HOST_Reject_HNP()         MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE
+				
+				#define USB_OTG_HOST_IsHNPReceived()             ((OTGCON &   (1 << HNPREQ)) ? true : false)
+				
+				#define USB_OTG_DEV_Initiate_SRP(type)     MACROS{ OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (type | (1 << SRPREQ))); }MACROE
+			#endif
+	
 #endif
+			
+/** @} */
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c
index 1218d2f24743d78772dccda75a12258859d63657..5850fcf7c15d17a6c3320c70963a02c09b1a00a6 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.c
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.c
@@ -74,8 +74,19 @@ uint8_t Pipe_WaitUntilReady(void)
 
 	USB_INT_Clear(USB_INT_HSOFI);
 
-	while (!(Pipe_ReadWriteAllowed()))
+	for (;;)
 	{
+		if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
+		{
+			if (Pipe_IsINReceived())
+			  return PIPE_READYWAIT_NoError;
+		}
+		else
+		{
+			if (Pipe_IsOUTReady())
+			  return PIPE_READYWAIT_NoError;		
+		}
+
 		if (Pipe_IsStalled())
 		  return PIPE_READYWAIT_PipeStalled;
 		else if (!(USB_IsConnected))
@@ -89,8 +100,6 @@ uint8_t Pipe_WaitUntilReady(void)
 			  return PIPE_READYWAIT_Timeout;
 		}
 	}
-	
-	return PIPE_READYWAIT_NoError;
 }
 
 uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length
@@ -107,9 +116,9 @@ uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Pipe_ReadWriteAllowed()))
+		if (!(Pipe_IsReadWriteAllowed()))
 		{
-			Pipe_ClearCurrentBank();
+			Pipe_ClearOUT();
 				
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -119,8 +128,10 @@ uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length
 			if ((ErrorCode = Pipe_WaitUntilReady()))
 			  return ErrorCode;
 		}
-
-		Pipe_Write_Byte(*(DataStream++));
+		else
+		{
+			Pipe_Write_Byte(*(DataStream++));
+		}
 	}
 
 	return PIPE_RWSTREAM_ERROR_NoError;
@@ -140,9 +151,9 @@ uint8_t Pipe_Write_Stream_BE(const void* Data, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Pipe_ReadWriteAllowed()))
+		if (!(Pipe_IsReadWriteAllowed()))
 		{
-			Pipe_ClearCurrentBank();
+			Pipe_ClearOUT();
 				
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -152,8 +163,10 @@ uint8_t Pipe_Write_Stream_BE(const void* Data, uint16_t Length
 			if ((ErrorCode = Pipe_WaitUntilReady()))
 			  return ErrorCode;
 		}
-
-		Pipe_Write_Byte(*(DataStream--));
+		else
+		{
+			Pipe_Write_Byte(*(DataStream--));
+		}
 	}
 
 	return PIPE_RWSTREAM_ERROR_NoError;
@@ -172,9 +185,9 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Pipe_ReadWriteAllowed()))
+		if (!(Pipe_IsReadWriteAllowed()))
 		{
-			Pipe_ClearCurrentBank();
+			Pipe_ClearIN();
 				
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -184,8 +197,10 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 			if ((ErrorCode = Pipe_WaitUntilReady()))
 			  return ErrorCode;
 		}
-
-		Pipe_Discard_Byte();
+		else
+		{
+			Pipe_Discard_Byte();
+		}
 	}
 
 	return PIPE_RWSTREAM_ERROR_NoError;
@@ -205,9 +220,9 @@ uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Pipe_ReadWriteAllowed()))
+		if (!(Pipe_IsReadWriteAllowed()))
 		{
-			Pipe_ClearCurrentBank();
+			Pipe_ClearIN();
 				
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -217,8 +232,10 @@ uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length
 			if ((ErrorCode = Pipe_WaitUntilReady()))
 			  return ErrorCode;
 		}
-		
-		*(DataStream++) = Pipe_Read_Byte();
+		else
+		{
+			*(DataStream++) = Pipe_Read_Byte();
+		}
 	}
 
 	return PIPE_RWSTREAM_ERROR_NoError;
@@ -238,9 +255,9 @@ uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length
 
 	while (Length--)
 	{
-		if (!(Pipe_ReadWriteAllowed()))
+		if (!(Pipe_IsReadWriteAllowed()))
 		{
-			Pipe_ClearCurrentBank();
+			Pipe_ClearIN();
 				
 			#if !defined(NO_STREAM_CALLBACKS)
 			if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
@@ -250,8 +267,10 @@ uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length
 			if ((ErrorCode = Pipe_WaitUntilReady()))
 			  return ErrorCode;
 		}
-
-		*(DataStream--) = Pipe_Read_Byte();
+		else
+		{
+			*(DataStream--) = Pipe_Read_Byte();
+		}
 	}
 	
 	return PIPE_RWSTREAM_ERROR_NoError;
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h
index 46a10e493cf365847bcbab6feecff0122ef186d3..253ce2a93a8332c4b78c9caa959685ed83fbc613 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.h
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.h
@@ -35,6 +35,29 @@
  *  send/recieve functions for various data types.
  */
  
+/** \ingroup Group_USB
+ *  @defgroup Group_PipeManagement Pipe Management
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of pipes while in USB Device mode.
+ *
+ *  @{
+ */
+
+/** @defgroup Group_PipeRW Pipe Data Reading and Writing
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
+ */
+ 
+/** @defgroup Group_PipePacketManagement Pipe Packet Management
+ *
+ *  Functions, macros, variables, enums and types related to packet management of pipes.
+ */
+ 
+/** @defgroup Group_PipeControlReq Pipe Control Request Management
+ *
+ *  Functions, macros, variables, enums and types related to control request management of pipes.
+ */
+
 #ifndef __PIPE_H__
 #define __PIPE_H__
 
@@ -221,158 +244,339 @@
 			 */
 			#define PIPE_INT_STALL                 UPIENX, (1 << RXSTALLE), UPINTX, (1 << RXSTALLI)
 
-			/** Indicates the number of bytes currently stored in the current pipe's selected bank. */
-			#define Pipe_BytesInPipe()             UPBCX
+		/* Psuedo-Function Macros: */
+			#if defined(__DOXYGEN__)
+				/** Indicates the number of bytes currently stored in the current pipes's selected bank.
+				 *
+				 *  \note The return width of this function may differ, depending on the maximum pipe bank size
+				 *        of the selected AVR model.
+				 *
+				 *  \ingroup Group_PipeRW
+				 *
+				 *  \return Total number of bytes in the currently selected Pipe's FIFO buffer
+				 */
+				static inline uint16_t Pipe_BytesInPipe(void);
+				
+				/** Returns the pipe address of the currently selected pipe. This is typically used to save the
+				 *  currently selected pipe number so that it can be restored after another pipe has been manipulated.
+				 *
+				 *  \return Index of the currently selected pipe
+				 */
+				static inline uint8_t Pipe_GetCurrentPipe(void);
+
+				/** Selects the given pipe number. Any pipe operations which do not require the pipe number to be
+				 *  indicated will operate on the currently selected pipe.
+				 *
+				 *  \param PipeNumber  Index of the pipe to select
+				 */
+				static inline void Pipe_SelectPipe(uint8_t PipeNumber);
+				
+				/** Resets the desired pipe, including the pipe banks and flags.
+				 *
+				 *  \param PipeNumber  Index of the pipe to reset
+				 */
+				static inline void Pipe_ResetPipe(uint8_t PipeNumber);
+				
+				/** Enables the currently selected pipe so that data can be sent and received through it to and from
+				 *  an attached device.
+				 *
+				 *  \note Pipes must first be configured properly rather than just being enabled via the
+				 *        Pipe_ConfigurePipe() macro, which calls Pipe_EnablePipe() automatically.
+				 */
+				static inline void Pipe_EnablePipe(void);
+
+				/** Disables the currently selected pipe so that data cannot be sent and received through it to and
+				 *  from an attached device.
+				 */
+				static inline void Pipe_DisablePipe(void);
+
+				/** Determines if the currently selected pipe is enabled, but not necessarily configured.
+				 *
+				 * \return Boolean True if the currently selected pipe is enabled, false otherwise
+				 */
+				static inline bool Pipe_IsEnabled(void);
+				
+				/** Gets the current pipe token, indicating the pipe's data direction and type.
+				 *
+				 *  \return The current pipe token, as a PIPE_TOKEN_* mask
+				 */
+				static inline uint8_t Pipe_GetCurrentToken(void);
+				
+				/** Sets the token for the currently selected pipe to one of the tokens specified by the PIPE_TOKEN_*
+				 *  masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during
+				 *  control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
+				 *  which have two endpoints of opposite direction sharing the same endpoint address within the device.
+				 *
+				 *  \param Token  New pipe token to set the selected pipe to, as a PIPE_TOKEN_* mask
+				 */
+				static inline void Pipe_SetPipeToken(uint8_t Token);
+				
+				/** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
+				static inline void Pipe_SetInfiniteINRequests(void);
+				
+				/** Configures the currently selected pipe to only allow the specified number of IN requests to be
+				 *  accepted by the pipe before it is automatically frozen.
+				 *
+				 *  \param TotalINRequests  Total number of IN requests that the pipe may receive before freezing
+				 */
+				static inline void Pipe_SetFiniteINRequests(uint8_t TotalINRequests);
+
+				/** Determines if the currently selected pipe is configured.
+				 *
+				 *  \return Boolean true if the selected pipe is configured, false otherwise
+				 */
+				static inline bool Pipe_IsConfigured(void);
+				
+				/** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
+				 *
+				 *  \param Milliseconds  Number of milliseconds between each pipe poll
+				 */
+				static inline void Pipe_SetInterruptPeriod(uint8_t Milliseconds);
+				
+				/** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
+				 *  be serviced.
+				 *
+				 *  \return Mask whose bits indicate which pipes have interrupted
+				 */
+				static inline uint8_t Pipe_GetPipeInterrupts(void);
+				
+				/** Clears the interrupt flag for the specified pipe number.
+				 *
+				 *  \param PipeNumber  Index of the pipe whose interrupt flag is to be cleared
+				 */
+				static inline void Pipe_ClearPipeInterrupt(uint8_t PipeNumber);
+				
+				/** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type
+				 *  pipes).
+				 *
+				 *  \param PipeNumber  Index of the pipe whose interrupt flag should be tested
+				 *
+				 *  \return Boolean true if the specified pipe has interrupted, false otherwise
+				 */
+				static inline bool Pipe_HasPipeInterrupted(uint8_t PipeNumber);
+				
+				/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
+				static inline void Pipe_Unfreeze(void);
+				
+				/** Freezes the selected pipe, preventing it from communicating with an attached device. */
+				static inline void Pipe_Freeze(void);
 
-			/** Resets the desired pipe, including the pipe banks and flags. */
-			#define Pipe_ResetPipe(pipenum)        MACROS{ UPRST = (1 << pipenum); UPRST = 0; }MACROE
+				/** Clears the master pipe error flag. */
+				static inline void Pipe_ClearError(void);
+				
+				/** Determines if the master pipe error flag is set for the currently selected pipe, indicating that
+				 *  some sort of hardware error has occurred on the pipe.
+				 *
+				 *  \see Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
+				 *
+				 *  \return Boolean true if an error has ocurred on the selected pipe, false otherwise
+				 */
+				static inline bool Pipe_IsError(void);
+				
+				/** Clears all the currently selected pipe's hardware error flags, but does not clear the master error
+				 *  flag for the pipe.
+				 */
+				static inline void Pipe_ClearErrorFlags(void);
+				
+				/** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This
+				 *  value can then be masked against the PIPE_ERRORFLAG_* masks to determine what error has occurred.
+				 *
+				 *  \return  Mask comprising of PIPE_ERRORFLAG_* bits indicating what error has ocurred on the selected pipe
+				 */
+				static inline uint8_t Pipe_GetErrorFlags(void);
+				
+				/** Determines if the currently selected pipe may be read from (if data is waiting in the pipe
+				 *  bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
+				 *  direction). This function will return false if an error has occurred in the pipe, or if the pipe
+				 *  is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT
+				 *  direction and the pipe bank is full.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *  
+				 *  \return Boolean true if the currently selected pipe may be read from or written to, depending on its direction
+				 */
+				static inline bool Pipe_IsReadWriteAllowed(void);
+				
+				/** Determines if an IN request has been received on the currently selected pipe.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \return Boolean true if the current pipe has received an IN packet, false otherwise.
+				 */
+				static inline bool Pipe_IsINReceived(void);
+				
+				/** Determines if the currently selected pipe is ready to send an OUT request.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \return Boolean true if the current pipe is ready for an OUT packet, false otherwise.
+				 */
+				static inline bool Pipe_IsOUTReady(void);
+
+				/** Determines if no SETUP request is currently being sent to the attached device on the selected
+				 *  CONTROL type pipe.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \return Boolean true if the current pipe is ready for a SETUP packet, false otherwise.
+				 */
+				static inline bool Pipe_IsSETUPSent(void);
+				
+				/** Acknowledges the reception of a setup IN request from the attached device on the currently selected
+				 *  CONTROL type pipe, freeing the bank ready for the next packet.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \note For non CONTROL type pipes, use Pipe_ClearIN() instead.			 
+				 */
+				static inline void Pipe_ClearControlIN(void);
+
+				/** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
+				 *  the bank ready for the next packet.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \note For non CONTROL type pipes, use Pipe_ClearOUT() instead.	
+				 */
+				static inline void Pipe_ClearControlOUT(void);
+
+				/** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \note This is not applicable for non CONTROL type pipes.			
+				 */
+				static inline void Pipe_ClearControlSETUP(void);
+
+				/** Acknowledges the reception of a setup IN request from the attached device on the currently selected
+				 *  pipe, freeing the bank ready for the next packet.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \note For CONTROL type pipes, use Pipe_ClearControlIN() instead.	
+				 */
+				static inline void Pipe_ClearIN(void);
+
+				/** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
+				 *  the bank ready for the next packet.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \note For CONTROL type pipes, use Pipe_ClearControlOUT() instead.	
+				 */
+				static inline void Pipe_ClearOUT(void);
+
+				/** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
+				 *  the currently selected pipe. This occurs when the host sends a packet to the device, but the device
+				 *  is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
+				 *  received, it must be cleared using Pipe_ClearNAKReceived() before the previous (or any other) packet
+				 *  can be re-sent.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \return Boolean true if an NAK has been received on the current pipe, false otherwise
+				 */
+				static inline bool Pipe_IsNAKReceived(void);
+
+				/** Clears the NAK condition on the currently selected pipe.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \see Pipe_IsNAKReceived() for more details.
+				 */
+				static inline void Pipe_ClearNAKReceived(void);
+				 
+				/** Determines if the currently selected pipe has had the STALL condition set by the attached device.
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 *
+				 *  \return Boolean true if the current pipe has been stalled by the attached device, false otherwise
+				*/
+				static inline bool Pipe_IsStalled(void);
+				
+				/** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the
+				 *  STALL condition itself (this must be done via a ClearFeature control request to the device).
+				 *
+				 *  \ingroup Group_PipePacketManagement
+				 */
+				static inline void Pipe_ClearStall(void);
+			#else
+				#define Pipe_BytesInPipe()             UPBCX
 
-			/** Selects the given pipe number. Any pipe operations which do not require the pipe number to be
-			 *  indicated will operate on the currently selected pipe.
-			 */
-			#define Pipe_SelectPipe(pipenum)       MACROS{ UPNUM = pipenum; }MACROE
+				#define Pipe_GetCurrentPipe()          (UPNUM & PIPE_PIPENUM_MASK)
 
-			/** Returns the pipe address of the currently selected pipe. This is typically used to save the
-			 *  currently selected pipe number so that it can be restored after another pipe has been manipulated.
-			 */
-			#define Pipe_GetCurrentPipe()          (UPNUM & PIPE_PIPENUM_MASK)
+				#define Pipe_SelectPipe(pipenum)       MACROS{ UPNUM = pipenum; }MACROE
+				
+				#define Pipe_ResetPipe(pipenum)        MACROS{ UPRST = (1 << pipenum); UPRST = 0; }MACROE
 
-			/** Enables the currently selected pipe so that data can be sent and received through it to and from
-			 *  an attached device.
-			 *
-			 *  \note Pipes must first be configured properly rather than just being enabled via the
-			 *        Pipe_ConfigurePipe() macro, which calls Pipe_EnablePipe() automatically.
-			 */
-			#define Pipe_EnablePipe()              MACROS{ UPCONX |= (1 << PEN); }MACROE
+				#define Pipe_EnablePipe()              MACROS{ UPCONX |= (1 << PEN); }MACROE
 
-			/** Disables the currently selected pipe so that data cannot be sent and received through it to and
-			 *  from an attached device.
-			 */
-			#define Pipe_DisablePipe()             MACROS{ UPCONX &= ~(1 << PEN); }MACROE
+				#define Pipe_DisablePipe()             MACROS{ UPCONX &= ~(1 << PEN); }MACROE
 
-			/** Returns true if the currently selected pipe is enabled, false otherwise. */
-			#define Pipe_IsEnabled()               ((UPCONX & (1 << PEN)) ? true : false)
+				#define Pipe_IsEnabled()               ((UPCONX & (1 << PEN)) ? true : false)
 
-			/** Sets the token for the currently selected endpoint to one of the tokens specified by the PIPE_TOKEN_*
-			 *  masks. This should only be used on CONTROL type endpoints, to allow for bidirectional transfer of
-			 *  data during control requests.
-			 */
-			#define Pipe_SetToken(token)           MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | token); }MACROE
-			
-			/** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
-			#define Pipe_SetInfiniteINRequests()   MACROS{ UPCONX |= (1 << INMODE); }MACROE
+				#define Pipe_GetPipeToken()            (UPCFG0X & PIPE_TOKEN_MASK)
 
-			/** Configures the currently selected pipe to only allow the specified number of IN requests to be
-			 *  accepted by the pipe before it is automatically frozen.
-			 */
-			#define Pipe_SetFiniteINRequests(n)    MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = n; }MACROE
+				#define Pipe_SetToken(token)           MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | token); }MACROE
+				
+				#define Pipe_SetInfiniteINRequests()   MACROS{ UPCONX |= (1 << INMODE); }MACROE
 
-			/** Returns true if the currently selected pipe is configured, false otherwise. */
-			#define Pipe_IsConfigured()            ((UPSTAX  & (1 << CFGOK)) ? true : false)
+				#define Pipe_SetFiniteINRequests(n)    MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = n; }MACROE
 
-			/** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds. */
-			#define Pipe_SetInterruptPeriod(ms)    MACROS{ UPCFG2X = ms; }MACROE
+				#define Pipe_IsConfigured()            ((UPSTAX  & (1 << CFGOK)) ? true : false)
 
-			/** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
-			 *  be serviced.
-			 */
-			#define Pipe_GetPipeInterrupts()       UPINT
+				#define Pipe_SetInterruptPeriod(ms)    MACROS{ UPCFG2X = ms; }MACROE
 
-			/** Clears the interrupt flag for the specified pipe number. */
-			#define Pipe_ClearPipeInterrupt(n)     MACROS{ UPINT &= ~(1 << n); }MACROE
+				#define Pipe_GetPipeInterrupts()       UPINT
 
-			/** Returns true if the specified pipe's interrupt period has elapsed, false otherwise. */
-			#define Pipe_HasPipeInterrupted(n)     ((UPINT & (1 << n)) ? true : false)
-			
-			/** Clears the pipe bank, and switches to the alternate bank if the currently selected pipe is
-			 *  dual-banked. When cleared, this either frees the bank up for the next packet from the host
-			 *  (if the endpoint is of the OUT direction) or sends the packet contents to the host (if the
-			 *  pipe is of the IN direction).
-			 */
-			#define Pipe_ClearCurrentBank()        MACROS{ UPINTX &= ~(1 << FIFOCON); }MACROE
+				#define Pipe_ClearPipeInterrupt(n)     MACROS{ UPINT &= ~(1 << n); }MACROE
 
-			/** Unfreezes the pipe, allowing it to communicate with an attached device. */
-			#define Pipe_Unfreeze()                MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE
+				#define Pipe_HasPipeInterrupted(n)     ((UPINT & (1 << n)) ? true : false)
 
-			/** Freezes the pipe, preventing it from communicating with an attached device. */
-			#define Pipe_Freeze()                  MACROS{ UPCONX |= (1 << PFREEZE); }MACROE
+				#define Pipe_Unfreeze()                MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE
 
-			/** Clears the master pipe error flag. */
-			#define Pipe_ClearError()              MACROS{ UPINTX &= ~(1 << PERRI); }MACROE
+				#define Pipe_Freeze()                  MACROS{ UPCONX |= (1 << PFREEZE); }MACROE
 
-			/** Returns true if the master pipe error flag is set for the currently selected pipe, indicating that
-			 *  some sort of hardware error has occurred on the pipe.
-			 *
-			 *  \see Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
-			 */
-			#define Pipe_IsError()                 ((UPINTX & (1 << PERRI)) ? true : false)
-			
-			/** Clears all the currently selected pipe's hardware error flags, but does not clear the master error
-			 *  flag for the pipe. */
-			#define Pipe_ClearErrorFlags()         MACROS{ UPERRX = 0; }MACROE
+				#define Pipe_ClearError()              MACROS{ UPINTX &= ~(1 << PERRI); }MACROE
 
-			/** Returns a mask of the hardware error flags which have occurred on the currently selected pipe. This
-			 *  value can then be masked against the PIPE_ERRORFLAG_* masks to determine what error has occurred.
-			 */
-			#define Pipe_GetErrorFlags()           UPERRX
+				#define Pipe_IsError()                 ((UPINTX & (1 << PERRI)) ? true : false)
+				
+				#define Pipe_ClearErrorFlags()         MACROS{ UPERRX = 0; }MACROE
 
-			/** Returns true if the currently selected pipe may be read from (if data is waiting in the pipe
-			 *  bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
-			 *  direction). This function will return false if an error has occurred in the pipe, or if the pipe
-			 *  is an IN direction and no packet has been received, or if the pipe is an OUT direction and the
-			 *  pipe bank is full.
-			 */
-			#define Pipe_ReadWriteAllowed()        ((UPINTX & (1 << RWAL)) ? true : false)
+				#define Pipe_GetErrorFlags()           UPERRX
 
-			/** Clears the flag indicating that a SETUP request has been sent to the attached device from the
-			 *  currently selected CONTROL type pipe.
-			 */
-			#define Pipe_ClearSetupSent()          MACROS{ UPINTX &= ~(1 << TXSTPI); }MACROE
+				#define Pipe_IsReadWriteAllowed()      ((UPINTX & (1 << RWAL)) ? true : false)
 
-			/** Returns true if no SETUP request is currently being sent to the attached device, false otherwise. */
-			#define Pipe_IsSetupSent()             ((UPINTX & (1 << TXSTPI)) ? true : false)
+				#define Pipe_IsINReceived()            ((UPINTX & (1 << RXINI)) ? true : false)
 
-			/** Returns true if the currently selected pipe has been stalled by the attached device, false otherwise. */
-			#define Pipe_IsStalled()               ((UPINTX & (1 << RXSTALLI)) ? true : false)
+				#define Pipe_IsOUTReady()              ((UPINTX & (1 << TXOUTI)) ? true : false)
 
-			/** Clears the stall condition on the currently selected pipe. */
-			#define Pipe_ClearStall()              MACROS{ UPINTX &= ~(1 << RXSTALLI); }MACROE             
+				#define Pipe_IsSETUPSent()             ((UPINTX & (1 << TXSTPI)) ? true : false)
 
-			/** Returns true if an IN request has been received on the currently selected CONTROL type pipe, false
-			 *  otherwise.
-			 */
-			#define Pipe_IsSetupINReceived()       ((UPINTX & (1 << RXINI)) ? true : false)
+				#define Pipe_ClearIN()                 MACROS{ UPINTX &= ~(1 << RXINI); UPINTX &= ~(1 << FIFOCON); }MACROE
 
-			/** Returns true if the currently selected CONTROL type pipe is ready to send an OUT request, false
-			 *  otherwise.
-			 */
-			#define Pipe_IsSetupOUTReady()         ((UPINTX & (1 << TXOUTI)) ? true : false)
+				#define Pipe_ClearControlIN()          MACROS{ UPINTX &= ~(1 << RXINI); UPINTX &= ~(1 << FIFOCON); }MACROE
 
-			/** Acknowledges the reception of a setup IN request from the attached device on the currently selected
-			 *  CONTROL type endpoint, allowing for the transmission of a setup OUT packet, or the reception of
-			 *  another setup IN packet.
-			 */
-			#define Pipe_ClearSetupIN()            MACROS{ UPINTX &= ~(1 << RXINI); UPINTX &= ~(1 << FIFOCON); }MACROE
+				#define Pipe_ClearOUT()                MACROS{ UPINTX &= ~(1 << TXOUTI); UPINTX &= ~(1 << FIFOCON); }MACROE
+				
+				#define Pipe_ClearControlOUT()         MACROS{ UPINTX &= ~(1 << TXOUTI); UPINTX &= ~(1 << FIFOCON); }MACROE
 
-			/** Sends the currently selected CONTROL type pipe's contents to the device as a setup OUT packet. */
-			#define Pipe_ClearSetupOUT()           MACROS{ UPINTX &= ~(1 << TXOUTI); UPINTX &= ~(1 << FIFOCON); }MACROE
-			
-			/** Returns true if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
-			 *  the currently selected pipe. This occurs when the host sends a packet to the device, but the device
-			 *  is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
-			 *  received, it must be cleared using Pipe_ClearNAKReceived() before the previous (or any other) packet
-			 *  can be re-sent.
-			 */
-			#define Pipe_IsNAKReceived()           ((UPINTX & (1 << NAKEDI)) ? true : false)
+				#define Pipe_ClearControlSETUP()       MACROS{ UPINTX &= ~(1 << TXSTPI); UPINTX &= ~(1 << FIFOCON); }MACROE        
 
-			/** Clears the NAK condition on the currently selected pipe.
-			 *
-			 *  \see Pipe_IsNAKReceived() for more details.
-			 */
-			#define Pipe_ClearNAKReceived()        MACROS{ UPINTX &= ~(1 << NAKEDI); }MACROE
+				#define Pipe_IsNAKReceived()           ((UPINTX & (1 << NAKEDI)) ? true : false)
+
+				#define Pipe_ClearNAKReceived()        MACROS{ UPINTX &= ~(1 << NAKEDI); }MACROE
+
+				#define Pipe_IsStalled()               ((UPINTX & (1 << RXSTALLI)) ? true : false)
+
+				#define Pipe_ClearStall()              MACROS{ UPINTX &= ~(1 << RXSTALLI); }MACROE
+			#endif
 
 		/* Enums: */
-			/** Enum for the possible error return codes of the Pipe_WaitUntilReady function */
+			/** Enum for the possible error return codes of the Pipe_WaitUntilReady function
+			 *
+			 *  \ingroup Group_PipeRW
+			 */
 			enum Pipe_WaitUntilReady_ErrorCodes_t
 			{
 				PIPE_READYWAIT_NoError                 = 0, /**< Pipe ready for next packet, no error */
@@ -384,7 +588,10 @@
 				                                             */
 			};
 
-			/** Enum for the possible error return codes of the Pipe_*_Stream_* functions. */
+			/** Enum for the possible error return codes of the Pipe_*_Stream_* functions.
+			 *
+			 *  \ingroup Group_PipeRW
+			 */
 			enum Pipe_Stream_RW_ErrorCodes_t
 			{
 				PIPE_RWSTREAM_ERROR_NoError            = 0, /**< Command completed successfully, no error. */
@@ -402,21 +609,34 @@
 			};
 
 		/* Inline Functions: */
-			/** Reads one byte from the currently selected pipe's bank, for OUT direction pipes. */
+			/** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \return Next byte in the currently selected pipe's FIFO buffer
+			 */
 			static inline uint8_t Pipe_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint8_t Pipe_Read_Byte(void)
 			{
 				return UPDATX;
 			}
 
-			/** Writes one byte from the currently selected pipe's bank, for IN direction pipes. */
+			/** Writes one byte from the currently selected pipe's bank, for IN direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \param Byte  Next byte to write into the the currently selected pipe's FIFO buffer
+			 */
 			static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_Byte(const uint8_t Byte)
 			{
 				UPDATX = Byte;
 			}
 
-			/** Discards one byte from the currently selected pipe's bank, for OUT direction pipes. */
+			/** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 */
 			static inline void Pipe_Discard_Byte(void) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Discard_Byte(void)
 			{
@@ -427,6 +647,10 @@
 			
 			/** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \return Next word in the currently selected pipe's FIFO buffer
 			 */
 			static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint16_t Pipe_Read_Word_LE(void)
@@ -441,6 +665,10 @@
 
 			/** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \return Next word in the currently selected pipe's FIFO buffer
 			 */
 			static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint16_t Pipe_Read_Word_BE(void)
@@ -455,6 +683,10 @@
 			
 			/** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \param Word  Next word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_Word_LE(const uint16_t Word)
@@ -465,6 +697,10 @@
 			
 			/** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \param Word  Next word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_Word_BE(const uint16_t Word)
@@ -473,9 +709,12 @@
 				UPDATX = (Word & 0xFF);
 			}
 
-			/** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes. */
-			static inline void Pipe_Ignore_Word(void) ATTR_ALWAYS_INLINE;
-			static inline void Pipe_Ignore_Word(void)
+			/** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 */
+			static inline void Pipe_Discard_Word(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Discard_Word(void)
 			{
 				uint8_t Dummy;
 				
@@ -485,6 +724,10 @@
 
 			/** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \return Next double word in the currently selected pipe's FIFO buffer
 			 */
 			static inline uint32_t Pipe_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint32_t Pipe_Read_DWord_LE(void)
@@ -505,6 +748,10 @@
 
 			/** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \return Next double word in the currently selected pipe's FIFO buffer
 			 */
 			static inline uint32_t Pipe_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint32_t Pipe_Read_DWord_BE(void)
@@ -525,6 +772,10 @@
 
 			/** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \param DWord  Next double word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_DWord_LE(const uint32_t DWord)
@@ -535,6 +786,10 @@
 			
 			/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
 			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipeRW
+			 *
+			 *  \param DWord  Next double word to write to the currently selected pipe's FIFO buffer
 			 */
 			static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_DWord_BE(const uint32_t DWord)
@@ -543,7 +798,10 @@
 				Pipe_Write_Word_BE(DWord);
 			}			
 			
-			/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. */
+			/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.	
+			 *
+			 *  \ingroup Group_PipeRW
+			 */
 			static inline void Pipe_Ignore_DWord(void) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Ignore_DWord(void)
 			{
@@ -595,6 +853,8 @@
 			 *
 			 *  \note This routine should not be called on CONTROL type pipes.
 			 *
+			 *  \ingroup Group_PipeRW
+			 *
 			 *  \return A value from the Pipe_WaitUntilReady_ErrorCodes_t enum.
 			 */
 			uint8_t Pipe_WaitUntilReady(void);		
@@ -602,13 +862,15 @@
 			/** Writes the given number of bytes to the pipe from the given buffer in little endian,
 			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
 			 *  the user is responsible for manually sending the last written packet to the host via the
-			 *  Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is
+			 *  Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is
 			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
 			 *
 			 *	The callback routine should be created using the STREAM_CALLBACK() macro. If the token
 			 *  NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled
 			 *  and this function has the Callback parameter omitted.
 			 *
+			 *  \ingroup Group_PipeRW
+			 *
 			 *  \param Buffer    Pointer to the source data buffer to read from.
 			 *  \param Length    Number of bytes to read for the currently selected pipe into the buffer.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -624,13 +886,15 @@
 			/** Writes the given number of bytes to the pipe from the given buffer in big endian,
 			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
 			 *  the user is responsible for manually sending the last written packet to the host via the
-			 *  Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is
+			 *  Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is
 			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
 			 *
 			 *	The callback routine should be created using the STREAM_CALLBACK() macro. If the token
 			 *  NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled
 			 *  and this function has the Callback parameter omitted.
 			 *
+			 *  \ingroup Group_PipeRW
+			 *
 			 *  \param Buffer    Pointer to the source data buffer to read from.
 			 *  \param Length    Number of bytes to read for the currently selected pipe into the buffer.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -645,7 +909,7 @@
 
 			/** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host
 			 *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the
-			 *  user is responsible for manually discarding the last packet from the host via the Pipe_ClearCurrentBank() macro.
+			 *  user is responsible for manually discarding the last packet from the device via the Pipe_ClearIN() macro.
 			 *  Between each USB packet, the given stream callback function is executed repeatedly until the next packet is ready,
 			 *  allowing for early aborts of stream transfers.
 			 *
@@ -653,6 +917,8 @@
 			 *  NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled
 			 *  and this function has the Callback parameter omitted.
 			 *
+			 *  \ingroup Group_PipeRW
+			 *
 			 *  \param Length  Number of bytes to send via the currently selected pipe.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
 			 *
@@ -667,13 +933,15 @@
 			/** Reads the given number of bytes from the pipe into the given buffer in little endian,
 			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
 			 *  the user is responsible for manually sending the last written packet to the host via the
-			 *  Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is
+			 *  Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is
 			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
 			 *
 			 *	The callback routine should be created using the STREAM_CALLBACK() macro. If the token
 			 *  NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled
 			 *  and this function has the Callback parameter omitted.
 			 *
+			 *  \ingroup Group_PipeRW
+			 *
 			 *  \param Buffer    Pointer to the source data buffer to write to.
 			 *  \param Length    Number of bytes to read for the currently selected pipe to read from.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -689,13 +957,15 @@
 			/** Reads the given number of bytes from the pipe into the given buffer in big endian,
 			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
 			 *  the user is responsible for manually sending the last written packet to the host via the
-			 *  Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is
+			 *  Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is
 			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
 			 *
 			 *	The callback routine should be created using the STREAM_CALLBACK() macro. If the token
 			 *  NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled
 			 *  and this function has the Callback parameter omitted.
 			 *
+			 *  \ingroup Group_PipeRW
+			 *
 			 *  \param Buffer    Pointer to the source data buffer to write to.
 			 *  \param Length    Number of bytes to read for the currently selected pipe to read from.
 			 *  \param Callback  Name of a callback routine to call between successive USB packet transfers, NULL if no callback
@@ -706,58 +976,7 @@
 			#if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)
 			                            , uint8_t (* const Callback)(void)
 			#endif
-			                            ) ATTR_NON_NULL_PTR_ARG(1);				
-
-		/* Function Aliases: */
-			/** Alias for Pipe_Discard_Byte().
-			 */
-			#define Pipe_Ignore_Byte()                 Pipe_Discard_Byte()
-
-			/** Alias for Pipe_Discard_Word().
-			 */
-			#define Pipe_Ignore_Word()                 Pipe_Discard_Word()		
-
-			/** Alias for Pipe_Discard_DWord().
-			 */
-			#define Pipe_Ignore_DWord()                Pipe_Discard_DWord()
-
-			/** Alias for Pipe_Read_Word_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Pipe_Read_Word()                   Pipe_Read_Word_LE()
-
-			/** Alias for Pipe_Write_Word_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Pipe_Write_Word(Word)              Pipe_Write_Word_LE(Word)
-
-			/** Alias for Pipe_Read_DWord_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Pipe_Read_DWord()                  Pipe_Read_DWord_LE()
-
-			/** Alias for Pipe_Write_DWord_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#define Pipe_Write_DWord(DWord)            Pipe_Write_DWord_LE(DWord)
-
-			/** Alias for Pipe_Read_Stream_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#if !defined(NO_STREAM_CALLBACKS)
-				#define Pipe_Read_Stream(Buffer, Length, Callback) Pipe_Read_Stream_LE(Buffer, Length, Callback)
-			#else
-				#define Pipe_Read_Stream(Buffer, Length)           Pipe_Read_Stream_LE(Buffer, Length)
-			#endif
-
-			/** Alias for Pipe_Write_Stream_LE(). By default USB transfers use little endian format, thus
-			 *  the command with no endianness specified indicates little endian mode.
-			 */
-			#if !defined(NO_STREAM_CALLBACKS)
-				#define Pipe_Write_Stream(Buffer, Length, Callback) Pipe_Read_Stream_LE(Buffer, Length, Callback)
-			#else
-				#define Pipe_Write_Stream(Buffer, Length)           Pipe_Read_Stream_LE(Buffer, Length)
-			#endif
+			                            ) ATTR_NON_NULL_PTR_ARG(1);
 			
 	/* Private Interface - For use in library only: */
 	#if !defined(__DOXYGEN__)
@@ -794,5 +1013,7 @@
 		#if defined(__cplusplus)
 			}
 		#endif
-		
+	
 #endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/USB.h b/LUFA/Drivers/USB/USB.h
index 499c59be23894b5bd09e1a2932a45953348d6695..75fff2fcdbf6377510f857548c298ed6e4a61b6c 100644
--- a/LUFA/Drivers/USB/USB.h
+++ b/LUFA/Drivers/USB/USB.h
@@ -38,6 +38,11 @@
  *  the USB library unless desired by the library user.
  */
 
+/** @defgroup Group_USB USB - LUFA/Drivers/USB/USB.h
+ *
+ *  Functions, macros, variables, enums and types related to the management of USB communications.
+ */
+
 #ifndef __USB_H__
 #define __USB_H__
 
@@ -79,5 +84,8 @@
 			#include "LowLevel/OTG.h"
 		#endif
 		
+		#include "Class/ConfigDescriptor.h"
+		#include "Class/HIDParser.h"
+		
 #endif
 
diff --git a/LUFA/Groups.txt b/LUFA/Groups.txt
new file mode 100644
index 0000000000000000000000000000000000000000..352d92e7f1cfe7da744e6aa28ee5671e4510e413
--- /dev/null
+++ b/LUFA/Groups.txt
@@ -0,0 +1,20 @@
+/** \file
+ *
+ *  This file contains special DoxyGen information for the generation of the main page and other special
+ *  documentation pages. It is not a project source file.
+ */
+
+/** @defgroup Group_BoardDrivers Board Drivers
+ *
+ *  Functions, macros, variables, enums and types related to the control of physical board hardware.
+ */
+
+/** @defgroup Group_SubsystemDrivers Subsystem Drivers
+ *
+ *  Functions, macros, variables, enums and types related to the control of AVR subsystems.
+ */
+ 
+/** @defgroup Group_MiscDrivers Miscellaneous Drivers
+ *
+ *  Miscellaneous driver Functions, macros, variables, enums and types.
+ */
\ No newline at end of file
diff --git a/LUFA/MemoryAllocator/DynAlloc.h b/LUFA/MemoryAllocator/DynAlloc.h
index dba1864cd5b2d268659df1190f9ca99accab90de..d53b8bb30cc6c58723cee3c0537e1cd7f9d3f9ea 100644
--- a/LUFA/MemoryAllocator/DynAlloc.h
+++ b/LUFA/MemoryAllocator/DynAlloc.h
@@ -51,6 +51,13 @@
  *  memory) to be freed. BLOCK_SIZE gives the number of bytes in each memory block.
  */
 
+/** @defgroup Group_MemoryAllocator Dynamic Block Memory Allocator - LUFA/MemoryAllocator/DynAlloc.h
+ *
+ *  Dynamic auto-degragmenting memory block allocator functions. See DynAlloc.h description for more details.
+ *
+ *  @{
+ */
+
 #ifndef __DYN_ALLOC__
 #define __DYN_ALLOC__
 
@@ -180,3 +187,5 @@
 	#endif
 	
 #endif
+
+/** @} */
diff --git a/LUFA/MigrationInformation.txt b/LUFA/MigrationInformation.txt
index 49fa25dea8d057224c9cc7c0789b0fe37376c8e7..e8e3065faa87dbf327d2ae53d7420d9277b70b2b 100644
--- a/LUFA/MigrationInformation.txt
+++ b/LUFA/MigrationInformation.txt
@@ -12,12 +12,48 @@
  *
  * \section Sec_MigrationXXXXXX Migrating from 090401 to XXXXXX
  *
+ *  <b>All</b>
+ *    - The ButtLoadTag.h header has been removed, as it was never used for its intended purpose. Projects should either remove all
+ *      BUTTLOADTAG elements, or download and extract ButtLoadTag.h header from the ButtLoad project.
+ *
+ *  <b>Library Demos</b>
+ *    - Most demos, bootloaders and applications have had significant changes from previous versions. Applications built off of any
+ *      library demos should update to the latest versions.
+ *
+ *  <b>Device Mode</b>
+ *    - The Endpoint_ClearCurrentBank() macro has been removed, and is now replaced with the Endpoint_ClearIN(), Endpoint_ClearOUT(),
+ *      Endpoint_ClearControlIN(), Endpoint_ClearControlOUT() and other related macros. See Endpoint.h documentation for more details
+ *      on the new endpoint management macros.
+ *    - The Endpoint_ReadWriteAllowed() macro has been renamed to Endpoint_IsReadWriteAllowed() to be more consistent with the rest of
+ *      the API naming scheme.
+ *    - The Endpoint_IsSetupINReady() and Endpoint_IsOutReceived() macros have been renamed to Endpoint_IsINReady() and
+ *      Endpoint_IsOUTReceived() respectively.
+ *    - The Endpoint_IsSetupReceived() macro has been renamed to Endpoint_IsSETUPReceived().
+ *    - The Endpoint_ClearSetupReceived() macro has been renamed to Endpoint_ClearControlSETUP().
+ *    - All endpoint read/write/discard aliases which did not have an explicity endianness specifier (such as Endpoint_Read_Word()) have
+ *      been removed for clarity. Existing projects should use the "_LE" suffix on such calls to use the explicit Little Endian versions.
+ *
  *  <b>Host Mode</b>
  *    - The USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0) to allow it to be used on
  *      other control type pipes. Care should be taken to ensure that the Control pipe is always selected before the function is called
  *      in existing projects where the Control pipe is to be operated on.
  *    - The USB Host management task now saves and restores the currently selected pipe before and after the task runs. Projects no longer
  *      need to manage this manually when calling the USB management task.
+ *    - The Pipe_ClearCurrentBank() macro has been removed, and is now replaced with the Pipe_ClearIN(), Pipe_ClearOUT(),
+ *      Pipe_ClearControlIN(), Pipe_ClearControlOUT() and other related macros. See Pipe.h documentation for more details on the new pipe
+ *      management macros.
+ *    - The Pipe_ReadWriteAllowed() macro has been renamed to Pipe_IsReadWriteAllowed() to be more consistent with the rest of the API
+ *      naming scheme.
+ *    - The Pipe_IsSetupINReceived() and Pipe_IsOutReady() macros have been renamed to Pipe_IsINReceived() and Pipe_IsOUTReady()
+ *      respectively.
+ *    - The new Pipe_ClearControlSETUP() macro should be used to send CONTROL transactions, rather than the previous Pipe_ClearSetupOUT() macro.
+ *    - The Pipe_IsSetupSent() macro has been renamed to Pipe_IsSETUPSent().
+ *    - The Pipe_ClearSetupSent() macro is no longer applicable and should be removed.
+ *    - All pipe read/write/discard aliases which did not have an explicity endianness specifier (such as Pipe_Read_Word()) have
+ *      been removed for clarity. Existing projects should use the "_LE" suffix on such calls to use the explicit Little Endian versions.
+ *    - The Host_IsResetBusDone() macro has been renamed to Host_IsBusResetComplete().
+ *    - The Pipe_Ignore_Word() function has been renamed to Pipe_Discard_Word() to remain consistent with the rest of the pipe API.
+ *
  *
  * \section Sec_Migration090401 Migrating from 090209 to 090401
  *
diff --git a/LUFA/Scheduler/Scheduler.h b/LUFA/Scheduler/Scheduler.h
index 414b0b2918432411fd2d222234b8ac6b73060120..979156e7cb14116b10cec94c277532e0e36a379b 100644
--- a/LUFA/Scheduler/Scheduler.h
+++ b/LUFA/Scheduler/Scheduler.h
@@ -65,6 +65,13 @@
  *  \endcode
  */
  
+/** @defgroup Group_Scheduler Simple Task Scheduler - LUFA/Scheduler/Scheduler.h
+ *
+ *  Simple round-robbin task scheduler. See Scheduler.h description for more details.
+ *
+ *  @{
+ */
+ 
 #ifndef __SCHEDULER_H__
 #define __SCHEDULER_H__
 
@@ -261,3 +268,5 @@
 		#endif
 		
 #endif
+
+/** @} */
diff --git a/Projects/Magstripe/Magstripe.c b/Projects/Magstripe/Magstripe.c
index 93681170a48678fe950be675b376baf20d1508dc..9132a80de96d5bd5aa9ed32c80cb67d86a4a8a96 100644
--- a/Projects/Magstripe/Magstripe.c
+++ b/Projects/Magstripe/Magstripe.c
@@ -37,12 +37,6 @@
  
 #include "Magstripe.h"
 
-/* Project Tags, for reading out using the ButtLoad project */
-BUTTLOADTAG(ProjName,    "Magstripe Reader");
-BUTTLOADTAG(BuildTime,   __TIME__);
-BUTTLOADTAG(BuildDate,   __DATE__);
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
-
 /* Scheduler Task List */
 TASK_LIST
 {
@@ -184,30 +178,30 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				if (wLength > sizeof(KeyboardReportData))
 				  wLength = sizeof(KeyboardReportData);
 
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 	
 				/* Write the report data to the control endpoint */
 				Endpoint_Write_Control_Stream_LE(&KeyboardReportData, wLength);
 				
 				/* Finalize the stream transfer to send the last packet or clear the host abort */
-				Endpoint_ClearSetupOUT();
+				Endpoint_ClearControlOUT();
 			}
 		
 			break;
 		case REQ_GetProtocol:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Write the current protocol flag to the host */
 				Endpoint_Write_Byte(UsingReportProtocol);
 				
 				/* Send the flag to the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 			
 			break;
@@ -217,14 +211,14 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				/* Read in the wValue parameter containing the new protocol mode */
 				uint16_t wValue = Endpoint_Read_Word_LE();
 				
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 
 				/* Set or clear the flag depending on what the host indicates that the current Protocol should be */
 				UsingReportProtocol = (wValue != 0x0000);
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
@@ -234,31 +228,31 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 				/* Read in the wValue parameter containing the idle period */
 				uint16_t wValue = Endpoint_Read_Word_LE();
 				
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Get idle period in MSB */
 				IdleCount = (wValue >> 8);
 				
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupINReady()));
-				Endpoint_ClearSetupIN();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_ClearControlIN();
 			}
 			
 			break;
 		case REQ_GetIdle:
 			if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
 			{		
-				Endpoint_ClearSetupReceived();
+				Endpoint_ClearControlSETUP();
 				
 				/* Write the current idle duration to the host */
 				Endpoint_Write_Byte(IdleCount);
 				
 				/* Send the flag to the host */
-				Endpoint_ClearSetupIN();
+				Endpoint_ClearControlIN();
 
 				/* Acknowledge status stage */
-				while (!(Endpoint_IsSetupOUTReceived()));
-				Endpoint_ClearSetupOUT();
+				while (!(Endpoint_IsOUTReceived()));
+				Endpoint_ClearControlOUT();
 			}
 
 			break;
@@ -410,7 +404,7 @@ TASK(USB_Keyboard_Report)
 		Endpoint_SelectEndpoint(KEYBOARD_EPNUM);
 
 		/* Check if Keyboard Endpoint Ready for Read/Write */
-		if (Endpoint_ReadWriteAllowed())
+		if (Endpoint_IsReadWriteAllowed())
 		{
 			/* Only fetch the next key to send once the period between key presses has elapsed */
 			if (!(KeyDelayRemaining))
@@ -436,7 +430,7 @@ TASK(USB_Keyboard_Report)
 				Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(USB_KeyboardReport_Data_t));
 
 				/* Finalize the stream transfer to send the last packet */
-				Endpoint_ClearCurrentBank();
+				Endpoint_ClearIN();
 
 				/* Reset the key delay period counter */
 				KeyDelayRemaining = 2;
diff --git a/Projects/Magstripe/Magstripe.h b/Projects/Magstripe/Magstripe.h
index fbf68e51cac43d10abca59b01cc3da6bc6fab24d..0393c36032198de69a51b0b709a876ae5c9d2595 100644
--- a/Projects/Magstripe/Magstripe.h
+++ b/Projects/Magstripe/Magstripe.h
@@ -50,7 +50,6 @@
 		#include "CircularBitBuffer.h"
 
 		#include <LUFA/Version.h>                    // Library Version Information
-		#include <LUFA/Common/ButtLoadTag.h>         // PROGMEM tags readable by the ButtLoad project
 		#include <LUFA/Drivers/USB/USB.h>            // USB Functionality
 		#include <LUFA/Scheduler/Scheduler.h>        // Simple scheduler for task management