World champion Peter Sagan outstayed his rivals to win a dramatic uphill sprint finish in Quimper on stage five of the Tour de France.
He made his move with 200m to go, beating Sonny Colbrelli and Philippe Gilbert for his second stage win.
Greg van Avermaet stayed in the yellow jersey, extending his overall lead with a two-second bonus during the stage.
He came seventh, behind Ireland's Dan Martin, while Chris Froome finished safely in the peloton.
In an impressive performance from Team Sky, Froome's team-mate Geraint Thomas came home 12th. The Welshman is fourth in the general classification, five seconds off Van Avermaet.
On a rolling, twisting 204km stage, which demanded technical skills throughout and canny tactics at the finish, Sagan's ability came to the fore.
The 28-year-old, who has represented his country in mountain biking at the Olympics, plotted his path to the finish superbly, overhauling Colbrelli in the final few metres.
Excluding Monday's team trial, Sagan has two second-placed finishes and two stage victories from the Tour's five race days so far.
He won five successive points classifications until 2016 before his run ended last year with disqualification following a crash involving Mark Cavendish.
With a 33-point lead over second-placed Colombian Fernando Gaviria and nearly 100 points over the rest of the field, he may well carry the green jersey all the way to Paris.
Thomas has only one Tour de France stage win to his name
Thomas claimed before the start of the Tour that Team Sky would permit him to compete as a contender for the overall title - rather than as support for four-time champion Froome - until at least Monday's first rest day.
The plan is apparently to review the situation from there.
So far the 32-year-old has done his best to ensure he is given longer to chase yellow for himself.
His current contract with Sky expires at the end of 2018.
And, although he is rumoured to be close to a renewal, a strong showing as a lead rider, combined with his recent win in the Criterium du Dauphine, would only strengthen his hand in negotiations with them or other teams.
Team Sky boss Dave Brailsford says the behaviour of some fans at the roadside in France is bordering on "pantomime".
And it is his riders who have been cast as the villains, with some fans protesting against Sky and lead rider Froome after an anti-doping case against the four-time Tour winner was recently dropped by cycling chiefs.
"To a large extent it feels like a pantomime, but as the guy responsible for all the riders and our staff I still have to take it very seriously," Brailsford said.
"I know how much work the race organisers have put into security, but some of the fans are behaving the way they are because what they believe is a long way from the truth."
He was speaking after Sky's Luke Rowe had earlier snatched a protester's banner which read: "Sky - Go home."
The protester, local resident Didier Bregardes, told reporters he was unhappy with the way Sky had handled the doping allegations.
Rowe, though, played down the altercation, saying it was "light-hearted and no big deal" and that he had been laughing and joking with the man.
"Does this pantomime have a darker side to it? That's a fair comment because a lot of people who chuckle and join in, but there are definitely people out there for whom this is not pantomime in the humorous context," Brailsford added.
It came on the day the World Anti-Doping Agency issued a statement about the Froome case to "clarify elements that have been subject to much speculation and misinformation".
1. Peter Sagan (Svk/Bora-Hansgrohe) 4hrs 48mins 6sec
2. Sonny Colbrelli (Ita/Bahrain - Merida) same time
3. Philippe Gilbert (Bel/Quick-Step Floors)
4. Alejandro Valverde (Spa/Movistar)
5. Julian Alaphilippe (Fra/Quick-Step Floors)
6. Daniel Martin (Ire/UAE Team Emirates)
7. Greg Van Avermaet (Bel/BMC Racing)
8. Soren Kragh (Den/Sunweb)
9. Andrea Pasqualon (Ita/Wanty - Groupe Gobert)
10. Vincenzo Nibali (Ita/Bahrain - Merida)
General classification after stage five
1. Greg van Avermaet (Bel/BMC Racing) 13hrs 33mins 56secs
2. Tejay van Garderen (US/BMC Racing) +2 secs
3. Philippe Gilbert (Bel/Quick-Step Floors) +3secs
4. Geraint Thomas (GB/Team Sky) +5secs
5. Julian Alaphilippe (Fra/Quick-Step Floors) +6secs
6. Bob Jungels (Lux/Quick-Step Floors) +9secs
7. Tom Dumoulin (Ned/Sunweb) +13secs
8. Soren Kragh Andersen (Den/Sunweb) same time
9. Rigoberto Uran (Col/EF Education First) +37secs
10. Rafal Majka (Pol/Bora - Hansgrohe) +52secs
15. Chris Froome (GB/Team Sky) +57secs
16. Adam Yates (GB/Mitchelton-Scott) +1min 2secs