Top-order batsman Kusal Mendis completed his 10th Test half-century and shared a 77-run stand with Angelo Mathews as Sri Lanka reached 143 for three at tea on day two of the first Test.
This left them 106 runs adrift of New Zealand, who were bundled out for 249 before lunch on a typically treacherous Galle wicket as Suranga Lakmal took four wickets.
The hosts lost Dimuth Karunaratne early in the extended afternoon session. The captain, who was dropped on 19 by Ross Taylor at first slip, was on 39 when he was trapped lbw by Ajaz Patel.
Mendis and Mathews used their feet expertly against the spin bowlers, finding the boundary frequently and forcing skipper Kane Williamson to bring back his pacemen. Tim Southee and Trent Boult were able to stop the run flow but the stand for the third wicket looked impregnable.
Mendis reached his half-century with a boundary to the leg-side off Ajaz Patel and a lapse in concentration saw him being dismissed off the very next ball, caught by Taylor at first slip. Patel had claimed all three Sri Lankan wickets to fall by tea.
Mendis' 53 came off 89 deliveries with seven fours and one six. Mathews was unbeaten on 41 off 83 balls with six fours and one six.
Earlier, New Zealand resumed on 203 for five but lost their last five wickets with the addition of just 46 runs.
Ross Taylor was the top scorer in the New Zealand innings with 86. He was dismissed on the first ball he faced on day two when he attempted a cut shot and was caught behind.
Lakmal hardly put a foot wrong on the second day and backed up off-spinner Akila Dananjaya, who finished with five wickets.
Kusal Mendis scored his 10th Test half-century against New Zealand at Galle