Hardik Pandya smashed his maiden Test century before Chinaman Kuldeep Yadav routed the Sri Lankan middle order, setting India up for a series whitewash on the second day of the third and final match, in Pallekele on Sunday.
Pandya's aggressive batting powered India to 487 all out after starting the day at 329 for six. The memorable knock was also Pandya's first ever hundred in first class cricket.
Pandya's knock, which was embellished with seven powerful sixes, punctured whatever hopes Sri Lanka had to make it a contest after ending the opening day on a high.
Kuldeep, who replaced the suspended Ravindra Jadeja in the side, scalped four Lankan batsmen after Mohammed Shami sent back both the openers to help India bundle out the hosts for a paltry 135.
With a massive 352-run lead in hand, Virat Kohli had no hesitation in enforcing the follow-on and inflict more misery on a hapless Sri Lanka.
India put the hosts further on the backfoot after picking the wicket of Upul Tharanga, who dragged one on to his stumps off paceman Umesh Yadav, leaving Sri Lanka at 19 for one at end of the day in which 15 wickets fell.
Dimuth Karunaratne (12) and Malinda Pushpakumara (0) were at the crease when the stumps were drawn.
The wicket was not a bad one to bat on but listless Sri Lankan batsmen failed to apply themselves.
Dinesh Chandimal (48) and Niroshan Dickwella (29) put on 63 runs for the fifth wicket in the final session of the day.
They attacked the Indian bowling with clear mindset. It helped Lanka cross 100 in the 21st over but their partnership was broken when Dickwella was stumped off Kuldeep (4/40).
It was the start of another collapse for the hosts as two overs later, Dilruwan Perera (0) holed out in the deep off Kuldeep again.
The big wicket came when Chandimal was caught at leg gully off R Ashwin (2/22) in the 32nd over, the ball lobbing up and KL Rahul completing the easy catch.
Five balls later, Kuldeep, playing only his second Test, bowled Malinda Pushpakumara (10) and then returned in the 37th over to dismiss Vishwa Fernando (0) in the same manner.
He missed his maiden Test five-wicket haul when Ashwin dismissed Lakshan Sandakan (10) an over later, caught at leg gully. Lanka lost their last six wickets for 34 runs.
Ashwin and Mohammed Shami shared the new ball for India in the second innings, and although the Lankan batsmen showed intent to fight, Umesh (1/3) managed to get the breakthrough.
Earlier, Pandya was dismissed for 108 runs (96 balls, 8 fours and 7 sixes) after adding 66 runs for the last wicket with Umesh (3) before lunch.
The former was caught at deep cover off Lakshan Sandakan (5/132) three deliveries after the break. It was the Lankan chinaman bowler’s maiden five-wicket haul in his sixth Test.
Lanka though struggled from the very start in this short middle session. Shami (2/15) and Umesh moved the new ball very well and used the bounce available to good effect.
Tharanga (5) was the first to go, caught behind off Shami in the third over, albeit he wasted a DRS review despite getting a thick edge.
Shami also sent back Karunaratne (4) cheaply, caught behind again in the 5th over. Things took a dire turn for the hosts when Kusal Mendis (18) was run-out after a mix-up with skipper Chandimal.
Pandya then struck a body blow with the ball as well trapping Angelo Mathews (0) lbw in the 10th over as Lanka were reduced to 38/4.
As the day began with India resuming at 329 for six, Pandya and Wriddhiman Saha (16) looked to bat for time in a bid to resurrect India’s floundering first innings.
But they could only add 10 more runs to their overnight partnership with Saha caught at gully off Vishwa Fernando (2- 87) in the ninth ball of the morning.
Kuldeep (26) batted resolutely though and put on 62 runs with Pandya for the eighth wicket. In doing so, they took India past 400 in the 110th over, something that seemed unlikely at stumps on day one.
The former then fell immediately afterwards caught behind off Sandakan. India became the first team to score 400-plus in three successive Tests of a series on Lankan soil.
Pandya then went into overdrive and put on 20 runs with Shami (8), whilst reaching his half-century off 61 balls. He then put Malinda Pushpakumara (3/82) to the sword in the 116th over, taking 26 runs off him with 3 sixes and 2 fours.
It was the most runs scored by an Indian batsman in an over in Test cricket, beating the previous joint-record of 24 runs held by Sandip Patil and Kapil Dev.
This attack helped put an aggressive 10th wicket stand for India as Umesh and Pandya put on 50 runs off only 26 balls in the extended morning session.
Pandya then reached his maiden Test hundred off 86 balls, his second half-century coming off only 25 balls. It was also the second fastest Test hundred overseas by an Indian batsman, second to Virender Sehwag’s 78-ball effort against West Indies at Gros Islet in 2006.
PHOTOS World Athletics: Pearson roars to world 100m hurdles gold
'Pandya can be the next Kapil Dev if he stays grounded'
What caused Bolt's injury in his farewell race
EPL PIX: Chelsea shocked; Watford hold Liverpool; Rooney scores