Mahela Jaywardene's 30th Test match century took Sri Lanka to 289/8 on day one in Galle, as England's bowlers produced another excellent performance.
Jayawardene, in his first Test since resuming the captaincy from Tilakaratne Dilshan, reached a sublime unbeaten 168 by the close, but the rest of his batting line-up failed to take advantage on a flat deck.
James Anderson was the pick of the bowlers for England, taking 3/56, and Samit Patel celebrated his Test debut by collecting a couple of wickets.
A strong bowling effort was marred by four drops off Jayawardene though - two of them from a hapless Monty Panesar late in the day.
Anderson took two wickets and Stuart Broad one in the first three overs, as the hosts stumbled to 15/3 in the fourth over having won the toss and elected to bat.
Opener Lahiru Thirimane fell to Anderson, who then made a critical breakthrough, sending Kumar Sangakkara back to the pavilion next ball as the left hander played a lose drive through to Matt Prior.
And England completed a stunning start in the next over, when dangerous Dilshan was caught by Andrew Strauss at slip off Stuart Broad.
Jayawardene has found himself in any number of sticky situations over his career though, and he and Thilan Samaraweera set about rebuilding the innings, reaching a steady 66/3 by Lunch.
England had a stroke of luck after the interval though when Samaraweera was run out while backing up, Anderson accidentally deflecting a drive back onto the stumps behind him.
Dinesh Chandimal was aggressive in an innings of 27 which included two sixes - one of which got him off the mark - but fell to give Patel his first wicket in Tests.
England kept chipping away with Anderson trapping Prasanna Jaywardene LBW to earn a third wicket and Strauss cleverly ran out Randiv for just 12.
Patel picked up a second just before the new ball, Herath falling LBW, but at the other end Jaywardene continued in his graceful manner, striking 20 fours and three sixes in his seventh century in 20 Tests against England.
He was lucky towards the close, as Panesar reminded England fans of his poor history in the field with two drops, but with the next highest score from his team just 27, Sri Lanka can thank their captain for posting a decent score.