Manchester City closed the gap on leaders Manchester United in the Premier League title race as Gareth Barry scored a late winner to sink Reading 1-0.
• Premier League gallery
• Jolly: Barry the unlikely hero
• Brewin: Ref justice at Upton Park
Barry scored in the dying minutes to earn three points at Etihad Stadium as the champions struggled to find a way past a dogged Royals team.
Reading have the leakiest defence in the Premier League, but neither Sergio Aguero nor Carlos Tevez could make the home side's dominance count, while Barry's header was fired straight at Adam Federici.
The visitors stuck to their game plan, often playing with eight at the back and camped in their own half for most of the match.
They looked to have done enough to earn a point and stem a run of six successive defeats, but suffered a heartbreaking defeat after Barry nodded David Silva's cross into the bottom corner.
Arsenal battled to a 1-0 victory over Wigan Athletic at the DW Stadium.
The Gunners and their manager Arsene Wenger have come in for criticism this season, but they produced a battling display to consign Wigan to Christmas in the relegation places.
It was not vintage Arsenal in dire weather, but they kept plugging away and a Mikel Arteta penalty on 59 minutes after Theo Walcott had been felled in the box by Jean Beausejour sealed the three points.
The result leaves Arsenal in third by virtue of their goal difference, with Tottenham having missed the chance to move into third as they were held to a 0-0 draw by Stoke City at White Hart Lane.
Spurs had won four of their last five matches, but were fortunate not to fall behind early when Kenwyne Jones blasted over after Kyle Walker had given the ball away in defence.
Despite the return of Gareth Bale, Spurs could not breach the Stoke backline and the spoils were shared.
Stewart Downing played a starring role as Liverpool returned to winning ways with a resounding 4-0 win over Fulham.
The Reds suffered a shock home defeat to Aston Villa last weekend, but Downing restored festive cheer at Anfield, scoring one and providing another as they cruised to victory.
Martin Skrtel gave the Reds an early lead with a thumping volley before Steven Gerrard doubled the scoreline after being fed through by a lovely Downing through-ball. Downing then scored his first Premier League goal for Liverpool, beating former Reds defender John Arne Riise before rifling in a powerful strike from the edge of the penalty area. Luis Suarez put the icing on the cake with a fourth in injury time as Liverpool moved up to eighth.
Steven Pienaar scored the winner as Everton came from behind to beat West Ham 2-1 Upton Park as both teams ended the game with ten men.
The Toffees launched a second-half fightback after West Ham scored just moments after Everton had a goal disallowed in the first half.
Leon Osman's header found the back of the net from a corner, but referee Anthony Taylor deemed that Victor Anichebe had impeded Hammers 'keeper Jussi Jaaskelainen. Carlton Cole added insult to injury just two minutes later, turning neatly to beat the Everton defence to smash the ball past Tim Howard from the edge of the area.
But Everton made a bright start to second half and were rewarded for their pressure, with Victor Anichebe rising to meet Pienaar's whipped cross to draw Everton level.
Sam Allardyce was left fuming when Cole was given his marching orders after he caught Leighton Baines with his studs with the scores still level, and the sending off proved costly as Everton made the most of their numerical advantage, Pienaar bundling home from close range after some neat play from Osman.
Gibson was sent off in the dying minutes for a high challenge on Mark Noble, but Everton held on for three points.
Norwich City's unbeaten run came to an end as they were beaten 2-1 by West Bromwich Albion. The Canaries took an early lead at The Hawthorns coutesy of Robert Snodgrass' free-kick, but Romelu Lukaku scored the winner after Zoltan Gera's equaliser.
Snodgrass, who had been fouled by Peter Odemwingie from 25 yards, curled a superb effort into the top corner for his third goal in five games, but the Baggies bounced back, Gera knocking in from close range after Mark Bunn could only push Jonas Olsson's header onto the bar.
Lukaku grabbed all three points with a late winner, burying a powerful header, to see West Brom join Arsenal, Everton and Tottenham on 30 points.
Newcastle secured a much-needed three points as they beat Queens Park Rangers 1-0 at St James' Park.
In a poor game of few chances, Harry Redknapp's unbeaten start to life as QPR manager came to an end as Shola Amoebi scored a late winner to earn three points for the Magpies.
Southampton are hovering dangerously above the bottom three on goal difference after they were beaten 1-0 by Sunderland at St Mary's Stadium.
The Saints had been in a good run of form after taking 11 points from their last six matches, but it was Sunderland, who had won just one of their last 16 away matches, who took all three points thanks to Steven Fletcher's eighth goal of the season.
Watch every goal from every Premier League game with ESPN Goals (UK only)