Manchester City survived a huge scare to draw at West Ham on Sunday afternoon and keep their Premier League title destiny in their own hands.
A searing atmosphere saw Jarrod Bowen score two expertly taken goals in the first half before Jack Grealish pulled one back and Vladimir Coufal headed in an own goal.
Riyad Mahrez had an opportunity late on to win the game for City after Craig Dawson took down Gabriel Jesus in the box, but Lukasz Fabianski sprawled to his left to block the Algerian's attempt.
On a sentimental day at the London Stadium as the home fans said their goodbyes to stalwart Mark Noble, West Ham enjoyed some early pressure before City got into their groove, with Rodri seeing a shot blocked before Fernandinho lashed just over the bar.
However, City got sucker-punched by as Pablo Fornals sent Bowen clean through on goal, exposing the visitors' high line. The winger's pace got him in and he rounded Ederson before firing in from an acute angle for the opener.
With the cat among the pigeons, City upped the intensity as Rodri, Oleksandr Zinchenko and Gabriel Jesus all went close, though the gauntlet was well and truly laid down when the Hammers went up the other end to double their advantage.
Again it was Bowen who raced through untracked from Michail Antonio's pass, cooly slotting into the far corner beyond Ederson to send West Ham fans - and their Liverpool counterparts - into dreamland.
However, City cranked up the heat on their hosts at the start of the first half as they clawed one back.
Rodri's header ballooned into Grealish's path and the forward struck past Fabianski courtesy of a slight deflection off Dawson to make it 2-1.
While City attempted to make good on their momentum, with Jesus testing Fabianski at the near post and Bernardo Silva also going close, their composure seemed to completely abandon them as they handed West Ham two golden opportunities.
A first poor back-pass from Laporte allowed Antonio to feed Bowen, who struck into the side-netting, before a similarly ill-judged ball from Fernandinho sent Antonio in. However, the forward elected to lob from a tight angle and got it all wrong.
Those misses proved costly for West Ham as City drew level from a set piece. Mahrez produced a tantalising ball which Coufal couldn't afford to let go, but instead of clearing the Czech defender nodded past Fabianski to give the visitors some renewed life.
A siege ensued as City pressed for a winner and they got the perfect opportunity when Dawson tumbled into Jesus, with the penalty awarded upon VAR review. However, Mahrez's effort was a nice height for Fabianski to bat it away to secure his side a point.
The draw means City will win the Premier League title with victory over Aston Villa on the final day of the season, while West Ham are seventh but still in with a shout for sixth, sitting two points behind Manchester United.
1. West Ham (4-2-3-1)
GK: Lukasz Fabianski - 7/10 - Few uncertain spills and no chance with Grealish's deflected effort. Booked for timewasting but made a tremendous penalty save.
RB: Vladimir Coufal - 3/10 - Booked for holding onto De Bruyne. Headed into his own net from Mahrez's free kick. A bad outing all in all.
CB: Craig Dawson - 6/10 - Some really heroic blocks. Stopped a full-flow De Bruyne run with a precise tackle. Unlucky to see Grealish's strike deflect off him and in. Gave away a penalty.
CB: Kurt Zouma - 6/10 - Made some good interventions, especially in the opening 20 minutes.
LB: Aaron Cresswell - 5/10 - A few iffy moments up against Mahrez.
CM: Declan Rice - 7/10 - Made some surging runs and was also on hand defensively whenever City tried to wriggle their way through the box.
CM: Tomas Soucek - 6/10 - Won the flick which led to West Ham's second.
RW: Jarrod Bowen - 9/10 - Took the goals expertly, bending his run to stay onside for the first. Booked for a cynical challenge on Grealish. West Ham's biggest threat on the counter.
AM: Manuel Lanzini - 5/10 - Didn't misplace any passes, though he only made 14 of them. Taken off for the hometown hero.
LW: Pablo Fornals - 6/10 - His hopeful lob turned into a great ball for Bowen. Nice and fluid whenever West Ham moved forward.
ST: Michail Antonio - 7/10 - Made the most of his opportunities to run at Fernandinho and bagged the assist for Bowen's second.
SUB: Mark Noble - 10/10 - Came on for his last appearance in front of his home supporters.
SUB: Ben Johnson - N/A.
2. Manchester City (4-3-3)
GK: Ederson - 5/10 - Not as commanding or comfortable as he usually is.
RB: Joao Cancelo - 5/10 - Some erratic passing from the usually assured defender.
CB: Fernandinho - 3/10 - Horrifically exposed by Antonio's brutality and City's poorly managed high line. Played a horrific back-pass and was lucky to get away with it. Was generally poor with the ball all game.
CB: Aymeric Laporte - 4/10 - Charged up too high at times, giving West Ham space to run into. has just returned from injury, so ring-rust is understandable.
LB: Oleksandr Zinchenko - 5/10 - Left a lot of space behind him which Bowen exposed for his two goals.
CM: Bernardo Silva - 5/10 - Not that effective on his 250th appearance for City. Had one good chance which was scrambled away by Zouma.
CM: Rodri - 7/10 - Grabbed an assist for Grealish's strike and made some crucial tackles to stop West Ham breaking. Did push a little too high and exposed his defenders behind him.
CM: Kevin De Bruyne - 5/10 - A few nice deliveries from out wide, but he did very little in comparison to his four-goal haul at Wolves in midweek.
RW: Riyad Mahrez - 5/10 - Gave Creswell some strife and his cross was nodded in by Coufal. Rating takes a massive hit for his saved penalty.
ST: Gabriel Jesus - 7/10 - Some nice link-up play with his attacking colleagues and always looked to take on opposition defenders. Had four shots but only one on target.
LW: Jack Grealish - 7/10 - Anonymous in the first half but got City back in the game with a smart finish. Grew into the game.