diff --git a/src/g_game.c b/src/g_game.c
index 52358a8b9..1c7abb00e 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -2075,6 +2075,7 @@ void G_PlayerReborn(INT32 player)
 	INT32 exiting;
 	INT16 numboxes;
 	INT16 totalring;
+	INT16 totalsphere;
 	UINT8 laps;
 	UINT8 mare;
 	UINT8 skincolor;
@@ -2103,6 +2104,7 @@ void G_PlayerReborn(INT32 player)
 	numboxes = players[player].numboxes;
 	laps = players[player].laps;
 	totalring = players[player].totalring;
+	totalsphere = players[player].totalsphere;
 
 	skincolor = players[player].skincolor;
 	skin = players[player].skin;
@@ -2187,6 +2189,7 @@ void G_PlayerReborn(INT32 player)
 	p->numboxes = numboxes;
 	p->laps = laps;
 	p->totalring = totalring;
+	p->totalsphere = totalsphere;
 
 	p->mare = mare;
 	if (bot)
diff --git a/src/m_cheat.c b/src/m_cheat.c
index 6e346de91..37a55ab99 100644
--- a/src/m_cheat.c
+++ b/src/m_cheat.c
@@ -892,7 +892,8 @@ void Command_Setrings_f(void)
 		{
 			players[consoleplayer].spheres = 0;
 			P_GivePlayerSpheres(&player[consoleplayer], atoi(COM_Argv(1)));
-			// no totalsphere addition to revert
+			if (!G_IsSpecialStage(gamemap))
+				players[consoleplayer].totalsphere -= atoi(COM_Argv(1)); //undo totalsphere addition done in P_GivePlayerRings
 		}
 
 		G_SetGameModified(multiplayer);
diff --git a/src/p_user.c b/src/p_user.c
index fd09b0847..e7a53d0be 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -963,6 +963,8 @@ void P_GivePlayerSpheres(player_t *player, INT32 num_spheres)
 
 	player->spheres += num_spheres;
 
+	player->totalsphere += num_spheres;
+
 	// Can only get up to 9999 spheres, sorry!
 	if (player->spheres > 9999)
 		player->spheres = 9999;