Zimbabwe skipper Graeme Cremer accounted for the core of Sri Lanka's middle order to wrestle the initiative away from Sri Lanka who ended day two of the first Test on 293/7 still trailing by 63 runs.
Sri Lanka had knocked over the Zimbabwe tail quickly with just twelve runs added to the overnight score to end 356 all out.
Craig Ervine was the last man out for a brilliant 160 that has given Zimbabwe a sniff.
Sri Lanka reached lunch without losing a wicket and were in a position to take the Test by the scruff of the neck at 77/0 with Upul Tharanga going to a half century.
Dimuth Karunaratne (25) and Kusal Mendis (11) fell shortly after the lunch break to leave Sri Lanka 107 for 2 but they would have been confident nonetheless of hauling in Zimbabwe's total.
The run out of Tharanga (71) was an example of Sri Lanka's failure to do the basics right as the batsman was run out at the non-strikers end courtesy of some horrible backing up, Sri Lanka were 116 for 3.
A 96 run stand between new skipper Dinesh Chandimal and his predecessor Angelo Mathews caused the game to swing back in Sri Lanka's favour.
The final session though would belong to Zimbabwe as their skipper Cremer accounted for Chandimal (55) and Niroshan Dickwella (6) before Mathews (41) fell to Sean Williams and Dilruwan Perera was brilliantly run out after a mix up with the injured Asela Gunaratne.
Gunaratne (24*) held firm towards the end of the day with veteran spinner Rangana Herath (5*) showing great resolve and setting up what promises to be a fascinating clash on day three.
Cremer ended the day with figures of 3/100.