On the occasion of legendary City manager Pep Guardiola's final game at the club, Aston Villa lived up to their moniker as they denied the likeable Spaniard a winning swansong.
Manchester City's Antoine Semenyo broke the deadlock in the 23rd minute. The Villans failed to fully clear a fizzing corner and the Ghanaian, who was lurking at the back post, acrobatically powered the ball back past a diving Marco Bizot.
Savinho had a golden chance to double the lead just minutes later. The Brazilian controlled a rebound inside the box and only the keeper to beat, but his shot flew a whisker wide of the right post. The winger was at it again shortly after with a strong run down the left side, but no teammate could find the end of his low cross that went across the face of the goal.
Tijjani Reijnders' close-range effort in the dying embers of the half was brilliantly saved by Bizot. Such was City's dominance of territory and possession that Aston Villa failed to generate a single shot at goal for the opening 45 minutes.
But Villa needed just 30 seconds into the second stanza to level matters. Departing City defender Josh Stones failed to deal with an accurate corner and Ollie Watkins needed no second invitation to fire the ball home from three metres out.
And 15 minutes later, the Villa found another. Hot on the counterattack, Watkins was ruled just onside before storming 45 meters, cutting inside and an overcommitting Stones and found the back of the net to go 2-1 up out of nowhere.
The visitors' Leon Bailey nearly added a third when he latched onto a pass inside the box, stepped inside his defender and smacked a shot against the left post.
City thought they had the equaliser when Phil Foden absolutely smashed one home from close, but he was ruled offside by the size of his glute by an unpopular VAR.