Racing-Métro scored a try in each half as they handed Toulon a first Top 14 loss of the season 17-10.
A week on from their defeat away at Bordeaux, Racing showed great ambition and deservedly beat Toulon, who were short of their best.
Racing edged the first half scoring a try through François van der Merwe to lead 10-7 at the break despite a great score from James O'Connor.
Maxime Machenaud went over early in the second half for Racing and although Frederic Michalak kept Toulon in touch with a penalty, they were not able to close the deficit.
It was an edgy start to the game, with neither side really able to impose themselves and it was the home side who were able to draw first blood when Craig Burden was sin-binned after 15 minutes.
The South African hooker took out Jonathan Sexton very late with no arms, sparking a melee between the teams but in the end it was just Burden who was sent to the sin-bin.
Racing took full advantage with a lineout deep in Toulon territory, and after a series of charges it was Luc Ducalcon who made ground before the ball was spread again and van der Merwe crashed over. Sexton converted to make it 7-0.
Toulon could have reduced the deficit but Michalak's first kick at goal went horribly wrong, never threatening the posts.
But despite being down to 14 men, Toulon were able to hit back with a try of their own through James O'Connor.
Michalak started it, spreading the ball wide in his own half, and Josua Tuisova made the most of the space to sprint into Racing territory.
Brice Dulin came across to tackle him, but the Fijian flipped the ball to O'Connor, who shrugged off Machenaud to go over in the right. Michalak made up for his earlier miss with a good conversion from out wide.
Burden made his return but Racing were next on the scoreboard, Machenaud slotting a penalty as Sexton was getting treatment for a knock to his shoulder.
That's how it remained at the break, with both sides threatening, but neither able to make it count.
The second half started in quicker fashion, and once more it was Racing who were first on the scoreboard.
It started with Teddy Thomas showing quick feet to get out of trouble when covering back, and rather than kicking clear, Racing spread the ball wide.
Casey Laulala showed his elusiveness to make ground on the right and Racing kept the pressure on with both forwards and backs making ground.
Having reached the Toulon 22, Machenaud threw a dummy before darting through a gaping hole to go over untouched. He converted his own try to make it 17-7 with half an hour remaining.
Sexton was still struggling with injury and was replaced by Johan Goosen, but it was Toulon who reacted next with a Michalak penalty after Eddy Ben Arous failed to roll away from a tackle.
Goosen nearly responded in kind with a penalty from inside his own half, but while he had the distance, the direction was awry.
Toulon had a chance to score their first try of the game with 20 minutes remaining, when they had the Racing defence scrambling, but when the ball arrived in David Smith's hands, an overlap had disappeared, and the Australian was stopped short.
And with quarter of an hour remaining Toulon were penalised for coming in at the side of a maul, but Goosen was again off-target when he had the chance to put Racing more than a score clear.
Machenaud was next to try his luck with a penalty in the final minute, and although he too was off-target, Racing were able to regather the ball and kick it out for the win.
Tries: van der Merwe, Machenaud
Conversions: Sexton 2
Yellow Card: Burden
Racing: 15 Brice Dulin, 14 Adrien Plante, 13 Casey Laulala, 12 Jamie Roberts, 11 Teddy Thomas, 10 Jonathan Sexton, 9 Maxime Machenaud, 8 Camille Gerondeau, 7 Bernard Le Roux, 6 Wenceslas Lauret, 5 Francois van der Merwe, 4 Thibault Dubarry, 3 Luc Ducalcon, 2 Dimitri Szarzewski (c), 1 Eddy Ben Arous
Replacements: 16 Jeremie Maurouard, 17 Davit Khinchagishvili, 18 Fabrice Metz, 19 Juandre Kruger, 20 Mike Phillips, 21 Dan Lydiate, 22 Johan Goosen, 23 Brian Mujati
Toulon: 15 James O'Connor, 14 Josua Tuisova, 13 Rudi Wulf, 12 Maxime Mermoz, 11 David Smith, 10 Frederic Michalak, 9 Eric Escande, 8 Chris Masoe (c), 7 Virgile Bruni, 6 Gerhard Vosloo, 5 Romain Taofifenua, 4 Konstantin Mikautadze, 3 Levan Chilachava, 2 Craig Burden, 1 Fabien Barcella
Replacements: 16 Jean-Charles Orioli, 17 Xavier Chiocci, 18 Jocelino Suta, 19 Juan Smith, 20 Mathieu Bastareaud, 21 Drew Mitchell, 22 Sebastien Tillous-Borde, 23 Carl Hayman
Referee: Sebastien Minery