Substitute Erling Haaland scored an injury-time winner from the penalty spot to give 10-man Manchester City victory over Fulham and send the defending champions top of the table.
The importance of his 95th-minute strike was underlined moments later when Haaland was embraced by his manager Pep Guardiola at the final whistle, and joined his team-mates on a lap of honour.
What appeared as though it would be a frustrating and potentially costly afternoon in City's pursuit of a third-successive title, instead ended with a memorable victory thanks to Haaland's 18th league goal of his dazzling start to his career at Etihad Stadium.
All seemed to be going according to plan for Guardiola's side early on, as they took the lead through Julian Alvarez's powerful finish and pressed forward looking for more goals.
But the anticipated march to a seventh successive home win this season did not transpire. Instead the game took an unexpected turn just before the the half-hour mark when Joao Cancelo muscled Fulham forward Harry Wilson off the ball in the box.
Referee Darren England pointed to the spot and showed Cancelo the red card, to the disbelief of Guardiola and his players, before Andreas Pereira sent Ederson the wrong way from the spot.
That was Fulham's first effort at goal and they rarely threatened afterwards either, even with the extra man, instead being content to sit deep and frustrate their hosts.
It initially appeared they would be successful, even when Haaland came off the bench in the second half after two games out injured.
Haaland thought he had scored the winner when he headed home a Kevin de Bruyne cross with 15 minutes to go, but the home side's celebrations were cut short when VAR showed he was offside.
City's attacks grew increasingly frantic towards the end and Haaland got no closer to finding the net, until Antonee Robinson tripped De Bruyne inside the area in injury time.
Haaland - who else? - stepped up to fire his penalty into the bottom corner and spark wild celebrations from his team-mates, manager and in the stands.
More to follow.
helpHow to play
Rate players out of 10 throughout or after the game. The rater will close 30 minutes after the final whistle.
Rating range key1 = Give it up10 = Pure perfection
Manchester City
Squad number3Player nameRúben DiasSquad number9Player nameHaalandSquad number47Player nameFodenFulham
Squad number17Player nameLeno
Squad number2Player nameTete
Squad number31Player nameDiop
Squad number13Player nameReam
Squad number33Player nameRobinson
Squad number6Player nameReed
Squad number26Player nameJoão Palhinha
Squad number8Player nameWilson
Squad number18Player nameAndreas Pereira
Squad number20Player nameWillian
Squad number30Player nameCarlos Vinícius
Squad number10Player nameCairney
Squad number21Player nameJames
Squad number27Player nameMbabu
Squad number38Player nameHarris
Line-ups
Man City
Formation 4-3-3
31Ederson
5Stones25Akanji6Aké7Cancelo
17De Bruyne16Rodri8Gündogan
20Bernardo Silva19Álvarez10Grealish
31Ederson5Stones25Akanji6Aké7CanceloBooked at 26mins17De Bruyne16Rodri8GündoganSubstituted forRúben Diasat 90+7'minutes20Bernardo SilvaBooked at 45mins19ÁlvarezSubstituted forHaalandat 64'minutesBooked at 90mins10GrealishSubstituted forFodenat 64'minutesSubstitutes
3Rúben Dias9Haaland14Laporte18Ortega21Gómez26Mahrez47Foden80Palmer82LewisFulham
Formation 4-2-3-1
17Leno
2Tete31Diop13Ream33Robinson
6Reed26João Palhinha
8Wilson18Pereira20Willian
30Alves Morais
17Leno2TeteBooked at 63mins31Diop13Ream33RobinsonBooked at 90mins6ReedBooked at 45mins26João Palhinha8WilsonSubstituted forJamesat 76'minutes18PereiraBooked at 7minsSubstituted forHarrisat 88'minutes20WillianSubstituted forMbabuat 80'minutes30Alves MoraisSubstituted forCairneyat 76'minutesSubstitutes
1Rodák3Kurzawa4Tosin5Duffy10Cairney21James25Onomah27Mbabu38HarrisLive Text
Match ends, Manchester City 2, Fulham 1.
Second Half ends, Manchester City 2, Fulham 1.
Erling Haaland (Manchester City) wins a free kick in the defensive half.
Foul by Kenny Tete (Fulham).
Attempt blocked. Issa Diop (Fulham) header from the centre of the box is blocked. Assisted by Tom Cairney with a cross.
Erling Haaland (Manchester City) is shown the yellow card for excessive celebration.
Substitution, Manchester City. Rúben Dias replaces Ilkay Gündogan.
Goal! Manchester City 2, Fulham 1. Erling Haaland (Manchester City) converts the penalty with a left footed shot to the bottom left corner.
Penalty Manchester City. Kevin De Bruyne draws a foul in the penalty area.
Penalty conceded by Antonee Robinson (Fulham) after a foul in the penalty area.
Antonee Robinson (Fulham) is shown the yellow card for a bad foul.
Corner, Manchester City. Conceded by Tim Ream.
Attempt blocked. Erling Haaland (Manchester City) header from the centre of the box is blocked. Assisted by Kevin De Bruyne with a cross.
Substitution, Fulham. Luke Harris replaces Andreas Pereira.
Foul by Manuel Akanji (Manchester City).
Daniel James (Fulham) wins a free kick in the defensive half.
Attempt blocked. Erling Haaland (Manchester City) right footed shot from the left side of the box is blocked. Assisted by Kevin De Bruyne with a through ball.
Substitution, Fulham. Kevin Mbabu replaces Willian.
Substitution, Fulham. Tom Cairney replaces Carlos Vinícius.
Substitution, Fulham. Daniel James replaces Harry Wilson because of an injury.
Our coverage of your Premier League club is bigger and better than ever before - here's everything you need to know to make sure you never miss a moment