England captain Joe Root scored a double-century, but Sri Lanka began a spirited fight-back to close day three of the first test in Galle.
The hosts will resume on Sunday 156/2 in their second innings, trailing the visitors by 130 runs.
Opener Lahiru Thirimanne anchored the Sri Lanka innings with an unbeaten 76 and will be joined at the crease by night-watchman Lasith Embuldeniya, who has yet to score.
It was a vastly improved effort on the home side's first innings score of 135, as they chase down England's total of 421.
Kusal Perera (62) was the first wicket to fall, caught at deep point by Jack Leach after trying to launch seamer Sam Curran to the boundary.
Spinner Leach then had the out-of-form Kusal Mendis caught by wicketkeeper Jos Buttler for 15 shortly before bad light took the players from the field.
Root was disappointed his side did not make further inroads on a turning wicket, but it was still a memorable day for him as he brought up his fourth test double-ton with a score of 228.
He also became the seventh English batsman to pass 8,000 test runs but was the last man out, caught on the mid-on boundary off spinner Dilruwan Perera (4/109), whose excellent performance on the third morning kept England somewhat in check.
Root's control and ability to sweep Sri Lanka's spinners pointed to a strong return to form after he went throughout 2020 without reaching three figures.
England resumed the third morning on 320/4 as Root and Buttler (30) scored 52 runs in quick time before Sri Lanka received a bit of luck.
A massive six from Root into the stands left the ball out of shape. When it was replaced, the home side suddenly found movement that had been lacking up to that point.
Seamer Asitha Fernando (2/44) removed Buttler and Curran in successive balls, before Dom Bess was run out in a mix-up with Root as the visitors lost three wickets for 10 runs.
Perera then removed the final three batsmen as the home side picked up six wickets for 101 more runs in the morning session.