Ryan Lamb scored all of London Irish's points as they piled on the misery for Bath in a 16-0 victory at the Recreation Ground on Saturday.
Lamb's "full house" of a try, conversion, two penalties and a drop-goal was in neat contrast to the scrappy match which went on around him.
But the Exiles will be delighted with the win, which cuts Saracens' lead at the top of the Guinness Premiership table to four points.
The pitch had been covered in recent days but conditions underfoot rapidly deteriorated.
After Lamb had missed with a penalty attempt from 45 metres, Bath swung the ball left and right in the rain without ever looking likely to make any headway.
On 11 minutes, almost inevitably, Nick Abendanon tried to clear under pressure just outside his 22 and Lamb charged down the kick to score, also adding the conversion.
After pushing Bath into the corner with a rolling kick, the fly-half could have added to the lead when Stuart Hooper was spotted throwing a punch, but his penalty kick was wide.
A hospital pass from Ryan Davis to Jack Cuthbert also went unpunished and Bath managed to hold out when Elvis Seveali'i stormed through some weak tackles.
But after Hooper was guilty of a late tackle, Lamb found the target from 40 metres.
Peter Richards gave way to Paul Hodgson at the break and it was no great surprise when the unhappy Davis gave way to Nicky Little on the Bath side 10 minutes later.
Having survived a referral to the television match official (TMO) when Abendanon let John Rudd see rather too much of a ball bouncing over the Bath line, the home side went further behind on 54 minutes when Lamb kicked his second penalty from 40 metres.
The TMO again ruled in Bath's favour on 61 minutes when Lamb's grubber kick cannoned off Matt Banahan into Peter Hewat's arms. The ball stuck and the winger sped down the touchline only to be denied by Little, Banahan and Shontayne Hape.
It was a brief respite though as Bath's scrummage began to suffer along with the other bits of their game and Lamb landed a 66th-minute drop goal.
The closest Bath came to scoring was when number eight Luke Watson battled his way to the posts but the visitors were awarded the scrum put-in and cleared the danger.
Bath began to see more of the ball as Irish relaxed their grip in the closing minutes but there was no sniff of a score.
For London Irish:
Pen: Lamb 2
Bath: 15 Nick Abendanon, 14 Jack Cuthbert, 13 Matt Carraro, 12 Shontayne Hape, 11 Matt Banahan, 10 Ryan Davis, 9 Michael Claassens (c), 8 Luke Watson, 7 Julian Salvi, 6 Ben Skirving, 5 Danny Grewcock, 4 Stuart Hooper, 3 David Wilson, 2 Lee Mears, 1 David Flatman.
Replacements: 16 Pieter Dixon, 17 Nathan Catt, 18 Duncan Bell, 19 Peter Short, 20 Daniel Browne, 21 Scott Bemand, 22 Nicky Little, 23 Michael Stephenson.
London Irish: 15 Jamie Lennard, 14 Peter Hewat, 13 Elvis Seveali'i, 12 Mike Catt, 11 John Rudd, 10 Ryan Lamb, 9 Peter Richards, 8 Chris Hala'Ufia, 7 Steffon Armitage, 6 Richard Thorpe, 5 Bob Casey (capt), 4 Nick Kennedy, 3 Alex Corbisiero, 2 David Paice, 1 Clarke Dermody.
Replacements: 16 Danie Coetzee, 17 Dan Murphy, 18 Max Lahiff, 19 Kieran Roche, 20 Jonathon Fisher, 21 Marcus Watson, 22 Paul Hodgson, 23 Chris Malone.
Referee: Dean Richards
Assistant referees: Peter Huckle, Paul Dix
Television match official: Laurie Bryant, Alan Hughes