Match ends, Livingston 0, Rangers 3.
Rangers are one game away from completing an unbeaten Scottish Premiership campaign after breezing past Livingston.
James Tavernier put the champions in front from the penalty spot after keeper Max Stryjek felled Ianis Hagi.
Ryan Kent finished a one-two with Alfredo Morelos by tapping in the visitors' second and Hagi slammed in their third.
Scott Pittman and Jaze Kabia hit the woodwork in Livi's best chances.
Steven Gerrard's Rangers, who set a new Scottish record of clean sheets in a 38-game season with 25, will receive the Premiership trophy after Saturday's home match with Aberdeen.
Livingston remain in contention to jump above their next opponents St Johnstone into fifth place, with the sides level on points and Saints two goals better off.
Jay Emmanuel-Thomas troubled Rangers in the early stages, creating space for Josh Mullin to force a save from Jon McLaughlin.
Hagi and Kent flashed shots wide of the Livingston goal before the first half's most contentious moment.
Kemar Roofe flicked the ball through for Hagi in behind the Livingston defence and the Romanian played the ball before he and Stryjek collided. Referee Don Robertson regarded it as a foul, despite protests that Hagi had knocked the ball wide.
Tavernier, having missed his past three penalties, stepped up and converted to the goalkeeper's right - his 19th goal this season.
And the club captain was involved in the second goal, his ball over the top finding Kent. The winger tried to lay off for Morelos but forced the striker wide then received the return pass to finish.
Livingston were inches away from halving their deficit on two occasions. Pittman's shot rattled the bar and Rangers keeper Jon McLaughlin forced the ball clear under pressure from the chasing pack.
Then substitute Kabia was presented with their best chance after Nicky Devlin's deflected cross, the forward only able to hit the outside of the left-hand post.
Joe Aribo tested Stryjek moments later and Kabia was off target when he latched on to another Devlin delivery at the other end.
Rangers completed the scoring with a swift move on the left, Roofe's replacement Cedric Itten squaring for Hagi to apply a ruthless finish.
Man of the match - James Tavernier

What did we learn?
Livingston's mid-season 14-match unbeaten run has been the catalyst for their top-half finish but they have won just once since that sequence ended in early February.
Emmanuel-Thomas is a commanding presence in attack, but needs more support from wide areas if Livingston are to finish the season on a high.
Amid injuries and substitutes, Rangers listed only six substitutes and midfielder Aribo played in an unfamiliar left-back role.
He looked far from out of place but there was a deliberate ploy from the visitors to attack on the other side with Tavernier, Kent and Hagi - a tactic that stretched the hosts.
What did they say?
Livingston manager David Martindale: "Wee bit disappointed. I'm quite happy with the performance in spells in the game. Rangers were far more clinical in our box.
"We had more than enough chances to take something from the game. We've hit the bar, we've hit the post, we've also had another chance."
Rangers manager Steven Gerrard: "Tonight we get the clean sheet record and Saturday gives us the opportunity to go break 100 points, which will round off an incredible league campaign.
"Our record at home has been ever so strong - we just need to go and do the final piece now."
What's next?
Rangers complete their campaign against Aberdeen on Saturday (12:30 BST) while Livingston play their last game of the season away to St Johnstone on Saturday (12:30).
Player of the match
PoplatnikMatej Poplatnik
Livingston
Avg
- Squad number15Player namePoplatnikAverage rating
7.93
- Squad number6Player nameBartleyAverage rating
7.04
- Squad number21Player nameMcMillanAverage rating
6.94
- Squad number25Player nameEfe AmbroseAverage rating
6.92
- Squad number37Player nameKabiaAverage rating
6.75
- Squad number5Player nameFitzwaterAverage rating
6.65
- Squad number18Player nameHoltAverage rating
6.53
- Squad number9Player nameEmmanuel-ThomasAverage rating
6.42
- Squad number10Player nameSibbaldAverage rating
6.39
- Squad number8Player namePittmanAverage rating
6.39
- Squad number28Player nameDianiAverage rating
6.35
- Squad number23Player nameLongridgeAverage rating
6.31
- Squad number27Player nameGuthrieAverage rating
6.30
- Squad number14Player nameMullinAverage rating
6.28
- Squad number2Player nameDevlinAverage rating
6.11
- Squad number32Player nameStryjekAverage rating
5.91
Rangers
Avg
- Squad number14Player nameKentAverage rating
6.60
- Squad number10Player nameDavisAverage rating
6.53
- Squad number2Player nameTavernierAverage rating
6.49
- Squad number7Player nameHagiAverage rating
6.32
- Squad number9Player nameDefoeAverage rating
6.26
- Squad number20Player nameMorelosAverage rating
6.24
- Squad number6Player nameGoldsonAverage rating
6.21
- Squad number18Player nameKamaraAverage rating
6.16
- Squad number17Player nameAriboAverage rating
6.15
- Squad number33Player nameMcLaughlinAverage rating
6.14
- Squad number11Player nameIttenAverage rating
6.10
- Squad number25Player nameRoofeAverage rating
6.06
- Squad number61Player nameKingAverage rating
5.92
- Squad number4Player nameSimpsonAverage rating
5.91
- Squad number23Player nameWrightAverage rating
5.87
- Squad number24Player nameStewartAverage rating
5.85
Line-ups
Livingston
Formation 4-2-3-1
- 32StryjekBooked at 41mins
- 2Devlin
- 5FitzwaterSubstituted forAmbroseat 85'minutes
- 27Guthrie
- 23Longridge
- 8PittmanBooked at 31mins
- 18HoltSubstituted forBartleyat 60'minutes
- 10SibbaldSubstituted forMcMillanat 61'minutes
- 28Diani
- 14MullinSubstituted forKabiaat 60'minutes
- 9Emmanuel-ThomasSubstituted forPoplatnikat 74'minutes
Substitutes
- 4Lithgow
- 6Bartley
- 11Forrest
- 12Serrano
- 15Poplatnik
- 21McMillan
- 25Ambrose
- 37Kabia
- 40Maley
Rangers
Formation 4-3-3
- 33McLaughlin
- 2Tavernier
- 6Goldson
- 4SimpsonBooked at 23mins
- 17AriboSubstituted forKingat 86'minutes
- 18Kamara
- 7HagiSubstituted forStewartat 86'minutes
- 10Davis
- 25RoofeSubstituted forIttenat 80'minutes
- 20MorelosBooked at 30minsSubstituted forDefoeat 80'minutes
- 14KentSubstituted forWrightat 84'minutes
Substitutes
- 1McGregor
- 9Defoe
- 11Itten
- 23Wright
- 24Stewart
- 61King
- Referee:
- Don Robertson
Match Stats
- Possession
- Home30%
- Away70%
- Shots
- Home9
- Away11
- Shots on Target
- Home2
- Away5
- Corners
- Home1
- Away5
- Fouls
- Home13
- Away10
Live Text
Post update
Full Time
Second Half ends, Livingston 0, Rangers 3.
Post update
Attempt missed. Cedric Itten (Rangers) right footed shot from the left side of the box is just a bit too high. Assisted by Connor Goldson following a corner.
Post update
Corner, Rangers. Conceded by Efe Ambrose.
Post update
Hand ball by Greg Stewart (Rangers).
Post update
Attempt missed. Jon Guthrie (Livingston) right footed shot from the centre of the box is too high. Assisted by Jaze Kabia with a cross.
Post update
Foul by Connor Goldson (Rangers).
Post update
Matej Poplatnik (Livingston) wins a free kick on the right wing.
Post update
Foul by Cedric Itten (Rangers).
Post update
Marvin Bartley (Livingston) wins a free kick on the left wing.
Substitution
Substitution, Rangers. Leon Thomson King replaces Joe Aribo.
Substitution
Substitution, Rangers. Greg Stewart replaces Ianis Hagi.
Post update
Attempt missed. Jon Guthrie (Livingston) header from the centre of the box misses to the right. Assisted by Jaze Kabia with a cross following a corner.
Substitution
Substitution, Livingston. Efe Ambrose replaces Jack Fitzwater.
Post update
Corner, Livingston. Conceded by James Tavernier.
Substitution
Substitution, Rangers. Scott Wright replaces Ryan Kent.
Goal!
Goal! Livingston 0, Rangers 3. Ianis Hagi (Rangers) right footed shot from the centre of the box to the bottom left corner. Assisted by Cedric Itten.
Post update
Connor Goldson (Rangers) wins a free kick in the defensive half.
Post update
Foul by Scott Pittman (Livingston).
Substitution
Substitution, Rangers. Cedric Itten replaces Kemar Roofe.