Match ends, Aston Villa 1, Millwall 0.
Dominant Aston Villa beat struggling Millwall to secure a Championship play-off spot with a record-breaking 10th successive win.
Jonathan Kodjia stabbed home Anwar El Ghazi's cross from close range to break a club record that has stood since 1910.
Kodjia, El Ghazi, Jack Grealish and substitute Andre Green all missed chances to make the margin of victory more comfortable.
Fifth-placed Villa will now finish at least sixth as sixth-placed Derby County and eighth-placed Bristol City meet next Saturday - and both cannot overhaul Dean Smith's men from their remaining games.
It is a remarkable turnaround for Villa, whose 2-1 defeat at The Den in October's corresponding fixture - their sole game under the caretaker stewardship of Kevin MacDonald following Steve Bruce's sacking - left them languishing 15th in the Championship.
They continued to hover around mid-table for much of the early part of Smith's reign but their stunning recent form has secured a play-off spot in a season most Villa fans were preparing to write off.
That successful sequence has owed much to the creativity of Grealish - since his return from injury - and the goals of Chelsea loanee Tammy Abraham, but it was the supporting cast that shone against Millwall.
With Abraham sidelined by a shoulder issue, Ivory Coast forward Kodjia made the most of a rare start, his first in two months, with a poacher's finish set up by the excellent El Ghazi to ensure this Villa side's place in club folklore.
They should have won more comfortably but Millwall keeper David Martin produced a string of second-half saves, two from El Ghazi and one each from Grealish and Green, while Kodjia prodded wide after a fine solo run.
The visitors - three points above 22nd-placed Rotherham in the fight to avoid the final Championship relegation spot - could have snatched a point but Jake Cooper headed wide when Villa keeper Jed Steer failed to meet a free-kick.
Aston Villa head coach Dean Smith:
"If you had asked me 11 games ago would we go and win the next 10, I would have thought you were a little bit crackers.
"The turning point was half-time at Stoke when I got into the players and we have been excellent since then.
"I don't think until I look back on it I will realise what we have actually done because my focus is still on getting promoted.
"This is a historic, great football club and to be the first manager to have achieved it is something special, but we want to continue it."
Millwall manager Neil Harris:
"First and foremost we lost the game so I am a little bit dejected at this stage of the season.
"We should have had our noses in front and then it could have been a different game.
"The goal is poor by us and I will make no bones about that. We have a throw-in and lose the first contact, the second ball, miss a tackle and then we open up against Villa. who pick the right end product.
"The goal was avoidable, so there is frustration."
- 27El Mohamady
- 3TaylorBooked at 81mins
- 6WhelanSubstituted forHourihaneat 60'minutes
- 37AdomahSubstituted forGreenat 60'minutes
- 22El Ghazi
- 26KodjiaSubstituted forDavisat 76'minutesBooked at 85mins
- 12RomeoSubstituted forElliottat 89'minutes
- 5CooperBooked at 27mins
- 3MeredithSubstituted forO'Brienat 64'minutesBooked at 90mins
- 18TunnicliffeSubstituted forMorisonat 79'minutes
- 7J Wallace
- Tim Robinson
- Shots on Target
Second Half ends, Aston Villa 1, Millwall 0.
Attempt blocked. Conor Hourihane (Aston Villa) left footed shot from outside the box is blocked.
Aiden O'Brien (Millwall) is shown the yellow card for a bad foul.
Jack Grealish (Aston Villa) wins a free kick in the attacking half.
Foul by Aiden O'Brien (Millwall).
Corner, Aston Villa. Conceded by Aiden O'Brien.
Jack Grealish (Aston Villa) wins a free kick on the right wing.
Foul by Aiden O'Brien (Millwall).
Corner, Aston Villa. Conceded by Jake Cooper.
Attempt blocked. Andre Green (Aston Villa) right footed shot from the right side of the box is blocked. Assisted by John McGinn.
Substitution, Millwall. Tom Elliott replaces Mahlon Romeo.
Corner, Aston Villa. Conceded by David Martin.
Attempt saved. Anwar El Ghazi (Aston Villa) right footed shot from the left side of the box is saved in the bottom right corner. Assisted by John McGinn.
Foul by Keinan Davis (Aston Villa).
Ryan Leonard (Millwall) wins a free kick in the defensive half.
Attempt missed. Lee Gregory (Millwall) right footed shot from very close range is too high. Assisted by Alex Pearce with a headed pass following a corner.
Corner, Millwall. Conceded by Tyrone Mings.
Keinan Davis (Aston Villa) is shown the yellow card for hand ball.
Hand ball by Keinan Davis (Aston Villa).