Wicketkeeper-batsman Niroshan Dickwella hit a run-a-ball 64 not out in the second Test to help Sri Lanka reach an imposing 6-469 at stumps on the second day against Bangladesh.
Sri Lanka had lost two wickets in successive overs on Friday with their first-innings score on 382, but Dickwella's knock wrestled back the initiative.
The aggressive left-hander unveiled a host of unconventional strokes and Bangladesh captain Mominul Haque was running out of ideas to contain him.
Dickwella was particularly harsh on the spinners, sweeping the first ball he faced - from Mehidy Hasan - to the square leg boundary and he continued to relish playing sweep and slog-sweep shots along with some elegant drives.
His adventures continued against pace as well as he frequently played the ramp shot to the vacant third man boundary, much to the frustration of the opposition.
Soon after tea, Dickwella was given out leg before wicket to Taijul Islam when on 32, but he successfully reviewed the decision and reached his 18th half-century in just 48 balls.
Together with rookie Ramesh Mendis, Dickwella has added 87 so far for the seventh wicket as Sri Lanka edged closer to the 500 mark.
Dickwella is chasing his first Test hundred, having been dismissed twice this year in the 90s.
Mendis, who was dropped on 12 at second slip, was 22 not out as play was called off early due to bad light.
In the morning, Oshada Fernando had steadied the Sri Lankan innings, adding 104 for the second wicket with Lahiru Thirimanne, who was eventually dismissed by Taskin Ahmed for 140.
Fernando was dismissed when wicketkeeper Liton Das moved across and completed the catch after the ball hit the pad and deflected off the back of Fernando's bat. His 81 came off 221 balls with eight boundaries.
Sri Lanka are in a strong position with the wicket offering much more turn and bounce for the spinners than the drawn first Test.
Only 65.5 overs were possible on Friday and 98 overs are scheduled to be bowled on Saturday to make up for lost time.