diff --git a/src/p_mobj.c b/src/p_mobj.c
index 13379ad538ed5eb9ba94eff690fbb6eaa1592453..0c4ae64889c1ec9ada9e9f790690c7dd5965495e 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -2124,6 +2124,11 @@ void P_XYMovement(mobj_t *mo)
 		// blocked move
 		moved = false;
 
+#ifdef ESLOPE
+		if (oldslope && predictedz > mo->z) // Only for moving up, otherwise there's a failed launch when going down slopes and hitting walls
+			P_SlopeToWallTransfer(mo);
+#endif
+
 		if (player) {
 			if (player->bot)
 				B_MoveBlocked(player);
diff --git a/src/p_slopes.c b/src/p_slopes.c
index d939fee98b9cb36f015da6cb187131acc6407eb6..69f0b756aa7605aa990ac3d40ae243a1ca44d6bc 100644
--- a/src/p_slopes.c
+++ b/src/p_slopes.c
@@ -804,6 +804,30 @@ void P_SlopeLaunch(mobj_t *mo)
 	mo->standingslope = NULL;
 }
 
+//
+// P_SlopeToWallTransfer
+//
+// Handles slope-to-wall transfer for objects.
+void P_SlopeToWallTransfer(mobj_t *mo)
+{
+	if (!(mo->standingslope->flags & SL_NOPHYSICS)) // If there's physics, time for launching.
+	{
+		// Doesn't kill the vertical momentum as much as P_SlopeLaunch does.
+		vector3_t slopemom;
+		slopemom.x = mo->momx;
+		slopemom.y = mo->momy;
+		slopemom.z = 3*(mo->momz/2);
+		P_QuantizeMomentumToSlope(&slopemom, mo->standingslope);
+
+		mo->momx = slopemom.x;
+		mo->momy = slopemom.y;
+		mo->momz = 2*(slopemom.z/3);
+	}
+
+	//CONS_Printf("Transferred off of slope.\n");
+	mo->standingslope = NULL;
+}
+
 // Function to help handle landing on slopes
 void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
 {
diff --git a/src/p_slopes.h b/src/p_slopes.h
index de38f1d9ed279be0059a8c0a283a337d8e4e7bb8..6975516ed466aefb10242ab31ad0dffc629e60a8 100644
--- a/src/p_slopes.h
+++ b/src/p_slopes.h
@@ -37,6 +37,7 @@ fixed_t P_GetZAt(pslope_t *slope, fixed_t x, fixed_t y);
 void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope);
 void P_ReverseQuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope);
 void P_SlopeLaunch(mobj_t *mo);
+void P_SlopeToWallTransfer(mobj_t *mo);
 void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope);
 void P_ButteredSlope(mobj_t *mo);