Sean Williams scored only his second Test century as Zimbabwe made a strong start in their quest to save the series with Sri Lanka.
The hosts lost the first match of the two-game series in Harare by 10 wickets but reached stumps on day one of the second at the same venue on 352-6.
It had looked as if it would be a difficult day for Zimbabwe when they were reduced to 49-2 inside the first 20 overs.
However, Brendan Taylor, who went for a run-a-ball 62, led a recovery effort alongside Kevin Kasuza (38), but it was Williams' partnership with Sikandar Raza that turned the tide.
Williams and Raza (72) put on 159 for the fifth wicket before the latter was removed by Lasith Embuldeniya (1-153), who endured an otherwise dreadful day with the ball.
There was no stopping Williams from reaching his hundred, which was brought up in 131 balls with a sweep through the gap between fine leg and deep square leg for four.
He faced six more deliveries before he was dismissed for 107 by Dhananjaya de Silva having struck 10 fours and three sixes, but Regis Chakabva (31 not out) and Tinotenda Mutombodzi (10no) are well set to push Zimbabwe past 400.