diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 8164f3084ba1cc3e8a0936dec4d4744cac47d593..bff555fc4d0603183d8a78de2732f9b20176e1db 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -28,6 +28,7 @@
   *  - Rewrote the implementation of the SwapEndian_16() and SwapEndian_32() functions so that they compile down in most instances to
   *    minimal loads and stores rather than complicated shifts
   *  - The software UART in the XPLAINBridge has been largely altered to try to improve upon its performance and reliability
+  *  - The USBtoSerial project now flushes received data via a flush timer, so that several bytes can be transmitted at once
   *
   *  <b>Fixed:</b>
   *  - Fixed AVRISP project sending a LOAD EXTENDED ADDRESS command to 128KB AVRs after programming or reading from
diff --git a/Projects/Benito/Benito.c b/Projects/Benito/Benito.c
index 3b3a398601c154ee9ca47ee940f66aa571437f6f..32c663cb6bb3fc9f37e6ac81b48bc15883378438 100644
--- a/Projects/Benito/Benito.c
+++ b/Projects/Benito/Benito.c
@@ -100,7 +100,7 @@ int main(void)
 		/* Echo bytes from the target to the host via the virtual serial port */
 		while (Tx_Buffer.Count)
 		{
-			CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&Tx_Buffer));
+			CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&Tx_Buffer));
 
 			LEDs_TurnOnLEDs(LEDMASK_RX);
 			PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;
diff --git a/Projects/Benito/Lib/LightweightRingBuff.h b/Projects/Benito/Lib/LightweightRingBuff.h
index 1dc05935cc0f4113e4ccd4017c382df767f462f5..9c25707b41adcbf7033eef621340f90fdf10d111 100644
--- a/Projects/Benito/Lib/LightweightRingBuff.h
+++ b/Projects/Benito/Lib/LightweightRingBuff.h
@@ -75,12 +75,12 @@
 			Buffer->Count = 0;
 		}
 		
-		/** Inserts an element into the ring buffer.
+		/** Atomically inserts an element into the ring buffer.
 		 *
 		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
 		 *  \param[in]     Data    Data element to insert into the buffer
 		 */
-		static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+		static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
 		{
 			ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
 			{
@@ -93,13 +93,13 @@
 			}
 		}
 
-		/** Retrieves an element from the ring buffer.
+		/** Atomically retrieves an element from the ring buffer.
 		 *
 		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
 		 *
 		 *  \return Next data element stored in the buffer
 		 */
-		static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+		static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer)
 		{
 			RingBuff_Data_t Data;
 			
@@ -116,5 +116,38 @@
 			return Data;
 		}
 
+		/** Inserts an element into the ring buffer.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
+		 *  \param[in]     Data    Data element to insert into the buffer
+		 */
+		static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+		{
+			*Buffer->In = Data;
+			
+			if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
+			  Buffer->In = Buffer->Buffer;
+				  
+			Buffer->Count++;
+		}
+
+		/** Retrieves an element from the ring buffer.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
+		 *
+		 *  \return Next data element stored in the buffer
+		 */
+		static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+		{
+			RingBuff_Data_t Data = *Buffer->Out;
+			
+			if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
+			  Buffer->Out = Buffer->Buffer;
+				  
+			Buffer->Count--;
+
+			return Data;
+		}
+
 #endif
  
\ No newline at end of file
diff --git a/Projects/USBtoSerial/Lib/LightweightRingBuff.h b/Projects/USBtoSerial/Lib/LightweightRingBuff.h
index 1dc05935cc0f4113e4ccd4017c382df767f462f5..9c25707b41adcbf7033eef621340f90fdf10d111 100644
--- a/Projects/USBtoSerial/Lib/LightweightRingBuff.h
+++ b/Projects/USBtoSerial/Lib/LightweightRingBuff.h
@@ -75,12 +75,12 @@
 			Buffer->Count = 0;
 		}
 		
-		/** Inserts an element into the ring buffer.
+		/** Atomically inserts an element into the ring buffer.
 		 *
 		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
 		 *  \param[in]     Data    Data element to insert into the buffer
 		 */
-		static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+		static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
 		{
 			ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
 			{
@@ -93,13 +93,13 @@
 			}
 		}
 
-		/** Retrieves an element from the ring buffer.
+		/** Atomically retrieves an element from the ring buffer.
 		 *
 		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
 		 *
 		 *  \return Next data element stored in the buffer
 		 */
-		static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+		static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer)
 		{
 			RingBuff_Data_t Data;
 			
@@ -116,5 +116,38 @@
 			return Data;
 		}
 
+		/** Inserts an element into the ring buffer.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
+		 *  \param[in]     Data    Data element to insert into the buffer
+		 */
+		static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+		{
+			*Buffer->In = Data;
+			
+			if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
+			  Buffer->In = Buffer->Buffer;
+				  
+			Buffer->Count++;
+		}
+
+		/** Retrieves an element from the ring buffer.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
+		 *
+		 *  \return Next data element stored in the buffer
+		 */
+		static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+		{
+			RingBuff_Data_t Data = *Buffer->Out;
+			
+			if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
+			  Buffer->Out = Buffer->Buffer;
+				  
+			Buffer->Count--;
+
+			return Data;
+		}
+
 #endif
  
\ No newline at end of file
diff --git a/Projects/USBtoSerial/USBtoSerial.c b/Projects/USBtoSerial/USBtoSerial.c
index 7a0f6866a86424965938464dffd7b075535ee23c..9189868835676180a6a0e1ba4700bc63bd3b14fc 100644
--- a/Projects/USBtoSerial/USBtoSerial.c
+++ b/Projects/USBtoSerial/USBtoSerial.c
@@ -87,16 +87,22 @@ int main(void)
 			if (!(BUFFER_SIZE - USBtoUSART_Buffer.Count))
 			  break;
 			  
-			RingBuffer_Insert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
+			RingBuffer_AtomicInsert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
 		}
 		
-		/* Read bytes from the USART receive buffer into the USB IN endpoint */
-		while (USARTtoUSB_Buffer.Count)
-		  CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer));
+		/* Check if the software USART flush timer has expired */
+		if (TIFR0 & (1 << TOV0))
+		{
+			TIFR0 |= (1 << TOV0);
+
+			/* Read bytes from the USART receive buffer into the USB IN endpoint */
+			while (USARTtoUSB_Buffer.Count)
+			  CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&USARTtoUSB_Buffer));
+		}
 		
-		/* Load bytes from the USART transmit buffer into the USART */
-		while (USBtoUSART_Buffer.Count)
-		  Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer));
+		/* Load the next byte from the USART transmit buffer into the USART */
+		if (USBtoUSART_Buffer.Count)
+		  Serial_TxByte(RingBuffer_AtomicRemove(&USBtoUSART_Buffer));
 		
 		CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
 		USB_USBTask();
@@ -117,6 +123,9 @@ void SetupHardware(void)
 	Serial_Init(9600, false);
 	LEDs_Init();
 	USB_Init();
+
+	/* Configure the UART flush timer - run at Fcpu/1024 for maximum interval before overflow */
+	TCCR0B = ((1 << CS02) | (1 << CS00));
 }
 
 /** Event handler for the library USB Connection event. */
diff --git a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h
index 1dc05935cc0f4113e4ccd4017c382df767f462f5..9c25707b41adcbf7033eef621340f90fdf10d111 100644
--- a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h
+++ b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h
@@ -75,12 +75,12 @@
 			Buffer->Count = 0;
 		}
 		
-		/** Inserts an element into the ring buffer.
+		/** Atomically inserts an element into the ring buffer.
 		 *
 		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
 		 *  \param[in]     Data    Data element to insert into the buffer
 		 */
-		static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+		static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
 		{
 			ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
 			{
@@ -93,13 +93,13 @@
 			}
 		}
 
-		/** Retrieves an element from the ring buffer.
+		/** Atomically retrieves an element from the ring buffer.
 		 *
 		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
 		 *
 		 *  \return Next data element stored in the buffer
 		 */
-		static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+		static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer)
 		{
 			RingBuff_Data_t Data;
 			
@@ -116,5 +116,38 @@
 			return Data;
 		}
 
+		/** Inserts an element into the ring buffer.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
+		 *  \param[in]     Data    Data element to insert into the buffer
+		 */
+		static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+		{
+			*Buffer->In = Data;
+			
+			if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
+			  Buffer->In = Buffer->Buffer;
+				  
+			Buffer->Count++;
+		}
+
+		/** Retrieves an element from the ring buffer.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
+		 *
+		 *  \return Next data element stored in the buffer
+		 */
+		static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+		{
+			RingBuff_Data_t Data = *Buffer->Out;
+			
+			if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
+			  Buffer->Out = Buffer->Buffer;
+				  
+			Buffer->Count--;
+
+			return Data;
+		}
+
 #endif
  
\ No newline at end of file
diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c
index 1f0070319fbc1bbcce49ddcea3461979f163911e..f08dfc5c7849c75ae145c4502bc960e85c1283fd 100644
--- a/Projects/XPLAINBridge/XPLAINBridge.c
+++ b/Projects/XPLAINBridge/XPLAINBridge.c
@@ -77,9 +77,6 @@ int main(void)
 {
 	SetupHardware();
 
-	RingBuffer_InitBuffer(&USBtoUART_Buffer);
-	RingBuffer_InitBuffer(&UARTtoUSB_Buffer);
-	
 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
 	sei();
 
@@ -124,7 +121,7 @@ void UARTBridge_Task(void)
 
 	/* Read bytes from the USB OUT endpoint into the UART transmit buffer */
 	if (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface))
-	  RingBuffer_Insert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
+	  RingBuffer_AtomicInsert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
 	
 	/* Check if the software UART flush timer has expired */
 	if (TIFR0 & (1 << TOV0))
@@ -133,7 +130,7 @@ void UARTBridge_Task(void)
 
 		/* Read bytes from the UART receive buffer into the USB IN endpoint */
 		while (UARTtoUSB_Buffer.Count)
-		  CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer));
+		  CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&UARTtoUSB_Buffer));
 	}
 
 	CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
@@ -180,8 +177,12 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 	{
 		EndpointConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
 
-		/* Configure the UART flush timer - run at FCPU/1024 for maximum interval before overflow */
+		/* Configure the UART flush timer - run at Fcpu/1024 for maximum interval before overflow */
 		TCCR0B = ((1 << CS02) | (1 << CS00));
+
+		/* Initialize ring buffers used to hold serial data between USB and software UART interfaces */
+		RingBuffer_InitBuffer(&USBtoUART_Buffer);
+		RingBuffer_InitBuffer(&UARTtoUSB_Buffer);
 	}
 	else
 	{