diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index 836023f5b704153b64517635fd3dd96847533e05..27397245ce33eee9e0073648683016848a56119e 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -1995,40 +1995,7 @@ static boolean CL_FinishedFileList(void)
 	else if (i == 1)
 		cl_mode = CL_ASKJOIN;
 	else
-	{
-		// must download something
-		// can we, though?
-#ifdef HAVE_CURL
-		if (http_source[0] == '\0' || curl_failedwebdownload)
-#endif
-		{
-			if (!CL_CheckDownloadable()) // nope!
-			{
-				D_QuitNetGame();
-				CL_Reset();
-				D_StartTitle();
-				M_StartMessage(M_GetText(
-					"You cannot connect to this server\n"
-					"because you cannot download the files\n"
-					"that you are missing from the server.\n\n"
-					"See the console or log file for\n"
-					"more details.\n\n"
-					"Press ESC\n"
-				), NULL, MM_NOTHING);
-				return false;
-			}
-
-			cl_mode = CL_ASKDOWNLOADFILES;
-			return true;
-		}
-#ifdef HAVE_CURL
-		else
-		{
-			cl_mode = CL_PREPAREHTTPFILES;
-			return true;
-		}
-#endif
-	}
+		cl_mode = CL_ASKDOWNLOADFILES;
 	return true;
 }
 
@@ -2163,10 +2130,9 @@ static boolean CL_ServerConnectionTicker(boolean viams, const char *tmpsave, tic
 
 #ifdef HAVE_CURL
 		case CL_PREPAREHTTPFILES:
-			if (http_source[0])
 			{
 				for (i = 0; i < fileneedednum; i++)
-					if (fileneeded[i].status == FS_NOTFOUND)
+					if (fileneeded[i].status == FS_NOTFOUND || fileneeded[i].status == FS_MD5SUMBAD)
 						curl_transfers++;
 
 				cl_mode = CL_DOWNLOADHTTPFILES;
@@ -2176,7 +2142,7 @@ static boolean CL_ServerConnectionTicker(boolean viams, const char *tmpsave, tic
 		case CL_DOWNLOADHTTPFILES:
 			waitmore = false;
 			for (i = 0; i < fileneedednum; i++)
-				if (fileneeded[i].status == FS_NOTFOUND)
+				if (fileneeded[i].status == FS_NOTFOUND || fileneeded[i].status == FS_MD5SUMBAD)
 				{
 					if (!curl_running)
 						CURLPrepareFile(http_source, i);
@@ -3912,7 +3878,9 @@ static void HandleConnect(SINT8 node)
 		if (netbuffer->u.clientcfg.needsdownload)
 		{
 			netbuffer->packettype = PT_DOWNLOADFILESOKAY;
-			HSendPacket(node, true, 0, 0);
+			strncpy(netbuffer->u.filecfg.http_source, cv_httpsource.string,
+					MAX_MIRROR_LENGTH);
+			HSendPacket(node, true, 0, sizeof netbuffer->u.filecfg);
 			return;
 		}
 
@@ -4193,7 +4161,17 @@ static void HandlePacketFromAwayNode(SINT8 node)
 
 			SERVERONLY
 
-			// This should've already been checked, but just to be safe...
+#ifdef HAVE_CURL
+			if (! curl_failedwebdownload &&
+					netbuffer->u.filecfg.http_source[0] != '\0'
+			){
+				strlcpy(http_source, netbuffer->u.filecfg.http_source,
+						MAX_MIRROR_LENGTH);
+
+				cl_mode = CL_PREPAREHTTPFILES;
+			}
+			else
+#endif
 			if (!CL_CheckDownloadable())
 			{
 				D_QuitNetGame();
@@ -4215,7 +4193,7 @@ static void HandlePacketFromAwayNode(SINT8 node)
 
 			cl_challengeattempted = 2;
 			CONS_Printf("trying to download\n");
-			if (CL_SendRequestFile())
+			if (cl_mode == CL_WAITDOWNLOADFILESRESPONSE && CL_SendRequestFile())
 					cl_mode = CL_DOWNLOADFILES;
 			break;
 
diff --git a/src/d_clisrv.h b/src/d_clisrv.h
index c4e54b4859125f44753373fb2f05958054e1064d..d1d99d7d45b47182e7b13e039f64ac3c57cd21df 100644
--- a/src/d_clisrv.h
+++ b/src/d_clisrv.h
@@ -443,6 +443,11 @@ typedef struct
 	UINT8 files[MAXFILENEEDED]; // is filled with writexxx (byteptr.h)
 } ATTRPACK filesneededconfig_pak;
 
+typedef struct
+{
+	char http_source[MAX_MIRROR_LENGTH];/* first byte 0? no die! */
+} ATTRPACK fileconfig;
+
 //
 // Network packet data
 //
@@ -477,6 +482,7 @@ typedef struct
 		plrconfig playerconfig[MAXPLAYERS]; // (up to) 528 bytes(?)
 		INT32 filesneedednum;               //           4 bytes
 		filesneededconfig_pak filesneededcfg; //       ??? bytes
+		fileconfig filecfg;
 		UINT32 pingtable[MAXPLAYERS+1];     //          68 bytes
 	} u; // This is needed to pack diff packet types data together
 } ATTRPACK doomdata_t;