Match ends, Reading 3, Millwall 2.
Reading 3-2 Millwall
Striker Simon Cox headed a late winner to give Reading a third successive Championship victory.
Cox had earlier put the Royals ahead with a long-range effort and Nick Blackman doubled their lead from the penalty spot.
But Millwall fought back to level through goals from Ricardo Fuller and Mark Beevers either side of the break.
They looked set to earn a point but with six minutes left Cox stooped to nod home a Jordan Obita corner.
Despite a run of just one win in their previous five games, Millwall started brightly with Fuller testing goalkeeper Adam Federici with a firm header.
But Reading quickly took control and went ahead in the sixth minute when Cox latched onto a huge clearance from Federici to fire past Millwall goalkeeper David Forde from 20 yards.
Glenn Murray then headed over from an inviting Obita cross and with 15 minutes gone the home side went further ahead.
Blackman drove in from the left flank and after being brought down by Byron Webster in the penalty area took the spot-kick himself to make it 2-0.
Millwall looked up against it but hit back with Federici making a fine double save to deny Scott Malone and Scott McDonald.
But the Australian was beaten for the first time in four games when the dangerous Fuller made space to steer home a low shot.
Millwall then levelled nine minutes into the second half when Beevers headed home a corner from substitute Martyn Woolford at the far post.
There was then little to separate the two sides but with time running out Cox pounced to claim his fourth goal of the season and take Reading into the top six.
Reading manager Nigel Adkins:
"We've got players who just want to score goals. You can see that everywhere.
"We've got a huge attacking threat at this football club and not just in one area, which is really pleasing.
"That's four wins on the spin now in league and cup. The spirit is great and we've got a really good attacking prowess about us at the moment."
Millwall manager Ian Holloway:
"My wife summed it up the other day when we were playing golf. She said very simply 'golf can be a cruel, cruel game'.
"Football is as well. If we deserved to lose that game, then there is no justice.
"At 2-0 down, we showed great character to get back in it. We gained some momentum and I was proud of our commitment and spirit.
"I feel sick to my core. When I wake up tomorrow, I'll be kicking myself. Apart from a few lapses, that's as good as we've played all season."
- 19MackieSubstituted forTaylorat 69'minutes
- 16AkpanSubstituted forEdwardsat 77'minutes
- 22BlackmanSubstituted forCooperat 86'minutes
- 17WebsterBooked at 14minsSubstituted forWoolfordat 26'minutes
- 20OnyedinmaSubstituted forUpsonat 74'minutesBooked at 76mins
- 30ChaplowSubstituted forRanegieat 86'minutes
- Keith Hill
- Shots on Target
Second Half ends, Reading 3, Millwall 2.
Corner, Reading. Conceded by Martyn Woolford.
Oliver Norwood (Reading) wins a free kick in the defensive half.
Foul by Martyn Woolford (Millwall).
Attempt missed. Martyn Woolford (Millwall) right footed shot from outside the box misses to the right. Assisted by Scott Malone.
Glenn Murray (Reading) wins a free kick in the defensive half.
Foul by Alan Dunne (Millwall).
Substitution, Reading. Jake Cooper replaces Nick Blackman.
Substitution, Millwall. Mathias Ranégie replaces Richard Chaplow.
Corner, Millwall. Conceded by Michael Hector.
Attempt blocked. Ricardo Fuller (Millwall) right footed shot from outside the box is blocked. Assisted by Scott McDonald.
Goal! Reading 3, Millwall 2. Simon Cox (Reading) header from the left side of the six yard box to the centre of the goal. Assisted by Nick Blackman with a headed pass following a corner.
Corner, Reading. Conceded by Mark Beevers.
Foul by Oliver Norwood (Reading).
Ed Upson (Millwall) wins a free kick in the attacking half.
Offside, Reading. Adam Federici tries a through ball, but Glenn Murray is caught offside.
Attempt saved. Ed Upson (Millwall) right footed shot from outside the box is saved in the top centre of the goal.
Foul by Nick Blackman (Reading).
Martyn Woolford (Millwall) wins a free kick in the defensive half.
Substitution, Reading. Ryan Edwards replaces Hope Akpan.
Ed Upson (Millwall) is shown the yellow card for a bad foul.
Michael Hector (Reading) wins a free kick in the defensive half.
Foul by Ed Upson (Millwall).
Substitution, Millwall. Ed Upson replaces Fred Onyedinma.
Substitution, Reading. Jake Taylor replaces Jamie Mackie.
Foul by Glenn Murray (Reading).
Alan Dunne (Millwall) wins a free kick in the defensive half.
Offside, Reading. Nick Blackman tries a through ball, but Glenn Murray is caught offside.
Attempt blocked. Glenn Murray (Reading) right footed shot from outside the box is blocked. Assisted by Simon Cox.
Simon Cox (Reading) wins a free kick in the attacking half.
Foul by Richard Chaplow (Millwall).
Jordan Obita (Reading) wins a free kick in the defensive half.
Foul by Ricardo Fuller (Millwall).
Hope Akpan (Reading) wins a free kick in the defensive half.
Foul by Mark Beevers (Millwall).
Foul by Glenn Murray (Reading).
Mark Beevers (Millwall) wins a free kick in the defensive half.
Attempt blocked. Jamie Mackie (Reading) right footed shot from the right side of the box is blocked. Assisted by Oliver Norwood.
Attempt missed. Scott McDonald (Millwall) right footed shot from outside the box is high and wide to the right. Assisted by Martyn Woolford.