diff --git a/src/namedef_custom.h b/src/namedef_custom.h
index 16814010d..2ed9c0ede 100644
--- a/src/namedef_custom.h
+++ b/src/namedef_custom.h
@@ -285,6 +285,7 @@ xx(Face)
 xx(Slot)
 xx(SoundClass)
 xx(ViewBob)
+xx(WaterClimbSpeed)
 xx(DamageFade)
 xx(MaxHealth)
 xx(crouchsprite)
diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp
index 9f5756394..c3ebd72b8 100644
--- a/src/playsim/p_mobj.cpp
+++ b/src/playsim/p_mobj.cpp
@@ -1997,7 +1997,9 @@ static double P_XYMovement (AActor *mo, DVector2 scroll)
 						(mo->player->cmd.ucmd.forwardmove | mo->player->cmd.ucmd.sidemove) &&
 						mo->BlockingLine->sidedef[1] != NULL)
 					{
-						mo->Vel.Z = WATER_JUMP_SPEED;
+						double spd = mo->FloatVar(NAME_WaterClimbSpeed);
+						if (fabs(spd) >= EQUAL_EPSILON)
+							mo->Vel.Z = spd;
 					}
 					// If the blocked move executed any push specials that changed the
 					// actor's velocity, do not attempt to slide.
diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs
index bd5710e68..38da0f0f6 100644
--- a/wadsrc/static/zscript/actors/player/player.zs
+++ b/wadsrc/static/zscript/actors/player/player.zs
@@ -47,6 +47,7 @@ class PlayerPawn : Actor
 	Class<Inventory> FlechetteType;
 	color 		DamageFade;				// [CW] Fades for when you are being damaged.
 	double		ViewBob;				// [SP] ViewBob Multiplier
+	double		WaterClimbSpeed;		// [B] Speed when climbing up walls in water
 	double		FullHeight;
 	double		curBob;
 	double		prevBob;
@@ -76,6 +77,7 @@ class PlayerPawn : Actor
 	property Portrait: Portrait;
 	property TeleportFreezeTime: TeleportFreezeTime;
 	property ViewBob: ViewBob;
+	property WaterClimbSpeed : WaterClimbSpeed;
 	
 	flagdef NoThrustWhenInvul: PlayerFlags, 0;
 	flagdef CanSuperMorph: PlayerFlags, 1;
@@ -118,6 +120,7 @@ class PlayerPawn : Actor
 		Player.FlechetteType "ArtiPoisonBag3";
 		Player.AirCapacity 1;
 		Player.ViewBob 1;
+		Player.WaterClimbSpeed 3.5;
 		Player.TeleportFreezeTime 18;
 		Obituary "$OB_MPDEFAULT";
 	}