diff --git a/src/info.c b/src/info.c
index 50da228e59297b64a3ac373690535c3c42816717..40495805830902d30e2736026436933f9f91894b 100644
--- a/src/info.c
+++ b/src/info.c
@@ -13448,7 +13448,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
 		sfx_None,       // attacksound
 		S_NULL,         // painstate
 		12*TICRATE,     // painchance (sets how long an unridden rock should last before disappearing - set to 0 to disable)
-		sfx_None,       // painsound
+		sfx_s3k49,      // painsound
 		S_NULL,         // meleestate
 		S_NULL,         // missilestate
 		S_NULL,         // deathstate
diff --git a/src/p_enemy.c b/src/p_enemy.c
index ea09533dfdbaf1432c2643460f44f46e1292fd4b..26d079cb418c5eb5c4f59376fafc517872dff45f 100644
--- a/src/p_enemy.c
+++ b/src/p_enemy.c
@@ -14534,6 +14534,9 @@ void A_RolloutRock(mobj_t *actor)
 
 	actor->friction = FRACUNIT; // turns out riding on solids sucks, so let's just make it easier on ourselves
 
+	if (actor->eflags & MFE_JUSTHITFLOOR)
+		S_StartSound(actor, actor->info->painsound);
+
 	if (actor->threshold)
 		actor->threshold--;
 
diff --git a/src/p_map.c b/src/p_map.c
index 28c5ac9553012c60cf8c966548d2569aa7a75719..97bff8156977c2b55b2d3364fde4db5b2bb6e448 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -1032,7 +1032,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
 			P_SetPlayerMobjState(tmthing, S_PLAY_WALK);
 			tmthing->player->powers[pw_carry] = CR_ROLLOUT;
 			P_SetTarget(&tmthing->tracer, thing);
-			P_SetObjectMomZ(thing, tmthing->momz, true);
+			if (!P_IsObjectOnGround(thing))
+				thing->momz += tmthing->momz;
 			return true;
 		}
 	}
@@ -1063,6 +1064,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
 			thing->momy = tmthing->momy;
 			tmthing->momx = tempmomx;
 			tmthing->momy = tempmomy;
+			S_StartSound(thing, thing->info->painsound);
 		}
 	}
 
diff --git a/src/p_user.c b/src/p_user.c
index 080d51e5371c97ff923ea379c26e9f222501f6cc..0140bee4dec4992ede5e58c1c0c1386b82a37891 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -4429,6 +4429,8 @@ void P_DoJump(player_t *player, boolean soundandstate)
 			player->mo->momz = 9*FRACUNIT;
 			if (P_MobjFlip(player->mo->tracer)*player->mo->tracer->momz > 0)
 				player->mo->momz += player->mo->tracer->momz;
+			if (!P_IsObjectOnGround(player->mo->tracer))
+				P_SetObjectMomZ(player->mo->tracer, -9*FRACUNIT, true);
 			player->powers[pw_carry] = CR_NONE;
 			player->mo->tracer->flags |= MF_PUSHABLE;
 			P_SetTarget(&player->mo->tracer->tracer, NULL);