Three first-half tries from London Irish secured a surprise victory over Premiership leaders Saracens in windy conditions at Allianz Park.
After James O'Connor put the visitors in front with an early penalty, Sarries centre Marcelo Bosch made it 5-3.
But despite having two men sin-binned, the Exiles led at half-time following tries from Matt Parr, Alex Lewington and captain George Skivington.
Schalk Brits scored a late consolation for the home side.
The defeat was just Saracens' second in the league this term and their first regular-season home defeat since their move to Allianz Park last year.
London Irish were forced into a late change as winger Topsy Ojo, absent after his wife gave birth, was replaced by Lewington.
However, Australian full-back O'Connor, who is set to join French side Toulon at the end of the season, gave the visitors the lead on three minutes after Saracens were penalised at the scrum.
The home side got back into the match after Irish centre Fergus Mulchrone was sent to the bin for repeated offences at the breakdown.
They scored their first try when Charlie Hodgson passed into space for the overlapping Bosch to cross the line.
Hodgson had missed an earlier penalty and failed to add the extras, with the wind in north London causing considerable difficulties for both sides.
With Mulchrone back on the field, Irish regained the lead when Nick Rouse offloaded for Parr to power over the line for his first Premiership try and O'Connor subsequently added a further two points for a 10-5 lead.
With Irish flanker Blair Cowan in the sin bin, a Hodgson penalty reduced the arrears, but after Cowan's return the Exiles seized control of the game with two tries just before the half-time break.
First, Hodgson's clearing kick was charged down by Eamonn Sheridan and Tomas O'Leary pounced on the loose ball to feed Lewington, who scored in the right hand corner.
Two minutes later, a grubber kick from Lewington was hacked on by Skivington, who gathered and scored his first try of the season, with O'Connor converting for a 22-8 lead.
Saracens sought a way back into the game in the second period but were frustrated by highly committed defence by London Irish, characterised by determined tackling.
South African hooker Brits did eventually find a breakthrough, crossing five minutes from time, but the conversion was missed and Sarries were unable to mount a late comeback.
VIEWS FROM THE DRESSING ROOM
Saracens director of rugby Mark McCall:
"The result is disappointing. With five minutes to go till half-time it was 10-8, we were going to have the wind in the second half, and I think we would have taken that.
"But then we lost 12 points in the last three minutes before half-time and that gave us a mountain to climb.
"We dominated the first 20 to 25 minutes of the game. We had a lot of line-outs and scrums five metres from their line.
"The referee gave a couple of yellow cards in that period. Clearly you want to come away with some points like we have done all season but we couldn't do it."
London Irish director of rugby Brian Smith:
"It's the best win of the season.
"Sarries are a quality outfit - their line speed, defence and heat they put on the ball in every tackle situation - and they are a champion team at the top of their game.
"We came into the game with a very simple plan but we had to execute it. We knew if we were to have a chance today we would have to out-work them and because they're a massive work-rate team.
"We deserved the win but that five-minute patch where we scored those two tries swung the whole contest in our favour as until then everything had been going to script for them by going into the wind first half."
Saracens: Ransom; Ashton, Bosch, Wyles, Strettle; Hodgson, de Kock; Barrington, George, Stevens; Borthwick (capt), Botha; Wray, Burger, Joubert.
Replacements: Kruis for Botha (44), Wigglesworth for de Kock (51), Tomkins for Ransom (51), Brits for George (54), Johnston for Stevens (54), Wilson for Ashton (62), Hankin for Joubert (66), Saunders for Barrington (68).
London Irish: O'Connor; Lewington, Mulchrone, Sheridan, Fenby; Geraghty, O'Leary; Parr, Paice, Hagan; Skivington (capt), Rouse; Low, Cowan, Treviranus.
Replacements: Yapp for Parr (40), Stevens for Paice (62), Sinclair for Treviranus (62), Kennedy for O'Leary (62), Fowlie for O'Connor (68), Halavatau for Hagan (76), Ellis for Rouse (76), Humphreys for Geraghty (76).
Referee: Dean Richards (RFU).