diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
index a3ca0aaa4b6ae9d4b2e639e3b0734cceabc096a0..5ed120a62a0fa49aaa83026b517b03430df2983e 100644
--- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
+++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
@@ -196,6 +196,13 @@ void Bluetooth_Host_Task(void)
 	}
 }
 
+/** Bluetooth stack callback event for a Bluetooth connection request. When this callback fires, the
+ *  user application must indicate if the connection is to be allowed or rejected.
+ *
+ *  \param RemoteAddress  Bluetooth address of the remote device attempting the connection
+ *
+ *  \return Boolean true to accept the connection, false to reject it
+ */
 bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress)
 {
 	printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"),
@@ -207,6 +214,9 @@ bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress)
 	return true;
 }
 
+/** Bluetooth stack callback event for a completed Bluetooth connection. When this callback is made,
+ *  the connection information can be accessed through the global \ref Bluetooth_Connection structure.
+ */
 void Bluetooth_ConnectionComplete(void)
 {
 	printf_P(PSTR("Connection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), 
@@ -215,6 +225,11 @@ void Bluetooth_ConnectionComplete(void)
 	         Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]);
 }
 
+/** Bluetooth stack callback event for a completed Bluetooth disconnection. When this callback is made,
+ *  the connection information in the global \ref Bluetooth_Connection structure is invalidated with the
+ *  exception of the RemoteAddress element, which can be used to determine the address of the device that
+ *  was disconnected.
+ */
 void Bluetooth_DisconnectionComplete(void)
 {
 	printf_P(PSTR("Disconnection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), 
@@ -222,3 +237,21 @@ void Bluetooth_DisconnectionComplete(void)
 	         Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2],
 	         Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]);
 }
+
+/** Bluetooth stack callback event for a non-signal ACL packet reception. This callback fires once a connection
+ *  to a remote Bluetooth device has been made, and the remote device has sent a non-signalling ACL packet.
+ *
+ *  \param PacketLength  Length of the packet data, in bytes - this must be decremented as data is read
+ *  \param Channel       Bluetooth ACL data channel information structure for the packet's destination channel
+ */
+void Bluetooth_PacketReceived(uint16_t* PacketLength, Bluetooth_Channel_t* Channel)
+{
+	uint8_t DataPayload[*PacketLength];
+	Pipe_Read_Stream_LE(&DataPayload, *PacketLength);
+	*PacketLength = 0;
+
+	BT_ACL_DEBUG("-- Data Payload: ", NULL);
+	for (uint16_t B = 0; B < sizeof(DataPayload); B++)
+	  printf("0x%02X ", DataPayload[B]);
+	printf("\r\n");	
+}
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c
index 17503ea54f53b504c0a68c965537903d7cfd4164..c2c9902141177d1af801ffe2a88fe7001f208bce 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c
@@ -91,21 +91,35 @@ void Bluetooth_ProcessACLPackets(void)
 	}
 	else
 	{
-		uint8_t DataPayload[DataHeader.PayloadLength];
-		Pipe_Read_Stream_LE(&DataPayload, sizeof(DataPayload));
-		DataHeader.PayloadLength = 0;
+		Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, true));
 	
-		BT_ACL_DEBUG("-- Data Payload: ", NULL);
-		for (uint16_t B = 0; B < sizeof(DataPayload); B++)
-		  printf("0x%02X ", DataPayload[B]);
-		printf("\r\n");
-
-		Pipe_Discard_Stream(ACLPacketHeader.DataLength);
-		Pipe_ClearIN();		
+		Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE);
+		Pipe_Discard_Stream(DataHeader.PayloadLength);
+		Pipe_ClearIN();
 		Pipe_Freeze();
 	}
 }
 
+void Bluetooth_SendPacket(uint8_t* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel)
+{
+	Bluetooth_ACL_Header_t        ACLPacketHeader;
+	Bluetooth_DataPacket_Header_t DataHeader;
+
+	ACLPacketHeader.ConnectionHandle      = Bluetooth_Connection.ConnectionHandle;
+	ACLPacketHeader.DataLength            = sizeof(DataHeader) + DataLen;
+	DataHeader.PayloadLength              = DataLen;
+	DataHeader.DestinationChannel         = Channel->RemoteNumber;
+
+	Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);
+	Pipe_Unfreeze();
+	
+	Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));
+	Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));
+	Pipe_Write_Stream_LE(Data, DataLen);
+
+	Pipe_Freeze();
+}
+
 static inline void Bluetooth_SignalPacket_ConnectionRequest(Bluetooth_ACL_Header_t* ACLPacketHeader,
                                                             Bluetooth_DataPacket_Header_t* DataHeader,
                                                             Bluetooth_SignalCommand_Header_t* SignalCommandHeader)
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h
index 46d323f00fcfdf0ad6b30a4ce6f21594440f7102..f6f8f769d33fd54f4faa00d4d77447619f864300 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h
@@ -143,7 +143,8 @@
 
 	/* Function Prototypes: */
 		void Bluetooth_ProcessACLPackets(void);
-
+		void Bluetooth_SendPacket(uint8_t* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel);
+		
 		#if defined(INCLUDE_FROM_BLUETOOTH_ACLPACKETS_C)
 			static inline void Bluetooth_SignalPacket_ConnectionRequest(Bluetooth_ACL_Header_t* ACLPacketHeader,
                                                                   Bluetooth_DataPacket_Header_t* DataHeader,
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h
index 2295e558cd510257efa0b068627a28110c499f7a..f64bba016be5b648fb226b37565b1ab25580c7a6 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h
@@ -190,10 +190,6 @@
 	/* Function Prototypes: */
 		void Bluetooth_ProcessHCICommands(void);
 		void Bluetooth_ProcessHCIEvents(void);
-		
-		bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress);
-		void Bluetooth_ConnectionComplete(void);
-		void Bluetooth_DisconnectionComplete(void);
 			
 		#if defined(INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C)
 			static uint8_t Bluetooth_SendHCICommand(void* Parameters, uint16_t ParameterLength);
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h
index 1cc0d9242d2ee3e2d2a1b81abb0f3f779a9171ab..b529ea48304b1eea2e3c289471cb97c42c62c8e8 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h
@@ -35,8 +35,6 @@
 		#include <LUFA/Drivers/USB/USB.h>
 		
 		#include "BluetoothHost.h"
-		#include "BluetoothHCICommands.h"
-		#include "BluetoothACLPackets.h"
 		
 	/* Macros: */
 		#define BLUETOOTH_DATA_IN_PIPE                   1
@@ -84,6 +82,10 @@
 			char     PINCode[16];
 			char     Name[];
 		} Bluetooth_Device_t;
+	
+	/* Includes: */
+		#include "BluetoothHCICommands.h"
+		#include "BluetoothACLPackets.h"		
 		
 	/* Function Prototypes: */
 		Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchBySource);
@@ -92,6 +94,11 @@
 		void Bluetooth_Stack_Init(void);
 		void Bluetooth_Stack_USBTask(void);
 
+		bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress);
+		void Bluetooth_ConnectionComplete(void);
+		void Bluetooth_DisconnectionComplete(void);
+		void Bluetooth_PacketReceived(uint16_t* PacketLength, Bluetooth_Channel_t* Channel);
+
 	/* External Variables: */
 		extern Bluetooth_Device_t     Bluetooth_DeviceConfiguration;
 		extern Bluetooth_Connection_t Bluetooth_Connection;