diff --git a/Demos/Device/ClassDriver/CDC/CDC.c b/Demos/Device/ClassDriver/CDC/CDC.c
index 90cbaf0bcaee480872f442cc85cb2d02475b06c3..5d74cb1a55d0327ecab728791592f3d507dc9da3 100644
--- a/Demos/Device/ClassDriver/CDC/CDC.c
+++ b/Demos/Device/ClassDriver/CDC/CDC.c
@@ -60,27 +60,10 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
 			},
 	};
 
-#if 0
-/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in
- *       <stdio.h> can be used on the virtual serial port (e.g. fprintf(&USBSerial, "Test"); to print a string).
+/** Standard file stream for the CDC interface when set up, so that the virtual CDC COM port can be
+ *  used like any regular character stream in the C APIs
  */
-
-static int CDC_putchar(char c, FILE *stream)
-{
-	CDC_Device_SendByte(&VirtualSerial_CDC_Interface, c);
-	return 0;
-}
-
-static int CDC_getchar(FILE *stream)
-{
-	if (!(CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface)))
-	  return -1;
-
-	return CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
-}
-
-static FILE USBSerial = FDEV_SETUP_STREAM(CDC_putchar, CDC_getchar, _FDEV_SETUP_RW);
-#endif
+static FILE USBSerialStream;
 
 /** Main program entry point. This routine contains the overall program flow, including initial
  *  setup of all components and the main program loop.
@@ -89,6 +72,9 @@ int main(void)
 {
 	SetupHardware();
 	
+	/* Create a regular character stream for the interface so that it can be used with the stdio.h functions */
+	CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream);
+
 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
 
 	for (;;)
@@ -143,8 +129,12 @@ void CheckJoystickMovement(void)
 	if ((ReportString != NULL) && (ActionSent == false))
 	{
 		ActionSent = true;
-		
-		CDC_Device_SendString(&VirtualSerial_CDC_Interface, ReportString, strlen(ReportString));		
+
+		// Write the string to the virtual COM port via the created character stream
+		fputs(ReportString, &USBSerialStream);
+
+		// Alternatively, without the stream:
+		// CDC_Device_SendString(&VirtualSerial_CDC_Interface, ReportString, strlen(ReportString));
 	}
 }
 
diff --git a/Demos/Device/ClassDriver/CDC/CDC.h b/Demos/Device/ClassDriver/CDC/CDC.h
index ee375a46653dca46d634469c3b42e2ae8e3c7584..9cc72487c27402690f981942e8f8cc687cec2014 100644
--- a/Demos/Device/ClassDriver/CDC/CDC.h
+++ b/Demos/Device/ClassDriver/CDC/CDC.h
@@ -41,6 +41,7 @@
 		#include <avr/wdt.h>
 		#include <avr/power.h>
 		#include <string.h>
+		#include <stdio.h>
 
 		#include "Descriptors.h"
 
diff --git a/Demos/Host/ClassDriver/CDCHost/CDCHost.c b/Demos/Host/ClassDriver/CDCHost/CDCHost.c
index ded3e4c109928b85ac3fef54179bce83703d2e26..e28f2f9e5c9bf474ca2ab249cfaac69eca63e991 100644
--- a/Demos/Host/ClassDriver/CDCHost/CDCHost.c
+++ b/Demos/Host/ClassDriver/CDCHost/CDCHost.c
@@ -54,28 +54,6 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface =
 				.NotificationPipeDoubleBank = false,
 			},
 	};
-
-#if 0
-/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in
- *       <stdio.h> can be used on the virtual serial port (e.g. fprintf(&USBSerial, "Test"); to print a string).
- */
-
-static int CDC_putchar(char c, FILE *stream)
-{
-	CDC_Host_SendByte(&VirtualSerial_CDC_Interface, c);
-	return 0;
-}
-
-static int CDC_getchar(FILE *stream)
-{
-	if (!(CDC_Host_BytesReceived(&VirtualSerial_CDC_Interface)))
-	  return -1;
-
-	return CDC_Host_ReceiveByte(&VirtualSerial_CDC_Interface);
-}
-
-static FILE USBSerial = FDEV_SETUP_STREAM(CDC_putchar, CDC_getchar, _FDEV_SETUP_RW);
-#endif
 	
 /** Main program entry point. This routine configures the hardware required by the application, then
  *  enters a loop to run the application tasks in sequence.
diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c
index dfee2bb1be7d4c3dfdcb29073355da6f255820ef..d0cb29ecfe708abfdecd5bf6916438905cbed58e 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.c
+++ b/LUFA/Drivers/USB/Class/Device/CDC.c
@@ -234,4 +234,24 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC
 	Endpoint_ClearIN();
 }
 
+void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, CDCInterfaceInfo);
+}
+
+static int CDC_Device_putchar(char c, FILE* Stream)
+{
+	CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c);
+	return 0;
+}
+
+static int CDC_Device_getchar(FILE* Stream)
+{
+	if (!(CDC_Device_BytesReceived((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))))
+	  return -1;
+
+	return CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
+}
+
 #endif
diff --git a/LUFA/Drivers/USB/Class/Device/CDC.h b/LUFA/Drivers/USB/Class/Device/CDC.h
index 1691857cdde897b296aa0a8e256134280fb4472f..857d07335597c3f177297e6ee3a0281adf978d44 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.h
+++ b/LUFA/Drivers/USB/Class/Device/CDC.h
@@ -48,6 +48,7 @@
 		#include "../../USB.h"
 		#include "../Common/CDC.h"
 
+		#include <stdio.h>
 		#include <string.h>
 
 	/* Enable C linkage for C++ Compilers: */
@@ -209,10 +210,24 @@
 			 */
 			void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 
+			/** Creates a standard characer stream for the given CDC Device instance so that it can be used with all the regular
+			 *  functions in the avr-libc <stdio.h> library that accept a FILE stream as a destination (e.g. fprintf).
+			 *
+			 *  \note The created stream can be given as stdout if desired to direct the standard output from all <stdio.h> functions
+			 *        to the given CDC interface.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state
+			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed
+			 */
+			void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* Stream);
+
 	/* Private Interface - For use in library only: */
 	#if !defined(__DOXYGEN__)
 		/* Function Prototypes: */
 			#if defined(INCLUDE_FROM_CDC_CLASS_DEVICE_C)
+				static int CDC_Device_putchar(char c, FILE* Stream);
+				static int CDC_Device_getchar(FILE* Stream);
+				
 				void CDC_Device_Event_Stub(void);
 				void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 														  ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c
index db2f721836ef67faff5c39b5a1c9826394d71018..6aceccaf1e6c96d4a9fb4e430d137bdf76d2fe3a 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.c
+++ b/LUFA/Drivers/USB/Class/Host/CDC.c
@@ -334,6 +334,26 @@ uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
 	return ReceivedByte;
 }
 
+void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, CDCInterfaceInfo);
+}
+
+static int CDC_Host_putchar(char c, FILE* Stream)
+{
+	CDC_Host_SendByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream), c);
+	return 0;
+}
+
+static int CDC_Host_getchar(FILE* Stream)
+{
+	if (!(CDC_Host_BytesReceived((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream))))
+	  return -1;
+
+	return CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));
+}
+
 void CDC_Host_Event_Stub(void)
 {
 
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h
index 6b3a320f0fcc9c3e18039a6c1777ff5d6042f32a..0ee24be4897d62ee318f9037585c44a978492320 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.h
+++ b/LUFA/Drivers/USB/Class/Host/CDC.h
@@ -47,6 +47,9 @@
 	/* Includes: */
 		#include "../../USB.h"
 		#include "../Common/CDC.h"
+
+		#include <stdio.h>
+		#include <string.h>
 		
 	/* Enable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
@@ -205,6 +208,17 @@
 			 */
 			uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 			
+			/** Creates a standard characer stream for the given CDC Device instance so that it can be used with all the regular
+			 *  functions in the avr-libc <stdio.h> library that accept a FILE stream as a destination (e.g. fprintf).
+			 *
+			 *  \note The created stream can be given as stdout if desired to direct the standard output from all <stdio.h> functions
+			 *        to the given CDC interface.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state
+			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed
+			 */
+			void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream);
+
 			/** CDC class driver event for a control line state change on a CDC host interface. This event fires each time the device notifies
 			 *  the host of a control line state change (containing the virtual serial control line states, such as DCD) and may be hooked in the
 			 *  user program by declaring a handler function with the same name and parameters listed here. The new control line states
@@ -231,6 +245,9 @@
 
 		/* Function Prototypes: */
 			#if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)
+				static int CDC_Host_putchar(char c, FILE* Stream);
+				static int CDC_Host_getchar(FILE* Stream);
+
 				void CDC_Host_Event_Stub(void);
 				void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
 				                                           ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Host_Event_Stub);
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 0dd3496557a53ba4cbd41952f090f366c4f1fda2..aaa811f6de59df09b9ff679cff259033fac14c00 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -13,12 +13,12 @@
   *  - Added new HID_HOST_BOOT_PROTOCOL_ONLY compile time token to reduce the size of the HID Host Class driver when
   *    Report protocol is not needed
   *  - Added new MIDI LowLevel and ClassDriver Host demo, add new MIDI Host Class driver
-  *  - Added stdio.h stream examples for the virtual CDC UART in the CDC host demos
   *  - Added new CDC/Mouse ClassDriver device demo
   *  - Added new Joystick Host ClassDriver and LowLevel demos
   *  - Added new Printer Host mode Class driver
   *  - Added new Printer Host mode ClassDriver demo
   *  - Added optional support for double banked endpoints in the Device mode Class drivers
+  *  - Added new stream creation function to the CDC Class drivers, to easily make standard streams from CDC Class driver instances
   *
   *  <b>Changed:</b>
   *  - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for sytax errors in the library
diff --git a/LUFA/ManPages/VIDAndPIDValues.txt b/LUFA/ManPages/VIDAndPIDValues.txt
index bfa493ff3625824b6ae92fe48a21c8c97b7a18f4..f1d66d2fbf70802992924ccdc90e5df4ea773b36 100644
--- a/LUFA/ManPages/VIDAndPIDValues.txt
+++ b/LUFA/ManPages/VIDAndPIDValues.txt
@@ -11,8 +11,8 @@
  *  are used within the LUFA demos, and thus may be re-used by derivations of each demo. Free PID values may be
  *  used by future LUFA demo projects.
  *
- *  These VID/PID values should not be used in commercial designs under any circumstances. Private projects may
- *  use the following values freely, but must accept any collisions due to other LUFA derived private projects
+ *  <b>These VID/PID values should not be used in commercial designs under any circumstances.>/b> Private projects
+ *  may use the following values freely, but must accept any collisions due to other LUFA derived private projects
  *  sharing identical values. It is suggested that private projects using interfaces compatible with existing
  *  demos share the save VID/PID value.
  *