diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 895c2604433df6a0254a0acbccab6d729a3f55b8..2317cbdfe1a0a3076dd6342f4055a35508093271 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -751,7 +751,7 @@ bool LuaEntitySAO::collideWithObjects(){
 
 // No prototype, PlayerSAO does not need to be deserialized
 
-PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
+PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, u16 peer_id_,
 		const std::set<std::string> &privs, bool is_singleplayer):
 	ServerActiveObject(env_, v3f(0,0,0)),
 	m_player(player_),
@@ -833,11 +833,10 @@ void PlayerSAO::addedToEnvironment(u32 dtime_s)
 void PlayerSAO::removingFromEnvironment()
 {
 	ServerActiveObject::removingFromEnvironment();
-	if(m_player->getPlayerSAO() == this)
-	{
+	if (m_player->getPlayerSAO() == this) {
 		m_player->setPlayerSAO(NULL);
 		m_player->peer_id = 0;
-		m_env->savePlayer((RemotePlayer*)m_player);
+		m_env->savePlayer(m_player);
 		m_env->removePlayer(m_player);
 	}
 }
diff --git a/src/content_sao.h b/src/content_sao.h
index ccae90b77ee7a25391db44e10ac2ab0d0251da7b..c97db4922788c1d0a57f6714f920b1bc1579ce9f 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -160,7 +160,7 @@ class LagPool
 class PlayerSAO : public ServerActiveObject
 {
 public:
-	PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
+	PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, u16 peer_id_,
 			const std::set<std::string> &privs, bool is_singleplayer);
 	~PlayerSAO();
 	ActiveObjectType getType() const
@@ -231,14 +231,8 @@ class PlayerSAO : public ServerActiveObject
 
 	void disconnected();
 
-	Player* getPlayer()
-	{
-		return m_player;
-	}
-	u16 getPeerID() const
-	{
-		return m_peer_id;
-	}
+	RemotePlayer* getPlayer() { return m_player; }
+	u16 getPeerID() const { return m_peer_id; }
 
 	// Cheat prevention
 
@@ -291,7 +285,7 @@ class PlayerSAO : public ServerActiveObject
 private:
 	std::string getPropertyPacket();
 
-	Player *m_player;
+	RemotePlayer *m_player;
 	u16 m_peer_id;
 	Inventory *m_inventory;
 	s16 m_damage;
diff --git a/src/game.cpp b/src/game.cpp
index 22d9ffef638fa4d6bf7e9e418888088d0e98202e..5bb08e27a253fe152c45b67cb1caffa46c91e727 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -2851,7 +2851,7 @@ void Game::processItemSelection(u16 *new_playeritem)
 
 	s32 wheel = input->getMouseWheel();
 	u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE - 1,
-		                 player->hud_hotbar_itemcount - 1);
+		    player->hud_hotbar_itemcount - 1);
 
 	s32 dir = wheel;
 
diff --git a/src/localplayer.h b/src/localplayer.h
index 3ae0c4e51d29566ffa04af1e19638df7598767f4..8897adc5e032a635e320739629807bfaa6a42589 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -80,6 +80,8 @@ class LocalPlayer : public Player
 		m_cao = toset;
 	}
 
+	u32 maxHudId() const { return hud.size(); }
+
 private:
 	void accelerateHorizontal(const v3f &target_speed, const f32 max_increase);
 	void accelerateVertical(const v3f &target_speed, const f32 max_increase);
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 6d42edd7d8055f276c0fbee12c06a3f446f2a76a..35e350f20e8bf9c0728a59d10c2faaec63fd0d03 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -1122,7 +1122,7 @@ void Client::handleCommand_HudSetParam(NetworkPacket* pkt)
 
 	*pkt >> param >> value;
 
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	if (param == HUD_PARAM_HOTBAR_ITEMCOUNT && value.size() == 4) {
@@ -1131,10 +1131,10 @@ void Client::handleCommand_HudSetParam(NetworkPacket* pkt)
 			player->hud_hotbar_itemcount = hotbar_itemcount;
 	}
 	else if (param == HUD_PARAM_HOTBAR_IMAGE) {
-		((LocalPlayer *) player)->hotbar_image = value;
+		player->hotbar_image = value;
 	}
 	else if (param == HUD_PARAM_HOTBAR_SELECTED_IMAGE) {
-		((LocalPlayer *) player)->hotbar_selected_image = value;
+		player->hotbar_selected_image = value;
 	}
 }
 
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index f9061cc4f1374525fccfcba7a381e11c133e438c..3fba7f720b4502ac725b3dfaf695b46964771446 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -800,7 +800,8 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
 	pitch = modulo360f(pitch);
 	yaw = modulo360f(yaw);
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -879,7 +880,9 @@ void Server::handleCommand_DeletedBlocks(NetworkPacket* pkt)
 
 void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
 {
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1078,7 +1081,9 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
 
 	*pkt >> damage;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1112,7 +1117,9 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
 
 	*pkt >> breath;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1224,7 +1231,9 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
 	if (pkt->getSize() < 2)
 		return;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1299,7 +1308,9 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
 	verbosestream << "TOSERVER_INTERACT: action=" << (int)action << ", item="
 			<< item_i << ", pointed=" << pointed.dump() << std::endl;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1719,7 +1730,9 @@ void Server::handleCommand_NodeMetaFields(NetworkPacket* pkt)
 		fields[fieldname] = pkt->readLongString();
 	}
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1769,7 +1782,9 @@ void Server::handleCommand_InventoryFields(NetworkPacket* pkt)
 		fields[fieldname] = pkt->readLongString();
 	}
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player =
+		dynamic_cast<RemotePlayer *>(m_env->getPlayer(pkt->getPeerId()));
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
diff --git a/src/player.h b/src/player.h
index f38effa9d62e20808ac0dd2b3a14665f3050b6ef..fbd88fc71038b3823f83a42be10caceba96b41d7 100644
--- a/src/player.h
+++ b/src/player.h
@@ -233,16 +233,6 @@ class Player
 		return size;
 	}
 
-	void setHotbarItemcount(s32 hotbar_itemcount)
-	{
-		hud_hotbar_itemcount = hotbar_itemcount;
-	}
-
-	s32 getHotbarItemcount()
-	{
-		return hud_hotbar_itemcount;
-	}
-
 	void setHotbarImage(const std::string &name)
 	{
 		hud_hotbar_image = name;
@@ -278,18 +268,6 @@ class Player
 		*params = m_sky_params;
 	}
 
-	void overrideDayNightRatio(bool do_override, float ratio)
-	{
-		m_day_night_ratio_do_override = do_override;
-		m_day_night_ratio = ratio;
-	}
-
-	void getDayNightRatio(bool *do_override, float *ratio)
-	{
-		*do_override = m_day_night_ratio_do_override;
-		*ratio = m_day_night_ratio;
-	}
-
 	void setLocalAnimations(v2s32 frames[4], float frame_speed)
 	{
 		for (int i = 0; i < 4; i++)
@@ -309,11 +287,6 @@ class Player
 		return false;
 	}
 
-	virtual PlayerSAO *getPlayerSAO()
-	{
-		return NULL;
-	}
-
 	virtual void setPlayerSAO(PlayerSAO *sao)
 	{
 		FATAL_ERROR("FIXME");
@@ -335,7 +308,7 @@ class Player
 	void setModified(const bool x)
 	{
 		m_dirty = x;
-		if (x == false)
+		if (!x)
 			inventory.setModified(x);
 	}
 
@@ -391,10 +364,7 @@ class Player
 	std::string inventory_formspec;
 
 	PlayerControl control;
-	PlayerControl getPlayerControl()
-	{
-		return control;
-	}
+	const PlayerControl& getPlayerControl() { return control; }
 
 	u32 keyPressed;
 
@@ -403,9 +373,6 @@ class Player
 	u32         addHud(HudElement* hud);
 	HudElement* removeHud(u32 id);
 	void        clearHud();
-	u32         maxHudId() {
-		return hud.size();
-	}
 
 	u32 hud_flags;
 	s32 hud_hotbar_itemcount;
@@ -429,9 +396,6 @@ class Player
 	std::string m_sky_type;
 	video::SColor m_sky_bgcolor;
 	std::vector<std::string> m_sky_params;
-
-	bool m_day_night_ratio_do_override;
-	float m_day_night_ratio;
 private:
 	// Protect some critical areas
 	// hud for example can be modified by EmergeThread
@@ -463,6 +427,25 @@ class RemotePlayer : public Player
 
 	const RemotePlayerChatResult canSendChatMessage();
 
+	void setHotbarItemcount(s32 hotbar_itemcount)
+	{
+		hud_hotbar_itemcount = hotbar_itemcount;
+	}
+
+	s32 getHotbarItemcount() const { return hud_hotbar_itemcount; }
+
+	void overrideDayNightRatio(bool do_override, float ratio)
+	{
+		m_day_night_ratio_do_override = do_override;
+		m_day_night_ratio = ratio;
+	}
+
+	void getDayNightRatio(bool *do_override, float *ratio)
+	{
+		*do_override = m_day_night_ratio_do_override;
+		*ratio = m_day_night_ratio;
+	}
+
 private:
 	PlayerSAO *m_sao;
 
@@ -473,6 +456,9 @@ class RemotePlayer : public Player
 	u32 m_last_chat_message_sent;
 	float m_chat_message_allowance;
 	u16 m_message_rate_overhead;
+
+	bool m_day_night_ratio_do_override;
+	float m_day_night_ratio;
 };
 
 #endif
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index ebdea09e4ebd1587a66b7aede422fade0bfb2dd8..f6ea23e95826857012b88f971f89a37576de0023 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -494,8 +494,8 @@ int ModApiEnvMod::l_get_player_by_name(lua_State *L)
 
 	// Do it
 	const char *name = luaL_checkstring(L, 1);
-	Player *player = env->getPlayer(name);
-	if(player == NULL){
+	RemotePlayer *player = dynamic_cast<RemotePlayer *>(env->getPlayer(name));
+	if (player == NULL){
 		lua_pushnil(L);
 		return 1;
 	}
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index befae42539e0d7ffc00fcd9e2f2df3605eb0f521..4e1a1c1598c37bdb52a079c4600fecdd6e218446 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -107,7 +107,7 @@ PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref)
 	return (PlayerSAO*)obj;
 }
 
-Player* ObjectRef::getplayer(ObjectRef *ref)
+RemotePlayer* ObjectRef::getplayer(ObjectRef *ref)
 {
 	PlayerSAO *playersao = getplayersao(ref);
 	if (playersao == NULL)
@@ -1212,8 +1212,8 @@ int ObjectRef::l_get_player_control(lua_State *L)
 		lua_pushlstring(L, "", 0);
 		return 1;
 	}
-	// Do it
-	PlayerControl control = player->getPlayerControl();
+
+	const PlayerControl &control = player->getPlayerControl();
 	lua_newtable(L);
 	lua_pushboolean(L, control.up);
 	lua_setfield(L, -2, "up");
@@ -1467,7 +1467,7 @@ int ObjectRef::l_hud_set_flags(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1519,7 +1519,7 @@ int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1537,7 +1537,7 @@ int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1677,7 +1677,7 @@ int ObjectRef::l_override_day_night_ratio(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1700,7 +1700,7 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h
index a37d29535accfeccfc0abaec09de55df784a0a24..a7ac9dff9298ac5588a3945789f66f65d8f45ef5 100644
--- a/src/script/lua_api/l_object.h
+++ b/src/script/lua_api/l_object.h
@@ -27,6 +27,7 @@ class ServerActiveObject;
 class LuaEntitySAO;
 class PlayerSAO;
 class Player;
+class RemotePlayer;
 
 /*
 	ObjectRef
@@ -47,7 +48,7 @@ class ObjectRef : public ModApiBase {
 
 	static PlayerSAO* getplayersao(ObjectRef *ref);
 
-	static Player* getplayer(ObjectRef *ref);
+	static RemotePlayer* getplayer(ObjectRef *ref);
 
 	// Exported functions
 
diff --git a/src/server.cpp b/src/server.cpp
index 2dd070b1a23c5787954e6376b7c6e399e7f46a71..11ffba3433cfb9e6576baaad3f62488dec732ecf 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1256,7 +1256,7 @@ Inventory* Server::getInventory(const InventoryLocation &loc)
 		break;
 	case InventoryLocation::PLAYER:
 	{
-		Player *player = m_env->getPlayer(loc.name.c_str());
+		RemotePlayer *player = dynamic_cast<RemotePlayer *>(m_env->getPlayer(loc.name.c_str()));
 		if(!player)
 			return NULL;
 		PlayerSAO *playersao = player->getPlayerSAO();
@@ -1296,9 +1296,12 @@ void Server::setInventoryModified(const InventoryLocation &loc, bool playerSend)
 		if (!playerSend)
 			return;
 
-		Player *player = m_env->getPlayer(loc.name.c_str());
-		if(!player)
+		RemotePlayer *player =
+			dynamic_cast<RemotePlayer *>(m_env->getPlayer(loc.name.c_str()));
+
+		if (!player)
 			return;
+
 		PlayerSAO *playersao = player->getPlayerSAO();
 		if(!playersao)
 			return;
@@ -2637,19 +2640,16 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
 				++i;
 		}
 
-		Player *player = m_env->getPlayer(peer_id);
+		RemotePlayer *player = dynamic_cast<RemotePlayer *>(m_env->getPlayer(peer_id));
 
 		/* Run scripts and remove from environment */
-		{
-			if(player != NULL)
-			{
-				PlayerSAO *playersao = player->getPlayerSAO();
-				assert(playersao);
+		if(player != NULL) {
+			PlayerSAO *playersao = player->getPlayerSAO();
+			assert(playersao);
 
-				m_script->on_leaveplayer(playersao, reason == CDR_TIMEOUT);
+			m_script->on_leaveplayer(playersao, reason == CDR_TIMEOUT);
 
-				playersao->disconnected();
-			}
+			playersao->disconnected();
 		}
 
 		/*
@@ -2691,7 +2691,7 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
 		SendChatMessage(PEER_ID_INEXISTENT,message);
 }
 
-void Server::UpdateCrafting(Player* player)
+void Server::UpdateCrafting(RemotePlayer* player)
 {
 	DSTACK(FUNCTION_NAME);
 
@@ -2701,7 +2701,8 @@ void Server::UpdateCrafting(Player* player)
 	loc.setPlayer(player->getName());
 	std::vector<ItemStack> output_replacements;
 	getCraftingResult(&player->inventory, preview, output_replacements, false, this);
-	m_env->getScriptIface()->item_CraftPredict(preview, player->getPlayerSAO(), (&player->inventory)->getList("craft"), loc);
+	m_env->getScriptIface()->item_CraftPredict(preview, player->getPlayerSAO(),
+			(&player->inventory)->getList("craft"), loc);
 
 	// Put the new preview in
 	InventoryList *plist = player->inventory.getList("craftpreview");
@@ -2851,8 +2852,8 @@ std::string Server::getPlayerName(u16 peer_id)
 
 PlayerSAO* Server::getPlayerSAO(u16 peer_id)
 {
-	Player *player = m_env->getPlayer(peer_id);
-	if(player == NULL)
+	RemotePlayer *player = dynamic_cast<RemotePlayer *>(m_env->getPlayer(peer_id));
+	if (player == NULL)
 		return NULL;
 	return player->getPlayerSAO();
 }
@@ -2917,8 +2918,9 @@ void Server::reportPrivsModified(const std::string &name)
 			reportPrivsModified(player->getName());
 		}
 	} else {
-		Player *player = m_env->getPlayer(name.c_str());
-		if(!player)
+		RemotePlayer *player =
+			dynamic_cast<RemotePlayer *>(m_env->getPlayer(name.c_str()));
+		if (!player)
 			return;
 		SendPlayerPrivileges(player->peer_id);
 		PlayerSAO *sao = player->getPlayerSAO();
@@ -3025,7 +3027,7 @@ bool Server::hudChange(Player *player, u32 id, HudElementStat stat, void *data)
 	return true;
 }
 
-bool Server::hudSetFlags(Player *player, u32 flags, u32 mask)
+bool Server::hudSetFlags(RemotePlayer *player, u32 flags, u32 mask)
 {
 	if (!player)
 		return false;
@@ -3043,10 +3045,11 @@ bool Server::hudSetFlags(Player *player, u32 flags, u32 mask)
 	return true;
 }
 
-bool Server::hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount)
+bool Server::hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount)
 {
 	if (!player)
 		return false;
+
 	if (hotbar_itemcount <= 0 || hotbar_itemcount > HUD_HOTBAR_ITEMCOUNT_MAX)
 		return false;
 
@@ -3057,13 +3060,6 @@ bool Server::hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount)
 	return true;
 }
 
-s32 Server::hudGetHotbarItemcount(Player *player)
-{
-	if (!player)
-		return 0;
-	return player->getHotbarItemcount();
-}
-
 void Server::hudSetHotbarImage(Player *player, std::string name)
 {
 	if (!player)
@@ -3130,7 +3126,7 @@ bool Server::setSky(Player *player, const video::SColor &bgcolor,
 	return true;
 }
 
-bool Server::overrideDayNightRatio(Player *player, bool do_override,
+bool Server::overrideDayNightRatio(RemotePlayer *player, bool do_override,
 	float ratio)
 {
 	if (!player)
diff --git a/src/server.h b/src/server.h
index 34427a71ac30f968f71805995071cb1b55402668..331a91a52371f2408cea5b1da98e03f30a7b5730 100644
--- a/src/server.h
+++ b/src/server.h
@@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "environment.h"
 #include "chat_interface.h"
 #include "clientiface.h"
+#include "player.h"
 #include "network/networkpacket.h"
 #include <string>
 #include <list>
@@ -48,7 +49,6 @@ class IWritableCraftDefManager;
 class BanManager;
 class EventManager;
 class Inventory;
-class Player;
 class PlayerSAO;
 class IRollbackManager;
 struct RollbackAction;
@@ -336,9 +336,10 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	u32 hudAdd(Player *player, HudElement *element);
 	bool hudRemove(Player *player, u32 id);
 	bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
-	bool hudSetFlags(Player *player, u32 flags, u32 mask);
-	bool hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount);
-	s32 hudGetHotbarItemcount(Player *player);
+	bool hudSetFlags(RemotePlayer *player, u32 flags, u32 mask);
+	bool hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount);
+	s32 hudGetHotbarItemcount(RemotePlayer *player) const
+			{ return player->getHotbarItemcount(); }
 	void hudSetHotbarImage(Player *player, std::string name);
 	std::string hudGetHotbarImage(Player *player);
 	void hudSetHotbarSelectedImage(Player *player, std::string name);
@@ -353,7 +354,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	bool setSky(Player *player, const video::SColor &bgcolor,
 			const std::string &type, const std::vector<std::string> &params);
 
-	bool overrideDayNightRatio(Player *player, bool do_override, float brightness);
+	bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness);
 
 	/* con::PeerHandler implementation. */
 	void peerAdded(con::Peer *peer);
@@ -475,7 +476,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	void DiePlayer(u16 peer_id);
 	void RespawnPlayer(u16 peer_id);
 	void DeleteClient(u16 peer_id, ClientDeletionReason reason);
-	void UpdateCrafting(Player *player);
+	void UpdateCrafting(RemotePlayer *player);
 
 	void handleChatInterfaceEvent(ChatEvent *evt);