Super Six, East London: Sri Lanka 256-5 (50 overs) beat Zimbabwe 182 (41.5 overs) by 74 runs
Sri Lanka booked their place in the World Cup semi-finals at New Zealand's expense with a clinical victory over Zimbabwe in East London.
Opener Marvan Atapattu carried his bat in an unbeaten knock of 103 to lay the foundations for the win.
And the unlucky dismissal of Andy Flower for 38 in his final innings for Zimbabwe sparked a collapse as paceman Chaminda Vaas took his tournament wicket haul to a record-equalling 20.
Sri Lanka will now play defending champions Australia in Port Elizabeth on Tuesday.
We will need to play really hard cricket against Australia
Sri Lanka captain Sanath Jayasuriya
The New Zealand team would have been watching the match in the hope that Zimbabwe might spring a surprise.
And the game did not begin well for Sri Lanka as captain Sanath Jayasuriya and Atapattu made a slow start in the face of steady bowling from Heath Streak and Andy Blignaut.
Jayasuriya departed for 22 in the 13th over when he edged a seaming delivery from Streak to wicketkeeper Tatenda Taibu.
But Atapattu combined well with Avishka Gunawardene in a patient 83-run partnership before Gunawardene was caught and bowled by spinner Doug Marillier for 41.
There was still work to do when Aravinda de Silva (25) edged a ball from Sean Ervine to Taibu to make the score 175-3 in the 41st over.
But Kumar Sangakkara survived an early let-off to hit 35 runs from 25 balls before he was caught by Grant Flower off Streak.
Russel Arnold was caught by Grant Flower off Hondo for one but Vaas (11 not out) chipped in as Atapattu reached his century in the final over.
Zimbabwe began their reply in style as openers Craig Wishart and Doug Marillier hammered some early boundaries.
But Pulasthi Gunaratne had Marillier caught for 19 by Jayasuriya in the sixth over before bowling Travis Friend for 21 to make it 68-2.
I would like to thank Andy Flower for what he's done for Zimbabwe cricket
Zimbabwe captain Heath Streak
Andy Flower and Wishart kept the run rate on course until the opener was bowled by Jayasuriya for 43.
But the collapse began in earnest after Andy Flower was harshly given out lbw to De Silva, with TV replays showing a thick inside edge.
Taibu was bowled by Muttiah Muralitharan for two, and Andy Blignaut then hit a full toss from Dilhara Fernando straight into the hands of De Silva.
Vaas then took his 19th wicket of the tournament by bowling Ervine for 12.
And, after Jayasuriya had dismissed Streak for two and Grant Flower for 31, Vaas equalled the World Cup record by bowling Douglas Hondo to end the match.
Sri Lanka: Sanath Jayasuriya (captain), Marvan Atapattu, Avishka Gunawardene, Hashan Tillakaratne, Aravinda de Silva, Russel Arnold, Kumar Sangakkara, Chaminda Vaas, Muttiah Muralitharan, Dilhara Fernando, Pulasthi Gunaratne.
Zimbabwe: Doug Marillier, Craig Wishart, Travis Friend, Andy Flower, Grant Flower, Tatenda Taibu, Andy Blignaut, Stuart Matsikenyeri, Heath Streak (captain), Sean Ervine, Douglas Hondo.
Umpires: B G Jerling and R E Koertzen.