L'Alpe d'Huez - Chris Froome all but sewed up his second Tour de France victory after holding off a stirring fightback by Nairo Quintana on Alpe d'Huez on Saturday.
Frenchman Thibaut Pinot salvaged something from his disappointing Tour with victory on the 20th stage but it was the battle between Froome and Quintana that really mattered.
Quintana finished second, 18sec behind Pinot, but Froome, who started the day with a 2min 38sec buffer, dug in to finish the stage fifth, just 1min 20sec behind Quintana.
The Colombian took six bonus seconds on the line but that still left him 1min 12sec short of overhauling Froome.
That was less than the minute-and-a-half Quintana had given up to Froome almost three weeks ago on the second stage when he was caught behind a crash in crosswinds.
Just as in 2013, Froome, 30, has fought off an Alpine comeback from Quintana to beat the 25-year-old Movistar leader to Tour success.
The final battle took place on the 13.8km climb to the finish at Alpe d'Huez at the end of a 110.5km stage from Modane.
Sunday's final stage to Paris is nothing more than a procession and barring an unlikely crash, Froome will be crowned Tour champion.
But Quintana, who was 3min 10sec behind following Thursday's 18th stage, did not lie down lightly.
He had already attacked on the hors category Col de la Croix de Fer some 60km from the finish and briefly had Froome in trouble before a small lead peloton regrouped on the descent off that mountain.
But right from the foot of the climb to Alpe d'Huez Quintana launched the first of four attacks.
Froome's Sky team-mate Wouter Poels chased down the Colombian the first three times, but the fourth, Quintana got away.
From there it was a race against time as Quintana tried to hunt down Pinot for the stage win, while also aiming to claw back his deficit to Froome for overall success.
By the end, though, Quintana had come up short on both counts.
Results from the 20th stage of the Tour de France, a 110.5km ride from Modane to L'Alpe-d'Huez, on Saturday:
1. Thibaut Pinot (FRA/FDJ) 3hr 17min 21sec
2. Nairo Quintana (COL/MOV) at 0:18.
3. Ryder Hesjedal (CAN/CAN) 0:41.
4. Alejandro Valverde (ESP/MOV) 1:38.
5. Chris Froome (GBR/SKY) 1:38.
6. Pierre Rolland (FRA/EUC) 1:41.
7. Richie Porte (AUS/SKY) 2:11.
8. Winner Anacona (COL/MOV) 2:32.
9. Wout Poels (NED/SKY) 2:50.
10. Rubn Plaza (ESP/LAM) 2:50.
11. Simon Yates (GBR/ORI) 3:06.
12. Joaquin Rodriguez (ESP/KAT) 3:12.
13. Bob Jungels (LUX/TRE) 3:26.
14. Bauke Mollema (NED/TRE) 3:30.
15. Vincenzo Nibali (ITA/AST) 3:30.
16. Alberto Contador (ESP/TIN) 3:30.
17. Rafal Majka (POL/TIN) 3:30.
18. Romain Bardet (FRA/ALM) 3:30.
19. Steven Kruijswijk (NED/LNL) 3:30.
20. Robert Gesink (NED/LNL) 3:30.
21. Alexis Vuillermoz (FRA/ALM) 4:16.
22. Adam Yates (GBR/ORI) 4:27.
23. Mathias Frank (SUI/IAM) 4:38.
24. Nicolas Edet (FRA/COF) 4:53.
25. Alexandre Geniez (FRA/FDJ) 4:56.
26. Samuel Sanchez (ESP/BMC) 5:01.
27. Andrew Talansky (USA/CAN) 5:19.
28. Daniel Martin (IRL/CAN) 5:30.
29. Pierrick Fedrigo (FRA/BSE) 5:53.
30. Thomas De Gendt (BEL/LOT) 5:53.
31. Jan Bakelants (BEL/ALM) 5:53.
32. Stephen Cummings (GBR/MTN) 5:53.
33. Serge Pauwels (BEL/MTN) 5:53.
34. Warren Barguil (FRA/GIA) 5:53.
35. Geraint Thomas (GBR/SKY) 5:53.
36. Lars Ytting Bak (DEN/LOT) 6:26.
37. Roman Kreuziger (CZE/TIN) 6:40.
38. Nicolas Roche (IRL/SKY) 6:43.
39. Christophe Riblon (FRA/ALM) 7:12.
40. Mickal Cherel (FRA/ALM) 7:12.
41. Jos Serpa Perez (COL/LAM) 8:04.
42. Rafael Valls (ESP/LAM) 8:04.
43. Nlson Oliveira (POR/LAM) 8:04.
44. Daniel Teklehaymanot (ERI/MTN) 8:09.
45. Jonathan Castroviejo (ESP/MOV) 8:09.
46. Luis ngel Mat (ESP/COF) 8:09.
47. Marcel Wyss (SUI/IAM) 8:40.
48. Daniel Navarro (ESP/COF) 8:45.
49. Giampaolo Caruso (ITA/KAT) 8:45.
50. Jan Brta (CZE/BOA) 8:45.
51. Michele Scarponi (ITA/AST) 8:55.
52. Thomas Voeckler (FRA/EUC) 9:17.
53. Romain Sicard (FRA/EUC) 9:32.
54. Tanel Kangert (EST/AST) 10:36.
55. Sylvain Chavanel (FRA/IAM) 11:04.
56. Jarlinson Pantano (COL/IAM) 11:04.
57. Tiago Machado (POR/KAT) 11:27.
58. Alberto Losada (ESP/KAT) 11:27.
59. Jakob Diemer Fuglsang (DEN/AST) 12:13.
60. Stef Clement (NED/IAM) 12:26.
61. Pieter Weening (NED/ORI) 12:26.
62. Simon Geschke (GER/GIA) 13:22.
63. Reto Hollenstein (SUI/IAM) 13:30.
64. Perrig Quemeneur (FRA/EUC) 13:30.
65. Martin Elmiger (SUI/IAM) 13:50.
66. Jean-Christophe Peraud (FRA/ALM) 14:17.
67. Michael Rogers (AUS/TIN) 14:17.
68. Jos Mendes (POR/BOA) 14:40.
69. Matteo Bono (ITA/LAM) 14:49.
70. Danilo Wyss (SUI/BMC) 14:49.
71. Kristijan Durasek (CRO/LAM) 14:49.
72. Imanol Erviti (ESP/MOV) 14:49.
73. Ramunas Navardauskas (LTU/CAN) 15:05.
74. Julien Simon (FRA/COF) 15:10.
75. Merhawi Kudus (ERI/MTN) 17:36.
76. Stijn Devolder (BEL/TRE) 17:36.
77. Anthony Delaplace (FRA/BSE) 17:36.
78. Christophe Laporte (FRA/COF) 19:26.
79. Sep Vanmarcke (BEL/LNL) 19:26.
80. Rohan Dennis (AUS/BMC) 19:26.
81. Daniel Oss (ITA/BMC) 19:26.
82. Damiano Caruso (ITA/BMC) 19:26.
83. Tylan van Baarle (NED/CAN) 19:26.
84. Wilco Kelderman (NED/LNL) 19:26.
85. Adriano Malori (ITA/MOV) 19:26.
86. Albert Timmer (NED/GIA) 19:26.
87. Jos Herrada (ESP/MOV) 19:26.
88. Leopold Knig (CZE/SKY) 19:26.
89. Lieuwe Westra (NED/AST) 19:26.
90. Rigoberto Uran (COL/ETI) 19:26.
91. Jos van Emden (NED/LNL) 19:52.
92. Bram Tankink (NED/LNL) 19:59.
93. Roy Curvers (NED/GIA) 20:29.
94. Michael Schr (SUI/BMC) 20:29.
95. Koen de Kort (NED/GIA) 20:29.
96. Matteo Tosatto (ITA/TIN) 21:19.
97. Filippo Pozzato (ITA/LAM) 21:19.
98. Peter Sagan (SVK/TIN) 21:19.
99. Manuel Quinziato (ITA/BMC) 21:19.
100. Kristjan Koren (SLO/CAN) 21:19.
101. Dmitriy Gruzdev (KAZ/AST) 21:19.
102. Matthieu Ladagnous (FRA/FDJ) 21:19.
103. Jeremy Roy (FRA/FDJ) 21:19.
104. Benot Vaugrenard (FRA/FDJ) 21:19.
105. Bryan Coquard (FRA/EUC) 21:19.
106. Pierre-Luc Perichon (FRA/BSE) 21:19.
107. Gregory Rast (SUI/TRE) 21:19.
108. Emanuel Buchmann (GER/BOA) 21:19.
109. Luke Rowe (GBR/SKY) 21:19.
110. Haimar Zubeldia (ESP/TRE) 21:19.
111. Angelo Tulik (FRA/EUC) 21:19.
112. Georg Preidler (AUT/GIA) 21:19.
113. Bryan Naulleau (FRA/EUC) 21:19.
114. Cyril Gautier (FRA/EUC) 21:19.
115. Andriy Grivko (UKR/AST) 21:19.
116. Arnaud Gerard (FRA/BSE) 21:19.
117. Florian Vachon (FRA/BSE) 21:19.
118. Jacques Janse Van Rensburg (RSA/MTN) 21:19.
119. Edvald Boasson Hagen (NOR/MTN) 21:19.
120. Paul Voss (GER/BOA) 21:19.
121. Ian Stannard (GBR/SKY) 21:19.
122. Gorka Izagirre (ESP/MOV) 21:19.
123. Marco Haller (AUT/KAT) 21:19.
124. Adam Hansen (AUS/LOT) 21:19.
125. Frdric Brun (FRA/BSE) 21:19.
126. Davide Cimolai (ITA/LAM) 21:19.
127. Tony Gallopin (FRA/LOT) 21:19.
128. Yohann Gene (FRA/EUC) 21:19.
129. Damien Gaudin (FRA/ALM) 21:19.
130. Brice Feillu (FRA/BSE) 21:19.
131. Tim Wellens (BEL/LOT) 21:19.
132. Bartosz Huzarski (POL/BOA) 21:55.
133. Julian Arredondo (COL/TRE) 23:22.
134. Zdenek Stybar (CZE/ETI) 23:57.
135. Michael Matthews (AUS/ORI) 23:57.
136. Julien Vermote (BEL/ETI) 23:57.
137. Andr Greipel (GER/LOT) 23:57.
138. Florian Snchal (FRA/COF) 23:57.
139. Markel Irizar (ESP/TRE) 23:57.
140. Kenneth Vanbilsen (BEL/COF) 23:57.
141. Jens Debusschere (BEL/LOT) 23:57.
142. Sebastien Chavanel (FRA/FDJ) 23:57.
143. Reinardt Janse Van Rensburg (RSA/MTN) 23:57.
144. Marcel Sieberg (GER/LOT) 23:57.
145. Matteo Trentin (ITA/ETI) 23:57.
146. John Degenkolb (GER/GIA) 23:57.
147. Paul Martens (GER/LNL) 23:57.
148. Geoffrey Soupe (FRA/COF) 23:57.
149. Jacopo Guarnieri (ITA/KAT) 23:57.
150. Laurens ten Dam (NED/LNL) 23:57.
151. Armindo Fonseca (FRA/BSE) 23:57.
152. Michal Golas (POL/ETI) 23:57.
153. Tom Leezer (NED/LNL) 23:57.
154. Luke Durbridge (AUS/ORI) 23:57.
155. Svein Tuft (CAN/ORI) 23:57.
156. Mark Cavendish (GBR/ETI) 23:57.
157. Arnaud Dmare (FRA/FDJ) 23:57.
158. Tyler Farrar (USA/MTN) 23:57.
159. Alexander Kristoff (NOR/KAT) 23:57.
160. Matthias Brandle (AUT/IAM) 23:57.