Match ends, Aston Villa 2, Bristol City 1.
Tammy Abraham scored against his former club Bristol City as Aston Villa continued their charge towards the Championship play-offs with an eighth successive win.
Abraham's penalty and Conor Hourihane's low strike ensured a swaggering second-half Villa display would be rewarded with victory over one of their top-six rivals.
Famara Diedhiou's acrobatic finish with 17 minutes left kept the Robins in the contest, but the hosts were fully deserving of their eighth win in a row - the first time they have managed such a sequence since 1975.
Dean Smith's side are now four points ahead of City in the table, maintaining their five-point cushion to Middlesbrough in seventh.
After a cagey opening period during which Albert Adomah headed against the post and City's former Villa striker Andreas Weimann had a goal disallowed for offside, Villa blew the visitors away in the second half and only an inspired display by goalkeeper Max O'Leary prevented a more one-sided scoreline.
The 22-year-old academy product produced a string of brilliant reaction saves, twice denying Hourihane at point-blank range, while he also tipped Neil Taylor's effort around the post when one-on-one.
But O'Leary could do nothing about Abraham's penalty, given for a foul by Jack Hunt on Hourihane and converted ruthlessly despite the Chelsea loanee having missed from the spot against Rotherham United on Wednesday.
It was Abraham's 24th goal of the season - against the club with whom he really established himself during a season-long spell during 2016-17.
Although Diedhiou's clever finish halved the deficit after Hourihane had eventually capped his energetic midfield display with a goal, it was still Villa who looked the more likely to score again at 2-1.
The Robins remain in sixth and have a game in hand on the majority of the teams around them, but are now just one point above Boro, who narrowed the gap by winning at home to Hull.
Aston Villa boss Dean Smith told BBC WM:
"I thought (the result was) fully deserved. The only thing missing was we should've scored far more goals. Because we had some great chances, we had one of those days where the goalkeeper had a great match, we've missed some big chances today, our play at times was exceptional.
"Kodija's gone to have a scan. Jack's just ill, he had a fever. When I spoke to him this morning he was devastated. He couldn't even go upstairs to take a shower.
"Hopefully the monkey's off our back now, we've got a win without Jack Grealish in the team."
Bristol City manager Lee Johnson told BBC Radio Bristol:
"Obviously there are many emotions after a game like that. I was pleased that we kept going and kept trying to attack to get back into it, but certain parts of our game and decisions went against us and cost us today.
"The penalty, we felt was a poor decision, but they're a good side and it was always going to be a difficult game.
"Weimann's header wasn't offside and I've just been in with the referee and the assessors because it's so important to get the simple ones right. But we can't allow poor decisions to affect our game."
- 27El Mohamady
- 14HourihaneSubstituted forLansburyat 80'minutes
- 7McGinnBooked at 20mins
- 18AbrahamSubstituted forDavisat 72'minutes
- 22El Ghazi
- 24O'LearyBooked at 55mins
- 32HuntBooked at 44minsSubstituted forPatersonat 88'minutes
- 4WebsterBooked at 87mins
- 14WeimannBooked at 54mins
- 21PackBooked at 19mins
- 19EliassonSubstituted forPalmerat 60'minutes
- 10TaylorBooked at 21minsSubstituted forBakerat 60'minutes
- 9DiedhiouBooked at 55mins
- Scott Duncan
- Shots on Target
Second Half ends, Aston Villa 2, Bristol City 1.
Corner, Aston Villa. Conceded by Max O'Leary.
Attempt saved. John McGinn (Aston Villa) right footed shot from the left side of the box is saved in the top centre of the goal. Assisted by Anwar El Ghazi.
Corner, Aston Villa. Conceded by Max O'Leary.
Attempt saved. Keinan Davis (Aston Villa) left footed shot from the left side of the box is saved in the bottom left corner.
Offside, Bristol City. Adam Webster tries a through ball, but Andreas Weimann is caught offside.
Marlon Pack (Bristol City) wins a free kick in the defensive half.
Foul by Glenn Whelan (Aston Villa).
Corner, Aston Villa. Conceded by Josh Brownhill.
Substitution, Bristol City. Jamie Paterson replaces Jack Hunt.
Attempt missed. John McGinn (Aston Villa) right footed shot from the centre of the box is too high. Assisted by Keinan Davis.
Adam Webster (Bristol City) is shown the yellow card for a bad foul.
Foul by Adam Webster (Bristol City).
John McGinn (Aston Villa) wins a free kick in the attacking half.
Attempt blocked. Mile Jedinak (Aston Villa) header from the centre of the box is blocked. Assisted by Anwar El Ghazi with a cross.
Corner, Aston Villa. Conceded by Marlon Pack.
Foul by Josh Brownhill (Bristol City).
Henri Lansbury (Aston Villa) wins a free kick in the attacking half.
Attempt missed. Nathan Baker (Bristol City) header from the centre of the box is high and wide to the left. Assisted by Andreas Weimann with a cross following a corner.