diff --git a/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.c b/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.c
index ed4bdb994e493f3d25447895508c2b044cf7b5c7..67a0fa76e55a6e84d63d2b4713893b4fba8d60e4 100644
--- a/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.c
+++ b/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.c
@@ -30,13 +30,16 @@
 
 #include "ConfigDescriptor.h"
 
+uint8_t PrinterInterfaceNumber;
+uint8_t PrinterAltSetting;
+
+
 uint8_t ProcessConfigurationDescriptor(void)
 {
 	uint8_t* ConfigDescriptorData;
 	uint16_t ConfigDescriptorSize;
 	uint8_t  ErrorCode;
 	uint8_t  FoundEndpoints = 0;
-	uint8_t  FoundEndpointMask;
 	
 	/* Get Configuration Descriptor size from the device */
 	if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
@@ -58,31 +61,17 @@ uint8_t ProcessConfigurationDescriptor(void)
 	
 	/* Get the printer interface from the configuration descriptor */
 	if ((ErrorCode = USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
-	                                           NextPrinterInterface)))
+	                                           NextBidirectionalPrinterInterface)))
 	{
 		/* Descriptor not found, error out */
 		return NoInterfaceFound;
 	}
-
-	/* Get the printer's communication protocol */
-	PrinterProtocol = DESCRIPTOR_CAST(ConfigDescriptorData, USB_Descriptor_Interface_t).Protocol;
 	
-	/* Determine what endpoints to look for from the protocol */
-	switch (PrinterProtocol)
-	{
-		case PROTOCOL_UNIDIRECTIONAL:
-			FoundEndpointMask = (1 << PRINTER_DATA_OUT_PIPE);
-			break;
-		case PROTOCOL_BIDIRECTIONAL:
-		case PROTOCOL_IEEE1284:
-			FoundEndpointMask = ((1 << PRINTER_DATA_OUT_PIPE) | (1 << PRINTER_DATA_IN_PIPE));
-			break;
-		default:
-			return NoInterfaceFound;
-	}
+	PrinterInterfaceNumber = DESCRIPTOR_CAST(ConfigDescriptorData, USB_Descriptor_Interface_t).InterfaceNumber;
+	PrinterAltSetting      = DESCRIPTOR_CAST(ConfigDescriptorData, USB_Descriptor_Interface_t).AlternateSetting;
 
 	/* Get the IN and OUT data endpoints for the mass storage interface */
-	while (FoundEndpoints != FoundEndpointMask)
+	while (FoundEndpoints != ((1 << PRINTER_DATA_OUT_PIPE) | (1 << PRINTER_DATA_IN_PIPE)))
 	{
 		/* Fetch the next bulk endpoint from the current printer interface */
 		if ((ErrorCode = USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
@@ -123,15 +112,16 @@ uint8_t ProcessConfigurationDescriptor(void)
 	return SuccessfulConfigRead;
 }
 
-uint8_t NextPrinterInterface(void* CurrentDescriptor)
+uint8_t NextBidirectionalPrinterInterface(void* CurrentDescriptor)
 {
-	/* PURPOSE: Find next mass storage class interface descriptor */
+	/* PURPOSE: Find next Bidirectional protocol printer class interface descriptor */
 
 	if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
 	{
 		/* Check the descriptor class and protocol, break out if correct class/protocol interface found */
 		if ((DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Class    == PRINTER_CLASS)    &&
-		    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == PRINTER_SUBCLASS))
+		    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == PRINTER_SUBCLASS) &&
+			(DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Protocol == PROTOCOL_BIDIRECTIONAL))
 		{
 			return DESCRIPTOR_SEARCH_Found;
 		}
diff --git a/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.h b/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.h
index 0a8dbe931a324340d62641b0f084704727e5b9d7..bbe23725cebcca5e5e6ea5db5b135ba7b2b771c2 100644
--- a/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.h
+++ b/Demos/Host/Incomplete/PrinterHost/ConfigDescriptor.h
@@ -55,11 +55,15 @@
 			NoInterfaceFound                     = 4,
 			NoEndpointFound                      = 5,
 		};
+	
+	/* External Variables: */
+		uint8_t PrinterInterfaceNumber;
+		uint8_t PrinterAltSetting;
 
 	/* Function Prototypes: */
 		uint8_t ProcessConfigurationDescriptor(void);	
 
-		uint8_t NextPrinterInterface(void* CurrentDescriptor);
+		uint8_t NextBidirectionalPrinterInterface(void* CurrentDescriptor);
 		uint8_t NextInterfaceBulkDataEndpoint(void* CurrentDescriptor);
 
 #endif
diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c
index 80fca259c35002cc35f29ab497f8844a597a580d..643f919c93e9654691d13701db2d41f50f9cbdfb 100644
--- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c
+++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c
@@ -36,8 +36,6 @@
 
 #include "PrinterHost.h"
 
-uint8_t PrinterProtocol;
-
 
 int main(void)
 {
@@ -150,12 +148,37 @@ void USB_Printer_Host(void)
 				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
-
+			
+			/* Some printers use alternate settings to determine the communication protocol used - if so, send a SetInterface
+			 * request to switch to the interface alternate setting with the Bidirection protocol */
+			if (PrinterAltSetting)
+			{
+				USB_ControlRequest = (USB_Request_Header_t)
+					{
+						bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),
+						bRequest:      REQ_SetInterface,
+						wValue:        PrinterAltSetting,
+						wIndex:        PrinterInterfaceNumber,
+						wLength:       0,
+					};
+					
+				if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+				{
+					puts_P(PSTR("Control Error (Set Interface).\r\n"));
+					printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);
+
+					/* Indicate error via status LEDs */
+					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+
+					/* Wait until USB device disconnected */
+					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+					break;					
+				}
+			}
+			
 			USB_HostState = HOST_STATE_Configured;
 			break;
 		case HOST_STATE_Configured:
-			printf_P(PSTR("Printer Protocol: %d\r\n"), PrinterProtocol);
-		
 			puts_P(PSTR("Retrieving Device ID...\r\n"));
 		
 			Device_ID_String_t DeviceIDString;
diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.h b/Demos/Host/Incomplete/PrinterHost/PrinterHost.h
index 46427b300b70653d2cf13cd78d634711a6d4b7bd..c0bbebfe395897be8f277a3c10a020d33c33ce48 100644
--- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.h
+++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.h
@@ -62,9 +62,6 @@
 	
 		/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
 		#define LEDMASK_USB_BUSY         (LEDS_LED2)
-
-	/* External Variables: */
-		extern uint8_t PrinterProtocol;
 	
 	/* Function Prototypes: */
 		void EVENT_USB_DeviceAttached(void);