diff --git a/Demos/Device/ClassDriver/AudioInput/AudioInput.c b/Demos/Device/ClassDriver/AudioInput/AudioInput.c
index 1acf20de800ba7ee63daa67140f0687275af0881..447cb91ddcf4277f989644ca04646ff873586270 100644
--- a/Demos/Device/ClassDriver/AudioInput/AudioInput.c
+++ b/Demos/Device/ClassDriver/AudioInput/AudioInput.c
@@ -190,13 +190,13 @@ void EVENT_USB_Device_ControlRequest(void)
  */
 bool CALLBACK_Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
                                            const uint8_t EndpointProperty,
-                                           const uint8_t EndpointIndex,
+                                           const uint8_t EndpointAddress,
                                            const uint8_t EndpointControl,
                                            uint16_t* const DataLength,
                                            uint8_t* Data)
 {
 	/* Check the requested endpoint to see if a supported endpoint is being manipulated */
-	if (EndpointIndex == Microphone_Audio_Interface.Config.DataINEndpointNumber)
+	if (EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_IN | Microphone_Audio_Interface.Config.DataINEndpointNumber))
 	{
 		/* Check the requested control to see if a supported control is being manipulated */
 		if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
diff --git a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c
index 77727f05e40d8eccfcc114cb9b4b7b91dbc97820..f1d6060706266a9248ad5d7ab8234425f654be4e 100644
--- a/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c
+++ b/Demos/Device/ClassDriver/AudioOutput/AudioOutput.c
@@ -226,13 +226,13 @@ void EVENT_USB_Device_ControlRequest(void)
  */
 bool CALLBACK_Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
                                            const uint8_t EndpointProperty,
-                                           const uint8_t EndpointIndex,
+                                           const uint8_t EndpointAddress,
                                            const uint8_t EndpointControl,
                                            uint16_t* const DataLength,
                                            uint8_t* Data)
 {
 	/* Check the requested endpoint to see if a supported endpoint is being manipulated */
-	if (EndpointIndex == Speaker_Audio_Interface.Config.DataOUTEndpointNumber)
+	if (EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_OUT | Speaker_Audio_Interface.Config.DataOUTEndpointNumber))
 	{
 		/* Check the requested control to see if a supported control is being manipulated */
 		if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
diff --git a/Demos/Device/LowLevel/AudioInput/AudioInput.c b/Demos/Device/LowLevel/AudioInput/AudioInput.c
index d7916766070f81c0c886e6b1f53c66319816a64c..e00b693f9854563838a1105c6652584d959533d2 100644
--- a/Demos/Device/LowLevel/AudioInput/AudioInput.c
+++ b/Demos/Device/LowLevel/AudioInput/AudioInput.c
@@ -160,18 +160,18 @@ void EVENT_USB_Device_ControlRequest(void)
 		case AUDIO_REQ_SetCurrent:
 			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
 			{
-				/* Extract out the relevant request information to get the target Endpoint index and control being set */
-				uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+				/* Extract out the relevant request information to get the target Endpoint address and control being set */
+				uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
 				uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
 				
 				/* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
-				if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+				if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_IN | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
 				{
 					uint8_t SampleRate[3];
 				
 					Endpoint_ClearSETUP();
 					Endpoint_Read_Control_Stream_LE(SampleRate, sizeof(SampleRate));
-					Endpoint_ClearOUT();
+					Endpoint_ClearIN();
 					
 					/* Set the new sampling frequency to the value given by the host */
 					CurrentAudioSampleFrequency = (((uint32_t)SampleRate[2] << 16) | ((uint32_t)SampleRate[1] << 8) | (uint32_t)SampleRate[0]);
@@ -183,14 +183,14 @@ void EVENT_USB_Device_ControlRequest(void)
 			
 			break;
 		case AUDIO_REQ_GetCurrent:
-			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
 			{
-				/* Extract out the relevant request information to get the target Endpoint index and control being retrieved */
-				uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+				/* Extract out the relevant request information to get the target Endpoint address and control being retrieved */
+				uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
 				uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
 				
 				/* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
-				if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+				if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_IN | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
 				{
 					uint8_t SampleRate[3];
 					
diff --git a/Demos/Device/LowLevel/AudioInput/Descriptors.c b/Demos/Device/LowLevel/AudioInput/Descriptors.c
index 10959074a7255ac90c058d6cbeedbdd2b536b7da..04f2524f6eb84668755cea61f564139c84d4f3c4 100644
--- a/Demos/Device/LowLevel/AudioInput/Descriptors.c
+++ b/Demos/Device/LowLevel/AudioInput/Descriptors.c
@@ -235,7 +235,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint},
 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General,
 
-			.Attributes               = AUDIO_EP_ACCEPTS_SMALL_PACKETS,
+			.Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL),
 
 			.LockDelayUnits           = 0x00,
 			.LockDelay                = 0x0000
diff --git a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c
index c5d93630018905a83a5cacff72d29a45f60313e6..fcc3d5abde4f3a68988a73e136d4c1aa53a21285 100644
--- a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c
+++ b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c
@@ -186,12 +186,12 @@ void EVENT_USB_Device_ControlRequest(void)
 		case AUDIO_REQ_SetCurrent:
 			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
 			{
-				/* Extract out the relevant request information to get the target Endpoint index and control being set */
-				uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+				/* Extract out the relevant request information to get the target Endpoint address and control being set */
+				uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
 				uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
 				
 				/* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
-				if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+				if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_OUT | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
 				{
 					uint8_t SampleRate[3];
 				
@@ -211,12 +211,12 @@ void EVENT_USB_Device_ControlRequest(void)
 		case AUDIO_REQ_GetCurrent:
 			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
 			{
-				/* Extract out the relevant request information to get the target Endpoint index and control being retrieved */
-				uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+				/* Extract out the relevant request information to get the target Endpoint address and control being retrieved */
+				uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
 				uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
 				
 				/* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
-				if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+				if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_OUT | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
 				{
 					uint8_t SampleRate[3];
 					
diff --git a/Demos/Device/LowLevel/AudioOutput/Descriptors.c b/Demos/Device/LowLevel/AudioOutput/Descriptors.c
index a86eee75cba872c206fec571f1c1c8734e2af9ad..0a6ec6d68693418cdcef9c52cc3a8716819403af 100644
--- a/Demos/Device/LowLevel/AudioOutput/Descriptors.c
+++ b/Demos/Device/LowLevel/AudioOutput/Descriptors.c
@@ -235,7 +235,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint},
 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General,
 
-			.Attributes               = AUDIO_EP_ACCEPTS_SMALL_PACKETS,
+			.Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL),
 
 			.LockDelayUnits           = 0x00,
 			.LockDelay                = 0x0000
diff --git a/LUFA/Drivers/USB/Class/Device/Audio.c b/LUFA/Drivers/USB/Class/Device/Audio.c
index f183fdedd2796b40bf6f03038740082f02babe4f..dbf62dae2f8c0c3d946722df1f263ca837ab579c 100644
--- a/LUFA/Drivers/USB/Class/Device/Audio.c
+++ b/LUFA/Drivers/USB/Class/Device/Audio.c
@@ -42,9 +42,6 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
 	if (!(Endpoint_IsSETUPReceived()))
 	  return;
 
-	if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber)
-	  return;
-
 	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE)
 	{
 		if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber)
@@ -52,13 +49,16 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
 	}
 	else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT)
 	{
-		if (!((AudioInterfaceInfo->Config.DataINEndpointNumber &&
-		       (USB_ControlRequest.wIndex == AudioInterfaceInfo->Config.DataINEndpointNumber)) ||
-		      (AudioInterfaceInfo->Config.DataOUTEndpointNumber &&
-		       (USB_ControlRequest.wIndex == AudioInterfaceInfo->Config.DataOUTEndpointNumber))))
-		{
-			return;
-		}
+		bool EndpointFilterMatch = false;
+	
+		EndpointFilterMatch |= (AudioInterfaceInfo->Config.DataINEndpointNumber &&
+		                        ((uint8_t)USB_ControlRequest.wIndex == (ENDPOINT_DESCRIPTOR_DIR_IN  | AudioInterfaceInfo->Config.DataINEndpointNumber)));
+	
+		EndpointFilterMatch |= (AudioInterfaceInfo->Config.DataOUTEndpointNumber &&
+		                        ((uint8_t)USB_ControlRequest.wIndex == (ENDPOINT_DESCRIPTOR_DIR_OUT | AudioInterfaceInfo->Config.DataOUTEndpointNumber)));
+
+		if (!(EndpointFilterMatch))
+		  return;
 	}	
 
 	switch (USB_ControlRequest.bRequest)
@@ -89,10 +89,10 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
 			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
 			{
 				uint8_t EndpointProperty = USB_ControlRequest.bRequest;
-				uint8_t EndpointIndex    = (uint8_t)USB_ControlRequest.wIndex;
+				uint8_t EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
 				uint8_t EndpointControl  = (USB_ControlRequest.wValue >> 8);
 			
-				if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, NULL, NULL))
+				if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, EndpointControl, NULL, NULL))
 				{
 					uint16_t ValueLength = USB_ControlRequest.wLength;
 					uint8_t  Value[ValueLength];
@@ -101,7 +101,7 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
 					Endpoint_Read_Control_Stream_LE(Value, ValueLength);
 					Endpoint_ClearIN();					
 
-					CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, &ValueLength, Value);
+					CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, EndpointControl, &ValueLength, Value);
 				}				
 			}
 
@@ -113,12 +113,12 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
 			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
 			{
 				uint8_t  EndpointProperty = USB_ControlRequest.bRequest;
-				uint8_t  EndpointIndex    = (uint8_t)USB_ControlRequest.wIndex;
+				uint8_t  EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
 				uint8_t  EndpointControl  = (USB_ControlRequest.wValue >> 8);
 				uint16_t ValueLength      = USB_ControlRequest.wLength;
 				uint8_t  Value[ValueLength];
 
-				if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, &ValueLength, Value))
+				if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, EndpointControl, &ValueLength, Value))
 				{
 					Endpoint_ClearSETUP();
 					Endpoint_Write_Control_Stream_LE(Value, ValueLength);
diff --git a/LUFA/Drivers/USB/Class/Device/Audio.h b/LUFA/Drivers/USB/Class/Device/Audio.h
index ed23683a6b7865b2c7ffb4955fe2a5c9e4bb6f22..cad87f3b6c81c3ce2a0bb9a0f8cc8c62e240ab30 100644
--- a/LUFA/Drivers/USB/Class/Device/Audio.h
+++ b/LUFA/Drivers/USB/Class/Device/Audio.h
@@ -143,7 +143,7 @@
 			 *
 			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
 			 *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t.
-			 *  \param[in]     EndpointIndex       Index of the streaming endpoint whose property is being referenced.
+			 *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced.
 			 *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t.
 			 *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum
 			 *                                     length of the retrieved data. When NULL, the function should return whether the given property
@@ -155,7 +155,7 @@
 			 */
 			bool CALLBACK_Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
 			                                           const uint8_t EndpointProperty,
-			                                           const uint8_t EndpointIndex,
+			                                           const uint8_t EndpointAddress,
 			                                           const uint8_t EndpointControl,
 			                                           uint16_t* const DataLength,
 			                                           uint8_t* Data);
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index 4eea5c5840f147716efd8db2704e023b34bd5226..522d0a317c4b4d090ad2a9da8840edc403ca82e6 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -33,7 +33,6 @@
   *      -# Add class driver support for Test and Measurement class
   *      -# Add class driver support for EEM class
   *      -# Add class driver support for ECM class
-  *      -# Extend Low Level Audio demos to include sample rate switching
   *  - Ports
   *      -# Complete AVR32 port for existing devices, add UC3C support
   *      -# Atmel ARM7 series microcontrollers