diff --git a/src/include/netconnect.h b/src/include/netconnect.h
index 9d8415a7b..4b3e1baf8 100644
--- a/src/include/netconnect.h
+++ b/src/include/netconnect.h
@@ -207,7 +207,7 @@ extern void NetworkInitClientConnect(void); /// Setup network connect state mach
 extern void NetworkExitClientConnect(void); /// Terminate network connect state machine for clients
 extern void NetworkInitServerConnect(void); /// Setup network connect state machine for the server
 extern void NetworkExitServerConnect(void); /// Terminate network connect state machine for the server
-extern void NetworkParseSetupEvent(const char *buf, int size); /// Parse a network connect event
+extern int NetworkParseSetupEvent(const char *buf, int size); /// Parse a network connect event
 extern int NetworkSetupServerAddress(const char *serveraddr); /// Menu: Setup the server IP
 extern void NetworkProcessClientRequest(void); /// Menu Loop: Send out client request messages
 extern void NetworkProcessServerRequest(void); /// Menu Loop: Send out server request messages
diff --git a/src/network/netconnect.cpp b/src/network/netconnect.cpp
index 6bd7e3727..7473828b2 100644
--- a/src/network/netconnect.cpp
+++ b/src/network/netconnect.cpp
@@ -801,8 +801,9 @@ global void NetworkProcessServerRequest(void)
     }
 }
 
+IfDebug(
 /**
-**	Parse a network menu packet in client disconneccted state.
+**	Parse a network menu packet in client disconnected state.
 **
 **	@param msg	message received
 */
@@ -812,9 +813,10 @@ local void ClientParseDisconnected(
     DebugLevel0Fn("ccs_disconnected: Server sending GoodBye dups %d\n" _C_
 	    msg->SubType);
 }
+);
 
 /**
-**	FIXME: docu
+**	Parse a network menu packet in client detaching state.
 **
 **	@param msg	message received
 */
@@ -835,7 +837,7 @@ local void ClientParseDetaching(const InitMessage* msg)
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu packet in client connecting state.
 **
 **	@param msg	message received
 */
@@ -909,19 +911,18 @@ local void ClientParseConnecting(const InitMessage* msg)
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu packet in client connected state.
 **
 **	@param msg	message received
 */
 local void ClientParseConnected(const InitMessage* msg)
 {
+    int pathlen;
+
     switch(msg->SubType) {
-	int pathlen;
 
 	case ICMMap:		// Server has sent us new map info
-	    sprintf(ScenSelectFullPath, "%s/", FreeCraftLibPath);
-	    // FIXME: pathlen = sprintf should work?
-	    pathlen = strlen(ScenSelectFullPath);
+	    pathlen = sprintf(ScenSelectFullPath, "%s/", FreeCraftLibPath);
 	    memcpy(ScenSelectFullPath+pathlen, msg->u.MapPath, 256);
 	    ScenSelectFullPath[pathlen+255] = 0;
 	    if (NetClientSelectScenario()) {
@@ -952,7 +953,7 @@ local void ClientParseConnected(const InitMessage* msg)
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu packet in client initial mapinfo state.
 **
 **	@param msg	message received
 */
@@ -975,7 +976,7 @@ local void ClientParseMapInfo(const InitMessage* msg)
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu packet in client synced state.
 **
 **	@param msg	message received
 */
@@ -993,7 +994,7 @@ local void ClientParseSynced(const InitMessage* msg)
 	    NetStateMsgCnt = 0;
 	    break;
 
-	case ICMConfig:		// Server gives the go ahead..
+	case ICMConfig:		// Server gives the go ahead.. - start game
 	    DebugLevel0Fn("ccs_synced: Config subtype %d received - starting\n" _C_ msg->SubType);
 	    HostsCount = 0;
 	    for (i = 0; i < msg->HostsCount - 1; ++i) {
@@ -1040,7 +1041,7 @@ local void ClientParseSynced(const InitMessage* msg)
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu packet in client async state.
 **
 **	@param msg	message received
 */
@@ -1077,7 +1078,7 @@ local void ClientParseAsync(const InitMessage* msg)
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu packet in client final goahead waiting state.
 **
 **	@param msg	message received
 */
@@ -1090,7 +1091,7 @@ local void ClientParseGoAhead(const InitMessage* msg)
 	    break;
 
 	case ICMState:		// Server has sent final state info
-	    DebugLevel3Fn("ccs_goahead: Final State subtype %d received - starting\n" _C_ msg->SubType);
+	    DebugLevel0Fn("ccs_goahead: Final State subtype %d received - starting\n" _C_ msg->SubType);
 	    ServerSetupState = msg->u.State;
 	    NetLocalState = ccs_started;
 	    NetStateMsgCnt = 0;
@@ -1103,7 +1104,7 @@ local void ClientParseGoAhead(const InitMessage* msg)
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu AreYouThere keepalive packet and reply IAmHere.
 **
 **	@param msg	message received
 */
@@ -1117,7 +1118,7 @@ local void ClientParseAreYouThere(const InitMessage* msg __attribute__((unused))
 }
 
 /**
-**	FIXME: docu
+**	Parse a network menu Bad Map reply from server.
 **
 **	@param msg	message received
 */
@@ -1135,6 +1136,7 @@ local void ClientParseBadMap(const InitMessage* msg __attribute__((unused)))
     NetConnectRunning = 0;	// End the menu..
 }
 
+
 /**
 **	Parse the initial 'Hello' message of new client that wants to join the game
 **
@@ -1559,16 +1561,11 @@ local int CheckVersions(const InitMessage* msg)
 **	Parse a Network menu packet.
 **
 **	@param msg	message received
-**	@param size	size of the received packet.
 */
-local void NetworkParseMenuPacket(const InitMessage *msg, int size)
+local void NetworkParseMenuPacket(const InitMessage *msg)
 {
-    if (msg->Type > MessageInitConfig || size != sizeof(*msg)) {
-	DebugLevel0Fn("Wrong message\n");
-	return;
-    }
-    DebugLevel0Fn("Received %s Init Message %d:%d (%d) from %d.%d.%d.%d:%d (%ld)\n" _C_
-	    icmsgsubtypenames[msg->SubType] _C_ msg->Type _C_ msg->SubType _C_ size _C_ NIPQUAD(ntohl(NetLastHost)) _C_
+    DebugLevel0Fn("Received %s Init Message %d:%d from %d.%d.%d.%d:%d (%ld)\n" _C_
+	    icmsgsubtypenames[msg->SubType] _C_ msg->Type _C_ msg->SubType _C_ NIPQUAD(ntohl(NetLastHost)) _C_
 	    ntohs(NetLastPort) _C_ FrameCounter);
 
     if (NetConnectRunning == 2) {		// client
@@ -1585,7 +1582,9 @@ local void NetworkParseMenuPacket(const InitMessage *msg, int size)
 	    }
 	    switch(NetLocalState) {
 		case ccs_disconnected:
+IfDebug(
 		    ClientParseDisconnected(msg);
+);
 		    break;
 
 		case ccs_detaching:
@@ -1692,33 +1691,27 @@ local void NetworkParseMenuPacket(const InitMessage *msg, int size)
 **
 **	@param buf	Packet received
 **	@param size	size of the received packet.
+**
+**	@return		1 if packet is an InitConfig message, 0 otherwise
 */
-global void NetworkParseSetupEvent(const char *buf, int size)
+global int NetworkParseSetupEvent(const char *buf, int size)
 {
-    NetworkPacket *packet;
+    const InitMessage *msg = (const InitMessage *)buf;
 
-    if (InterfaceState == IfaceStateMenu && NetConnectRunning) {
-	NetworkParseMenuPacket((const InitMessage *)buf, size);
-	return;
+    if (msg->Type > MessageInitConfig || size != sizeof(*msg)) {
+	if (NetConnectRunning == 2 && NetLocalState == ccs_started) {
+	    // Client has acked ready to start and receives first real network packed.
+	    // This indicates game has been started by server, so do the same for client.
+	    NetConnectRunning = 0;	// End the menu..
+	}
+	DebugLevel3Fn("Wrong message\n");
+	return 0;
     }
-    packet = (NetworkPacket *)buf;
-    if (packet->Commands[0].Type == MessageInitConfig
-	    && size == sizeof(InitMessage)) {
-	Acknowledge acknowledge;
-
-	DebugLevel0Fn("Received late clients\n");
-
-	// Acknowledge the packets.
-	acknowledge.Type = MessageInitReply;
-	size = NetSendUDP(NetworkFildes, NetLastHost, NetLastPort, &acknowledge,
-		sizeof(acknowledge));
-	DebugLevel0Fn("Sending config ack (%d)\n" _C_ size);
-	return;
-    }
-    if (packet->Commands[0].Type == MessageInitReply) {
-	DebugLevel0Fn("late init reply\n");
-	return;
+    if (InterfaceState == IfaceStateMenu) {
+	NetworkParseMenuPacket(msg);
+	return 1;
     }
+    return 0;
 }
 
 //@}
diff --git a/src/network/network.cpp b/src/network/network.cpp
index b63cfc734..e76ee88ec 100644
--- a/src/network/network.cpp
+++ b/src/network/network.cpp
@@ -635,9 +635,9 @@ global void NetworkEvent(void)
     //
     //	Setup messages
     //
-    if (packet->Commands[0].Type <= MessageInitConfig) {
-	NetworkParseSetupEvent(buf, i);
-	return;
+    if (NetConnectRunning) {
+	if (NetworkParseSetupEvent(buf, i))
+	    return;
     }
 
     //
@@ -647,6 +647,7 @@ global void NetworkEvent(void)
 	DebugLevel0Fn("Bad packet\n");
 	return;
     }
+    
     for (i = 0; i < HostsCount; ++i) {
 	if (Hosts[i].Host == NetLastHost && Hosts[i].Port == NetLastPort) {
 	    break;