Stand-in captain Lawrence Shankland scored his 16th goal of the season as Hearts secured their first away league win over St Johnstone in 12 years to move three points clear in third place in the cinch Premiership.
The striker wore the armband in the absence of injured goalkeeper Craig Gordon and opened the scoring with a penalty before further strikes from Alan Forrest and substitute Barrie McKay secured a 3-2 victory in Perth.
Saints boss Callum Davidson made two changes to the side that lost 4-1 at Celtic Park last Saturday as Ali Crawford and Adam Montgomery replaced Daniel Phillips and James Brown.
The Jambos made four alterations to the team that started the 2-2 draw at Dundee United on Christmas Eve as injured trio Gordon, Craig Halkett and Stephen Kingsley missed out while McKay dropped to the bench. Zander Clark, Toby Sibbick, Forrest and Jorge Grant all came in.
Hearts started strongly and almost went ahead early on when Grant hit a post from close range after Shankland’s shot had been parried into his path by goalkeeper Remi Matthews.
The visitors were dominant in the early period and deservedly went ahead after 14 minutes when Shankland fired home from the penalty spot after VAR deemed that Ryan McGowan had handled the ball while trying to block a Grant flick-on from Josh Ginnelly’s cross.
Saints suffered another blow in the 25th minute when Melker Hallberg was forced off through injury and replaced by Alex Mitchell.
The substitute had to make an important block on the half hour to deflect a Ginnelly shot from the edge of the box over the crossbar.
Hearts doubled their lead in the 33rd minute when Forrest was teed up by Andy Halliday and curled a lovely finish beyond Matthews from 15 yards.
Saints started to come to life and Stevie May fired over from the edge of the box after being fed by Drey Wright in the 35th minute.
Four minutes later, the hosts were given a chance to pull one back when they were awarded a penalty after VAR deemed that Cammy Devlin had handled, but Graham Carey blazed his spot-kick over.
Saints threatened again three minutes before the break when Crawford’s deflected shot almost caught out Clark as it looped up in the air and came down onto the keeper’s right-hand post.
The Perth men got themselves back in the game in the 55th minute when May tucked away a penalty after he was tugged in the box by Robert Snodgrass.
Hearts restored their two-goal advantage in the 64th minute when McKay – who had come on as a substitute just seconds earlier – produced a lovely piece of skill before firing a superb low strike beyond Matthews from 25 yards.
But Saints made the visitors sweat when substitute Jamie Murphy pulled another goal back with a superb strike from just inside the box in the 79th minute.