NatWest Series, Canterbury: South Africa 272-5 (50 overs) beat Zimbabwe 226-9 (50 overs) by 46 runs
Jacques Kallis hit his second century is as many days as South Africa posted a daunting 272-5 against Zimbabwe in Canterbury.
But Travis Friend led a Zimbabwe rebellion that made South Africa sweat for their first victory of the NatWest Series, by 46 runs.
Kallis, a centurion in Saturday's six-wicket loss to England, hit a patient 125 from 147 deliveries - his highest score in one-day internationals.
Having looked well below par at 84-3 at the half-way mark, South Africa recovered impressively.
But pinch-hitter Friend smashed an audacious 82 from 93 deliveries, including five fours and two sixes, as Zimbabwe overcame a similarly slow start.
As he added 109 for the second wicket with Dion Ebrahim, the possibility that Kallis would be one the losing side for the second day running appeared very real.
But Andrew Hall bowled Friend nine runs short of his career best score to regain the upper hand with 17 overs remaining.
We didn't play well [against England] so it was nice to put things right
Wickets fell regularly from there on and it took last wicket pair Tatenda Taibu, who finished 18 not out, and Doug Hondo to steer Zimbabwe to a consolation bonus point.
Hall was the most successful bowler, finishing with 3-38.
Kallis came to the crease following the loss of Herschelle Gibbs in the second over, but refused to go for broke until late in the innings.
Including a dropped return catch by Hondo when he had made just 21, the all-rounder's first 50 took 89 balls but his second occupied just 48.
Zimbabwe skipper Heath Streak's decision to bowl first was rewarded straight away as Gibbs could only match the five runs he managed at The Oval before Andy Blignaut bowled him through the gate.
Skipper Smith followed after a scratchy seven, lbw to an inswinger from Hondo, whose first eight overs cost just 15.
Friend fought fire with fire with an audacious 82
And spinner Ray Price dismissed Jacques Rudolph, caught at fly slip for 32, in the 25th over to break a partnership of 55.
But the innings was invigorated by Hall's blistering 56, including three sixes, in a fourth wicket partnership of 91.
And Kallis took the lead in an unbroken stand of 52 with Shaun Pollock, the former skipper making 12.
Blignaut suffered the ignominy of being pulled out of the attack but the umpires after bowling two waist-high full-tosses, Kallis cracking the second into the crowd for six.
Zimbabwe: HH Streak (capt), DA Marillier, DD Ebrahim, TJ Friend, GW Flower, T
Taibu (wkt), S Matsikenyeri, SM Ervine, AM Blignaut, RW Price, D Hondo.
South Africa: GC Smith (capt), HH Gibbs, JH Kallis, JA Rudolph, MV
Boucher (wkt), M van Jaarsveld, SM Pollock, N Boje, AJ Hall, AC Dawson, M Ntini.