Cheteshwar Pujara's painstaking and brave century gave India a narrow lead on the second day of the fourth Test after England off-spinner Moeen Ali took five wickets at Southampton on Friday.
Pujara's near six-hour 132 not out was the cornerstone of India's 273, made in reply to England's first-innings 246.
Ali took five wickets for 63 runs in 16 overs — his second successive five-wicket innings haul in a Test against India at Southampton following a return of six for 67 in 2014.
Alastair Cook and Keaton Jennings batted out four overs as England reached stumps on six without loss in their second innings — a deficit of 21 runs.
"At one stage they were 140 for two going well, and so to bowl them out just 20-odd runs ahead is fantastic" Ali told Sky Sports. "I have nice memories from the last Test I played here which helps as well."
Pujara was on 78 when Ali struck twice in two balls to leave India, 2-1 down in the five-match series after their 203-run win at Trent Bridge last week, on 195 for eight.
Ishant Sharma survived the hat-trick at the start of Ali's next over before he too fell to the all-rounder. Pujara, now on 96, now had only No 11 Jasprit Bumrah for company.
But a swept two off Ali took him to 99 and he then survived the bowler's review for lbw after third umpire Joel Wilson ruled he had been playing a shot.
India number three Pujara, with the field up, lofted Ali down the ground to complete a deserved century, his 15th in Tests, off 210 balls including 11 fours.
It was the kind of patient century seemingly beyond many members of an England top order for whom batting collapses have become a matter of routine. Pujara fielded, but did not attend the post-match press conferences.
India-born former England captain Nasser Hussain, commentating on Sky, praised Pujara's innings by saying: "Here is a lad who has gutsed it out, played in a good old-fashioned determined way."
Bumrah hung around so long that England took the new ball. Pujara's response was to launch Stuart Broad for four over midwicket and next ball drive him through the covers for another boundary.
Broad eventually had Bumrah, who batted over an hour for six, caught by Cook at first slip. India resumed Friday on 19 without loss.
James Anderson, England's all-time leading Test wicket-taker, needed six more wickets to equal retired Australia great Glenn McGrath's mark of 563 — the most taken by any fast bowler at this level.
Anderson, however, went wicketless in an innings return of none for 50 in 18 overs. Instead it was longtime new-ball partner Broad who removed openers KL Rahul and Shikhar Dhawan to leave India 50 for two.
Pujara and India captain Virat Kohli (46) rebuilt the innings with a third-wicket stand of 92.
But after lunch, Sam Curran, who had already marked his return to the team with a Test-best 78 that rescued England from the depths of 86 for six on Thursday, dismissed Kohli, who during his innings passed 6,000 runs in Tests.
The 20-year-old Surrey left-arm swing bowler angled a delivery across star batsman Kohli who, in a rare error, pushed away from his body and saw the ensuing edge well caught low at first slip by Cook.
Curran was unlucky to make way for the returning Ben Stokes at Trent Bridge.
A minor recurrence of all-rounder Stokes's knee injury led to doubts over his ability to bowl at Southampton and a fresh rejig of England's team.
But the paceman's first legitimate delivery on Friday saw Pujara, on 50, edge just beyond Buttler's grasp.
Stokes had better luck when a desperately close call for a no-ball went his way after he had Ajiknya Rahane lbw for 11.
Pujara suffered a painful blow when he missed an intended hook off Stokes, with the batsman needing several minutes of on-field treatment as medical staff checked for concussion.
Ali removed Rishabh Pant and Hardik Pandya either side of tea.
Ravichandran Ashwin then inexplicably tried to reverse sweep his opposing off-spinner and played on, before Ali's next ball clean-bowled Mohammed Shami.