James Anderson’s burst of three wickets for one run either side of tea helped keep the outcome of this first Investec Test in doubt to the very last ball, as the tourists clung on at 201 for nine in notional pursuit of a ground-record 390.
After Anderson (four wickets for 25 runs) returned with the second new ball to have Sri Lanka captain Angelo Mathews caught at slip by his opposite number Alastair Cook, Stuart Broad (three for 43) had five shots at last man Nuwan Pradeep.
Broad, who had Rangana Herath caught behind down the leg side with the first ball of the last over, sparked false celebrations when umpire Paul Reiffel gave Pradeep out lbw to the penultimate delivery of the match.
DRS proved the tailender had got a big inside-edge, however, and he then survived the final ball too.
Half-centuries by Kumar Sangakkara (61) and opener Kaushal Silva (57) helped to buy the leeway Sri Lanka needed.
After 59 of the 90 overs available to bowl the tourists out, Sangakkara and his oldest ally Mahela Jayawardene guided their team to a serene 159 for two. But with an ageing ball, in 14 deliveries, Anderson saw off three batsmen – including Jayawardene and Sangakkara.
But Mathews and Prasanna Jayawardene held England up for another 20 overs. That stand was broken by Chris Jordan, Jayawardene lbw via DRS but, with four wickets still required, and a second new ball for the last ten overs, England could not quite get through the tail.
The nearest they had come to discomforting the opposition in the first two sessions were Liam Plunkett’s efforts with the short ball.
But Sangakkara took some shifting. He shared a second-wicket stand of 98 with Silva, and then joined forces with Jayawardene – until Anderson found enough full-length movement to have the latter caught behind.
Broad had made the solitary new-ball breakthrough on another cloudy morning, Dimuth Karunaratne’s inside edge on to his thigh pad going straight to short leg.
Sangakkara lost Silva, who had made a two-and-a-half-hour 50, caught behind down the leg-side off his glove as he tried too late to leave a Jordan bouncer. Plunkett then worked over Jayawardene in predictable fashion but the plan did not come to fruition and Sangakkara reached his 50 from 137 balls.
Then Anderson cranked up the pace and found telling movement in the air. Jayawardene was his first victim, followed straight after tea by Sangakkara, chopping on cramped for room from round the wicket.
Lahiru Thirimanne was next, three balls later, edging to second slip when Anderson this time extracted bounce.
Anderson so nearly had a fourth wicket when Jayawardene escaped lbw, and the 121 deliveries then eaten up before Jordan instead got his man were crucial.