diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index df6ab2bc6b8918e2d632aa91573b81e7adb1f4a3..6a83419d5acac795d79a1b10a4d4cb832685da03 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -473,6 +473,11 @@ static inline void CL_DrawConnectionStatus(void)
 // used only in arbitratrenetstart()
 static boolean CL_SendJoin(void)
 {
+	if (server)
+	{
+		nodewaiting[servernode]++;
+		return true;
+	}
 	// NET TODO
 	return true;
 }
@@ -715,7 +720,10 @@ static void CL_ConnectToServer(boolean viams)
 	sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home);
 #endif
 
-	cl_mode = cl_searching;
+	if (servernode == 0)
+		cl_mode = cl_askjoin;
+	else
+		cl_mode = cl_searching;
 
 #ifdef CLIENT_LOADINGSCREEN
 	lastfilenum = 0;
@@ -881,7 +889,8 @@ static void CL_ConnectToServer(boolean viams)
 
 				cl_mode = cl_askjoin; // don't break case continue to cljoin request now
 			case cl_askjoin:
-				CL_LoadServerFiles();
+				if (!server)
+					CL_LoadServerFiles();
 #ifdef JOININGAME
 				// prepare structures to save the file
 				// WARNING: this can be useless in case of server not in GS_LEVEL
@@ -889,7 +898,7 @@ static void CL_ConnectToServer(boolean viams)
 				CL_PrepareDownloadSaveGame(tmpsave);
 #endif
 				if (CL_SendJoin())
-					cl_mode = cl_waitjoinresponse;
+					cl_mode = server ? cl_connected : cl_waitjoinresponse;
 				break;
 #ifdef JOININGAME
 			case cl_downloadsavegame: