diff --git a/src/mserv.c b/src/mserv.c
index 21eb44c96e739f4aeaf9172d8ed64ab6733d0ae3..f5c4fa8892fdecbcc235d259b7e2dd2a8a359a77 100644
--- a/src/mserv.c
+++ b/src/mserv.c
@@ -661,19 +661,11 @@ FUNCMATH static const char *int2str(INT32 n)
 #ifndef NONET
 static INT32 ConnectionFailed(void)
 {
-	time(&MSLastPing);
 	con_state = MSCS_FAILED;
 	CONS_Alert(CONS_ERROR, M_GetText("Connection to Master Server failed\n"));
 	CloseConnection();
 	return MS_CONNECT_ERROR;
 }
-
-static INT32 ConnectionFailedwerrno(int no)
-{
-	CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error: %s\n"),
-			strerror(no));
-	return ConnectionFailed();
-}
 #endif
 
 /** Tries to register the local game server on the master server.
@@ -690,41 +682,44 @@ static INT32 AddToMasterServer(boolean firstadd)
 	msg_server_t *info = (msg_server_t *)msg.buffer;
 	INT32 room = -1;
 	fd_set tset;
+	time_t timestamp = time(NULL);
 	UINT32 signature, tmp;
 	const char *insname;
 
-	if (socket_fd == (SOCKET_TYPE)ERRSOCKET)/* Woah, our socket was closed! */
-	{
-		if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0))
-			return ConnectionFailedwerrno(errno);
-	}
-
 	M_Memcpy(&tset, &wset, sizeof (tset));
 	res = select(255, NULL, &tset, NULL, &select_timeout);
-	if (res == 0)/* nothing selected */
+	if (res != ERRSOCKET && !res)
 	{
-		/*
-		Timeout next call because SendPingToMasterServer
-		(our calling function) already calls this once
-		every two minutes.
-		*/
-		if (retry++ == 1)
+		if (retry++ > 30) // an about 30 second timeout
 		{
 			retry = 0;
 			CONS_Alert(CONS_ERROR, M_GetText("Master Server timed out\n"));
+			MSLastPing = timestamp;
 			return ConnectionFailed();
 		}
 		return MS_CONNECT_ERROR;
 	}
 	retry = 0;
+	if (res == ERRSOCKET)
+	{
+		if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0))
+		{
+			CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error #%u: %s\n"), errno, strerror(errno));
+			MSLastPing = timestamp;
+			return ConnectionFailed();
+		}
+	}
 
 	// so, the socket is writable, but what does that mean, that the connection is
 	// ok, or bad... let see that!
 	j = (socklen_t)sizeof (i);
-	if (getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, (char *)&i, &j) == ERRSOCKET)
-		return ConnectionFailedwerrno(errno);
+	getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, (char *)&i, &j);
 	if (i) // it was bad
-		return ConnectionFailedwerrno(i);
+	{
+		CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error #%u: %s\n"), errno, strerror(errno));
+		MSLastPing = timestamp;
+		return ConnectionFailed();
+	}
 
 #ifdef PARANOIA
 	if (ms_RoomId <= 0)
@@ -757,12 +752,15 @@ static INT32 AddToMasterServer(boolean firstadd)
 	msg.length = (UINT32)sizeof (msg_server_t);
 	msg.room = 0;
 	if (MS_Write(&msg) < 0)
+	{
+		MSLastPing = timestamp;
 		return ConnectionFailed();
+	}
 
 	if(con_state != MSCS_REGISTERED)
 		CONS_Printf(M_GetText("Master Server update successful.\n"));
 
-	time(&MSLastPing);
+	MSLastPing = timestamp;
 	con_state = MSCS_REGISTERED;
 	CloseConnection();
 #endif