Sri Lanka skipper Angelo Mathews struck his sixth Test century but India took command on the third day of the second Test at P Sara Oval, in Colombo, on Saturday.
Mathews faced 167 balls in a patient knock, hitting 12 boundaries in a display of controlled aggression, before becoming Stuart Binny's first Test victim.
Colombo Test: India regain the initiative after Mathews ton
After a wicketless first session, the touring side dismissed the last seven batsmen for 65 runs to bowl Sri Lanka out for 306 and take an 87-run first innings lead.
India then lost opener Lokesh Rahul to the fifth ball of their second innings before Murali Vijay and Ajinkya Rahane guided them to 70 for one at the close of play, an advantage of 157 runs.
Vijay was unbeaten on 39 while Rahane was 28 not out after both survived loud lbw appeals.
Starting the day on 140 for three, Mathews (102) and Lahiru Thirimanne (62) enjoyed a productive morning session in Sri Lankan hero Kumar Sangakkara's farewell match.
The pair added 84 runs in the session without being separated, much to the frustration of India who trail 1-0 in the three-match series.
Ishant Sharma struck two big blows after lunch to expose Sri Lanka's late order before leg-spinner Amit Mishra polished off the tail with four for 43.
Paceman Ishant ended a 127-run stand by removing Thirimanne although the batsman looked unhappy with the caught-behind decision.
He also got rid of Dinesh Chandimal for 11 but Mathews brought up his century with a reverse-swept four off spinner Ravichandran Ashwin.
Mishra then removed Dhammika Prasad for five in the next over and also got rid of Jehan Mubarak for 22 and Tharindu Kaushal for six.