diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c
index 537c81f0a3472c260172d73fddba665bd29e6cc9..2530231aebeac91362608f904d5369ebc14f1d0d 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c
@@ -38,8 +38,8 @@ const struct
 
 const struct
 {
-	uint8_t     Header;
-	uint16_t    Size;
+	uint8_t    Header;
+	uint16_t   Size;
 	ItemUUID_t UUIDList[];
 } PROGMEM SDP_Attribute_ServiceClassIDs =
 	{
@@ -50,32 +50,32 @@ const struct
 				{.Header = (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), .UUID = {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00}},}
 			}
 	};
-
+	
 const struct
 {
 	uint8_t     Header;
 	uint8_t     Size;
-	Item16Bit_t VersionList[];
-} PROGMEM SDP_Attribute_Version =
+	Item16Bit_t OffsetList[];
+} PROGMEM SDP_Attribute_LangOffset =
 	{
 		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
 		.Size   = (sizeof(Item16Bit_t) * 1),
-		.VersionList =
+		.OffsetList =
 			{
 				{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
 			}
-	};
+	};	
 
 const struct
 {
 	uint8_t     Header;
 	uint8_t     Size;
-	Item16Bit_t OffsetList[];
-} PROGMEM SDP_Attribute_LangOffset =
+	Item16Bit_t VersionList[];
+} PROGMEM SDP_Attribute_Version =
 	{
 		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
 		.Size   = (sizeof(Item16Bit_t) * 1),
-		.OffsetList =
+		.VersionList =
 			{
 				{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
 			}
@@ -83,9 +83,9 @@ const struct
 
 const struct
 {
-	uint8_t     Header;
-	uint8_t     Size;
-	char        Text[];
+	uint8_t Header;
+	uint8_t Size;
+	char    Text[];
 } PROGMEM SDP_Attribute_ServiceName =
 	{
 		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
@@ -95,9 +95,9 @@ const struct
 
 const struct
 {
-	uint8_t     Header;
-	uint8_t     Size;
-	char        Text[];
+	uint8_t Header;
+	uint8_t Size;
+	char    Text[];
 } PROGMEM SDP_Attribute_ServiceDescription =
 	{
 		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
@@ -110,8 +110,8 @@ const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =
 	{
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle      },
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,     .Data = &SDP_Attribute_ServiceClassIDs    },
-		{.AttributeID = SDP_ATTRIBUTE_ID_VERSION,             .Data = &SDP_Attribute_Version            },
 		{.AttributeID = SDP_ATTRIBUTE_ID_LANGIDOFFSET,        .Data = &SDP_Attribute_LangOffset         },
+		{.AttributeID = SDP_ATTRIBUTE_ID_VERSION,             .Data = &SDP_Attribute_Version            },
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,         .Data = &SDP_Attribute_ServiceName        },
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,  .Data = &SDP_Attribute_ServiceDescription },
 
@@ -126,8 +126,8 @@ const struct
 
 const struct
 {
-	uint8_t     Header;
-	uint16_t    Size;
+	uint8_t    Header;
+	uint16_t   Size;
 	ItemUUID_t UUIDList[];
 } PROGMEM RFCOMM_Attribute_ServiceClassIDs =
 	{
@@ -143,7 +143,22 @@ const struct
 {
 	uint8_t     Header;
 	uint8_t     Size;
-	char        Text[];
+	Item16Bit_t OffsetList[];
+} PROGMEM RFCOMM_Attribute_LangOffset =
+	{
+		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+		.Size   = (sizeof(Item16Bit_t) * 1),
+		.OffsetList =
+			{
+				{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
+			}
+	};
+
+const struct
+{
+	uint8_t Header;
+	uint8_t Size;
+	char    Text[];
 } PROGMEM RFCOMM_Attribute_ServiceName =
 	{
 		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
@@ -153,9 +168,9 @@ const struct
 
 const struct
 {
-	uint8_t     Header;
-	uint8_t     Size;
-	char        Text[];
+	uint8_t Header;
+	uint8_t Size;
+	char    Text[];
 } PROGMEM RFCOMM_Attribute_ServiceDescription =
 	{
 		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
@@ -167,6 +182,7 @@ const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM =
 	{
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle      },
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,     .Data = &RFCOMM_Attribute_ServiceClassIDs    },
+		{.AttributeID = SDP_ATTRIBUTE_ID_LANGIDOFFSET,        .Data = &RFCOMM_Attribute_LangOffset         },
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,         .Data = &RFCOMM_Attribute_ServiceName        },
 		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,  .Data = &RFCOMM_Attribute_ServiceDescription },
 
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h
index 92fe226bc7ba77c54792f1855141fa4756e00ba4..0fd0aa4edaa6e3a6dd5531b4ac1646aa6d313193 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h
@@ -49,13 +49,13 @@
 		#define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE    0x0000
 		#define SDP_ATTRIBUTE_ID_SERVICECLASSIDS        0x0001
 		#define SDP_ATTRIBUTE_ID_LANGIDOFFSET           0x0006
-		#define SDP_ATTRIBUTE_ID_AVAILABILITY           0x0008
 		#define SDP_ATTRIBUTE_ID_VERSION                0x0200
 		#define SDP_ATTRIBUTE_ID_SERVICENAME            0x0100
 		#define SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION     0x0101
 		
 		#define SWAPENDIAN_16(x)                        ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
-		#define SWAPENDIAN_32(x)                        (SWAPENDIAN_16(((x) & 0xFFFF0000) >> 16) | SWAPENDIAN_16(((x) & 0x0000FFFF) << 16))
+		#define SWAPENDIAN_32(x)                        ((((x) & 0xFF000000) >> 24) | (((x) & 0x00FF0000) >> 8) | \
+		                                                 (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24))
 		
 		/** Terminator for a service attribute table of type \ref ServiceAttributeTable_t. */
 		#define SERVICE_ATTRIBUTE_TABLE_TERMINATOR      {.Data = NULL}
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c
index 82cb60e2917bb13221bef51f082179716bec6c41..3731e1f381b2d94746a5134721035ed98e983ae2 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c
@@ -116,11 +116,10 @@ static void SDP_ProcessServiceSearch(const SDP_PDUHeader_t* const SDPHeader, Blu
 	/* Search through the list of UUIDs one at a time looking for matching search Attributes */
 	for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++)
 	{
+		ServiceAttributeTable_t* AttributeTable;
+
 		/* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */
-		ServiceAttributeTable_t* AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem]);
-		
-		/* If the UUID does not exist in the global UUID table, continue on to the next search UUID */
-		if (AttributeTable == NULL)
+		if ((AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem])) == NULL)
 		  continue;
 		  
 		BT_SDP_DEBUG(2, " -- Found UUID %d in table", CurrUUIDItem);
@@ -216,9 +215,12 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader,
 		/* Get the size of the header for the Service Record Handle */
 		uint8_t AttrHeaderSize;
 		SDP_GetLocalAttributeContainerSize(ServiceRecord, &AttrHeaderSize);
-
+		
+		/* Retrieve the endian-swapped service handle of the current service being examined */
+		uint32_t CurrServiceHandle = SwapEndian_32(pgm_read_dword(ServiceRecord + AttrHeaderSize));
+		
 		/* Check if the current service in the service table has the requested service handle */
-		if (memcmp_P(ServiceRecord + AttrHeaderSize, &ServiceHandle, sizeof(uint32_t)) == 0)
+		if (ServiceHandle == CurrServiceHandle)
 		{
 			*TotalResponseSize += SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes,
 		                                                            &CurrResponsePos);
@@ -300,15 +302,15 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe
 	/* Search through the list of UUIDs one at a time looking for matching search Attributes */
 	for (uint8_t CurrUUIDItem = 0; CurrUUIDItem < TotalUUIDs; CurrUUIDItem++)
 	{
+		ServiceAttributeTable_t* AttributeTable;
+
 		/* Retrieve the attribute table of the current search UUID from the global UUID table if it exists */
-		ServiceAttributeTable_t* AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem]);
-		
-		/* If the UUID does not exist in the global UUID table, continue on to the next search UUID */
-		if (AttributeTable == NULL)
+		if ((AttributeTable = SDP_GetAttributeTable(UUIDList[CurrUUIDItem])) == NULL)
 		  continue;
 		  
 		BT_SDP_DEBUG(2, " -- Found UUID %d in table", CurrUUIDItem);
 
+		/* Add the listed attributes for the found UUID to the response */
 		*TotalResponseSize += SDP_AddListedAttributesToResponse(AttributeTable, AttributeList, TotalAttributes,
 		                                                        &CurrResponsePos);
 	}
@@ -361,21 +363,24 @@ static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t*
 	for (uint8_t CurrAttribute = 0; CurrAttribute < TotalAttributes; CurrAttribute++)
 	{
 		uint16_t* AttributeIDRange = AttributeList[CurrAttribute];
-	
-		/* Look in the current Attribute Range for a matching Attribute ID in the UUID's Attribute table */
-		for (uint32_t CurrAttributeID = AttributeIDRange[0]; CurrAttributeID <= AttributeIDRange[1]; CurrAttributeID++)
+		void*     AttributeValue;
+		
+		/* Look through the current service's attribute list, examining all the attributes */
+		while ((AttributeValue = (void*)pgm_read_word(&AttributeTable->Data)) != NULL)
 		{
-			/* Retrieve a PROGMEM pointer to the value of the current Attribute ID, if it exists in the UUID's Attribute table */
-			const void* AttributeValue = SDP_GetAttributeValue(AttributeTable, CurrAttributeID);
-			
-			/* If the Attribute does not exist in the current UUID's Attribute table, continue to the next Attribute ID */
-			if (AttributeValue == NULL)
-			  continue;
-			
-			BT_SDP_DEBUG(2, " -- Add Attribute 0x%04X", CurrAttributeID);
+			/* Get the current Attribute's ID from the current attribute table entry */
+			uint16_t CurrAttributeID = pgm_read_word(&AttributeTable->AttributeID);
+
+			/* Check if the current Attribute's ID is within the current Attribute range */
+			if ((CurrAttributeID >= AttributeIDRange[0]) && (CurrAttributeID <= AttributeIDRange[1]))
+			{
+				BT_SDP_DEBUG(2, " -- Add Attribute 0x%04X", CurrAttributeID);
 
-			/* Increment the current UUID's returned Attribute container size by the number of added bytes */
-			*AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos);
+				/* Increment the current UUID's returned Attribute container size by the number of added bytes */
+				*AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos);			
+			}
+			
+			AttributeTable++;
 		}
 
 		/* Increment the outer container size by the number of added bytes */
@@ -551,12 +556,8 @@ static uint8_t SDP_GetUUIDList(uint8_t UUIDList[][UUID_SIZE_BYTES], const void**
 		/* Copy over the base UUID value to the free UUID slot in the list */
 		memcpy_P(CurrentUUID, &BaseUUID, sizeof(BaseUUID));
 
-		/* Copy over UUID from the container to the free slot - if a short UUID (<= 4 bytes) it replaces the lower
-		   4 bytes of the base UUID, otherwise it replaces the UUID completely */
-		if (UUIDLength <= 4)
-		  memcpy(&CurrentUUID[UUID_SIZE_BYTES - UUIDLength], *CurrentParameter, UUIDLength);
-		else
-		  memcpy(&CurrentUUID[0], *CurrentParameter, UUIDLength);		
+		/* Copy over UUID from the container to the free slot */
+		memcpy(&CurrentUUID[UUID_SIZE_BYTES - UUIDLength], *CurrentParameter, UUIDLength);
 		
 		BT_SDP_DEBUG(2, "-- UUID (%d): %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X",
 		                UUIDLength,