Diafra Sakho’s seventh goal in as many Barclays Premier League starts gave West Ham a 2-1 victory over champions Manchester City at Upton Park.
The Irons, who had climbed into the top four with a run of positive displays, took a deserved lead through Morgan Amalfitano on 21 minutes as the visitors were outmuscled.
City piled on the pressure, which saw Sergio Aguero hit the crossbar and Yaya Toure strike the outside of the post.
However, on 73 minutes, Sakho, signed from Metz in the summer, made it 2-0 when his downward header dropped over the line, given by the Goal Decision System after Joe Hart had clawed the ball out inside the far post.
David Silva hit back immediately to set up a grandstand finale, but West Ham held on as City missed the chance to close up on leaders Chelsea, who visit Manchester United on Sunday.
It was almost a flying start for City when Aguero sent in a dipping half-volley from 25 yards, which Adrian scrambled behind for a corner.
At the other end, England goalkeeper Hart had to be alert to tip over a looping backwards clearance from defender Eliaquim Mangala, which was threatening to drop under the crossbar.
Hart was called into action again on 19 minutes when he blocked at point-blank range from Enner Valencia’s header after a deep free-kick into the City box - and was then accidentally clattered by the West Ham striker, which left him needing some treatment.
There was, though, little Hart could do as West Ham swept into the lead on 21 minutes.
Alex Song released Valencia down the right, he skipped past Mangala and into the penalty area, before cutting the ball back across the six-yard box.
Pablo Zabaleta fell into Hart as he tried to recover ground, which left Amalfitano with a tap-in at the far post.
City immediately went in search of an equaliser, and Edin Dzeko fired over from a corner.
The Irons remained a threat on the break, with Stewart Downing’s looping header dropping onto the roof of the net following another swift counter down the right.
Amalfitano’s pass from a cleverly worked free-kick via Mark Noble sailed across the front of goal, but neither Valencia nor James Collins were able to apply the finishing touch as they slid into the six-yard box.
Adrian then showed great reactions to kick out a boot and deflect a goal-bound effort from Aguero, as the ball cannoned off the chest of the City forward.
At the start of the second half, City captain Vincent Kompany was fortunate not to collect a second caution for a high boot on Valencia, but referee Martin Atkinson opted to keep his cards in his pocket.
From the resulting free-kick, the ball was worked out to Song on the right, who chipped it back into the six-yard box with a neat rabona reverse pass, but Downing hacked his shot wide.
As the hour passed, Aguero darted onto a ball from Silva into the West Ham penalty area, but his shot was first blocked by Adrian and then Collins as City continued to push the home wide back.
Jesus Navas charged down the right and cut the ball back for Aguero, who crashed it against the underside of the crossbar from six yards.
Toure was first the rebound, but his follow-up header was saved at point-blank range by Adrian.
The referee again resisted calls for what really should have been a booking to Kompany after the City skipper felled Valencia on the halfway line as West Ham looked to break quickly.
As City pressed, the Irons were dangerous on the counter, with Song feeding Valencia on the right of the penalty area, who cut the ball back to Sakho and his shot looped just over.
Toure was inches away from equalising on 73 minutes when his curling effort struck the outside of the post.
And West Ham then went up the other end and doubled their lead.
Left-back Aaron Cresswell floated over a deep cross, and Sakho climbed to nod it inside the far post. Hart clawed it out, but the GDS correctly signalled the ball had crossed the line.
The champions looked beaten, but hit back immediately when Silva curled the ball into the top corner after cutting in from the right.
There were five minutes of stoppage time, and Adrian palmed away a 25-yard drive from substitute Stevan Jovetic and the Irons held out for a hard-earned victory.