Match ends, Millwall 3, Sheffield United 1.
Millwall produced a strong performance to beat promotion-chasing Sheffield United and end a six-match winless run.
The Lions took the lead when Steve Morison set up Lee Gregory to turn and finish on the counter-attack.
David Brooks equalised brilliantly with a volley from a tight angle, but defender Mahlon Romeo finished one-on-one to restore the hosts' lead.
Jake Cooper headed in Jed Wallace's free-kick to seal the win and condemn the Blades to a seventh league defeat.
Millwall were without a win since 21 October and had failed to score in three previous games against top-six sides, but started brightly and deservedly took the lead through Gregory's smart finish.
Brooks equalised in dramatic fashion, but Chris Wilder's side were disappointing in front of goal, managing just two shots on target as they slipped to a third game without a win.
Gregory's through ball allowed Romeo to score his first Championship goal in his first league start for the Lions this season and Cooper's towering downward header made sure of the points.
Defeat means the Blades now trail second-placed Cardiff by six points, while leaders Wolves can open up a 10-point gap in the automatic promotion places if they beat Birmingham on Monday.
Millwall manager Neil Harris:
"We had a conundrum at half-time. Do we leave it as it is and hope that we get a back in the game and our 4-4-2 shape dictates play, or do we change it?
"We made a brave decision to change to a 3-5-2 to match them up, and you've got 10 minutes to do it and try and get messages to players.
"They're never going to let me down on effort, determination, desire to play for this club, and there were some real moments of quality as well."
Sheffield United boss Chris Wilder:
"The blame 100% totally lies with me and the team. We haven't done enough to win but they have.
"This game wasn't won tactically, in my opinion. It was won because they got to more first and second balls from the off.
"When we got to grips with that, we didn't punish them when we were on top."
- 14J WallaceSubstituted forO'Brienat 90+3'minutes
- 11FergusonSubstituted forCraigat 86'minutes
- 9GregorySubstituted forThompsonat 77'minutes
- 19StearmanSubstituted forSharpat 73'minutes
- 7LundstramSubstituted forDonaldsonat 82'minutes
- 36BrooksBooked at 10mins
- Andy Madley
- Shots on Target
Second Half ends, Millwall 3, Sheffield United 1.
Foul by Leon Clarke (Sheffield United).
Shaun Hutchinson (Millwall) wins a free kick in the defensive half.
Substitution, Millwall. Aiden O'Brien replaces Jed Wallace.
Foul by Cameron Carter-Vickers (Sheffield United).
James Meredith (Millwall) wins a free kick in the defensive half.
Corner, Sheffield United. Conceded by Tony Craig.
Foul by Enda Stevens (Sheffield United).
Steve Morison (Millwall) wins a free kick on the right wing.
Goal! Millwall 3, Sheffield United 1. Jake Cooper (Millwall) header from the centre of the box to the top right corner. Assisted by Jed Wallace with a cross following a set piece situation.
Foul by Mark Duffy (Sheffield United).
Jed Wallace (Millwall) wins a free kick on the left wing.
Substitution, Millwall. Tony Craig replaces Shane Ferguson.
Offside, Sheffield United. Enda Stevens tries a through ball, but Clayton Donaldson is caught offside.
Substitution, Sheffield United. Clayton Donaldson replaces John Lundstram.
Attempt missed. Jed Wallace (Millwall) right footed shot from the right side of the box misses to the right. Assisted by Steve Morison with a cross.
Attempt missed. Steve Morison (Millwall) header from the centre of the box misses to the left. Assisted by Shane Ferguson with a cross following a set piece situation.
Foul by Jack O'Connell (Sheffield United).
Ben Thompson (Millwall) wins a free kick on the right wing.