diff --git a/source/games/exhumed/src/osdcmds.cpp b/source/games/exhumed/src/osdcmds.cpp
index de76375ef..47701bfa0 100644
--- a/source/games/exhumed/src/osdcmds.cpp
+++ b/source/games/exhumed/src/osdcmds.cpp
@@ -87,7 +87,7 @@ static int osdcmd_spawn(CCmdFuncPtr parm)
     if (!stricmp(c, "anubis")) BuildAnubis(nullptr, initpos, sectp, inita, false);
     else if (!stricmp(c, "spider")) BuildSpider(nullptr, initpos, sectp, inita);
     else if (!stricmp(c, "mummy")) BuildMummy(nullptr, initpos, sectp, inita);
-    else if (!stricmp(c, "fish")) BuildFish(nullptr, initpos.plusZ(PlayerList[nLocalPlayer].eyelevel), sectp, inita);
+    else if (!stricmp(c, "fish")) BuildFish(nullptr, initpos.plusZ(PlayerList[nLocalPlayer].pActor->viewzoffset), sectp, inita);
     else if (!stricmp(c, "lion")) BuildLion(nullptr, initpos, sectp, inita);
     else if (!stricmp(c, "lava")) BuildLava(nullptr, initpos, sectp, inita, nNetPlayerCount);
     else if (!stricmp(c, "rex")) BuildRex(nullptr, initpos, sectp, inita, nNetPlayerCount);
diff --git a/source/games/exhumed/src/player.cpp b/source/games/exhumed/src/player.cpp
index c578949f8..86391c0b3 100644
--- a/source/games/exhumed/src/player.cpp
+++ b/source/games/exhumed/src/player.cpp
@@ -400,7 +400,7 @@ void RestartPlayer(int nPlayer)
 	}
 
 	plr->pPlayerGrenade = nullptr;
-	plr->oeyelevel = plr->eyelevel = -55.;
+	pActor->oviewzoffset = pActor->viewzoffset = -55.;
 	dVertPan[nPlayer] = 0;
 
 	nTemperature[nPlayer] = 0;
@@ -504,7 +504,7 @@ void StartDeathSeq(int nPlayer, int nVal)
     StopFiringWeapon(nPlayer);
 
     PlayerList[nPlayer].horizon.ohoriz = PlayerList[nPlayer].horizon.horiz = nullAngle;
-    PlayerList[nPlayer].oeyelevel = PlayerList[nPlayer].eyelevel = -55;
+    pActor->oviewzoffset = pActor->viewzoffset = -55;
     PlayerList[nPlayer].nInvisible = 0;
     dVertPan[nPlayer] = 15;
 
@@ -908,7 +908,6 @@ void AIPlayer::Tick(RunListEvent* ev)
     PlayerList[nPlayer].horizon.backup();
     PlayerList[nPlayer].angle.resetadjustment();
     PlayerList[nPlayer].horizon.resetadjustment();
-    PlayerList[nPlayer].oeyelevel = PlayerList[nPlayer].eyelevel;
 
     pPlayerActor->vel.XY() = sPlayerInput[nPlayer].vel;
 
@@ -1170,7 +1169,7 @@ sectdone:
 
     auto pViewSect = pPlayerActor->sector();
 
-    double EyeZ = PlayerList[nPlayer].eyelevel + pPlayerActor->spr.pos.Z + nQuake[nPlayer];
+    double EyeZ = pPlayerActor->getOffsetZ() + nQuake[nPlayer];
 
     while (1)
     {
@@ -2363,8 +2362,8 @@ sectdone:
                 }
                 else
                 {
-                    if (PlayerList[nPlayer].eyelevel < -32.5) {
-                        PlayerList[nPlayer].eyelevel += ((-32.5 - PlayerList[nPlayer].eyelevel) * 0.5);
+                    if (pPlayerActor->viewzoffset < -32.5) {
+                        pPlayerActor->viewzoffset += ((-32.5 - pPlayerActor->viewzoffset) * 0.5);
                     }
 
                 loc_1BD2E:
@@ -2382,7 +2381,7 @@ sectdone:
             {
                 if (PlayerList[nPlayer].nHealth > 0)
                 {
-                    PlayerList[nPlayer].eyelevel += (nActionEyeLevel[nAction] - PlayerList[nPlayer].eyelevel) * 0.5;
+                    pPlayerActor->viewzoffset += (nActionEyeLevel[nAction] - pPlayerActor->viewzoffset) * 0.5;
 
                     if (bUnderwater)
                     {
@@ -2610,9 +2609,9 @@ sectdone:
     {
         PlayerList[nPlayer].nThrust.Zero();
 
-        if (PlayerList[nPlayer].eyelevel >= -11)
+        if (pPlayerActor->viewzoffset >= -11)
         {
-            PlayerList[nPlayer].eyelevel = -11;
+            pPlayerActor->viewzoffset = -11;
             dVertPan[nPlayer] = 0;
         }
         else
@@ -2620,7 +2619,7 @@ sectdone:
             if (PlayerList[nPlayer].horizon.horiz.Sgn() > 0)
             {
                 PlayerList[nPlayer].horizon.settarget(nullAngle);
-                PlayerList[nPlayer].eyelevel -= dVertPan[nPlayer];
+                pPlayerActor->viewzoffset -= dVertPan[nPlayer];
             }
             else
             {
@@ -2718,7 +2717,6 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, Player& w, Player*
             ("floorspr", w.pPlayerFloorSprite)
             ("save", w.sPlayerSave)
             ("totalvel", w.totalvel)
-            ("eyelevel", w.eyelevel)
             ("grenade", w.pPlayerGrenade)
 
             .EndObject();
diff --git a/source/games/exhumed/src/player.h b/source/games/exhumed/src/player.h
index 11f0307b0..326bf2eb4 100644
--- a/source/games/exhumed/src/player.h
+++ b/source/games/exhumed/src/player.h
@@ -99,7 +99,6 @@ struct Player
     PlayerSave sPlayerSave;
     int ototalvel;
     int totalvel;
-    double eyelevel, oeyelevel;
     TObjPtr<DExhumedActor*> pPlayerGrenade;
     TObjPtr<DExhumedActor*> pPlayerFloorSprite;
     TObjPtr<DExhumedActor*> pDoppleSprite;
diff --git a/source/games/exhumed/src/sequence.cpp b/source/games/exhumed/src/sequence.cpp
index 2d4753439..f12bfab18 100644
--- a/source/games/exhumed/src/sequence.cpp
+++ b/source/games/exhumed/src/sequence.cpp
@@ -676,7 +676,7 @@ int seq_PlotSequence(int nSprite, int16_t edx, int16_t nFrame, int16_t ecx)
         auto pSector =pTSprite->sectp;
         double nFloorZ = pSector->floorz;
 
-        if (nFloorZ <= PlayerList[nLocalPlayer].eyelevel + initpos.Z) {
+        if (nFloorZ <= PlayerList[nLocalPlayer].pActor->viewzoffset + initpos.Z) {
             pTSprite->ownerActor = nullptr;
         }
         else
diff --git a/source/games/exhumed/src/view.cpp b/source/games/exhumed/src/view.cpp
index f5cfc8cf5..929f327bb 100644
--- a/source/games/exhumed/src/view.cpp
+++ b/source/games/exhumed/src/view.cpp
@@ -226,7 +226,7 @@ void DrawView(double interpfrac, bool sceneonly)
     }
     else
     {
-        nCamerapos = pPlayerActor->interpolatedpos(interpfrac).plusZ(interpolatedvalue(PlayerList[nLocalPlayer].oeyelevel, PlayerList[nLocalPlayer].eyelevel, interpfrac));
+        nCamerapos = pPlayerActor->getRenderPos(interpfrac);
 
         pSector = PlayerList[nLocalPlayer].pPlayerViewSect;
         updatesector(nCamerapos, &pSector);