Match ends, Swansea City 0, Aston Villa 1.
Orjan Nyland saved a 90th-minute penalty from Wilfried Bony to earn Aston Villa victory at Swansea City.
Although the hosts controlled things in a goalless first half, Villa improved after the break and, after cranking up the pressure with several chances, Conor Hourihane headed them in front.
However, Swansea were awarded a late penalty when Nathan Dyer was bundled over by Anwar El Ghazi.
But substitute Bony's low spot-kick was superbly pushed away by Nyland.
The win lifts Villa up to 10th in the Championship, within three points of the play-off places.
For the Swans, meanwhile, a second successive defeat sees them drop down to 13th.
Both sides had succumbed to late comebacks in their previous outings, Villa squandering a 2-0 lead to lose 3-2 at home to Leeds and Swansea beaten by the same score at Hull having been 1-0 in front.
The Swans dominated that encounter but were undone by an inability to take their chances, and there was a similar theme to their first-half display against Villa.
Graham Potter's players monopolised possession and worked their way into several promising positions but struggled to create many genuine scoring opportunities.
The visitors, by contrast, were without the ball for long periods but did fashion the best chance of the opening 45 minutes as former Swan Tammy Abraham nodded the ball down to John McGinn, whose powerful close-range effort was somehow saved by Erwin Mulder.
If that was a little against the run of play, it was a different story after the interval.
Villa played with far more attacking intent and at a much quicker tempo, with Hourihane twice testing Mulder with well-struck free-kicks.
Dean Smith's side came at their opponents in waves and the pressure led to the winning goal after 65 minutes as Alan Hutton's cross was headed in by Hourihane, via the crossbar and a touch from Mulder.
Villa deserved their lead, though they lived dangerously in the closing stages.
Mike van der Hoorn was close to equalising for Swansea when he headed against the post, and then the home side were handed a golden opportunity to level when El Ghazi clumsily felled Dyer as a cross came into Villa's box.
However, it was Villa who were given the final reprieve as Bony's firmly struck penalty was superbly pushed away by Nyland to prompt ecstatic celebrations among the travelling supporters.
Swansea City manager Graham Potter said:
"Obviously we are disappointed with the result, we really put a lot into the game.
"I thought we had enough, we may have lacked something in the final areas - a couple of times I'm waiting for the net to ripple, and it hasn't.
"To get there though I thought we did well, the boys tried, they tried their best, they left everything on the pitch, and in the end we came up short. I feel for the players and I feel for the supporters."
Aston Villa manager Dean Smith said:
"I thought we showed another side to our game, which has been questioned at times - our grit and defensive resilience.
"He [Orjan Nyland] has been doing very well of late. Everyone knows we've signed another goalkeeper [Lovre Kalinic] to put competition in an area we want to strengthen, and that's what it's doing for Orjan.
"Credit to him and the goalkeeping department because they do a lot of work on penalties and they'd predicted he [Bony] would go that way. He's ended up making a good save which has won us the game."
- 5van der HoornBooked at 79mins
- 26NaughtonBooked at 53mins
- 27FultonSubstituted forDyerat 70'minutes
- 8FerSubstituted forBonyat 69'minutes
- 20JamesSubstituted forMonteroat 62'minutes
- 27El Mohamady
- 6WhelanBooked at 21mins
- 22El Ghazi
- 14HourihaneSubstituted forBjarnasonat 90+3'minutes
- 7McGinnBooked at 80mins
- 11BolasieSubstituted forAdomahat 76'minutes
- 18AbrahamSubstituted forKodjiaat 88'minutes
- Roger East
- Shots on Target
Second Half ends, Swansea City 0, Aston Villa 1.
Substitution, Aston Villa. Birkir Bjarnason replaces Conor Hourihane.
Cameron Carter-Vickers (Swansea City) wins a free kick in the defensive half.
Foul by Jonathan Kodjia (Aston Villa).
Attempt blocked. Wilfried Bony (Swansea City) right footed shot from the centre of the box is blocked. Assisted by Connor Roberts.
Penalty saved! Wilfried Bony (Swansea City) fails to capitalise on this great opportunity, right footed shot saved in the bottom left corner.
Penalty Swansea City. Nathan Dyer draws a foul in the penalty area.
Penalty conceded by Anwar El Ghazi (Aston Villa) after a foul in the penalty area.
Substitution, Aston Villa. Jonathan Kodjia replaces Tammy Abraham.
Foul by Jefferson Montero (Swansea City).
Albert Adomah (Aston Villa) wins a free kick in the defensive half.
Corner, Swansea City. Conceded by James Chester.
Attempt saved. Mike van der Hoorn (Swansea City) header from the right side of the six yard box is saved in the bottom right corner. Assisted by Bersant Celina with a cross.
Corner, Swansea City. Conceded by James Bree.
Attempt saved. John McGinn (Aston Villa) left footed shot from outside the box is saved in the centre of the goal. Assisted by James Bree.
Attempt blocked. James Chester (Aston Villa) right footed shot from the centre of the box is blocked. Assisted by Conor Hourihane with a cross.
Corner, Aston Villa. Conceded by Cameron Carter-Vickers.
John McGinn (Aston Villa) is shown the yellow card.
Mike van der Hoorn (Swansea City) is shown the yellow card for a bad foul.