diff --git a/Projects/Webserver/Lib/FATFs/ffconf.h b/Projects/Webserver/Lib/FATFs/ffconf.h
index 4b19f1326dabff768152bb31bd263daef664d4df..3ad7a56af619dfc230700e11752901cfb438952b 100644
--- a/Projects/Webserver/Lib/FATFs/ffconf.h
+++ b/Projects/Webserver/Lib/FATFs/ffconf.h
@@ -14,7 +14,7 @@
 / Function and Buffer Configurations
 /----------------------------------------------------------------------------*/
 
-#define	_FS_TINY	1		/* 0 or 1 */
+#define	_FS_TINY	0		/* 0 or 1 */
 /* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system
 /  object instead of the sector buffer in the individual file object for file
 /  data transfer. This reduces memory consumption 512 bytes each file object. */
diff --git a/Projects/Webserver/Lib/HTTPServerApp.c b/Projects/Webserver/Lib/HTTPServerApp.c
index 3f8a2c3385cc1d2f53e86c8e326dd51f5a9e33ab..78c1b131ca321887f0bde0ff4a47c16bdb038299 100644
--- a/Projects/Webserver/Lib/HTTPServerApp.c
+++ b/Projects/Webserver/Lib/HTTPServerApp.c
@@ -96,17 +96,16 @@ void WebserverApp_Callback(void)
 	char*                     AppData     = (char*)uip_appdata;
 	uint16_t                  AppDataSize = 0;
 
-	if (uip_aborted() || uip_timedout())
+	if (uip_aborted() || uip_timedout() || uip_closed())
 	{
-		/* Close the file before terminating, if it is open */
-		f_close(&AppState->FileToSend);
+		/* Check if the open file needs to be closed */
+		if (AppState->FileOpen)
+		{
+			f_close(&AppState->FileHandle);
+			AppState->FileOpen = false;
+		}
 
-		AppState->CurrentState = WEBSERVER_STATE_Closed;
-
-		return;
-	}
-	else if (uip_closed())
-	{
+		AppState->PrevState    = WEBSERVER_STATE_Closed;
 		AppState->CurrentState = WEBSERVER_STATE_Closed;
 
 		return;
@@ -114,14 +113,20 @@ void WebserverApp_Callback(void)
 	else if (uip_connected())
 	{
 		/* New connection - initialize connection state and data pointer to the appropriate HTTP header */
+		AppState->PrevState    = WEBSERVER_STATE_OpenRequestedFile;
 		AppState->CurrentState = WEBSERVER_STATE_OpenRequestedFile;
 	}
+	else if (uip_rexmit())
+	{
+		/* Re-try last state */
+		AppState->CurrentState = AppState->PrevState;
+	}
 	
 	switch (AppState->CurrentState)
 	{
 		case WEBSERVER_STATE_OpenRequestedFile:
 			/* Wait for the packet containing the request header */
-			if (uip_datalen())
+			if (uip_newdata())
 			{
 				/* Must be a GET request, abort otherwise */
 				if (strncmp(AppData, "GET ", (sizeof("GET ") - 1)) != 0)
@@ -150,8 +155,10 @@ void WebserverApp_Callback(void)
 				  strcpy(AppState->FileName, "index.htm");
 				
 				/* Try to open the file from the Dataflash disk */
-				AppState->FileOpen = (f_open(&AppState->FileToSend, AppState->FileName, FA_OPEN_EXISTING | FA_READ) == FR_OK);
+				AppState->FileOpen       = (f_open(&AppState->FileHandle, AppState->FileName, FA_OPEN_EXISTING | FA_READ) == FR_OK);
+				AppState->CurrentFilePos = 0;
 
+				AppState->PrevState    = WEBSERVER_STATE_OpenRequestedFile;
 				AppState->CurrentState = WEBSERVER_STATE_SendResponseHeader;
 			}
 
@@ -171,6 +178,7 @@ void WebserverApp_Callback(void)
 			
 			uip_send(AppData, AppDataSize);
 			
+			AppState->PrevState    = WEBSERVER_STATE_SendResponseHeader;
 			AppState->CurrentState = WEBSERVER_STATE_SendMIMETypeHeader;
 			break;
 		case WEBSERVER_STATE_SendMIMETypeHeader:
@@ -209,28 +217,42 @@ void WebserverApp_Callback(void)
 				uip_send(AppData, AppDataSize);
 			}
 				
+			AppState->PrevState    = WEBSERVER_STATE_SendMIMETypeHeader;
 			AppState->CurrentState = WEBSERVER_STATE_SendData;				
 			break;
 		case WEBSERVER_STATE_SendData:
 			/* If end of file/file not open, progress to the close state */
-			if (!(AppState->FileOpen))
+			if (!(AppState->FileOpen) && !(uip_rexmit()))
 			{
-				f_close(&AppState->FileToSend);
+				f_close(&AppState->FileHandle);
 				uip_close();
+
+				AppState->PrevState    = WEBSERVER_STATE_Closed;
 				AppState->CurrentState = WEBSERVER_STATE_Closed;
 				break;
 			}
 
 			uint16_t MaxSegSize = uip_mss();
 			
+			/* Return file pointer to the last ACKed position if retransmitting */
+			f_lseek(&AppState->FileHandle, AppState->CurrentFilePos);
+
 			/* Read the next chunk of data from the open file */
-			f_read(&AppState->FileToSend, AppData, MaxSegSize, &AppDataSize);
-			AppState->FileOpen = (MaxSegSize == AppDataSize);
+			f_read(&AppState->FileHandle, AppData, MaxSegSize, &AppDataSize);
+			AppState->FileOpen = (AppDataSize > 0);
 
 			/* If data was read, send it to the client */
 			if (AppDataSize)
-			  uip_send(AppData, AppDataSize);
-					
+			{
+				/* If we are not re-transmitting a lost segment, advance file position */
+				if (!(uip_rexmit()))
+				  AppState->CurrentFilePos += AppDataSize;
+
+				uip_send(AppData, AppDataSize);
+			}
+			
+			AppState->PrevState = WEBSERVER_STATE_SendData;
+
 			break;
 	}
 }
diff --git a/Projects/Webserver/Lib/uIPManagement.c b/Projects/Webserver/Lib/uIPManagement.c
index dd9f15f42015bf571be16845b0f8e39718a2f551..f0011937292782434eb2d0421eaba4d74c4f8b8c 100644
--- a/Projects/Webserver/Lib/uIPManagement.c
+++ b/Projects/Webserver/Lib/uIPManagement.c
@@ -52,7 +52,7 @@ void uIPManagement_Init(void)
 {
 	/* uIP Timing Initialization */
 	clock_init();
-	timer_set(&ConnectionTimer, CLOCK_SECOND / 2);
+	timer_set(&ConnectionTimer, CLOCK_SECOND / 100);
 	timer_set(&ARPTimer, CLOCK_SECOND * 10);	
 
 	/* uIP Stack Initialization */
diff --git a/Projects/Webserver/Lib/uip/conf/apps-conf.h b/Projects/Webserver/Lib/uip/conf/apps-conf.h
index 63a445ca97ea41a8ff6e59fe707bdda470864c1e..88885a30390edc69018d3922bad5a09149336103 100644
--- a/Projects/Webserver/Lib/uip/conf/apps-conf.h
+++ b/Projects/Webserver/Lib/uip/conf/apps-conf.h
@@ -5,10 +5,13 @@
 
 	typedef struct
 	{
+		uint8_t PrevState;
 		uint8_t CurrentState;
+		
+		FIL     FileHandle;
 		char    FileName[13];
-		FIL     FileToSend;
 		bool    FileOpen;
+		uint32_t CurrentFilePos;
 	} uip_tcp_appstate_t;
 
 	typedef struct
diff --git a/Projects/Webserver/USBHostMode.c b/Projects/Webserver/USBHostMode.c
index 14f33e07cfa80fb010def8c02a7dc3d1ee75e70a..b8e2dcee7330a465b2170eb1895053869e60d959 100644
--- a/Projects/Webserver/USBHostMode.c
+++ b/Projects/Webserver/USBHostMode.c
@@ -45,10 +45,10 @@ USB_ClassInfo_RNDIS_Host_t Ethernet_RNDIS_Interface =
 		.Config =
 			{
 				.DataINPipeNumber           = 1,
-				.DataINPipeDoubleBank       = false,
+				.DataINPipeDoubleBank       = true,
 
 				.DataOUTPipeNumber          = 2,
-				.DataOUTPipeDoubleBank      = false,
+				.DataOUTPipeDoubleBank      = true,
 
 				.NotificationPipeNumber     = 3,
 				.NotificationPipeDoubleBank = false,