diff --git a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c
index 0f9134fea6d1f247ee13a5b27c8e66c6df529a9d..27662db753c6d3a39f82f8332a884838e195f448 100644
--- a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c
+++ b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c
@@ -121,6 +121,23 @@ int main(void)
 					break;
 				}
 				
+				SCSI_Request_Sense_Response_t SenseData;
+				if (MS_Host_RequestSense(&FlashDisk_MS_Interface, 0, &SenseData) != 0)
+				{
+					printf("Error retrieving device sense.\r\n");
+					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+					break;
+				}
+			
+				if (MS_Host_PreventAllowMediumRemoval(&FlashDisk_MS_Interface, 0, true))
+				{
+					printf("Error setting Prevent Device Removal bit.\r\n");
+					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+					break;
+				}
+
 				SCSI_Inquiry_Response_t InquiryData;
 				if (MS_Host_GetInquiryData(&FlashDisk_MS_Interface, &InquiryData))
 				{
@@ -147,7 +164,7 @@ int main(void)
 				}
 				while (!(DeviceReady));
 
-				puts_P(PSTR("Retrieving Capacity... "));
+				printf("Retrieving Capacity... ");
 
 				SCSI_Capacity_t DiskCapacity;
 				if (MS_Host_ReadDeviceCapacity(&FlashDisk_MS_Interface, 0, &DiskCapacity))
@@ -160,6 +177,41 @@ int main(void)
 				
 				printf("%lu blocks of %lu bytes.\r\n", DiskCapacity.Blocks, DiskCapacity.BlockSize);
 
+				uint8_t BlockBuffer[DiskCapacity.BlockSize];
+
+				if (MS_Host_ReadDeviceBlocks(&FlashDisk_MS_Interface, 0, 0x00000000, 1, DiskCapacity.BlockSize, BlockBuffer))
+				{
+					printf("Error reading device block.\r\n");
+					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+					break;
+				}
+			
+				printf("\r\nContents of first block:\r\n");
+
+				for (uint16_t Chunk = 0; Chunk < (DiskCapacity.BlockSize >> 4); Chunk++)
+				{
+					uint8_t* ChunkPtr = &BlockBuffer[Chunk << 4];
+					
+					/* Print out the 16 bytes of the chunk in HEX format */
+					for (uint8_t ByteOffset = 0; ByteOffset < (1 << 4); ByteOffset++)
+					{
+						char CurrByte = *(ChunkPtr + ByteOffset);
+						printf_P(PSTR("%.2X "), CurrByte);
+					}
+					
+					printf("    ");
+
+					/* Print out the 16 bytes of the chunk in ASCII format */
+					for (uint8_t ByteOffset = 0; ByteOffset < (1 << 4); ByteOffset++)
+					{
+						char CurrByte = *(ChunkPtr + ByteOffset);
+						putchar(isprint(CurrByte) ? CurrByte : '.');
+					}
+					
+					printf("\r\n");
+				}
+
 				LEDs_SetAllLEDs(LEDMASK_USB_READY);
 				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
diff --git a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h
index 02aabaf5873295ad1b992b19b2aab6f54044b14b..4c3539fd01ee3394d1ac6bb1a171acce0c2a584c 100644
--- a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h
+++ b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h
@@ -41,6 +41,7 @@
 		#include <avr/wdt.h>
 		#include <avr/pgmspace.h>
 		#include <avr/power.h>
+		#include <ctype.h>
 		#include <stdio.h>
 
 		#include <LUFA/Version.h>
diff --git a/Demos/Host/makefile b/Demos/Host/makefile
index 937c8fac852743953fcea9ebd38b4b0ebcd2500a..2da989302db4ad2ffb4eb03d6ca832e4b149f140 100644
--- a/Demos/Host/makefile
+++ b/Demos/Host/makefile
@@ -14,5 +14,5 @@
 # code.
 
 %:
-	make -C ClassDriver/ $@
+	#make -C ClassDriver/ $@  -- TODO: Re-enable once Host Mode class drivers complete
 	make -C LowLevel/ $@
diff --git a/LUFA/Drivers/USB/Class/Host/MassStorage.c b/LUFA/Drivers/USB/Class/Host/MassStorage.c
index ea7ed3d8a363b1648cfe216e6db58dd745951bd1..a0b34610cd1fdc3845e7bfeabc49d83409e8abfe 100644
--- a/LUFA/Drivers/USB/Class/Host/MassStorage.c
+++ b/LUFA/Drivers/USB/Class/Host/MassStorage.c
@@ -131,7 +131,7 @@ void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* MSInterfaceInfo)
 	
 }
 
-static uint8_t MassStore_SendCommand(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, MS_CommandBlockWrapper_t* SCSICommandBlock)
+static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, MS_CommandBlockWrapper_t* SCSICommandBlock)
 {
 	uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
 
@@ -152,7 +152,7 @@ static uint8_t MassStore_SendCommand(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, M
 	return PIPE_RWSTREAM_NoError;
 }
 
-static uint8_t MassStore_WaitForDataReceived(USB_ClassInfo_MS_Host_t* MSInterfaceInfo)
+static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* MSInterfaceInfo)
 {
 	uint16_t TimeoutMSRem = COMMAND_DATA_TIMEOUT_MS;
 
@@ -205,7 +205,7 @@ static uint8_t MassStore_WaitForDataReceived(USB_ClassInfo_MS_Host_t* MSInterfac
 	return PIPE_RWSTREAM_NoError;
 }
 
-static uint8_t MassStore_SendReceiveData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
+static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
                                          MS_CommandBlockWrapper_t* SCSICommandBlock, void* BufferPtr)
 {
 	uint8_t  ErrorCode = PIPE_RWSTREAM_NoError;
@@ -243,12 +243,12 @@ static uint8_t MassStore_SendReceiveData(USB_ClassInfo_MS_Host_t* MSInterfaceInf
 	return PIPE_RWSTREAM_NoError;
 }
 
-static uint8_t MassStore_GetReturnedStatus(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
+static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
                                            MS_CommandStatusWrapper_t* SCSICommandStatus)
 {
 	uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
 
-	if ((ErrorCode = MassStore_WaitForDataReceived(MSInterfaceInfo)) != PIPE_RWSTREAM_NoError)
+	if ((ErrorCode = MS_Host_WaitForDataReceived(MSInterfaceInfo)) != PIPE_RWSTREAM_NoError)
 	  return ErrorCode;
 
 	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipeNumber);
@@ -312,11 +312,25 @@ uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t* Max
 
 uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, SCSI_Inquiry_Response_t* InquiryData)
 {
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.Active))
+	  return HOST_SENDCONTROL_DeviceDisconnect;
 
 }
 
 uint8_t MS_Host_TestUnitReady(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex, bool* DeviceReady);
+
 uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex,
                                    SCSI_Capacity_t* DeviceCapacity);
 
+uint8_t MS_Host_RequestSense(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex,
+                             SCSI_Request_Sense_Response_t* SenseData);
+
+uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex, bool PreventRemoval);							 
+
+uint8_t MS_Host_ReadDeviceBlocks(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex, uint32_t BlockAddr,
+                                 uint8_t Blocks, uint16_t BlockSize, void* BlockBuffer);
+
+uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex, uint32_t BlockAddr,
+                                  uint8_t Blocks, uint16_t BlockSize, void* BlockBuffer);
+
 #endif
diff --git a/LUFA/Drivers/USB/Class/Host/MassStorage.h b/LUFA/Drivers/USB/Class/Host/MassStorage.h
index a8a957bab4fa29176ec74200c9c5dc7e06ff4ad2..7ee3b880468651d5631c9785c83e7b78e2e304bd 100644
--- a/LUFA/Drivers/USB/Class/Host/MassStorage.h
+++ b/LUFA/Drivers/USB/Class/Host/MassStorage.h
@@ -199,6 +199,15 @@
 			 */
 			uint8_t MS_Host_ResetMSInterface(USB_ClassInfo_MS_Host_t* MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 
+			/** Sends a GET MAX LUN control request to the attached device, retrieving the index of the highest LUN (Logical
+			 *  UNit, a logical drive) in the device. This value can then be used in the other functions of the Mass Storage
+			 *  Host mode Class driver to address a specific LUN within the device.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state
+			 *  \param[out] MaxLUNIndex  Pointer to a location where the highest LUN index value should be stored
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum
+			 */
 			uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t* MaxLUNIndex) ATTR_NON_NULL_PTR_ARG(1, 2);
 
 			uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
@@ -210,6 +219,18 @@
 			uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex,
 			                                   SCSI_Capacity_t* DeviceCapacity) ATTR_NON_NULL_PTR_ARG(1, 3);
 		
+			uint8_t MS_Host_RequestSense(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex,
+			                             SCSI_Request_Sense_Response_t* SenseData) ATTR_NON_NULL_PTR_ARG(1, 3);
+		
+			uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex,
+			                                          bool PreventRemoval) ATTR_NON_NULL_PTR_ARG(1);
+			
+			uint8_t MS_Host_ReadDeviceBlocks(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex, uint32_t BlockAddr,
+			                                 uint8_t Blocks, uint16_t BlockSize, void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1, 6);
+		
+			uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex, uint32_t BlockAddr,
+			                                  uint8_t Blocks, uint16_t BlockSize, void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1, 6);
+
 	/* Private Interface - For use in library only: */
 	#if !defined(__DOXYGEN__)
 		/* Macros: */
@@ -236,13 +257,13 @@
 				static uint8_t DComp_NextMassStorageInterface(void* CurrentDescriptor);
 				static uint8_t DComp_NextInterfaceBulkDataEndpoint(void* CurrentDescriptor);
 				
-				static uint8_t MassStore_SendCommand(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
-				                                     MS_CommandBlockWrapper_t* SCSICommandBlock);
-				static uint8_t MassStore_WaitForDataReceived(USB_ClassInfo_MS_Host_t* MSInterfaceInfo);
-				static uint8_t MassStore_SendReceiveData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, 
-                                                         MS_CommandBlockWrapper_t* SCSICommandBlock, void* BufferPtr);
-				static uint8_t MassStore_GetReturnedStatus(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
-				                                           MS_CommandStatusWrapper_t* SCSICommandStatus);
+				static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
+				                                   MS_CommandBlockWrapper_t* SCSICommandBlock);
+				static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* MSInterfaceInfo);
+				static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, 
+                                                       MS_CommandBlockWrapper_t* SCSICommandBlock, void* BufferPtr);
+				static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,
+				                                         MS_CommandStatusWrapper_t* SCSICommandStatus);
 			#endif
 	#endif
 	
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h
index beee2eb85a5cfc9f7e591a046e93d82e63d3cc31..1057ec8bc3e25bc2fff0b206062b350085070e14 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.h
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.h
@@ -699,8 +699,10 @@
 			static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_DWord_LE(const uint32_t DWord)
 			{
-				Pipe_Write_Word_LE(DWord);
-				Pipe_Write_Word_LE(DWord >> 16);
+				UPDATX = (DWord &  0xFF);
+				UPDATX = (DWord >> 8);
+				UPDATX = (DWord >> 16);
+				UPDATX = (DWord >> 24);
 			}
 			
 			/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
@@ -713,8 +715,10 @@
 			static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
 			static inline void Pipe_Write_DWord_BE(const uint32_t DWord)
 			{
-				Pipe_Write_Word_BE(DWord >> 16);
-				Pipe_Write_Word_BE(DWord);
+				UPDATX = (DWord >> 24);
+				UPDATX = (DWord >> 16);
+				UPDATX = (DWord >> 8);
+				UPDATX = (DWord &  0xFF);
 			}			
 			
 			/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.	
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 981ff1ded1019c4d987aef8c1a3690ce42fcb870..61485a0dd461390b4066e9589f6876914999f2e4 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -25,6 +25,7 @@
   *  - Added return values to the CDC and MIDI class driver transmit functions
   *  - Added extra masks to the SPI driver, changed SPI_Init() so that the clock polarity and sample modes can be set
   *  - Optimized Endpoint_Read_Word_* and Pipe_Read_Word_* macros to reduce compiled size
+  *  - Added non-null function parameter pointer restrictions to USB Class drivers to improve user code reliability
   *
   *  <b>Fixed:</b>
   *  - Fixed possible lockup in the CDC device class driver, when the host sends data that is a multiple of the