Contador, himself a two-time winner of Paris-Nice, attacked with five kilometres remaining, and only Thomas and his Sky lieutenant, Sergio Henao, were initially able to follow, before Zakarin and Porte made it a lead quintet.
Porte then attacked as the leaders headed into the final kilometre, but the Australian wasn’t able to make his move stick, prompting Thomas to break clear. It looked like the Welshman had done enough to claim both the yellow jersey and the stage win, but Zakarin edged the two-time Olympic gold medalist on the line.
Contador finished a second back, with Porte seven seconds adrift and Henao ten seconds off the pace after his efforts setting up Thomas. British rider Adam Yates, riding for Orica-GreenEDGE, crossed the line in sixth to move up to eighth overall.
Thomas now has a 15 second advantage over Contador in the overall standings, with Zakarin 20 seconds back and Porte 21 seconds adrift. The final stage of Paris-Nice follows a 134km route which scales six climbs, finishing with a double header of two category one ascents: the Cote de Peille and the Col d’Eze, before the final descent into Nice.