Kumar Sangakkara hit 134 not out as Sri Lanka chased down a target of 294 to beat England by seven wickets in the Champions Trophy.
Sangakkara anchored the run chase with a 135-ball knock, while Nuwan Kulasekara smashed Sri Lanka over the winning line in the 48th over with 58 not out from 38 deliveries.
The result throws Group A wide open. England and New Zealand meet at Cardiff on Sunday with the winner guaranteed a semi-final spot, while Sri Lanka will also make the last four if they beat Australia at The Oval on Monday.
Jonathan Trott top scored with 76 in an England total of 293-7 after they had been asked to bat.
Seamer Shaminda Eranga ended an opening stand of 48 by having Ian Bell (20) caught at midwicket but Trott shared half-century partnerships with Alastair Cook (59) and Joe Root (68) to set a solid platform.
Left-arm spinner Rangana Herath (2-46) accounted for Cook and Trott, both lbw, during his 10-over allocation before England suffered a middle-order stutter with three wickets going down in the space of six balls.
Root, straight back among the runs after the distraction of his bar-room altercation with David Warner over the weekend, and Eoin Morgan (13) went in the same Lasith Malinga (2-58) over.
And Jos Buttler (0) edged behind off Kulasekara (1-42) at the start of the next to leave England on 249-6 with 22 deliveries of the innings remaining.
Ravi Bopara stepped up and hammered 33 not out from 13 balls, including three sixes. The final over, bowled by Eranga (2-80), disappeared for 28 runs as - for the second match in a row - it was the Essex all-rounder who ensured England had a decent total to defend.
James Anderson had Kusal Perera (6) held at mid-on by Bopara in his opening spell before Sangakkara put on 92 with Tillakaratne Dilshan (44) and, after Dilshan holed out off Graeme Swann's bowling, 85 with Mahela Jayawardene (42).
Anderson (2-51) returned to the attack to have Jayawardene caught at deep midwicket by substitute fielder Jonathan Bairstow and, with the required-rate creeping up, Sri Lanka sent in Kulasekara to throw the bat.
He did just that, planting Swann (1-50) into the leg-side for two huge sixes in the 43rd over and another maximum for good measure in the next from Broad (0-67) to bring the run chase back under control.
Sangakkara, who had brought up his 15th ODI hundred from 111 balls, finished the game with a boundary - his 12th - to fine-leg off Broad to start the 48th over, his fourth-wicket stand with Kulasekara by this stage worth 110 off 71 deliveries.