St Johnstone twice came from behind to save a point against Hearts in a thrilling match that deserved to be seen by more than 3,000 fans.
Hearts took the lead through John Sutton's close-range header, but Rowan Vine forced in an immediate equaliser.
Andrew Driver restored the lead with a carbon copy of that back-post tap-in seven minutes from the break.
But Saints piled on the pressure and were worthy of Steven MacLean's equaliser, yet again from close range.
The result means St Johnstone stay ahead of the Edinburgh visitors in fifth place in the Scottish Premier League but have now only won once in their last nine games.
St Johnstone had gone into the game forced to field a makeshift defence in the absence of suspended trio Frazer Wright, Dave Mackay and Steven Anderson.
Dave McCracken passed himself fit to make an earlier-than-expected return to the side after a fractured cheekbone, but he and stand-in central defender Tam Scobbie were posted missing as Hearts took a deserved early lead.
Driver curled a free-kick to the back post, where Sutton rose from among the unmarked Hearts bodies to head in from five yards.
The lead did not last for long, however, as Saints exploited Hearts' own defensive deficiencies, with MacLean's low cross taking a deflection off Marius Zaliukas and Vine forcing his shot past goalkeeper Jamie MacDonald from close range at the back post.
Hearts forward Gordon Smith poked a snap-shot wide, while Saints also failed to make the best of a good opportunity.
Vine put Peter Pawlett clear behind the defence only for the midfielder to shoot straight at MacDonald on his return to Saints' starting line-up in place of dropped striker Gregory Tade.
Just as the home side were emerging as the dominant force, Hearts re-established their lead when Ryan McGowan's low cross was forced in by Driver at the back post.
Hearts midfielder Darren Barr was perhaps fortunate to escape with a yellow card for a spot of retaliation after a heavy challenge by former Falkirk team-mate Patrick Cregg just short of the break.
Whether because of an injury picked up in that incident, to save him from a possible red card, or the otherwise anonymity of his performance, Barr could not escape manager John McGlynn's half-time hook, Dylan McGowan his replacement.
Hearts ought to have extended their lead when Smith screwed his shot wide from in front of goal after a Sutton knock-down.
However, the second half was otherwise dominated by St Johnstone.
MacDonald saved well from Pawlett, with Callum Paterson blocking Liam Craig's attempt to score on the rebound.
From the corner, the otherwise hapless Kevin McHattie cleared Vine's overhead kick off the line.
Pressure finally told when MacLean turned in Murray Davidson's low cross at the back post.
It was the swiftly recovering Ryan McGowan's turn to clear off the Hearts line after Tade appeared to wrestle the ball out of goalkeeper MacDonald's grasp and MacLean deflected it towards the unguarded net.
However, Hearts survived to take a point their second-half display hardly merited.
Full Time The game is over, as the referee blows his whistle.
Andrew Driver sends in a cross, clearance made by Thomas Scobbie.
Gregory Tade concedes a free kick for a foul on Andy Webster. Jamie MacDonald takes the free kick.
Murray Davidson is penalised for handball and concedes a free kick. Indirect free kick taken by Marius Zaliukas.
Substitution (St Johnstone) makes a substitution, with Nigel Hasselbaink coming on for Rowan Vine.
Arvydas Novikovas sends in a cross, save by Alan Mannus.
Centre by Andrew Driver, John Sutton takes a shot. Save by Alan Mannus.
Substitution Arvydas Novikovas on for Callum Paterson.
Free kick awarded for a foul by Dale Carrick on Thomas Scobbie. Free kick taken by David McCracken.
Ryan McGowan sends in a cross, Header from deep inside the area by John Sutton goes harmlessly over the crossbar.
Jamie MacDonald takes the free kick.
Substitution Dale Carrick joins the action as a substitute, replacing Gordon Smith.
The official flags Gregory Tade offside.
Rowan Vine sends in a cross, Ryan Stevenson manages to make a clearance.
Gregory Tade takes a shot. Save made by Jamie MacDonald.
Ryan Stevenson crosses the ball, Gary Miller makes a clearance. Inswinging corner taken from the left by-line by Andrew Driver, Liam Craig makes a clearance.
Andy Webster takes the direct free kick.
Booking Murray Davidson shown a yellow card.
Unfair challenge on Dylan McGowan by Murray Davidson results in a free kick.
The ball is delivered by Gary Miller, Andy Webster makes a clearance.
Liam Craig takes the inswinging corner, Andy Webster manages to make a clearance. Inswinging corner taken by Liam Craig from the right by-line, Callum Paterson makes a clearance.
Substitution Gregory Tade on for Peter Pawlett.
The ball is swung over by Rowan Vine, Marius Zaliukas manages to make a clearance.
Murray Davidson produces a right-footed shot from the edge of the area and misses to the left of the target.
Kevin McHattie restarts play with the free kick.
Booking The referee shows Peter Pawlett a yellow card.
Foul by Peter Pawlett on Kevin McHattie, free kick awarded.
Gary Miller delivers the ball, Marius Zaliukas manages to make a clearance.
Murray Davidson concedes a free kick for a foul on John Sutton. Kevin McHattie restarts play with the free kick.
Assist on the goal came from Murray Davidson.
59:06 Goal scored
Goal - Steven MacLean - St J'stone 2 - 2 Hearts Goal scored by Steven MacLean from close range to the bottom left corner of the goal. St Johnstone 2-2 Hearts.
Free kick crossed left-footed by Liam Craig, clearance made by Marius Zaliukas.
Booking The referee books Ryan McGowan for unsporting behaviour.
Ryan McGowan challenges Liam Craig unfairly and gives away a free kick.
Unfair challenge on Andrew Driver by Steven MacLean results in a free kick. Andrew Driver takes the free kick.
Peter Pawlett takes a shot. Save by Jamie MacDonald. Corner taken left-footed by Liam Craig from the left by-line, Steven MacLean takes a shot. Kevin McHattie gets a block in.
The ball is swung over by Liam Craig, clearance by Kevin McHattie.
Callum Paterson takes a shot and went wide right of the target.
Booking The referee cautions Andrew Driver for dissent.
Free kick awarded for a foul by Ryan Stevenson on Patrick Cregg. Free kick taken by David McCracken.
Shot by Gordon Smith from deep inside the penalty area misses to the left of the goal.
The referee blows his whistle to start the second half.
Substitution (Hearts) makes a substitution, with Dylan McGowan coming on for Darren Barr.
45:00 +1:14 Half time
Half Time The half-time whistle blows.
Booking Darren Barr goes into the book.
Foul by David McCracken on Andrew Driver, free kick awarded. Free kick taken by Ryan Stevenson.
Corner taken by Liam Craig, Header from deep inside the penalty area by David McCracken goes harmlessly over the crossbar.
Marius Zaliukas gives away a free kick for an unfair challenge on Steven MacLean. Free kick crossed left-footed by Liam Craig from right wing, Ryan McGowan makes a clearance.
Free kick awarded for a foul by Callum Davidson on Callum Paterson. Free kick taken by Andy Webster.
John Sutton provided the assist for the goal.
37:38 Goal scored
Goal - Andrew Driver - St J'stone 1 - 2 Hearts A goal is scored by Andrew Driver from inside the six-yard box to the bottom left corner of the goal. St Johnstone 1-2 Hearts.
Unfair challenge on Gordon Smith by Thomas Scobbie results in a free kick. Free kick crossed left-footed by Andrew Driver, save by Alan Mannus.
Thomas Scobbie challenges Gordon Smith unfairly and gives away a free kick. Free kick crossed left-footed by Andrew Driver from right wing, save by Alan Mannus.
The ball is sent over by Gary Miller, save made by Jamie MacDonald.
The referee blows for offside. Free kick taken by Kevin McHattie.
Callum Paterson concedes a free kick for a foul on Patrick Cregg. David McCracken takes the direct free kick.
The offside flag is raised against Rowan Vine. Andy Webster takes the indirect free kick.
Peter Pawlett takes a shot. Save by Jamie MacDonald.
The ball is sent over by Gary Miller, clearance by Andy Webster.
Free kick awarded for an unfair challenge on Callum Davidson by Gordon Smith. Thomas Scobbie takes the free kick.
Corner from the right by-line taken by Liam Craig, Murray Davidson challenges Jamie MacDonald unfairly and gives away a free kick. Jamie MacDonald restarts play with the free kick.
Callum Paterson challenges Patrick Cregg unfairly and gives away a free kick. Gary Miller takes the free kick.
A cross is delivered by Gordon Smith, Patrick Cregg gets a block in. Inswinging corner taken left-footed by Andrew Driver from the left by-line.
Gordon Smith produces a right-footed shot from just outside the box that misses to the right of the goal.
John Sutton gives away a free kick for an unfair challenge on Callum Davidson. Free kick taken by Callum Davidson. Free kick awarded for a foul by Patrick Cregg on Ryan Stevenson. Ryan Stevenson restarts play with the free kick.
Gary Miller takes the direct free kick.
Booking Kevin McHattie shown a yellow card.
Free kick awarded for an unfair challenge on Patrick Cregg by Kevin McHattie.
Callum Paterson fouled by Callum Davidson, the ref awards a free kick. Andrew Driver takes the free kick.
Assist by Gary Miller.
15:04 Goal scored
Goal - Rowan Vine - St J'stone 1 - 1 Hearts Rowan Vine scores a goal from inside the area low into the middle of the goal. St Johnstone 1-1 Hearts.
Andrew Driver provided the assist for the goal.
14:02 Goal scored
Goal - John Sutton - St J'stone 0 - 1 Hearts John Sutton finds the net with a headed goal from inside the penalty box. St Johnstone 0-1 Hearts.
Unfair challenge on John Sutton by Patrick Cregg results in a free kick. Andrew Driver restarts play with the free kick,
Callum Paterson has shot on goal from just outside the penalty box which goes wide of the right-hand upright.
The assistant referee flags for offside against Steven MacLean. Jamie MacDonald restarts play with the free kick.
Gordon Smith takes a shot. Save by Alan Mannus.
Foul by Steven MacLean on Kevin McHattie, free kick awarded. Free kick taken by Marius Zaliukas.
Ryan McGowan has an effort at goal from outside the area which misses left.
Steven MacLean gives away a free kick for an unfair challenge on Andy Webster. Marius Zaliukas takes the free kick.
Free kick awarded for an unfair challenge on Andy Webster by Steven MacLean. Jamie MacDonald takes the free kick.
Liam Craig takes the inswinging corner, Andy Webster manages to make a clearance. Free kick awarded for a foul by John Sutton on Murray Davidson. Free kick taken by Patrick Cregg.
The game gets underway.
Live text and data provided by The Press Association
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.