World champions India thrashed Sri Lanka by eight wickets at Cardiff on Thursday to set up a Champions Trophy final against tournament hosts England at Edgbaston on Sunday.
India, chasing a modest target of 182, finished on 182 for two with 15 overs to spare to set up a final against England, who beat South Africa by seven wickets at The Oval on Wednesday.
Opener Shikhar Dhawan, dropped three times, made 68 as he extended his record as the tournament's leading scorer to 332 runs following innings of 114 against South Africa, 102 not out against the West Indies and 48 against Pakistan.
Virat Kohli was 58 not out, with India now having won seven of their last eight one-day internationals (ODIs) against their Asian rivals.
K. Perera c Raina b Kumar 4
T. Dilshan not out 18
K. Sangakkara c Raina b I Sharma 17
L. Thirimanne c Raina b I Sharma 7
M. Jayawardene b Jadeja 38
A. Mathews c Kumar b Ashwin 51
J. Mendis st Dhoni b Ashwin 25
T. Perera c Dhawan b I Sharma 0
N. Kulasekara b Ashwin 1
L. Malinga not out 7
Total (8 wkts, 50 overs) 181
Fall of wickets: 1-6 (K Perera), 2-36 (Thirimanne), 3-41 (Sangakkara),
4-119 (Jayawardene), 5-158 (Mathews), 6-160 (T Perera), 7-164 (Kulasekara),
R. Sharma b Mathews 33
S. Dhawan st Sangakkara b Mendis 68
V. Kohli not out 58
S. Raina not out 7
Extras (b1, lb5, w10) 16
Total (2 wkts, 35 overs) 182
Fall of wickets: 1-77 (R Sharma), 2-142 (Dhawan)
The course of Thursday's match, a repeat of the 2011 World Cup final India won by six wickets in Mumbai, was set in the first innings.
After India captain Mahendra Singh Dhoni won the toss, his seamers exploited the helpful overcast conditions as Sri Lanka were restricted to 181 for eight.
Ishant Sharma took three wickets for 33 runs following impressive work by new-ball duo Bhuvneshwar Kumar and Umesh Yadav.
Sri Lanka captain Angelo Mathews top scored with 51 in an innings where no other batsman made more than the 38 of Mahela Jayawardene, who two years ago became the only man to score a hundred in a losing cause in a World Cup final.
Sri Lanka were six for one when Kusal Perera edged a drive off Kumar and was caught at second slip by Suresh Raina.
They suffered a further setback when Tillakaratne Dilshan, after playing an on-drive, pulled up with a right leg injury.
He received lengthy on-field treatment but, still struggling, retired hurt shortly afterwards on 12 in the fifth over.
Ishant Sharma, with the aid of two excellent second slip catches by Raina, reduced Sri Lanka to 41 for three by removing Lahiru Thirimanne and dangerman Kumar Sangakkara.
It was a deserved reward for Dhoni's decision to attack the batsmen with two slips and only two men outside the circle.
The 23rd over saw Dhoni pass on wicketkeeping duties to Dinesh Karthik, a specialist gloveman but mainly deployed as a batsman this tournament.
That allowed Dhoni to bowl himself in conditions suited to his medium-pacers.
In his 222 previous ODIs, Dhoni had bowled only two overs, yet his decision very nearly proved a master-stroke with just his second ball Thursday.
Jayawardene, on five, was given out leg before to Dhoni by Pakistani umpire Aleem Dar only for the batsman to overturn it on review.
But Jayawardene was bowled by left-arm spinner Ravindra Jadeja after an ugly swipe across the line.
If Sri Lanka were to have any realistic chance of winning this match, it looked as if Lasith Malinga would have to take early wickets.
But for all slingshot seamer Malinga's skill, his bowling average of 40.88 against India is his highest against any country.
And the tone for the innings was set when left-hander Dhawan uppercut Malinga for a stunning six off the last ball of the bowler's third over.
Worse followed for Sri Lanka when Dhawan was dropped by first slip Mathews off Nuwan Kulasekara and put down by wicketkeeper Sangakkara, standing up, off the same bowler.
Dhawan cashed in with a 73-ball fifty before he was dropped by Sachitra Sennayake, substitute for Dilshan, at point again off Kulasekara.
He was eventually stumped off Jeevan Mendis but by then India were in sight of victory.