Sikandar Raza hit a gritty 97 not out to help Zimbabwe recover from a top-order collapse and stretch its second-innings lead over Sri Lanka to 262 in the one-off Test on Sunday.
The visiting side was 252 for 6 at stumps on the third day, with Raza and Malcolm Waller (57) putting on an unbeaten 107-run stand for the seventh wicket at Colombo's R Premadasa Stadium.
Raza lifted Zimbabwe from a precarious 23 for 4, and then 59 for 5, after Rangana Herath rattled the batting with four early wickets.
Herath, who got three wickets before the lunch break, bowled Sean Williams for 22 in the second session as Zimbabwe teetered dangerously close to losing its 10-run advantage.
It was then that Raza put together 86 runs with Peter Moor (40) for the sixth wicket to turn the tables on Sri Lanka. Moor later fell to Lahiru Kumara.
Raza, who registered his fifth Test 50, used the sweep shot to great effect against the spinners as he found another partner in Waller to thwart the Sri Lanka bowling attack.
Earlier Graeme Cremer, the Zimbabwe captain, helped the side take the lead after claiming his maiden five-wicket haul in a Test and bowling Sri Lanka out for 346 in the morning session.
But it was Herath's left-arm spin that undid the fine bowling effort from Cremer (5 for 125). Herath, who registered his 30th Test five-wicket haul in the first innings, ran riot at the start of Zimabwe's second dig to get the wickets of Hamilton Masakadza, Tarisai Musakanda and Regis Chakabva.
Dilruwan Perera, the offspinner, joined forces to get the prized wicket of first-innings centurion Craig Ervine for 5 at the stroke of lunch.
While Sri Lanka look for redemption under Dinesh Chandimal, the new Test captain, after its loss in the one-day series against Zimbabwe, the visiting side eyes its first-ever Test win over the island country.