Zimbabwe skipper Graeme Cremer claimed three wickets to dent Sri Lanka's first innings reply on the second day of the one-off Test in Colombo on Saturday.
Cremer's leg-spin and two crucial run outs left Sri Lanka reeling at 293-7 at stumps. Asela Gunaratne (24) and Rangana Herath (5) were at the crease with the hosts still trailing Zimbabwe by 63 runs.
Gunaratne, who came in to bat at number eight after sustaining a hamstring injury while fielding, put up sturdy resistence in the final few overs of the day.
Top Sri Lankan batsmen faltered against Cremer's wily wrist spinners including captain Dinesh Chandimal falling to his opposite number after a well-made 55.
Chandimal's wicket ended a 96-run stand for the fourth wicket with Angelo Mathews (41), who quit the captaincy this week after Sri Lanka's loss in the one-day series against Zimbabwe.
Cremer, who had got Kusal Mendis caught behind for 11 before tea, struck twice in the final session of play to put the hosts in trouble at 238-6.
Dilruwan Perera, who made a gritty 33 with 2 fours and as many sixes, then ran himself out after hesitating on a single with his hamstrung partner Gunaratne.
Another unlucky run out early in the innings saw the back of opening batsman Upul Tharanga, who gave Sri Lanka a solid start with his brisk 71.
Tharanga fell short of his crease while backing up to a straight drive by Chandimal as the ball grazed past the fingers of paceman Donald Tiripano.
Tiripano's lucky fielding effort came after he got Zimbabwe's first breakthrough in Dimuth Karunaratne (25) in his first over after lunch, ending an 84-run opening partnership.
Earlier the Zimbabwe innings lasted just 4.4 overs of the morning session to be bowled out for 356. Overnight batsman Craig Ervine top-scored with 160.
Left-arm spinner Herath returned with an impressive 5-116, his 30th five-wicket haul in 81 Tests.