Jonny Bairstow fell five runs short of a maiden test century on Saturday before South Africa took their lead in the match to 139 at the end of day three of the third and final test against England at Lord's.
South Africa closed on 145 for three after England claimed the wickets of Proteas captain Graeme Smith (23) and fellow opener Alviro Petersen (24) after tea, and the key scalp of Jacques Kallis (31) late on.
Kallis showed dissent at his reviewed dismissal for the second time in the match. Hashim Amla was 57 not out and night-watchman Dale Steyn had yet to score.
Amla was dropped on two when he gloved Stuart Broad down the leg side, but although wicketkeeper Matt Prior managed to get a full glove on the ball, he couldn't hold on. The wicket of Kallis, though, would have buoyed England late on.
England, who must win the match to square the series and prevent South Africa leapfrogging them at the top of the world rankings, were dismissed for 315 shortly after lunch.
Bairstow made a fighting 95 and Graeme Swann added a vital 37 not out at the end to give England a modest first innings lead of six runs.
South Africa started their second innings cautiously, reaching 33 without loss at tea off 15 overs. But Swann struck not long after, when Smith attempted to sweep the off-spinner and was adjudged leg before after failing to make contact.
That was 46 for one, and it was soon to be 50 for two.
Petersen fell two balls after Amla was dropped, when Broad trapped him lbw. Like Smith, he chose not to review the dismissal and replays showed it to be the right decision, as the ball would have struck leg stump.
Kallis and Amla put on 81 and were solid for the most part, ominously so for England, who would have well remembered their third-wicket partnership of 377 at The Oval in the first test, when South Africa won by an innings and 12 runs.
But the duo was separated when Kallis was lbw to Steven Finn. Kallis instantly called for a review, giving the impression he had hit it, but hotspot and regular replays did not show evidence to support the batsman's protest. He walked off visibly annoyed and shaking his head.
Bairstow, in the England side for the omitted Kevin Pietersen, was bowled by Morne Morkel trying to drive through mid-on. It was a courageous effort by the 22-year-old after coming to the crease at 54 for four, and he received a warm standing ovation by the capacity crowd.
Bairstow's innings of just over five hours came to an end after mounting pressure took its toll. He failed to score from 15 balls off Morkel before he perished. His stand of 124 with Ian Bell the day before, though, kept England in the match.
Fast bowlers Morkel (four for 80) and Dale Steyn (four for 94) did most of the damage for the tourists.