diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index ba90912cfd5903fb7e4b8681f8988b5404962029..23aa060fe72a2507f0484d5c795ae04192c4fae6 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -1360,6 +1360,17 @@ static int lib_pSpawnSkidDust(lua_State *L)
 	return 0;
 }
 
+static int lib_pMovePlayer(lua_State *L)
+{
+	player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
+	NOHUD
+	INLEVEL
+	if (!player)
+		return LUA_ErrInvalid(L, "player_t");
+	P_MovePlayer(player);
+	return 0;
+}
+
 static int lib_pDoPlayerFinish(lua_State *L)
 {
 	player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@@ -3386,6 +3397,7 @@ static luaL_Reg lib[] = {
 	{"P_BlackOw",lib_pBlackOw},
 	{"P_ElementalFire",lib_pElementalFire},
 	{"P_SpawnSkidDust", lib_pSpawnSkidDust},
+	{"P_MovePlayer",lib_pMovePlayer},
 	{"P_DoPlayerFinish",lib_pDoPlayerFinish},
 	{"P_DoPlayerExit",lib_pDoPlayerExit},
 	{"P_InstaThrust",lib_pInstaThrust},
diff --git a/src/p_local.h b/src/p_local.h
index 9873a20af5de11ce97c20d840121ff70a82704ec..b6c34f357a18e2ca55211cca139eb429c5d871af 100644
--- a/src/p_local.h
+++ b/src/p_local.h
@@ -177,6 +177,7 @@ void P_BlackOw(player_t *player);
 void P_ElementalFire(player_t *player, boolean cropcircle);
 void P_SpawnSkidDust(player_t *player, fixed_t radius, boolean sound);
 
+void P_MovePlayer(player_t *player);
 void P_DoPityCheck(player_t *player);
 void P_PlayerThink(player_t *player);
 void P_PlayerAfterThink(player_t *player);
diff --git a/src/p_user.c b/src/p_user.c
index d426277ff06099189ba7d6148c1b53153f82029c..7dd8881178e64c305e44f091662a2f0b088c2949 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -7889,7 +7889,7 @@ static void P_SkidStuff(player_t *player)
 
 //
 // P_MovePlayer
-static void P_MovePlayer(player_t *player)
+void P_MovePlayer(player_t *player)
 {
 	ticcmd_t *cmd;
 	INT32 i;