Match ends, Bradford City 0, Millwall 1.
Steve Morison volleyed a late winner as Millwall won promotion to the Championship with victory over Bradford in the League One play-off final.
Bradford controlled the first half, Jordan Archer saving well to stop Billy Clarke giving them the lead at Wembley.
Millwall improved and Jed Wallace dragged a shot wide when put through.
But Morison stabbed in Lee Gregory's header to send Millwall to the second tier after two years away, with Lions fans invading the pitch at full-time.
Tony McMahon had Bradford's best chance to equalise in stoppage time, but the full-back could only fire wide from a tight angle.
Millwall fans flooded on to the pitch at the final whistle, but although a small number of supporters confronted Bradford's dejected players there did not appear to be signs of serious trouble.
Those scenes could do nothing to dampen the Lions' players spirits, however, as they laid to rest their demons from play-off final defeat by Barnsley a year ago.
- READ MORE: McCall 'close to hitting' Millwall fans
- READ MORE: It was Millwall's time - Harris
- READ MORE: Millwall promoted to the Championship as it happened
Missed opportunity for Bradford
Bradford were aiming to return to the Championship for the first time since suffering relegation in 2004, and they looked well set to do so after a dominant first-half showing.
Clarke and Mark Marshall were particularly influential, regularly finding space in between Millwall's defence and midfield.
But the Bantams were punished for poor decisions and the lack of a final ball, with Clarke's chance their only real opportunity.
Marshall broke free down the left on a counter-attack, and weighted his through ball perfectly into the path of Clarke.
But Archer - who conceded twice in 20 minutes in Millwall's defeat by Barnsley at Wembley last season - made a wonderful save to his left to turn the ball behind.
Millwall banish their demons
Millwall made a similarly slow start to this year's final, but this time Archer and his defence held firm against waves of pressure.
Neil Harris' side emerged a different team after the break, with Wallace inches away from handing his side the lead after being played through by Gregory.
Bradford offered less of a threat as the game went on, and Millwall's direct approach finally paid dividends inside the final 10 minutes.
Wallace's cross from the left was flicked on brilliantly by Gregory, with Morison holding off James Meredith at the back post to secure his side a place in the Championship.
- 4LawSubstituted forDiengat 74'minutes
- 3MeredithBooked at 76mins
- 10ClarkeSubstituted forJonesat 74'minutes
- 14J WallaceSubstituted forOnyedinmaat 89'minutes
- 22O'BrienBooked at 58minsSubstituted forFergusonat 70'minutes
- 9GregorySubstituted forButcherat 90+1'minutes
- Simon Hooper
- Shots on Target
Second Half ends, Bradford City 0, Millwall 1.
Attempt missed. Tony McMahon (Bradford City) right footed shot from a difficult angle on the right is close, but misses the top right corner. Assisted by Josh Cullen.
Foul by Josh Cullen (Bradford City).
Fred Onyedinma (Millwall) wins a free kick on the right wing.
Romain Vincelot (Bradford City) wins a free kick in the defensive half.
Foul by Fred Onyedinma (Millwall).
Offside, Millwall. Nadjim Abdou tries a through ball, but Fred Onyedinma is caught offside.
Substitution, Millwall. Callum Butcher replaces Lee Gregory.
Foul by Rory McArdle (Bradford City).
Shaun Williams (Millwall) wins a free kick in the defensive half.
Substitution, Millwall. Fred Onyedinma replaces Jed Wallace.
Attempt missed. Josh Cullen (Bradford City) right footed shot from outside the box is too high. Assisted by Timothee Dieng following a corner.
Corner, Bradford City. Conceded by Shaun Williams.
Goal! Bradford City 0, Millwall 1. Steve Morison (Millwall) right footed shot from very close range to the high centre of the goal. Assisted by Lee Gregory with a headed pass.
Colin Doyle (Bradford City) wins a free kick in the defensive half.
Foul by Lee Gregory (Millwall).
Corner, Millwall. Conceded by James Meredith.
Foul by Charlie Wyke (Bradford City).
Tony Craig (Millwall) wins a free kick in the defensive half.