Jos Buttler celebrated his 28th birthday with an innings of 89 that left England on top in the fifth Test against India at the Oval on Saturday.
England, who had already won this five-match series at 3-1 up, started the second day in danger of being dismissed for under 200 at 198 for seven.
Yet when Buttler was last man out they had made a total of 332.
At stumps, India were struggling at 174 for six - a deficit of 158 runs -- with captain and star batsman Virat Kohli falling to Ben Stokes for 49.
Test debutant Hanuma Vihari was 25 not out and Ravindra Jadeja unbeaten on eight.
England spearhead James Anderson's figures of two for 20 in 11 overs left him just two shy of Australia great Glenn McGrath's record of 563 Test wickets -- the most taken by any fast bowler.
Buttler and Stuart Broad (38) frustrated India with a ninth-wicket stand of 98 as, yet again this series, England bounced back after a top-order collapse.
This was the fourth time in five innings that Buttler, recalled to Test duty earlier this season by new national selector Ed Smith, had been England's top scorer.
"We spoke about (adding) fifty runs, that's what we were targeting but I thought the guys worked really well in partnerships," said Buttler.
Alastair Cook, in his final Test appearance before international retirement, made 71 on Friday.
But his dismissal sparked a slump that saw England lose six wickets for 48 runs.
Buttler, who had been given out lbw to Mohammed Shami on eight on Friday only for a review to reveal an inside edge, was 11 not out overnight, with Adil Rashid unbeaten on four.
Rashid was soon lbw for 15 to fast bowler Jasprit Bumrah on an overcast morning.
Broad was then peppered with several short-pitched deliveries but hung in to play some good shots before Buttler went to fifty in 84 balls, with England scoring 106 runs in the morning session.
Broad eventually fell when a skied drive off left-arm spinner Jadeja was well caught over his shoulder by a diving KL Rahul, running back from mid-on.
Buttler, now with only last man Anderson for company, hit two sixes in three balls off Bumrah -- a drive over long-on and a hook over long leg.
But looking for a single to keep the strike, he fell short of what would have been his second Test hundred when he guided Jadeja to Ajinkya Rahane at slip.
Jadeja, playing his first match of the series, finished with fine figures of four for 79 in 30 overs.
Broad struck with his first ball Saturday to have Shikhar Dhawan lbw.
India were 70 for two when a trimmer from Sam Curran bowled Rahul for 37, and Anderson thought he had Kohli lbw for 16.
But an original not out decision by umpire Kumar Dharmasena was upheld on review after replays showed Kohli was struck outside the line of off stump.
The end of the over saw Anderson speak to Dharmasena, prompting the Sri Lankan to summon England captain Joe Root in a move that could yet prompt action by match referee Andy Pycroft.
Anderson has yet to dismiss Kohli this series but their duels have been a memorable feature of the campaign.
"It's obviously fantastic Test cricket," said Buttler.
"Virat's one of the best players in the world, if not the best at the minute and Jimmy's England's greatest-ever bowler so as a match-up for players and fans alike it's awesome to watch.
"I think the two of them are immensely competitive and have had a great duel all through this series," added Buttler, who explained Anderson's flare-up as "probably a couple of words and that's about it".
Anderson was soon in a better mood, the 36-year-old striking twice in seven balls to leave India 103 for four.
He had Cheteshwar Pujara, dropped by Cook at short leg off Moeen Ali on 10, caught behind for 37 before removing Rahane for a duck when Cook held a routine first-slip catch.
Vihari survived two close lbw calls against Broad on nought before hooking Stokes for six.
Kohli, the leading run-scorer in the series, was in sight of reaching fifty for the sixth time in five Tests, when he edged a drive on the up off Stokes to Root at second slip.
And India were then 160 for six when Rishabh Pant nicked Stokes to Cook.