Birmingham, United Kingdom: Jonny Bairstow hit a hundred before Chris Woakes starred as England ended India's unbeaten run at this World Cup with a 31-run win on Sunday to once again leave semi-final qualification in their own hands.
England, who came into this match on the back of successive defeats by Sri Lanka and Australia, will be assured of a place in the last four if they beat New Zealand in their last group match on Wednesday.
India can reach the knockout phase by beating Bangladesh when they return to Edgbaston on Tuesday.
England's bid to win a first World Cup title is based on aggressive top-order batting but the runs had dried up lately.
That made their 337-7 after captain Eoin Morgan won the toss on a good pitch in Birmingham all the more heartening.
Bairstow top-scored with 111 and all-rounder Ben Stokes added a brisk 79, with India paceman Mohammed Shami taking a career-best 5-69.
No side have made more batting second to win a World Cup match than Ireland's 329-7 against England at Bangalore in 2011.
Title contenders India weren't up to the task as their chase petered out on 306-5.
India were a long way off from the moment opener KL Rahul was caught and bowled for a duck by Warwickshire paceman Woakes, who reeled off an impressive three straight maidens with the new ball on his home ground.
Rohit Sharma, Rahul's opening partner, should have fallen for four but Joe Root dropped a routine second-slip catch off fast bowler Jofra Archer.
It threatened to be a costly miss with Sharma going on to 102, his third century of the tournament, in front of an overwhelmingly India-supporting capacity crowd of more than 24,000.
Sharma also shared a second-wicket stand of 138 with India captain Virat Kohli, whose 66 was the star batsman's fifth successive fifty of this World Cup.
But Kohli fell when he sliced Liam Plunkett to backward point.
Sharma went to three figures, after scores of 122 not out against South Africa and 140 against Pakistan, in 106 balls with 15 fours.
But the pressure of the chase told when he was caught behind off a Woakes off-cutter to leave India 198-3 in the 37th over.
Rishabh Pant made 32 at better than a run-a-ball and it looked as if he had hit the first six of the innings only for Woakes, running round from deep backward square, to hold a brilliant diving catch.
India needed 104 more runs off the last 10 overs but their hopes faded when the big-hitting Hardik Pandya (45) holed out to substitute James Vince off fast bowler Plunkett, who justified his recall in place of off-spinner Moeen Ali with 3-55.
Earlier, Bairstow and Jason Roy (66), returning after missing three matches with a torn hamstring, shared a first-wicket stand of 160 -- the highest opening partnership of the tournament.
Bairstow, involved in a pre-match spat with former England captain Michael Vaughan after suggesting pundits wanted England to lose, twice saw big inside edges miss the stumps.
Roy could have been out on 21 when all-rounder Pandya appealed for a caught behind down the legside.
But umpire Aleem Dar signalled a wide instead and Kohli opted against a review, although replays suggested the ball had touched Roy's glove.
Roy reached fifty in just 41 balls before, on 66, he was well caught by substitute Ravindra Jadeja at long-on.
A single off Pandya saw Bairstow to a 90 ball-hundred, including eight fours and six sixes, before he carved Shami to deep cover.