Alexandr Foliforov (Gazprom-Rusvelo) won the 10.85km uphill time trial from Castelrotto to Alpe di Siusi by fractions of a second over race leader Steven Kruijswijk (LottoNL-Jumbo).
Alejandro Valverde (Movistar) overcame Stage 14's disappointing performance by powering to third as Vincenzo Nibali (Astana) suffered a heartbreaking mechanical.
"This is unbelievable. It's like a dream to win this stage. I came to the Giro well prepared for this stage in particular because uphill time trials have always been my forte," Foliforov said.
"I did my best but I didn't expect to win. However, this is not going to be my last victory," Foliforov said.
“I was very nervous during the last minute of the race as I was watching TV. I thought Kruijswijk was going to win," he added later. "
I still cannot believe that I’ve won a stage of the Giro d’Italia! Today’s victory is very important for the team, our sponsors and me, bearing in mind that we’re a wildcard team. It shows that we can fight and win stages."
Kruijswijk looked comfortable, his riding style controlled and seemingly matchless.
"For me it’s an historic day. I lost the stage by almost nothing but I gained more time that I could have hoped for on my rivals," Kruijswijk said.
"I never expected to be in the lead at the end of the weekend before the last week. I’m in my best shape ever.
"As it was a 30-minute time trial, I had to start fast in order to not lose time at the beginning, then I found my rhythm, although the last two kilometers were very hard.
"I haven’t won the Giro yet but I hope to defend the Maglia Rosa till the end. I’ve got faith in my team, although Chaves, Nibali and Valverde are equally dangerous. I don’t know the coming mountain stages with precision but the last two will be very demanding because of the altitude."
Nibali first encountered obstructive fans then moments later his chain slipped and derailleur snapped.
Esteban Chaves (Orica-GreenEDGE) looked to struggle on the flatter parts of the course but paced himself to a solid sixth place finish and moved into second on the overall classification.
Kruijswijk now enjoys a two minute and 12 second cushion to nearest rival Chaves.