Our Portuguese midfielder picked up possession on the edge of the box from Rodrigo in the 79th minute before rifling an inch-perfect strike past the despairing dive of Emiliano Martinez and into the top corner.
And the game was put to bed on the verge of stoppage time when Gundogan coolly swept home from the spot after Gabriel Jesus’ header had been handled by Matty Cash inside the area.
Bernardo could have had a goal within the opening five minutes when he reacted quickest to a Ruben Dias flick-on from a corner, but his effort was well saved by Martinez.
The Villa defence scrambled the rebound away from danger to deny the onrushing John Stones, and while we enjoyed the lion’s share of the play in the opening 45, the visitors continued to hold firm.
City once again set the tone as the game edged into the second half with Joao Cancelo cutting onto his left and curling an effort off the top of the crossbar..
The Villans continued to defend doggedly and, quite literally, weathered the storm at a rain-sodden Etihad Stadium, but it was far from one-way traffic, with Douglas Luiz forcing a fine save from Ederson down to his right.
An enthralling encounter continued to ebb and flow, with Ilkay Gundogan the next to go close, his near-post header almost squeezing underneath Martinez and rebounding agonisingly out of reach.
John McGinn then found a pocket of space around the penalty spot at the other end, but couldn’t not get a proper connection on the increasingly slippery surface.
But five minutes later we found the all important breakthrough, with Bernardo’s clinical finish edging us ahead, much to the delight and relief of him and his teammates, before Gundogan’s calm spot kick then put the game beyond doubt and extended our unbeaten run to 16.
Enjoy the best of the action via the gallery below…