Classy Francisco Sandaza set up Cillian Sheridan for a clinical double as St Johnstone eased to victory over a toothless Hearts side.
Ryan Stevenson failed to find the target with an early chance for Hearts, while Saints' Liam Craig forced a good save from Jamie MacDonald.
But Sandaza threaded the ball through for Sheridan to power in the opener on the half-hour mark.
And a Sandaza pass allowed Sheridan to round the keeper after 55 minutes.
Saints' first home win of the season puts them level with a fourth-placed Hearts side still looking for their first away since February.
Hearts manager Paulo Sergio made nine changes, with only Marius Zaliukas and Danny Grainger retaining their places after the shock midweek Scottish Communities League Cup defeat by Ayr United.
St Johnstone were also looking to bounce back from their exit at the hands of St Mirren, with David McCracken and Kevin Moon returned from injury and Willie Gibson joining them in the starting line-up in place Sean Higgins, Jamie Adams and the injured Frazer Wright.
Sheridan and Sandaza teamed up well for both goals at McDiarmid Park
The two sides traded blows early on, with Ryan Stevenson sending a snap shot over from 15 yards and Chris Millar looping a drive just wide at the other end.
Liam Craig forced MacDonald to parry a ferocious free-kick over the crossbar after Andy Webster had hauled back Francisco Sandaza 25 yards out.
Sandaza's presence was giving Saints a cutting edge that was absent in the Hearts line-up and it was the Spaniard who set up the opener in an otherwise even contest.
Gathering a ball from Dave MacKay, Sandaza threaded it quickly behind the visiting defence and Sheridan fired into the roof of the net from 16 yards.
Craig ought to have done better than send a low, bobbling drive wide of the far post from a similar range after being found unmarked by Sheridan.
Hearts were stuggling to create chances, but a free-kick allowed Danny Grainger the opportunity to whip the ball into the box that just evaded the diving Marius Zaliukas 10 yards out after the Lithuanian defender broke clear of his marker.
Stevenson headed into the side netting after St Johnstone goalkeeper Peter Enckelman failed to gather a corner.
Winger David Templeton came on at the break for Webster, although it was not clear whether the already-booked defender was withdrawn because manager Sergio feared a red card or because the player had picked up yet another injury complaint.
Hearts were probing the Saints defence to little effect when the home side went further ahead.
Sheridan won a header and, after Sandaza beat Jamie Hamill to the loose ball, the Spaniard played the ball into the path of his strike partner, who rounded goalkeeper MacDonald to score.
Enckelman spilled a long drive from Stevenson and, when the ball was played back into the Saints penalty box, the Hearts forward's flick on after a mis-hit Templeton effort was clawed off the line by the nervy looking goalkeeper.
However, Saints were by then on their way to a deserved win that stretches their unbeaten run to five games.
Full Time The game is over, as the referee blows his whistle.
Unfair challenge on Jamie Hamill by Alan Maybury results in a free kick. Daniel Grainger delivers the ball, Effort from 12 yards by Ryan Stevenson. Comfortable save by Peter Enckelman.
Handball decision goes against Gordon Smith. Peter Enckelman takes the direct free kick.
The offside flag is raised against Scott Robinson. Peter Enckelman takes the indirect free kick.
Alan Maybury gives away a free kick for an unfair challenge on Mehdi Taouil. Mehdi Taouil restarts play with the free kick.
Daniel Grainger produces a cross, David McCracken makes a clearance.
Direct free kick taken by Peter Enckelman.
Booking Ian Black receives a yellow card for unsporting behaviour.
Free kick awarded for a foul by Ian Black on David Robertson.
Substitution Marcus Haber comes on in place of Francisco Sandaza.
The free kick is delivered right-footed by Jamie Hamill from left wing, save made by Peter Enckelman.
Booking The referee cautions David MacKay for unsporting behaviour.
David MacKay concedes a free kick for a foul on Daniel Grainger.
A cross is delivered by David Templeton.
Liam Craig challenges Mehdi Taouil unfairly and gives away a free kick. Jamie Hamill takes the free kick.
David Robertson challenges Ian Black unfairly and gives away a free kick. Ian Black takes the free kick.
A cross is delivered by Chris Millar, save by Jamie MacDonald.
Daniel Grainger fouled by David MacKay, the ref awards a free kick. Jamie Hamill crosses the ball from the free kick right-footed from left wing, save made by Peter Enckelman.
Ryan Stevenson takes a shot. Peter Enckelman makes a comfortable save.
Shot from 30 yards from Jamie Hamill. Save made by Peter Enckelman.
Peter Enckelman restarts play with the free kick.
Substitution David Robertson comes on in place of William Gibson.
Booking Mehdi Taouil receives a caution.
Mehdi Taouil challenges Francisco Sandaza unfairly and gives away a free kick.
Substitution Scott Robinson is brought on as a substitute for Stephen Elliott.
David McCracken concedes a free kick for a foul on Marius Zaliukas. Jamie MacDonald restarts play with the free kick.
Outswinging corner taken by Liam Craig.
Free kick crossed by William Gibson, Daniel Grainger makes a clearance.
Booking Marius Zaliukas receives a yellow card for unsporting behaviour.
Marius Zaliukas challenges William Gibson unfairly and gives away a free kick.
The ball is sent over by Jamie Hamill, save by Peter Enckelman.
Foul by Adrian Mrowiec on Francisco Sandaza, free kick awarded. Liam Craig takes the direct free kick.
Marius Zaliukas takes the free kick.
Booking Booking for Chris Millar.
Free kick awarded for an unfair challenge on Ian Black by Chris Millar.
Substitution David Obua goes off and Gordon Smith comes on.
Mehdi Taouil produces a right-footed shot from just outside the box that goes wide right of the target.
Ryan Stevenson takes the chance to get an effort at goal. Blocked by Stephen Elliott.
Ian Black gives away a free kick for an unfair challenge on Kevin Moon. Liam Craig restarts play with the free kick.
Assist on the goal came from Francisco Sandaza.
54:54 Goal scored
Goal! - Cillian Sheridan - St J'stone 2 - 0 Hearts Cillian Sheridan scores a goal from inside the six-yard box low into the middle of the goal. St Johnstone 2-0 Hearts.
Corner from right by-line taken by Daniel Grainger.
A cross is delivered by Jamie Hamill, David McCracken makes a clearance.
The ball is delivered by Jamie Hamill, Francisco Sandaza makes a clearance.
Short corner worked by Jamie Hamill.
Free kick awarded for a foul by Stephen Elliott on Alan Maybury. Peter Enckelman takes the direct free kick.
Cillian Sheridan produces a left-footed shot from just outside the box that goes wide left of the goal.
Free kick awarded for an unfair challenge on Chris Millar by Mehdi Taouil. Steven Anderson takes the free kick.
The second half kicks off.
Substitution David Templeton is brought on as a substitute for Andy Webster.
45:00 +1:12 Half time
Half Time The first half comes to an end.
Free kick awarded for an unfair challenge on Ryan Stevenson by Liam Craig. Free kick taken by Jamie Hamill.
Inswinging corner taken left-footed by Daniel Grainger, Headed effort from deep inside the area by Ryan Stevenson misses to the left of the goal.
David Obua fouled by Francisco Sandaza, the ref awards a free kick. Jamie MacDonald takes the free kick.
Corner taken by Liam Craig, clearance by Marius Zaliukas.
Chris Millar challenges David Obua unfairly and gives away a free kick. Free kick crossed left-footed by Daniel Grainger, save made by Peter Enckelman.
Effort from inside the area by Liam Craig misses to the left of the target.
Jamie Hamill takes the free kick.
Booking The referee cautions Steven Anderson for unsporting behaviour.
Free kick awarded for a foul by Steven Anderson on Mehdi Taouil.
Assist by Francisco Sandaza.
29:30 Goal scored
Goal! - Cillian Sheridan - St J'stone 1 - 0 Hearts A goal is scored by Cillian Sheridan from just inside the penalty area to the top right corner of the goal. St Johnstone 1-0 Hearts.
William Gibson produces a cross.
Outswinging corner taken by William Gibson from the right by-line, Ryan Stevenson manages to make a clearance.
Outswinging corner taken by Liam Craig from the left by-line, clearance by Marius Zaliukas.
Free kick awarded for a foul by Alan Maybury on Ian Black. Daniel Grainger delivers the ball from the free kick left-footed from right wing, David McCracken fouled by Andy Webster, the ref awards a free kick. Peter Enckelman takes the direct free kick.
Liam Craig concedes a free kick for a foul on Adrian Mrowiec. Direct free kick taken by Mehdi Taouil.
Unfair challenge on Ryan Stevenson by David McCracken results in a free kick. Direct free kick taken by Ryan Stevenson.
Jamie Hamill crosses the ball, David MacKay manages to make a clearance.
Daniel Grainger takes the inswinging corner, Liam Craig makes a clearance.
The ball is swung over by Stephen Elliott, David McCracken manages to make a clearance.
William Gibson takes the inswinging corner, clearance made by Andy Webster.
Liam Craig has an effort at goal from 20 yards. Save made by Jamie MacDonald.
Free kick taken by Kevin Moon.
Booking Andy Webster receives a caution.
Andy Webster gives away a free kick for an unfair challenge on Cillian Sheridan.
Mehdi Taouil concedes a free kick for a foul on Chris Millar. Liam Craig restarts play with the free kick.
Chris Millar gives away a free kick for an unfair challenge on Mehdi Taouil. Direct free kick taken by Jamie Hamill.
Chris Millar takes a shot from a long way out clearing the bar.
The ball is swung over by William Gibson, Andy Webster manages to make a clearance.
Shot from just outside the box by Ryan Stevenson goes over the bar.
The ball is delivered by Jamie Hamill.
Inswinging corner taken by Jamie Hamill from the left by-line.
The offside flag is raised against Cillian Sheridan. Andy Webster takes the free kick.
The official flags Stephen Elliott offside. Free kick taken by Peter Enckelman.
Foul by Chris Millar on Mehdi Taouil, free kick awarded. Direct free kick taken by Mehdi Taouil.
Ryan Stevenson produces a cross, clearance made by Steven Anderson.
This page is best viewed in an up-to-date web browser with style sheets (CSS) enabled. While you will be able to view the content of this page in your current browser, you will not be able to get the full visual experience. Please consider upgrading your browser software or enabling style sheets (CSS) if you are able to do so.