Kumar Sangakkara's first century at Lord's led Sri Lanka to 415 for 7 at stumps and within 160 of England's first innings after three days of the first Test on Saturday.
Sangakkara cruised to his 36th Test century, and helped Sri Lanka sail past the follow-on mark after England declared at 575 for 9 on Friday.
England's total didn't look so imposing on Saturday as all of Sri Lanka's top order delivered.
Resuming from 140 for 1 overnight, Sri Lanka opener Kaushal Silva was first to depart in the morning after a patient 63, nicking a James Anderson bouncer.
Mahela Jayawardene joined Sangakkara, and the stalwarts led their side safely to lunch and beyond.
Sangakkara raised his century off 182 balls with a four through the covers off Joe Root. Sangakkara raised his arms and Jayawardene jumped on his back.
They added 126 for the third wicket until Jayawardene was dismissed for 55 by Stuart Broad, after a review.
Lahiru Thirimanne scored only 2 before he became Anderson's second wicket, then captain Angelo Mathews joined Sangakkara and they immediately fell into synch.
They put up 96 together when Sangakkara tried to cut Moeen Ali only to top edge to wicketkeeper Matt Prior at 385 for 5. Sangakkara's 147 came from 258 deliveries, and included 16 boundaries. The Lord's crowd gave him rapturous applause.
Prasanna Jayawardene made 6 before falling to Liam Plunkett, with Ian Bell taking a good reaction catch at leg slip, and Chris Jordan took his second England wicket when Nuwan Kulasekara edged behind on 4.
Mathews finished the day unbeaten with a defiant 79, with Rangana Herath yet to get off the mark.
England's bowlers looked like they were going to make an impact with the new ball taken in the 81st over, but generally struggled as Sri Lanka's did on a flat pitch.