Kuldeep led an inspired bowling display with his left-arm wrist spin to help dismiss Sri Lanka for 135 in response to India's 487, before the visitors enforced the follow-on in Pallekele in search of a series whitewash.
While it was expected that Kohli and Ajinkya Rahane will make merry on a batting-friendly wicket, the two could not score many with Kohli getting out for 42 off Sandakan and Rahane getting out on Pushpakumara's bowling. Lanka lost their last six wickets for 34 runs.
WICKET! The Hardik Pandya show is over and so is the Indian innings shortly after lunch.
The Indian cricketer bolted an unbelievable 108 runs with the help of 15 boundaries - eight 4s and seven 6s- before he was taken down as Dilruwan Perera catches his shot on Sandakan's ball.
The former was caught at deep cover off Lakshan Sandakan (5/132) three deliveries after the break.
Chameera meanwhile, last played a Test in South Africa past year, but featured in four of the five ODIs against Zimbabwe - the series that Sri Lanka lost 2-3. Shami (2/15) and Umesh moved the new ball very well and used the bounce available to good effect.
The team management may think of giving Abhinav Mukund another chance while Rohit Sharma is still waiting to play his first Test since October.
From 23 for 2, Chandimal and Kusal Mendis had the task of resurrecting Sri Lanka. Hardik Pandya got rid of Angelo Mathews as the hosts went into Tea, struggling at 61/4.
Kuldeep Yadav batted decisively with Pandya on the other end to put on 62 runs partnership for the 8th wicket.
Saha (16) was dismissed off the ninth ball at the start of the second day, caught by Perera at gully in his attempt to cut Fernando through a small gap on the offside. In doing so, they took India past 400 in the 110th over, something that seemed unlikely at stumps on day one.
Kuldeep Yadav was the pick of the bowlers with a four-wicket haul, while Shami and Ashwin picked up two wicket each. Sandakan ended with figures of 5 for 132, with Milinda Pushpakumara (3 for 82) and Vishwa Fernando (2 for 87) lending him support.
He also became the 81st batsman to score India's 483rd hundred in Test cricket.
Rahul entered record books by becoming the first Indian to join an exclusive club of batsmen who scored the most consecutive half-centuries in Test history.
Along with these, Hardik only took 86 balls to reach his century is the second fastest for an Indian player away from home, after the 78-ball hundred by Virender Sehwag against West Indies in Gros Islet in 2006. Previously, the record was held by Virender Sehwag who scored 99 runs against West Indies in Gros Islet in 2006.