diff --git a/Demos/Device/ClassDriver/MIDI/MIDI.c b/Demos/Device/ClassDriver/MIDI/MIDI.c
index 217a3a4bd78d2d27e9089a4f9cec0791c9f9e142..95a2ddd0e0e28fcdaee434908488f224c6b6d522 100644
--- a/Demos/Device/ClassDriver/MIDI/MIDI.c
+++ b/Demos/Device/ClassDriver/MIDI/MIDI.c
@@ -71,7 +71,7 @@ int main(void)
 		CheckJoystickMovement();
 
 		MIDI_EventPacket_t ReceivedMIDIEvent;
-		if (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent))
+		while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent))
 		{
 			if ((ReceivedMIDIEvent.Command == (MIDI_COMMAND_NOTE_ON >> 4)) && (ReceivedMIDIEvent.Data3 > 0))
 			  LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2);
diff --git a/Demos/Device/LowLevel/MIDI/MIDI.c b/Demos/Device/LowLevel/MIDI/MIDI.c
index e4364558572e90e7501638f5b64cc98f214507c1..bfe90b0d15938b05e2a62f02fce52a57c428fd27 100644
--- a/Demos/Device/LowLevel/MIDI/MIDI.c
+++ b/Demos/Device/LowLevel/MIDI/MIDI.c
@@ -204,8 +204,12 @@ void MIDI_Task(void)
 			LEDs_SetAllLEDs(LEDS_NO_LEDS);
 		}
 
-		/* Clear the endpoint ready for new packet */
-		Endpoint_ClearOUT();
+		/* If the endpoint is now empty, clear the bank */
+		if (!(Endpoint_BytesInEndpoint()))
+		{
+			/* Clear the endpoint ready for new packet */
+			Endpoint_ClearOUT();
+		}
 	}
 }
 
diff --git a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
index 56daf125ca189c2c4292c884f909a30dddd9b0ae..eda82725714148bfca46b1f32ecdf579744d23f5 100644
--- a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
+++ b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
@@ -109,7 +109,7 @@ int main(void)
 				CheckJoystickMovement();
 
 				MIDI_EventPacket_t MIDIEvent;
-				if (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent))
+				while (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent))
 				{
 					bool NoteOnEvent  = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON  >> 4));
 					bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4));
diff --git a/Demos/Host/LowLevel/MIDIHost/MIDIHost.c b/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
index b616b679f59203a8cac408351711ae807f4230e6..5ff3baa39952f6c804d5766546151a6380bbeb5e 100644
--- a/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
+++ b/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
@@ -192,19 +192,19 @@ void MIDI_Host_Task(void)
 				                                                                           ((MIDIEvent.Data1 & 0x0F) + 1),
 				                                                                           MIDIEvent.Data2, MIDIEvent.Data3);
 				}
-
-				Pipe_ClearIN();
+				
+				if (!(Pipe_BytesInPipe()))
+				  Pipe_ClearIN();
 			}
 
 			Pipe_SelectPipe(MIDI_DATA_OUT_PIPE);
 
-			static uint8_t PrevJoystickStatus;
-
 			if (Pipe_IsOUTReady())
 			{
 				uint8_t MIDICommand = 0;
 				uint8_t MIDIPitch;
 
+				static uint8_t PrevJoystickStatus;
 				uint8_t JoystickStatus  = Joystick_GetStatus();
 				uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus);