Chelsea had Christian Pulisic to thank for a last minute winner against 10-player West Ham at Stamford Bridge, a result which strengthen their grip on third place in the Premier League.
The visiting Hammers looked to be on course to hold out for a point and had even survived a terrible late Jorginho penalty, which had seen the otherwise outstanding Craig Dawson sent off. But Pulisic swept home a Marcos Alonso cross just as the clock was about to hit stoppage time.
With one eye firmly on Thursday’s Europa League semi-final first leg, there was a degree of rotation and a defensive outlook from David Moyes. But they were right in it and almost punished Chelsea for individual mistakes in possession in the opening 20 minutes.
The Blues were visibly flat for more than 50 minutes. They were without a capacity crowd at to lift them due to ongoing restrictions on ticket sales as part of the UK government sanctions against outgoing owner Roman Abramovich. Poor recent results also seemed to be weighing them down.
Half an hour in, Andriy Yarmolenko flashed one across the face of goal. He might actually have been better leaving the ball for Said Benrahma, who was coming at it from a better angle.
But by the interval, neither side had managed a shot on target. West Ham were happy to contain and let Chelsea play in front of them. There was no creativity from Thomas Tuchel’s side and Mason Mount, Kai Havertz and Timo Werner might as well not have been on the pitch at that stage.
The second half initially started in similar fashion until Chelsea finally started picking up the tempo. A flying block from Dawson stopped a goal-bound Werner volley in its tracks, while the centre-back blocked two more efforts in the lead up to the hour mark.
Fabianski was soon called into action twice, first as he gratefully grasped a deflected effort that threatened to arc over his head, then parrying a Trevoh Chalobah drive to safety. Dawson then made another huge block, this time denying Mount, before Fabianski closed down Werner on the rebound.
When Dawson finally did miss a defensive header, Werner couldn’t get enough power on his subsequent close-range shot to beat Fabianski.
Tuchel rang the changes with 15 minutes left, turning to Romelu Lukaku, Christian Pulisic and Hakim Ziyech to give Chelsea fresh attacking impetus. It looked as though it had worked when Lukaku successfully rolled Dawson in the final moments and was pulled back by the West Ham defender, who was then given his marching orders after referee Michael Oliver consulted the pitchside monitor.
But with Jorginho’s weak penalty, along the floor and straight down the middle, easily saved by Fabianski, it was Pulisic who went on to win it instead.
Here are your player ratings...
Chelsea vs West Ham player ratings - Premier League
1. Chelsea (3-4-1-2)
GK: Edouard Mendy - 6/10 - Had very little to do.
CB: Trevoh Chalobah - 6/10 - A late addition to the starting XI after Andreas Christensen was forced to pull out.
CB: Thiago Silva - 6/10 - Organised things at the back and even got the flick-on header which led to the penalty incident.
CB: Cesar Azpilicueta (c) - 4/10 - Looked really off his usual game and seemed to be frustrated with himself and others.
RWB: Ruben Loftus-Cheek - 7/10 - Put a few teasing balls into the box and looked a potential source of an assist until he came off.
CM: N'Golo Kante - 7/10 - Recycled possession really well in central areas as you would expect. Lacked technical quality but that's not his game.
CM: Jorginho - 3/10 - This game needed way more than sideways passing. Had a chance to be the hero but his penalty miss was shocking.
LWB: Marcos Alonso - 7/10 - Fluffed his own lines in front of goal when a great chance came, but pretty heavily involved in the game on the whole and provided the measure last minute assist.
AM: Mason Mount - 5/10 - Didn't really turn up until midway through the second half. Denied a breakthrough goal by an outstanding Dawson block.
ST: Kai Havertz - 4/10 - Invisible in the first half. Slightly improved in the second but it wasn't his day overall.
ST: Timo Werner - 5/10 - Better after the break when he caught the game's first clear sight of goal and later saw several chances go begging. Should have taken one of them.
SUB: Hakim Ziyech (76' for Loftus-Cheek) - 5/10 - The least effective of the three Chelsea substitutes.
SUB: Christian Pulisic (76' for Werner) - 7/10 - Popped up when it mattered most and had the composure to win the game.
SUB: Romelu Lukaku (76' for Havertz) - 6/10 - Did well to win the penalty by intelligently using his body and strength
2. West Ham (3-4-1-2)
GK: Lukasz Fabianski - 8/10 - Ended up being quite busy in the second half and made save after save. The penalty stop was one of the easier ones, yet he stood no chance with the actual goal.
CB: Ben Johnson - 7/10 - Made several clearances and was arguably unlucky to finish on the losing side.
CB: Craig Dawson - 6/10 - Led so well in a makeshift back three and made some huge blocks early in the second half. But gave away the penalty and his absence when Chelsea scored was critical.
CB: Aaron Cresswell - 7/10 - Another player unfortunate to lose, having made blocks and clearances to keep Chelsea at bay until the death.
RWB: Vladimir Coufal - 5/10 - Relatively quiet in an attacking sense, while the cross for Chelsea's winner came from his side.
CM: Tomas Soucek - 7/10 - A strong box to box presence who made important contributions at either end of the pitch.
CM: Mark Noble (c) - 6/10 - First start in any competition since early February. Understandably only lasted an hour but did well.
LWB: Arthur Masuaku - 5/10 - Could have done more to stretch the game as an attacking outlet.
AM: Pablo Fornals - 5/10 - Didn't see a lot of the ball so needed to do more with it when it came his way.
ST: Andriy Yarmolenko - 5/10 - Got into some good positions but probably not ruthless enough when it mattered.
ST: Said Benrahma - 6/10 - Pressed well from the front, although didn't get much joy from it aside from a couple of first half moments.
SUB: Declan Rice (62' for Noble) - 5/10 - Rested from the start but brought on just as Chelsea started to gain an upper hand.
SUB: Jarrod Bowen (73' for Yarmolenko) - 5/10
SUB: Manuel Lanzini (78' for Benrahma) - 5/10