diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index d263d65e8d0a115f3df06d4c0f81b281e5d1ac4a..f7150ed526bd33603d044b310292e666fd6a71f1 100755
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -5041,6 +5041,19 @@ int recommendedSimulateTics = 0;
 int smoothingDelay;
 precise_t saveStateBenchmark = 0;
 precise_t loadStateBenchmark = 0;
+precise_t loadUnArchiveMisc = 0;
+precise_t loadUnArchiveWorld = 0;
+precise_t loadUnArchivePolyObjects = 0;
+precise_t loadUnArchiveThinkers = 0;
+precise_t loadUnArchiveSpecials = 0;
+precise_t loadUnArchiveColormaps = 0;
+precise_t loadUnArchiveWaypoints = 0;
+precise_t loadRelinkPointers = 0;
+precise_t loadFinishMobjs = 0;
+precise_t loadLUA_UnArcive = 0;
+precise_t loadLuaBanks = 0;
+// uint16_t	 hashHits;
+// uint16_t	 hashMiss;
 double netUpdateFudge; // our last net update fudge
 
 tic_t SavestatesClearedTic;
@@ -5776,31 +5789,39 @@ void MakeNetDebugString()
 	sprintf(&netDebugText[strlen(netDebugText)], "\nJitter: %d", serverJitter);
 	sprintf(&netDebugText[strlen(netDebugText)], "\nRTTJitter: %d", rttJitter);
 	sprintf(&netDebugText[strlen(netDebugText)], "\nEstRTT: %d", estimatedRTT);
-	sprintf(&netDebugText[strlen(netDebugText)], "\nSimInacc: %d", simInaccuracy);
-	sprintf(&netDebugText[strlen(netDebugText)], "\nGame: %d", gametic);
-	sprintf(&netDebugText[strlen(netDebugText)], "\nSim: %d", simtic);
-	sprintf(&netDebugText[strlen(netDebugText)], "\nSim-Game: %d", simtic - gametic);
-	sprintf(&netDebugText[strlen(netDebugText)], "\nSimDelta: %d", simtic - lastSim);
-	// sprintf(&netDebugText[strlen(netDebugText)], "\nLive: %d", liveTic);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nGameTic: %d", gametic);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nSimTic: %d", simtic);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nSims: %d", simtic - gametic);
 	sprintf(&netDebugText[strlen(netDebugText)], "\nTime save/load: %.4f/%.4f", (float)(I_PreciseToMicros(saveStateBenchmark)) / 1000, (float)(I_PreciseToMicros(loadStateBenchmark)) / 1000);
 	sprintf(&netDebugText[strlen(netDebugText)], "\nSim time: %.4f", (float)(I_PreciseToMicros(simEndTime - simStartTime)) / 1000);
 	sprintf(&netDebugText[strlen(netDebugText)], "\nTotal +ms: %.4f", (float)(I_PreciseToMicros(simEndTime - simStartTime + saveStateBenchmark + loadStateBenchmark))/1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nMisc: %.4f", (float)(I_PreciseToMicros(loadUnArchiveMisc)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nWorld: %.4f", (float)(I_PreciseToMicros(loadUnArchiveWorld)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nPolyObjs: %.4f", (float)(I_PreciseToMicros(loadUnArchivePolyObjects)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nThinkers: %.4f", (float)(I_PreciseToMicros(loadUnArchiveThinkers)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nSpecials: %.4f", (float)(I_PreciseToMicros(loadUnArchiveSpecials)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nColormaps: %.4f", (float)(I_PreciseToMicros(loadUnArchiveColormaps)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nWP: %.4f", (float)(I_PreciseToMicros(loadUnArchiveWaypoints)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nRELINKPTS: %.4f", (float)(I_PreciseToMicros(loadRelinkPointers)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nFinishMobjs: %.4f", (float)(I_PreciseToMicros(loadFinishMobjs)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nLUA_UnArch: %.4f", (float)(I_PreciseToMicros(loadLUA_UnArcive)) / 1000);
+	sprintf(&netDebugText[strlen(netDebugText)], "\nLuaBanks: %.4f", (float)(I_PreciseToMicros(loadLuaBanks)) / 1000);
 	// sprintf(&netDebugText[strlen(netDebugText)], "\nseed: %d", P_GetRandSeed());
 	// sprintf(&netDebugText[strlen(netDebugText)], "\nTimeFudge: %d%%", cv_timefudge.value);
-	lastSim = simtic;
-
-	unsigned int rtts[20] = {0};
-	for (int i = 0; i < rttBufferMax; i++)
-	{
-		if (rttBuffer[i] < 20)
-			rtts[rttBuffer[i]]++;
-	}
-
-	for (int i = 0; i < 20; i++)
-	{
-		if (rtts[i] > 0)
-			sprintf(&netDebugText[strlen(netDebugText)], "\nRTT %i: %i%%", i, rtts[i] * 100 / rttBufferMax);
-	}
+	// lastSim = simtic;
+
+	// unsigned int rtts[20] = {0};
+	// for (int i = 0; i < rttBufferMax; i++)
+	// {
+	// 	if (rttBuffer[i] < 20)
+	// 		rtts[rttBuffer[i]]++;
+	// }
+
+	// for (int i = 0; i < 20; i++)
+	// {
+	// 	if (rtts[i] > 0)
+	// 		sprintf(&netDebugText[strlen(netDebugText)], "\nRTT %i: %i%%", i, rtts[i] * 100 / rttBufferMax);
+	// }
 }
 
 // startTic and endTics are tics going back in time from the current liveTic
diff --git a/src/p_savenetrb.c b/src/p_savenetrb.c
index 95622ba8860dd180db25e26b49752e90ba122ee1..04822b1e38d091bef5c98f419c1e403df60659ab 100755
--- a/src/p_savenetrb.c
+++ b/src/p_savenetrb.c
@@ -3912,7 +3912,7 @@ static void P_LocalArchiveThinkers(void)
 
 	WRITEUINT8(save_p, 0xFF);
 }
-
+/*
 static void P_LocalUnArchiveThinkers()
 {
 	thinker_t *thinker;
@@ -4357,6 +4357,7 @@ static void P_LocalUnArchiveThinkers()
 	skyboxmo[0] = skyboxviewpnts[(skyviewid >= 0) ? skyviewid : 0];
 	skyboxmo[1] = skyboxcenterpnts[(skycenterid >= 0) ? skycenterid : 0];
 }
+*/
 
 /*
 static void P_LocalUnArchiveThinkers(boolean preserveLevel)
@@ -5790,6 +5791,17 @@ void P_GameStateFreeMemory(savestate_t* savestate)
 
 extern precise_t saveStateBenchmark;
 extern precise_t loadStateBenchmark;
+extern precise_t loadUnArchiveMisc;
+extern precise_t loadUnArchiveWorld;
+extern precise_t loadUnArchivePolyObjects;
+extern precise_t loadUnArchiveThinkers;
+extern precise_t loadUnArchiveSpecials;
+extern precise_t loadUnArchiveColormaps;
+extern precise_t loadUnArchiveWaypoints;
+extern precise_t loadRelinkPointers;
+extern precise_t loadFinishMobjs;
+extern precise_t loadLUA_UnArcive;
+extern precise_t loadLuaBanks;
 
 void P_SaveGameState(savestate_t* savestate)
 {
@@ -5863,6 +5875,7 @@ boolean P_LoadGameState(const savestate_t* savestate)
 {
 
     INT16 savedGameMap;
+	precise_t currentTime;
 	loadStateBenchmark = I_GetPreciseTime();
 	if (savestate->buffer == NULL)
 	{
@@ -5887,24 +5900,46 @@ boolean P_LoadGameState(const savestate_t* savestate)
 	con_muted = true;
 	CV_LoadNetVars(&save_p);
 	con_muted = false;
-	// CONS_Printf("P_NetUnArchiveMisc from Netplus\n");
+	currentTime = I_GetPreciseTime();
 	if (!P_NetUnArchiveMisc(true))
+	{
+		loadUnArchiveMisc = I_GetPreciseTime() - currentTime;
 		return false;
+	}
+	loadUnArchiveMisc = I_GetPreciseTime() - currentTime;
 	P_NetUnArchivePlayers();
 	if (gamestate == GS_LEVEL)
 	{
 		// P_NetUnArchiveWorld();
+		currentTime = I_GetPreciseTime();
 		P_LocalUnArchiveWorld();
+		loadUnArchiveWorld = I_GetPreciseTime() - currentTime;
+		currentTime = I_GetPreciseTime();
 		P_UnArchivePolyObjects();
+		loadUnArchivePolyObjects = I_GetPreciseTime() - currentTime;
+		currentTime = I_GetPreciseTime();
 		P_NetUnArchiveThinkers();
+		loadUnArchiveThinkers = I_GetPreciseTime() - currentTime;
+		currentTime = I_GetPreciseTime();
 		P_NetUnArchiveSpecials();
+		loadUnArchiveSpecials = I_GetPreciseTime() - currentTime;
+		currentTime = I_GetPreciseTime();
 		P_NetUnArchiveColormaps();
+		loadUnArchiveColormaps = I_GetPreciseTime() - currentTime;
+		currentTime = I_GetPreciseTime();
 		P_NetUnArchiveWaypoints();
-		P_RelinkPointers();
+		loadUnArchiveWaypoints = I_GetPreciseTime() - currentTime;
+		currentTime = I_GetPreciseTime();
+		P_RelinkPointers(); //candidate for optimization
+		loadRelinkPointers = I_GetPreciseTime() - currentTime;
+		currentTime = I_GetPreciseTime();
 		P_FinishMobjs();
+		loadFinishMobjs = I_GetPreciseTime() - currentTime;
 	}
 	con_muted = true;
-	LUA_UnArchive();
+	currentTime = I_GetPreciseTime();
+	LUA_UnArchive(); //candidate for optimization
+	loadLUA_UnArcive = I_GetPreciseTime() - currentTime;
 	con_muted = false;
 
 	// This is stupid and hacky, but maybe it'll work!