diff --git a/src/p_mobj.c b/src/p_mobj.c
index f3f0b9ab01df4db5e7b1d1d3e47ce301ce151efb..d9d0f2b560686c2653d6c2161c97ea11b8948066 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -215,10 +215,15 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
 		return P_SetPlayerMobjState(mobj, S_PLAY_FALL);
 
 	// Catch swimming versus flying
-	if (state == S_PLAY_FLY && player->mo->eflags & MFE_UNDERWATER)
+	if ((state == S_PLAY_FLY || state == S_PLAY_GLIDE) && player->mo->eflags & MFE_UNDERWATER && !player->skidtime)
 		return P_SetPlayerMobjState(player->mo, S_PLAY_SWIM);
 	else if (state == S_PLAY_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
-		return P_SetPlayerMobjState(player->mo, S_PLAY_FLY);
+	{
+		if (player->charability == CA_GLIDEANDCLIMB)
+			return P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE);
+		else
+			return P_SetPlayerMobjState(player->mo, S_PLAY_FLY);
+	}
 
 	// Catch SF_NOSUPERSPIN jumps for Supers
 	if (player->powers[pw_super] && (player->charflags & SF_NOSUPERSPIN))
diff --git a/src/p_user.c b/src/p_user.c
index e2a7943f1b63eb22e31b983a4e0b1e407386d0a7..a01267b736f63bf7c387a5448e25906ea5de117c 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -2344,6 +2344,7 @@ boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff)
 				if (dorollstuff)
 				{
 					player->skidtime = TICRATE;
+					P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE);
 					player->mo->tics = -1;
 				}
 				else if (!player->skidtime)
@@ -8583,6 +8584,32 @@ static void P_MovePlayer(player_t *player)
 
 		if (!player->skidtime) // TODO: make sure this works in 2D!
 		{
+			/*angle_t anglediff = angle - moveangle;
+			fixed_t scale = mo->scale;
+			fixed_t accelfactor = 4*FRACUNIT - 3*FINECOSINE(((angle-moveangle) >> ANGLETOFINESHIFT) & FINEMASK); // mamgic number BAD but this feels right
+			fixed_t speed = FixedHypot(momx, momy);
+			fixed_t minspeed;
+
+			if (anglediff > ANGLE_180)
+				anglediff = InvAngle(InvAngle(anglediff) >> 4);
+			else
+				anglediff = anglediff >> 4;
+
+			if (mo->eflags & MFE_UNDERWATER)
+				minspeed = FixedMul((glidespeed>>1) + player->glidetime*750, scale);
+			else
+				minspeed = FixedMul(glidespeed + player->glidetime*1500, scale);
+
+			if (speed < minspeed)
+			{
+				momx += P_ReturnThrustX(mo, angle, FixedMul(accelfactor, scale));
+				momy += P_ReturnThrustY(mo, angle, FixedMul(accelfactor, scale));
+				speed = FixedHypot(momx, momy); // recalculate speed
+			}
+
+			mo->momx = P_ReturnThrustX(mo, moveangle + anglediff, speed) + player->cmomx;
+			mo->momy = P_ReturnThrustY(mo, moveangle + anglediff, speed) + player->cmomy;*/
+
 			fixed_t speed, scale = mo->scale;
 			fixed_t newMagnitude, oldMagnitude = R_PointToDist2(momx, momy, 0, 0);
 			fixed_t accelfactor = 4*FRACUNIT - 3*FINECOSINE(((angle-moveangle) >> ANGLETOFINESHIFT) & FINEMASK); // mamgic number BAD but this feels right