Match ends, Walsall 3, Bradford City 2.
Walsall halted a five-game losing streak to deepen Bradford's relegation worries with a thrilling home victory - despite playing virtually the whole game with 10 men.
Saddlers top scorer Andy Cook was sent off after just six minutes for elbowing Nathaniel Knight-Percival.
And Bradford quickly capitalised by going ahead in the 12th minutes as Eoin Doyle headed home Jack Payne's cross.
Walsall levelled in the 42nd minute when Josh Gordon rifled home a loose ball in the box, and the 10 men led in the 47th minute when Joe Edwards nodded home after Matt Jarvis' header came back off the bar.
Bradford equalised in the 53rd minute, with Anthony O'Connor slotting in after Walsall keeper Liam Roberts had parried Lewis O'Brien's fierce strike.
O'Brien rattled the bar from 25 yards and a Payne shot was cleared off the line by Jon Guthrie - but Walsall won it just after the hour mark when Gordon flashed a header home from Luke Leahy's corner.
Bradford could have rescued a point but Guthrie blocked Doyle's point-blank volley and Roberts saved superbly from Payne to leave City three points from safety.
Match report supplied by the Press Association.
- 6DevlinBooked at 24mins
- 29GordonSubstituted forOtehat 83'minutes
- 10IsmailSubstituted forOsbourneat 79'minutes
- 11JarvisBooked at 53minsSubstituted forDobsonat 87'minutes
- 9CookBooked at 6mins
- 38CaddisSubstituted forMellorat 85'minutes
- 16ButterfieldBooked at 74mins
- 39O'BrienBooked at 34minsSubstituted forMillerat 85'minutes
- 17ClarkeSubstituted forAndersonat 72'minutes
- Brett Huxtable
- Shots on Target
Second Half ends, Walsall 3, Bradford City 2.
Attempt missed. Nathaniel Knight-Percival (Bradford City) header from the left side of the six yard box is close, but misses to the left.
Hand ball by Luke Leahy (Walsall).
George Dobson (Walsall) wins a free kick in the defensive half.
Foul by David Ball (Bradford City).
Attempt blocked. David Ball (Bradford City) right footed shot from outside the box is blocked.
Corner, Bradford City. Conceded by Jon Guthrie.
Attempt blocked. Adam Chicksen (Bradford City) left footed shot from the left side of the box is blocked.
Attempt blocked. Jack Payne (Bradford City) left footed shot from the centre of the box is blocked.
Substitution, Walsall. George Dobson replaces Matthew Jarvis.
Substitution, Bradford City. George Miller replaces Lewis O'Brien.
Substitution, Bradford City. Kelvin Mellor replaces Paul Caddis.
Attempt saved. David Ball (Bradford City) right footed shot from the left side of the box is saved in the bottom left corner.
Attempt saved. Jack Payne (Bradford City) right footed shot from the centre of the box is saved in the bottom left corner.
Substitution, Walsall. Aramide Oteh replaces Josh Gordon.
Attempt blocked. Eoin Doyle (Bradford City) right footed shot from the centre of the box is blocked.
Foul by Josh Gordon (Walsall).
Paul Caddis (Bradford City) wins a free kick in the defensive half.
Attempt blocked. Matthew Jarvis (Walsall) left footed shot from the left side of the six yard box is blocked.