India booked their place in the World Cup semi-finals as they claimed a hard-fought 28-run victory over Bangladesh at Edgbaston.
An opening stand of 180 between Rohit Sharma (104) and KL Rahul (77) laid the foundations for India's 314-9 and Bangladesh came up short as they were all out for 286 in reply to end their own hopes of reaching the last four.
It was Rohit's fourth century of the tournament, although he took full advantage of being dropped by Tamim Iqbal on nine, as he equalled the record set by Sri Lanka's Kumar Sangakkara, who scored four tons at the 2015 World Cup.
Shakib Al Hasan once again led the way for Bangladesh as he made 66 for his sixth fifty in seven innings, but his departure at the hands of Hardik Pandya effectively sealed a sixth win in eight games for India, despite some defiant late hitting from Shabbir Rahman and Mohammad Shaifuddin.
The match was played on the same wicket that saw India suffer their first defeat of the tournament when they lost to England on Sunday. But after Virat Kohli won the toss and chose to bat, Rohit and Rahul showed there was no hangover from that loss as they made the most of the conditions, including the short boundary, with their tournament-best first-wicket partnership.
Rohit's good fortune came when Tamim spilled a simple chance at mid-wicket off the bowling of Mustafizur Rahman in just the fifth over, and the opening pair went on to take the total to 69-0 after 10 overs with some impressive hitting.
Rohit joined Sachin Tendulkar in becoming only the second India batsman to score 500 runs at two different World Cups when he reached 60 and he had taken over as the tournament's highest run scorer, with 544, when he eventually fell for 104 in the 30th over, clipping Soumya Sarkar to Liton Das at cover, with his 92-ball innings including seven fours and five sixes.
Rahul was the next to depart when wicketkeeper Mushfiqur Rahim took a low catch off the bowling of Rubel Hossain, the opener dismissed for 77 from 92 balls, including six fours and one six.
A big India total had looked likely but Mustafizur applied the brakes further with two wickets in three balls as he had Kohli caught at mid-wicket by Rubel for 26 and Pandya caught at first slip by Soumya for a duck.
Rishabh Pant kept the runs flowing for India as he smashed 48 from 41 balls before he picked out Mosaddek Hossain at deep square leg to give Shakib his only wicket as he finished with solid figures of 1-41.
MS Dhoni added 35 in the closing stages but some excellent bowling by Mustafizur, who picked up three late wickets for a haul of 5-59, restricted India to only 60 runs in the final 10 overs with their final total of 314-9 respectable enough but appearing under par following their good start.
The India bowlers were used to the slow wicket, though, and they applied their experience from the weekend well with Pandya especially effective as he took the pace off the ball to claim three crucial wickets.
The Bangladesh batsmen embarked on a number of promising partnerships at the top of the order but none of them made it past the 50-mark as wickets fell at a steady rate.
Tamim (22) was the first to depart in the 10th over when he chopped a delivery from Mohammed Shami on to his stumps, with his fellow opener Soumya the next to go when he became Pandya's first victim, caught by Kohli in the covers having made 33 from 38 balls.
He had shared a stand of 35 with Shakib who then put on 47 with Mushfiqur (24), before he was caught by Shami off the bowling of Yuzvendra Chahal (1-50), and 41 with Liton Das, who mistimed a short ball from Pandya into the hands of Dinesh Karthik to fall for 22.
Mosaddek (3) failed to cope with the pace of Jasprit Bumrah as he also chopped on and Pandya (3-60) then struck the vital blow as Shakib shovelled a catch straight to Karthik at extra cover to exit for a 74-ball 66 which featured six fours.
That left Shabbir and Shaifuddin together at the crease and, with nothing to lose, they launched a late counter-attack with a seventh-wicket stand of 66 until the former was clean bowled by Bumrah for 36.
After Bhuvneshwar Kumar removed Mashrafe Mortaza for eight, Shaifuddin fought on and completed only his second ODI fifty as he finished unbeaten on 51 after Bumrah (4-55) bowled Rubel (9) and Mustafizur (0) with successive fast yorkers.
Sky customer? With Sky VIP - your free loyalty programme - you could be right at the heart of the Ashes action with a once-in-a-lifetime opportunity to join the captains on the pitch for the coin toss at Edgbaston. Enter now on the My Sky app.