Keita Balde struck twice as Lazio ruined Francesco Totti's final derby as a player on Sunday with a thrilling 3-1 win over Roma that could also jeopardise their push for a top-two finish in Serie A.
Roma hosted their city rivals looking to maintain their fading title challenge to leaders Juventus after a 2-2 at Atalanta Saturday took their lead to nine points with four games remaining.
But Juve's slip-up wasn't enough to entice Roma on what should have been Totti's derby farewell as his final season in Italy's top flight draws to a close.
Luciano Spalletti's men physically turned up at the Stadio Olimpico, but mentally looked elsewhere as they struggled to impose their usual, fast-flowing game against a Lazio side battling for a place in Europe.
Roma remain nine points behind Juventus but if Napoli beat Inter Milan at the San Siro later Sunday, the gap to third will be just one point.
Spalletti said Roma "lacked lucidity" but said his men ultimaltely had to "keep quiet and accept the flak".
"We made some wrong decisions. We should have had more ball possession, but we struggled to respond when they went on the counter."
Lazio midfielder Lucas Biglia said they had been determined to cause an upset.
"We deserved the win, but the coach has been trying to drill into us since Monday that we could beat Roma," said Biglia, who swapped shirts with Totti at the final whistle.
"For me, he's one of football's icons so to go home with his shirt is great gift for me."
Roma enjoyed a bright start, Edin Dzeko notably firing over while under pressure from six yards out.
But the red and yellow half of the Stadio Olimpico was stunned into silence before the quarter-hour when Balde collected a perfect through ball from deep in midfield to sidestep two defenders and fire through the legs of Emerson Palmieri to wrong-foot Wojciech Szczesny in the Roma net.
Lazio were denied a penalty when Jordan Lukaku was brought down by Fazio after he powered his his way into the area from the left.
Over-run in midfield and struggling for solutions in the final third, Spalletti turned to the Roma fans, gesturing for their vocal support as his side failed to fire.
But on 36 minutes Lazio almost had their second, Marco Parolo forcing Szczesny to parry down low after he ran on to a looose ball following another Balde incursion.
Dzeko had a previous claims for a penalty waved away but Roma's luck changed in dramatic fashion when Kevin Strootman came down following a swipe at his feet by Lazio defender Wallace.
Television pictures suggested no contact had been made on the Dutchman, but the decision stood and Daniele De Rossi stepped up to roll a cheeky low shot inside Thomas Strakosha's near post to level on the stroke of half-time.
But Lazio resumed in positive fashion, Balde breaking down the left to cut back for Parolo, before he was dispossessed.
And although Dzeko flashed a drive off the post from Salah's smart delivery, Roma's defence stood back moments later at the other end to allow Dusan Basta a free shot on goal, and paid the price.
His effort deflected off a Roma defender before creeping past Szczesny and inside the near post.
Totti, who has enjoyed only a handful of cameo appearances this season, replaced De Rossi for the final 17 minutes.
On one of his first touches, the 40-year-old was dispossessed by Biglia, who set up Felipe Anderson for a counter that saw Szczesny thwart the Brazilian with his trailing leg.
But Lazio weren't to be denied. On another counter Senad Lulic was allowed to run half the length of the pitch before finding Balde with a precision pass inside the area for the striker to slot past Szczesny five minutes from the end.