The Premier League champions scored twice in the final 10 minutes to snatch a victory at Villa Park.
Yaya Toure belatedly brought his season to life as Manchester City left it late to beat Aston Villa 2-0 in the Premier League on Saturday.
The champions were at risk of losing further ground in the title race ahead of leader Chelsea hosting Arsenal on Sunday. But Toure, who once again looked some distance below his best form at Villa Park, broke the deadlock after 82 minutes.
Sergio Aguero, who like Aleksandar Kolarov hit the post earlier in the contest, rifled home a second to make the points safe and place the onus back on Jose Mourinho's side, with the gap at the summit reduced to two points.
Andreas Weimann scored a dramatic winner in this fixture last year, but was set to be restricted to a place on the Villa bench alongside the returning Christian Benteke until he was promoted into the starting XI to replace Gabriel Agbonlahor, who fell ill during warm-ups.
James Milner came back into the City lineup against his former club alongside the defensive duo of Eliaquim Mangala and Kolarov as Manuel Pellegrini tinkered with the side that drew with Roma midweek in the UEFA Champions League.
Nathan Baker flung himself to block a sixth-minute strike by Toure after an ambitious effort from Kolarov was partially cleared. Kolarov found himself in a more favorable position five minutes later and rattled Brad Guzan's near post from the left-hand side of Villa's box.
Aguero glanced wide from a devilish Kolarov cross and strike partner Edin Dzeko lashed into the Holte End when well placed.
Villa refused to buckle under intense pressure at the end of the first half as Milner and Kolarov saw shots deflected narrowly wide before Aly Cissokho cleared Dzeko's goalbound header.
The second half began in dramatic fashion as Milner played through Aguero to strike the base of the post.
The rebound fell favorably for the host, which surged forward and a brilliant last-ditch challenge was required from City fullback Pablo Zabaleta to stop Kieran Richardson from beating Joe Hart.
Hart's opposite number Guzan produced the save of the match in the 48th minute, plunging to keep out David Silva's shot on the turn.
But Villa was increasingly looking dangerous on the break, with City captain Vincent Kompany required to intervene after Charles N'Zogbia slalomed past Mangala and Fernandinho — the latter hobbling off in the 56th minute to be replaced by Frank Lampard.
The Brazilian's departure saw Villa enjoy a sustained spell of possession for the first time in the contest and Weimann should have done better when he glanced off target from Tom Cleverley's 60th-minute cross.
It was his last act as Benteke came on for his first action since March following an Achilles injury.
Fernando's introduction for Dzeko allowed City to regain control of central areas and Silva stabbed wide from Milner's low 70th-minute cross.
Aguero, Mangala and Lampard all went on to test Guzan's sound handling, but he had no chance when Toure was allowed room to shimmy past Fabian Delph and caress a left-footed shot into the bottom corner.
Milner fired a pass into Aguero two minutes from time and the tireless Argentine held off Baker and Philippe Senderos to finish and condemn seventh-place Villa to a third consecutive loss.