Bangladesh powered their way to their highest One-Day International total and then matched their batting prowess with smart bowling to beat South Africa by 21 runs at The Oval on Sunday.
It was a major scalp for Bangladesh and the victory underlined their reputation as dangerous outsiders at the tournament.
Mushfiqur Rahim and Shakib Al Hasan put together a record partnership as Bangladesh reached 330 for six wickets after being put in to bat. That meant South Africa needed to pull off the highest run-chase in World Cup history, but they fell short, ending with 309 for eight.
The pair scored 142 runs for the third wicket to notch Bangladesh’s highest World Cup partnership.
Backed by enthusiastic support at The Oval, the Bangladeshis put on an aggressive batting display to achieve their highest ODI score.
They dominated the bowling to reach 217-2 before Shakib was bowled for 75 by Imran Tahir in the 36th over while attempting a sweep shot to a full-pitched delivery.
Mushfiqur went for 78 not long after, caught on the boundary off Andile Phehlukwayo.
But South Africa, who lost to England at the same venue in the tournament opener on Thursday, were unable to apply the brakes on the scoring.
Mahmudullah’s unbeaten 46, and 26 runs off 20 balls from Mosaddek Hossain, put Bangladesh in a dominant position.
South Africa’s gamble of putting Bangladesh in to bat, hoping to bounce them out cheaply with their pace attack, fell flat on a docile wicket, and was exacerbated by a hamstring injury to opening bowler Lungi Ngidi, who left the field after bowling just four overs.
Attempting to become the first team to successfully chase more than 330 to win a World Cup match, South Africa's bid to rewrite the record books fell short.
Proteas skipper Faf du Plessis scored 62 from 53 balls, but Bangladesh seamer Mustafizur Rahman took three wickets and economical spinners Shakib and Mehidy Hasan wrapped up a memorable victory.
After reaching the World Cup quarter-finals in 2015, Bangladesh once again look capable of shaking up cricket's established order, much to the delight of their army of vociferous supporters who packed the Oval.
"It will be one of our top wins," said Shakib at the presentation ceremony. "We have done some upsets at World Cups but we want to prove something at this tournament."
In contrast, South Africa are in turmoil after du Plessis's decision to bowl first backfired despite two wickets from veteran spinner Imran Tahir in his 100th ODI appearance.
With the World Cup just four days old, they have already lost twice in south London -- this disappointing performance coming hot on the heels of their 104-run thrashing by hosts England in the tournament opener.
South Africa, who have never won the World Cup, are left with little margin for error in the rest of the 10-team group stage, which sees each country play nine matches. It won't get any easier for Du Plessis' troubled side in their next match when they face title contenders India on Wednesday.
Quinton de Kock and Aiden Markram needed to get South Africa's chase off to a fast start and they reached 49 before a disastrous blunder sent them spiralling towards defeat.
De Kock was run out for 23 after being rashly called for a single by Markram, whose partner's edge was fumbled by Mushfiqur before the wicket-keeper recovered to throw out the opener.
That brought du Plessis to the crease and together with Markram he put on 53 in 60 balls. But Shakib curtailed that partnership when his perfectly-flighted delivery bowled Markham for 45 to leave South Africa 102 for two in the 20th over. That made Shakib just the fifth player to score 5,000 runs and take 250 wickets in ODIs.
Du Plessis got to fifty off 45 balls, reaching the milestone with a six off Mosaddek Hossain. But that blast got du Plessis's adrenaline flowing too fast and a charge at Mehidy saw him bowled after he misjudged the flight.
David Miller's lofted shot was dropped by Soumya Sarkar at mid-off and he escaped again when Mahmudullah couldn't grab his mistimed drive. However, Miller's luck ran out when he was caught by Mehidy off Mustafizur for 38 to leave the Proteas in disarray.
The required run-rate was at 10 an over by the time Rassie van der Dussen's agricultural swipe saw him bowled by Mohammad Saifuddin for 41.
Saifuddin removed Andile Phehlukwayo to push South Africa to the brink and when JP Duminy was bowled by Mustafizur for a defiant 45, Bangladesh's jubilant fans could get the party started.