Chelsea moved up to third place in the Premier League and postponed Manchester City's title celebrations by coming from behind to earn a dramatic late victory at the Etihad Stadium.
Following a slow start, a first half largely devoid of excitement burst into life just before half-time, when the referee waved play on as Andreas Christensen went down injured, allowing Raheem Sterling to put Man City in front. There was further frustration when we were denied the chance to bring on a substitute, finishing the half with 10 men, and then the home side were awarded a penalty in added time.
However, Edouard Mendy was wise to Sergio Aguero's cheeky effort, saving the spot kick comfortably, and the Blues fought back strongly when restored to a full 11 players in the second half.
First Hakim Ziyech powered a low shot into the bottom corner from outside the box to level the scores, following good play on the right from Cesar Azpilicueta and Christian Pulisic.
Then, with frustration growing after three Chelsea goals had been disallowed for offside, two by Timo Werner and one for Callum Hudson-Odoi, Marcos Alonso popped up in the box in second-half injury time to turn in Werner's cutback. It gave us all three points and a timely confidence boost ahead of meeting the same opponents in the Champions League final.
The selection
Thomas Tuchel had hinted at rotation following our exertions against Real Madrid in midweek, and stuck to his word with five changes.
Timo Werner, scorer of our opener against Real, is the only player to retain his place in the front three. Joining him in attack at the Etihad Stadium were Christian Pulisic and Hakim Ziyech, in for Mason Mount and Kai Havertz. With Mateo Kovacic still missing through injury, N’Golo Kante continued in midfield, joined by Billy Gilmour, who came in for Jorginho.
With Thiago Silva rested, skipper Cesar Azpilicueta dropped into the back three alongside Andreas Christensen and Antonio Rudiger, with Edouard Mendy in goal. Reece James came in on the right, while on the opposite flank Marcos Alonso replaced Ben Chilwell.
Manchester City made nine changes from their own Champions League semi-final win on Tuesday, with only goalkeeper Ederson and centre-back Ruben Dias keeping their places.
Cagey start
The first real opportunity of the game fell to Manchester City, as the ball broke in the left channel after Andreas Christensen and Sergio Aguero both misread the flight. That allowed Ferran Torres a run at goal, but he blasted his shot high and wide under pressure from N’Golo Kante.
However, it was a fairly slow start to the game as both sides eased into the game while cautiously probing to find where the space would be on the pitch, given the unusual 5-1-4 formation City seemed to start the game with in an effort to match up with our back three.
With that early sparring out of the way, though, we gradually started to pick up the pace and cause the home side problems around the 15-minute mark, particularly down the right. Raheem Sterling received the first booking for a desperate looking challenge on Timo Werner on that side, and then Reece James got free to power a cross into the box, but Ederson was able to get there first and push it away.
We looked just about the more threatening of the two sides in possession, but chances were elusive for both teams, despite Man City having one powerful Rodri shot from a long way out deflected wide by Cesar Azpilicueta, before Antonio Rudiger, Marcos Alonso and Edouard Mendy all had to be strong to deal with a series of corners from our right.
It briefly looked like we might be in after N’Golo Kante won the ball in a promising area and launched a quick attack, but Alonso and Werner weren’t quite on the same wavelength as the former dummied and left a Billy Gilmour pass for the German, with the moment of hesitation allowing the City defenders to recover.
We did have the ball in the net after 30 minutes, as James lashed a deep Alonso cross into the six-yard box and Werner swept past Ederson, but the striker was still coming back from an offside position following the original cross and the goal was ruled out.
That signalled our growing threat, particularly through Werner’s pace, and there was no raised flag as he raced on to a Gilmour pass down the left, but after standing up Ruben Dias, the striker couldn’t get the curl on his shot as he tried to thread the ball towards the far post.
It was still an evenly-matched tie, though, as shown when Sterling volleyed a loose ball towards goal on the break, but it lacked power and Mendy could save comfortably at his near post. Hakim Ziyech and Rudiger both responded with long-range shots of their own, but without success.
Blues behind at the break
With the two teams cancelling each other out, it looked like it would take a stroke of luck to provide a breakthrough, and it fell Man City’s way. Christensen went down injured following a coming together with Gabriel Jesus, but referee Anthony Taylor waved play on, allowed the striker to race into the box and square towards Aguero, whose heavy touch merely diverted the ball towards Sterling to finish.
The Blues weren’t happy with the referee, and little changed when Christensen limped off but Taylor whistled for play to restart before we could bring on Kurt Zouma to replace him, causing widespread confusion and frustration. It nearly proved costly when Gabriel Jesus ran at our depleted defence and went to ground in a tangle with Gilmour.
The referee awarded a penalty, despite being beyond the allocated added time, but Mendy reacted quickly when Aguero tried to chip the spot kick and stood up to gather the penalty with the last touch of a half that we finished with 10 men and ran two minutes longer than indicated.
When the second half began, we did finally have Zouma on to return us to full strength at the back, but chances were still few and far between for both teams, with the exception of a couple of hopeful efforts from range.
Level again
We managed to peg Man City back into their own half for a spell in the first part of the second period, but found space in the final third difficult to come by. Werner and Pulisic briefly looked like they may have found room to threaten the hosts, but couldn’t trouble Ederson from the edge of the box.
It was from an almost identical position that we did equalise, though. It started with Azpilicueta winning possession high up on the right and breaking with an exchange of passes with Ziyech and Pulisic.
That resulted in Ziyech finding himself with the ball in a bit of space just outside the box, and the Moroccan needed no second invitation. He drove a low shot at goal which settled right into the corner, beyond the reach of Ederson this time. The Blues were level and it was no less than we had deserved with our improved performance since the break.
Guardiola reacted with a double change, while for the Blues Jorginho came on to replace Kante, but we remained on top, Werner being inches away from getting on the end of a low James ball across the face of the six-yard box.
Strong finish pays off
We were staying patient with our build-up, but it remained down that right side that we were looking dangerous as we entered the last 15 minutes of the game, with Laporte at full stretch to prevent another threatening James cross from reaching Werner in the centre.
For the second time in the match Werner had the ball in the back of the net, only to be flagged offside after beating Laporte to Jorginho’s through ball and rounding the keeper to slot in. He was quickly joined in his frustration by substitute Callum Hudson-Odoi, who turned in another low James cross following Pulisic’s break forward, only to see the flag go up yet again and the narrow offside decision upheld by VAR.
The game increased to an almost frantic pace in the last few minutes, and despite Sterling's appeals for another penalty under a challenge from Zouma, it was Chelsea who made the more open finish count. Werner was played in down the that right-hand channel and drove into the box before cutting a pass back towards the penalty spot. Alonso and Hudson-Odoi both went for it, but it seemed to be the Spaniard who got the last touch as the ball spun up, out of Ederson's reach, and dropped into the back of the net. This time there was no hint of an offside and Chelsea had the lead for the first time deep into stoppages.
City looked disappointed not to have got anything from the game at the final whistle, having missed that first-half penalty, but it was the Blues who lifted our performance after the break and got the late reward for those efforts.
What's next?
We are back at Stamford Bridge on Wednesday to host Arsenal in a Premier League London derby at 8.15pm, before we get our first chance to lift silverware this season next Saturday, when we meet Leicester City at Wembley in the FA Cup final at 5.15pm.
Chelsea (3-4-3): Mendy; Azpilicueta (c), Christensen (Zouma 46), Rudiger; James, Kante (Jorginho 68), Gilmour, Alonso; Ziyech (Hudson-Odoi 76), Werner, Pulisic
Unused subs: Kepa, Emerson, Livramento, Havertz, Abraham, Giroud
Scorers: Ziyech 63, Alonso 90+2
Manchester City (3-3-4): Ederson; Dias, Laporte, Ake; Joao Cancelo, Rodri, Mendy (Zinchenko 80); Torres (Foden 71), Aguero (Gundogan 71), Gabriel Jesus, Sterling (c)
Unused subs: Steffen, Walker, Garcia, Fernandinho, Bernando Silva, Mahrez
Scorer: Sterling 44
Booked: Sterling 12, Laporte 72, Gabriel Jesus 90
Referee: Anthony Taylor