Debutant teenager Rubel Hossain claimed four wickets and Shakib Al Hasan scored an unbeaten 92 to send Bangladesh into the tri-series ODI tournament final with a surprise five-wicket defeat of Sri Lanka on Wednesday.
The hosts needed to win the fog-delayed, reduced-overs game inside 24.5 overs for a bonus point victory to finish ahead of Zimbabwe and set up a rematch with the Sri Lankans in Friday's decider.
Sri Lanka, whose progress was assured thanks to Monday's 130-run victory over Zimbabwe, were totally helpless against Shakib's magnificent 92 off just 69 balls that avoided an exit on net run rate or head-to-head records with an over to spare.
"The win is very special to all of us as we were very upset against Zimbabwe. Whatever we wanted to do today, it clicked," victorious captain Mohammad Ashraful told reporters.
"It is one of the best innings I have ever seen," he said of Shakib's match-winning contribution. "Given the situation we were in after losing three wickets, may be it is one of the best for any Bangladeshis."
Bangladesh's shaky start after bowling their opponents out for 147 saw them lose their first three wickets for just 11 runs.
After openers Tamim Iqbal and Zunaed Siddique were run out and one-down Mushfiqur Rahim added just one run, Shakib brought the innings back on track with a 91-run stand along side Ashraful, who contributed 26 runs.
Shakib, who also made 52 runs in the 38-run opening match loss to Zimbabwe, took 45 balls to reach his 10th one-day fifty in an innings that contained 10 fours and two sixes.
Naeem Islam then struck Ajantha Mendis for four and six in successive balls over mid-off and long-on to give Bangladesh only their second ODI victory over Sri Lanka in 25 matches
The debuting Hossain's four wickets and three more from Mashrafe Mortaza had earlier set up the win after fog delayed play for more than three hours and reduced the series' final league game to 31 overs a piece.
Sri Lanka started terribly when opener Upul Tharanga and Kumar Sangakkara were dismissed by Mortaza for naught.
Sanath Jayasuriya and Mahela Jayawardene recovered with a 71-run stand for the third wicket before Jayawardene, who failed to score in his last three games, went for 28.
Mortaza claimed his third wicket when he sharply caught and bowled Jayasuriya, who struck seven boundaries to make 54 off 64 balls for his 67th ODI half-century.
The 19-year old right-arm pacer Rubel, who has a sling-shot action, mopped up the tail as Sri Lanka lost their last six wickets for 23 runs with three balls to spare. His return of 4-33 was the best performance by a debutant for Bangladesh.
"We tried to control things, but at the middle I think we lost our way," Sri Lanka captain Mahela Jayawardene said.
"The way I got out, then Sunny (Sanath Jayasuriya) and (Jehan) Mubarak getting run out, we did not have the batsmen to bat the last five overs."
"Maybe we were 30-40 run shot. But it would not have mattered given the way Shakib batted."