Match ends, Bradford City 1, Millwall 0.
Bradford City ended Millwall's run of six league games unbeaten to move into the League One play-off places.
In an game of few chances Bradford's Tony McMahon curled a free-kick wide before Millwall striker Aiden O'Brien sliced over Steve Morison's cross.
Lions' keeper Jordan Archer produced a good save to keep out Jamie Proctor, with the rebound ruled out for offside.
With 11 minutes remaining substitute Steven Davies headed in Nathan Clarke's cross to earn the valuable points.
The victory moved Bradford into sixth place, above Barnsley, who were held to a 0-0 draw with Scunthorpe on Friday.
Millwall's first defeat since 16 February leaves them a point above the Bantams in fifth.
- 2DarbyBooked at 22mins
- 17ReidSubstituted forMorrisat 90+2'minutes
- 19ProctorSubstituted forHansonat 75'minutes
- 10ClarkeSubstituted forDaviesat 75'minutes
- 17WebsterBooked at 60mins
- 3MartinBooked at 13mins
- 10OnyedinmaSubstituted forPhilpotat 83'minutes
- 8UpsonBooked at 19minsSubstituted forTaylorat 57'minutesBooked at 71mins
- 22O'BrienSubstituted forGregoryat 65'minutes
- Darren Bond
- Shots on Target
Second Half ends, Bradford City 1, Millwall 0.
Hand ball by Tom Thorpe (Bradford City).
Foul by James Hanson (Bradford City).
Mark Beevers (Millwall) wins a free kick in the attacking half.
Substitution, Bradford City. Josh Morris replaces Kyel Reid.
Attempt saved. Steve Morison (Millwall) right footed shot from the centre of the box is saved in the centre of the goal.
Attempt missed. Shaun Williams (Millwall) right footed shot from outside the box misses to the right.
Substitution, Millwall. Jamie Philpot replaces Fred Onyedinma.
Attempt missed. Lee Gregory (Millwall) right footed shot from the centre of the box is close, but misses to the right.
Goal! Bradford City 1, Millwall 0. Steve Davies (Bradford City) header from very close range to the centre of the goal. Assisted by Nathan Clarke.
James Meredith (Bradford City) wins a free kick on the right wing.
Foul by Steve Morison (Millwall).
Substitution, Bradford City. James Hanson replaces Jamie Proctor.
Substitution, Bradford City. Steve Davies replaces Billy Clarke.
Chris Taylor (Millwall) is shown the yellow card for a bad foul.
Stephen Darby (Bradford City) wins a free kick on the right wing.
Foul by Chris Taylor (Millwall).
Nathan Clarke (Bradford City) wins a free kick in the attacking half.
Dangerous play by Steve Morison (Millwall).