Grigor Dimitrov came from a set down to beat Jack Sock 4-6 6-0 6-3 and reach the decider of the ATP Finals.
The Bulgarian, ranked three places above world number nine Sock, gave up a 3-1 lead to lose the first set to the American, who surprisingly won the Paris Masters during a resurgent end to 2017.
But, after edging in front during a tight third set, it is Dimitrov who will contest the final against David Goffin.
The Belgian shocked heavy favourite Roger Federer in Saturday's first semi-final at the O2 Arena.
Both Dimitrov and Goffin will now feature in the final match of the ATP Tour calendar in London for the first time in their careers.
Dimitrov took charge of proceedings early on, playing a brilliant point by coming in on Sock's backhand, pushing his opponent out of position and then volleying into open court to earn the first break.
Sock saved a break point before holding with an ace down the T to get to 3-1 and then broke back when Dimitrov netted a rally ball.
And the momentum then swung as Sock moved through the gears, holding with newfound ease and drawing a long forehand error to see Dimitrov broken again in the ninth game.
The American brought up two set points and took the first of them when Dimitrov dragged an attempted backhand return from a second serve into the net.
The resilience that allowed Sock to come from behind and win the first set was nowhere to be seen in the second.
Dimitrov held confidently and then broke when Sock mishit a rally ball. He sent another careless forehand long two games later to give up a double break.
Sock came to the net and threw in some sliced drop shots during a rushed final service game in the second set, but then netted successive rally balls to gift Dimitrov an unexpected bagel.
It soon became apparent that Dimitrov would not have the third set all his own way, though, as Sock composed himself and began to attack his opponent's awkward slice with heavier forehands.
And the set duly stayed on serve until the eighth game, when an unfortunate net cord for Sock was followed by two double faults in quick succession that offered Dimitrov two chances to break.
The Bulgarian took the second of them with an inch-perfect forehand down the line to serve for a place in the final, which he secured with his fourth match point.
Dimitrov  bt Sock  4-6 6-0 6-3
Dimitrov – 25/33
Sock – 20/37
Sock – 3/5
BREAK POINTS WON
Dimitrov - 5/8
FIRST SERVE PERCENTAGE
Dimitrov – 64
Sock – 62
PERCENTAGE OF POINTS WON ON FIRST/SECOND SERVE
Dimitrov – 68/52
Sock – 62/45
Dimitrov - 91
Sock – 77
|Goffin hopeful of ´fast recovery´ after nasty eye injury|
|Aguero lashes out at fan as tempers flare after Wigan stun Man City|
|Grigg revels in dousing Manchester City´s fire|
|Dzumhur saves four match points to down Kukushkin|
|Wigan Athletic 1 Manchester City 0: Grigg ends Guardiola´s quadruple dream|
|Edinburgh to finish season at Murrayfield|
|Messi the best but don´t forget Suarez, says Chelsea boss Conte|
|I need a great game – Hazard aiming for Messi heights|
|AFC Champions League Review: El-Arabi´s brace seals Al Wahda´s fate|
|Dubai disappointment for Radwanska|
|Patriots knew Butler would be benched, says McCourty|
|Barcelona boss Valverde tells Chelsea: History counts|
|Schmidt departs as Wolfsburg face relegation fight|
|Madrid, Barca & PSG are Champions League favourites, says Heynckes|
|I was at rock bottom – Brook opens up on depression battle|
|Rashid in form as Afghanistan rout sorry Zimbabwe|
|Toulon president charged over Bastareaud comments|
|Biggar, Halfpenny and Faletau all fit as Wales given clean bill of health|
|Hughes availability ´absolutely huge´ for England, says Alphonsi|
|Former football coach Bennell sentenced to 31 years|
|Why didn´t Jimmy Butler play in NBA All-Star Game?|
|Returning Ringrose added to Ireland Six Nations squad|
|Hummels wary of ´top European team´ as Bayern prepare for Besiktas|
|In-form Kvitova withdraws from Dubai|
|WATCH: ´Crazy´ Evra drives to West Ham training in London cab|
|Barca clash a chance for Chelsea ´to do things right´, proclaims Rudiger|
|Lucas claims Tottenham can win Champions League|
|Federer the ´complete player´ with number-one return - Schuettler|
|LeBron relishes one more link-up with Irving|
|Barcelona tie will not decide Conte´s Chelsea future, says Deco|
|Cordner signs bumper deal with Roosters|
|Lewandowski won´t be distracted by Real Madrid rumours|
|Bennett signs on until 2019 with England|
|Man Utd must not underestimate Sevilla - Navas|
|Coleman demolishes 20-year-old 60m world record|
|Red Bull reveal ´special edition´ livery on 2018 car|
|Iniesta will not be made welcome at Stamford Bridge, warns Azpilicueta|
|Ballack sees ´a big difference´ between Bundesliga and Premier League|
|Karmichael Hunt faces no conviction, but will remain sidelined|
|Betis boss would have preferred to face Madrid´s BBC|
|Chelsea v Barcelona: Messi´s blues against the Blues|
|James leaving Madrid was the best thing, says father|
|He´s looking good – Zidane thrilled with Ronaldo|
|It needs to take 30 seconds – Matic wants quicker VAR|
|Team LeBron edges Team Stephen in thrilling All-Star Game|
|McIlroy sees progress despite failing to contend at Riviera|
|Silver supports NBA players speaking out on social issues|
|Mickelson ready for Masters after third straight top-six finish|
|Gattuso: My job is to be the players´ nightmare until season´s end|
|I wasn´t good enough – Guardiola reveals Wigan rejection|
|Dillon reigns supreme with overtime win at Daytona 500|
|Bubba Watson ends drought with third Genesis Open title|
|Brazilian derby between Vitoria and Bahia abandoned after red-card frenzy|
|Anderson ends barren spell with New York Open triumph|
|It was crazy, but I like that - Zidane revels in eight-goal Betis thriller|
|Asensio credits Zidane for Madrid´s thrilling Betis comeback|
|Zidane hopeful over Marcelo hamstring injury|
|Overton replaces injured Plunkett for Blacks Caps ODI series|
|Bonaventura claims Milan can catch Inter|
|Bravo for Claudio! Guardiola to pick keeper at Wembley|
|Mourinho hoping for reinforcements at Sevilla|
|´Quick-healer´ Groves hopeful over shoulder injury|
|Real Madrid become first side to score 6,000 goals in LaLiga|
|Real Betis 3 Real Madrid 5: Asensio at the double in LaLiga classic|
|AC Milan 1 Sampdoria 0: Bonaventura makes it 10 unbeaten for Rossoneri|
|Schurrle excited to finally link up with Reus and Gotze|
|Fit-again Hughes included in England squad|
|New number one Federer revels in ´unbelievable´ week|
|Real Madrid defender Marcelo suffers hamstring injury|
|Costa fumes referees ´want to give me a card´, but Simeone plays down penalty row|