diff --git a/Projects/HIDReportViewer/HIDReportViewer.c b/Projects/HIDReportViewer/HIDReportViewer.c
index 6d48aca78522997917efa1af2b239040b0d79ddc..49f81f2a64c98d9cfd78056f429a2098a7420d69 100644
--- a/Projects/HIDReportViewer/HIDReportViewer.c
+++ b/Projects/HIDReportViewer/HIDReportViewer.c
@@ -123,76 +123,8 @@ int main(void)
 			case HOST_STATE_Configured:
 				LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
 				
-				printf_P(PSTR("\r\n\r\nTotal Device Reports: %" PRId8 "\r\n"), HIDReportInfo.TotalDeviceReports);
-				for (uint8_t ReportIndex = 0; ReportIndex < HIDReportInfo.TotalDeviceReports; ReportIndex++)
-				{
-					HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[ReportIndex];
-
-					uint8_t ReportSizeInBits      = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_In];
-					uint8_t ReportSizeOutBits     = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Out];
-					uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Feature];
-
-					/* Print out the byte sizes of each report within the device */
-					printf_P(PSTR("  + Report ID 0x%02" PRIX8 "\r\n"
-					              "    - Input Data:   %" PRId8 " bits (%" PRId8 " bytes)\r\n"
-					              "    - Output Data:  %" PRId8 " bits (%" PRId8 " bytes)\r\n"
-					              "    - Feature Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"),
-					         CurrReportIDInfo->ReportID,
-					         ReportSizeInBits,
-					         ((ReportSizeInBits      >> 3) + ((ReportSizeInBits      & 0x07) != 0)),
-					         ReportSizeOutBits,
-					         ((ReportSizeOutBits     >> 3) + ((ReportSizeOutBits     & 0x07) != 0)),
-					         ReportSizeFeatureBits,
-					         ((ReportSizeFeatureBits >> 3) + ((ReportSizeFeatureBits & 0x07) != 0)));
-				}
-				
-				printf_P(PSTR("\r\nReport Items (%" PRId8 " Stored in Table):\r\n"), HIDReportInfo.TotalReportItems);
-				for (uint8_t ItemIndex = 0; ItemIndex < HIDReportInfo.TotalReportItems; ItemIndex++)
-				{
-					const HID_ReportItem_t* RItem = &HIDReportInfo.ReportItems[ItemIndex];
-
-					printf_P(PSTR("  + Item %" PRId8 ":\r\n"
-					              "    - Report ID:          0x%02" PRIX8  "\r\n"
-					              "    - Data Direction:     %s\r\n"
-					              "    - Item Flags:         0x%02" PRIX8  "\r\n"
-					              "    - Item Offset (Bits): 0x%02" PRIX8  "\r\n"
-					              "    - Item Size (Bits):   0x%02" PRIX8  "\r\n"
-					              "    - Usage Page:         0x%04" PRIX16 "\r\n"
-					              "    - Usage:              0x%04" PRIX16 "\r\n"
-					              "    - Unit Type:          0x%08" PRIX32 "\r\n"
-					              "    - Unit Exponent:      0x%02" PRIX8  "\r\n"
-					              "    - Logical Minimum:    0x%08" PRIX32 "\r\n"
-					              "    - Logical Maximum:    0x%08" PRIX32 "\r\n"
-					              "    - Physical Minimum:   0x%08" PRIX32 "\r\n"
-					              "    - Physical Maximum:   0x%08" PRIX32 "\r\n"
-					              "    - Collection Path:\r\n"),
-					         ItemIndex,
-					         RItem->ReportID,
-					         ((RItem->ItemType == HID_REPORT_ITEM_In) ? "IN" : ((RItem->ItemType == HID_REPORT_ITEM_Out) ? "OUT" : "FEATURE")),
-					         RItem->ItemFlags,
-					         RItem->BitOffset,
-					         RItem->Attributes.BitSize,
-					         RItem->Attributes.Usage.Page,
-					         RItem->Attributes.Usage.Usage,
-					         RItem->Attributes.Unit.Type,
-					         RItem->Attributes.Unit.Exponent,
-					         RItem->Attributes.Logical.Minimum,
-					         RItem->Attributes.Logical.Maximum,
-					         RItem->Attributes.Physical.Minimum,
-					         RItem->Attributes.Physical.Maximum);
-					
-					const HID_CollectionPath_t* CollectionPath  = RItem->CollectionPath;
-					
-					while (CollectionPath != NULL)
-					{
-						printf_P(PSTR("      |\r\n"
-						              "      - Type:  0x%02" PRIX8 "\r\n"
-						              "      - Usage: 0x%02" PRIX8 "\r\n"),
-						              CollectionPath->Type, CollectionPath->Usage);
-						
-						CollectionPath = CollectionPath->Parent;
-					}
-				}
+				OutputReportSizes();
+				OutputParsedReportItems();
 				
 				LEDs_SetAllLEDs(LEDMASK_USB_READY);
 				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
@@ -204,6 +136,104 @@ int main(void)
 	}
 }
 
+/** Prints a summary of the device's HID report sizes from the HID parser output to the serial port
+ *  for display to the user.
+ */
+void OutputReportSizes(void)
+{
+	printf_P(PSTR("\r\n\r\nTotal Device Reports: %" PRId8 "\r\n"), HIDReportInfo.TotalDeviceReports);
+
+	for (uint8_t ReportIndex = 0; ReportIndex < HIDReportInfo.TotalDeviceReports; ReportIndex++)
+	{
+		const HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[ReportIndex];
+
+		uint8_t ReportSizeInBits      = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_In];
+		uint8_t ReportSizeOutBits     = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Out];
+		uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Feature];
+
+		/* Print out the byte sizes of each report within the device */
+		printf_P(PSTR("  + Report ID 0x%02" PRIX8 "\r\n"
+					  "    - Input Data:   %" PRId8 " bits (%" PRId8 " bytes)\r\n"
+					  "    - Output Data:  %" PRId8 " bits (%" PRId8 " bytes)\r\n"
+					  "    - Feature Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"),
+				 CurrReportIDInfo->ReportID,
+				 ReportSizeInBits,
+				 ((ReportSizeInBits      >> 3) + ((ReportSizeInBits      & 0x07) != 0)),
+				 ReportSizeOutBits,
+				 ((ReportSizeOutBits     >> 3) + ((ReportSizeOutBits     & 0x07) != 0)),
+				 ReportSizeFeatureBits,
+				 ((ReportSizeFeatureBits >> 3) + ((ReportSizeFeatureBits & 0x07) != 0)));
+	}
+}
+
+/** Prints a summary of the device's parsed and stored report items along with their attributes
+ *  to the serial port for display to the user.
+ */
+void OutputParsedReportItems(void)
+{
+	printf_P(PSTR("\r\nReport Items (%" PRId8 " in Table):\r\n"), HIDReportInfo.TotalReportItems);
+
+	for (uint8_t ItemIndex = 0; ItemIndex < HIDReportInfo.TotalReportItems; ItemIndex++)
+	{
+		const HID_ReportItem_t* RItem = &HIDReportInfo.ReportItems[ItemIndex];
+
+		printf_P(PSTR("  + Item %" PRId8 ":\r\n"
+					  "    - Report ID:          0x%02" PRIX8  "\r\n"
+					  "    - Data Direction:     %s\r\n"
+					  "    - Item Flags:         0x%02" PRIX8  "\r\n"
+					  "    - Item Offset (Bits): 0x%02" PRIX8  "\r\n"
+					  "    - Item Size (Bits):   0x%02" PRIX8  "\r\n"
+					  "    - Usage Page:         0x%04" PRIX16 "\r\n"
+					  "    - Usage:              0x%04" PRIX16 "\r\n"
+					  "    - Unit Type:          0x%08" PRIX32 "\r\n"
+					  "    - Unit Exponent:      0x%02" PRIX8  "\r\n"
+					  "    - Logical Minimum:    0x%08" PRIX32 "\r\n"
+					  "    - Logical Maximum:    0x%08" PRIX32 "\r\n"
+					  "    - Physical Minimum:   0x%08" PRIX32 "\r\n"
+					  "    - Physical Maximum:   0x%08" PRIX32 "\r\n"
+					  "    - Collection Path:\r\n"),
+				 ItemIndex,
+				 RItem->ReportID,
+				 ((RItem->ItemType == HID_REPORT_ITEM_In) ? "IN" : ((RItem->ItemType == HID_REPORT_ITEM_Out) ? "OUT" : "FEATURE")),
+				 RItem->ItemFlags,
+				 RItem->BitOffset,
+				 RItem->Attributes.BitSize,
+				 RItem->Attributes.Usage.Page,
+				 RItem->Attributes.Usage.Usage,
+				 RItem->Attributes.Unit.Type,
+				 RItem->Attributes.Unit.Exponent,
+				 RItem->Attributes.Logical.Minimum,
+				 RItem->Attributes.Logical.Maximum,
+				 RItem->Attributes.Physical.Minimum,
+				 RItem->Attributes.Physical.Maximum);
+		
+		OutputCollectionPath(RItem->CollectionPath);
+	}
+}
+
+/** Prints the HID Collection path (along with each node's attributes) to the serial port
+ *  for display to the user, from the given starting node to the root node.
+ *
+ *  \param[in] CollectionPath  Starting HID Collection node to print
+ */
+void OutputCollectionPath(const HID_CollectionPath_t* const CollectionPath)
+{
+	const HID_CollectionPath_t* CurrentNode = CollectionPath;
+
+	while (CurrentNode != NULL)
+	{
+		printf_P(PSTR("      |\r\n"
+					  "      - Type:  0x%02" PRIX8 "\r\n"
+					  "      - Usage: 0x%02" PRIX8 "\r\n"),
+					  CurrentNode->Type, CurrentNode->Usage);
+		
+		CurrentNode = CurrentNode->Parent;
+	}
+	
+	printf_P(PSTR("      |\r\n"
+				  "      END\r\n"));
+}
+
 /** Configures the board hardware and chip peripherals for the demo's functionality. */
 void SetupHardware(void)
 {
diff --git a/Projects/HIDReportViewer/HIDReportViewer.h b/Projects/HIDReportViewer/HIDReportViewer.h
index f4e131f3ef1121a3d4dca0ed1e6b88f221ff06b8..ff2512b90d37f9af587d619f6efd82e41aa331ce 100644
--- a/Projects/HIDReportViewer/HIDReportViewer.h
+++ b/Projects/HIDReportViewer/HIDReportViewer.h
@@ -69,6 +69,9 @@
 
 	/* Function Prototypes: */
 		void SetupHardware(void);
+		void OutputReportSizes(void);
+		void OutputParsedReportItems(void);
+		void OutputCollectionPath(const HID_CollectionPath_t* const CollectionPath);
 
 		void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
 		void EVENT_USB_Host_DeviceAttached(void);