Karunaratne and Chandimal fire as Sri Lanka take control against New Zealand
Karunaratne scored 83 and Chandimal made 61 as the pair batted sensibly to milk the runs in a 147-run partnership that flattened the Black Caps but their dismissals left the game delicately poised with Sri Lanka 202 runs ahead.
The experienced Angelo Mathews and captain Dhananjaya de Silva (both 34) were at the crease and will look to help Sri Lanka pull further away on Sunday when play resumes.
Saturday is a rest day due to the presidential election in Sri Lanka, marking the first time that a Test has accommodated such a break since 2008 when Bangladesh hosted Sri Lanka.
New Zealand made a promising start and skipper Tim Southee produced a spectacular catch to dismiss Pathum Nissanka, but the tourists struggled for breakthroughs thereafter on a track that deteriorated steadily.
Spinner Ajaz Patel finally got one to sneak past the defence of Karunaratne after a wicketless second session, while speedster William O'Rourke accounted for Chandimal in the following over to bring New Zealand back into the game at 153-3.
O'Rourke then dismissed first innings centurion Kamindu Mendis (13) to turn up the heat but Sri Lanka held their nerve late on.
Resuming the day on 255-4, New Zealand began well but added only 85 runs for a lead of 35 as Sri Lanka's spinners cleaned up the tail with the new ball.
Tom Blundell was the first to depart when a tame delivery from Prabath Jayasuriya tickled his glove and flew to slip while fellow overnight batsman Daryl Mitchell was run out for 57.
Jayasuriya then removed Mitchell Santner and Southee to end up with 4-136, before Ramesh Mendis got rid of Patel, but Glenn Phillips continued to frustrate the hosts.
The right-hander raised the tempo with some heavy hits and was unbeaten on 49 from 48 balls, with two fours and five sixes, when Ramesh bowled out last man O'Rourke to finish with 3-101.