Cheteshwar Pujara's painstaking 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.
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.
That left Pujara, now on 96, with 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.
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, took the prize wicket of Kohli, who in the course of his innings reached 6,000 runs in Test cricket.
The 20-year-old Surrey left-arm swing bowler angled a delivery across the star batsman who, in a rare error, pushed out away from his body and saw the ensuing edge well caught low at first slip by Cook.
Soon afterwards, Pujara completed a 100-ball fifty.
Curran was unlucky to make way for the returning Ben Stokes at Trent Bridge.
All-rounder Stokes arrived at Southampton nursing a knee injury that led to doubts over his ability to bowl and a fresh rejig of England's team.
But the paceman's first legitimate delivery on Friday saw Pujara on 50, just edge beyond Buttler -- keeping wicket in place of Jonny Bairstow after deputising in Nottingham when his fellow gloveman broke a finger while behind the stumps.
Stokes had Ajinkya Rahane (five) dropped at second slip by diving England captain Joe Root before having the same batsman lbw for 11, although he was fortunate a desperately tight review saw Wilson decide he had not bowled a no-ball.
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.
Meanwhile the often aggressive Rishabh Pant was lbw for a 29-ball duck to Ali off what became the last ball before tea.
Hardik Pandya was caught at short midwicket by Root off Ali.
Ravichandran Ashwin then inexplicably tried to reverse sweep his opposing off-spinner and played on, before Ali's next ball clean-bowled Mohammed Shami.
Scoreboard at stumps on the second day of the fourth Test between England and India at Southampton on Friday:
England 1st Innings 246 (S Curran 78; J Bumrah 3-46)
India 1st Innings (overnight: 19-0)
S. Dhawan c Buttler b Broad 23
KL Rahul lbw b Broad 19
C. Pujara not out 132
V. Kohli c Cook b Curran 46
A. Rahane lbw b Stokes 11
R. Pant lbw b Ali 0
H. Pandya c Root b Ali 4
R. Ashwin b Ali 1
M. Shami b Ali 0
I. Sharma c Cook b Ali 14
J. Bumrah c Cook b Broad 6
Extras: (b9, lb1, nb3, w4) 17
Total: (all out, 84.5 overs, 389 mins) 273
Fall of wickets: 1-37 (Rahul), 2-50 (Dhawan), 3-142 (Kohli), 4-161 (Rahane), 5-181 (Pant), 6-189 (Pandya), 7-195 (Ashwin), 8-195 (Shami), 9-227 (Sharma), 10-273 (Bumrah)
Bowling: Anderson 18-2-50-0; Broad 18.5-5-63-3 (1w); Curran 16-4-41-1 (3w); Jennings 2-0-4-0; Rashid 7-0-19-0; Ali 16-1-63-5; Stokes 7-1-23-1 (3nb)
England 2nd Innings
A. Cook not out 2
K. Jennings not out 4
Total: (0 wkts, 4 overs, 10 mins) 6
To bat: J Root, J Bairstow, B Stokes, J Buttler, M Ali, S Curran, A Rashid, S Broad, J Anderson
Bowling: Ashwin 2-1-1-0; Bumrah 2-0-5-0;
Match position: England are 21 runs behind with all 10 second-innings wickets standing.
Umpires: Kumar Dharmasena (SRI), Bruce Oxenford (AUS)
TV umpire: Joel Wilson (WIS)
Match referee: Andy Pycroft (ZIM)