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