Rangers will play Hearts in the final of the Scottish Cup on 21 May after coming from behind to beat Celtic in extra time of a relentless and pulsating Old Firm derby.
Celtic defender Carl Starfelt turned Calvin Bassey's cross into his own net with five minutes of extra time left to send the blue end of Hampden wild.
It sealed an impressive turnaround for the Ibrox side, who fell behind to Greg Taylor's goal in the second half before Scott Arfield equalised, and a chance at a first domestic cup for 11 years.
The rousing comeback also ends Celtic's hopes of a fifth domestic treble in six seasons, having already won the League Cup this season and with a six-point lead in the Scottish Premiership.
Rangers' performance was especially impressive given they were taken to extra time on Thursday in their Europa League quarter-final against Braga, as they also stopped their rivals from making it 19 straight wins at Scotland's national stadium.
With Hampden a cauldron of colour and noise, it was no surprise the game was filled with crunching tackles, mistakes, and nerve-shredding tension.
When the smoke which billowed from the pre-match pyrotechnics finally cleared, the action started and never really let up. Despite their European exploits, Rangers looked fresh as they shut down Celtic's midfield and hampered their build up.
Joe Aribo had two headed chances to give them a deserved lead, and John Lundstram's curling effort cracked a post as they came close to adding the gloss to a disciplined, if frantic, first period.
But Celtic, who have made Hampden their fortress in the last decade, came back in the second half when Callum McGregor's quick free quick caught out Rangers, and Taylor fired beyond Jon McLaughlin with the help of a deflection off Bassey.
On an afternoon when Ange Postecoglou's side looked less sure of themselves, they might have been 2-0 up and on course for the final had Cameron Carter-Vickers' close-range shot cannoned off the bar.
But instead Arfield swept home the equaliser from James Tavernier's cross with 12 minutes left, and from there it was Rangers who looked the side with more energy and intent heading into extra time, dismissing any notion they would fade.
Tavernier and Fashion Sakala were denied by Joe Hart in extra-time, before some quick thinking by Glen Kamara released Bassey down the left, and his low delivery was prodded by Starfelt beyond his own goalkeeper under pressure from Sakala.
The explosion of noise in the Rangers end was something to behold as their decade-long pain in the cups comes another step closer to ending after a game where they had to dig incredibly deep to get the job done.
Man of the match - John Lundstram
The Rangers midfielder was everywhere and played a key role in shutting down Celtic in midfieldWhat did we learn?
After back-to-back derby defeats in 2022, Rangers ceded the league lead to Celtic and there was a general malaise about their domestic form, in stark contrast to their Europa League run, which will continue in the semi-finals against RB Leizpig.
But to get off the floor here, especially given they had won just two of their last 11 games at Hampden, with 120 minutes already in the legs from three days prior, was a hugely impressive feat.
All of the substitutes made a huge contribution. Steven Davis brought calm amid the storm and tired legs, Kamara's quick thinking set up the goal, while Arfield scored and Sakala was the man who forced the winner.
That was in contrast to Celtic, who seemed to suffer when Stephen Welsh and Anthony Ralston came on in the full-back positions.
Matt O'Riley did make a difference, but overall this was a reminder there is work to do with their squad building. They also looked short of ideas when Rangers were able to shut them down for long spells.
They'll need to quickly refocus with another derby to come in the league to make sure they press home their league advantage and end the season with the league title.
What's next?
Celtic will look to re-affirm their six-point lead at the top of the Scottish Premiership next Sunday when they face Ross County in Dingwall (14:30 BST), while Rangers are scheduled to be away to Motherwell just before (12:00). They have asked for that game to be brought forward to the Saturday, though.
helpHow to play
Rate players out of 10 throughout or after the game. The rater will close 30 minutes after the final whistle.
Rating range key1 = Give it up10 = Pure perfection
Celtic
Squad number15Player nameHart
Squad number88Player nameJuranovic
Squad number20Player nameCarter-Vickers
Squad number4Player nameStarfelt
Squad number3Player nameTaylor
Squad number18Player nameRogic
Squad number42Player nameMcGregor
Squad number41Player nameHatate
Squad number11Player nameAbada
Squad number38Player nameMaeda
Squad number17Player nameJota
Squad number8Player nameFuruhashi
Squad number14Player nameTurnbull
Squad number33Player nameO'Riley
Squad number49Player nameForrest
Squad number56Player nameRalston
Squad number57Player nameWelsh
Rangers
Squad number33Player nameMcLaughlin
Squad number2Player nameTavernier
Squad number6Player nameGoldson
Squad number3Player nameBassey
Squad number31Player nameBarisic
Squad number8Player nameJack
Squad number4Player nameLundstram
Squad number16Player nameRamsey
Squad number17Player nameAyodele-Aribo
Squad number14Player nameKent
Squad number25Player nameRoofe
Squad number10Player nameDavis
Squad number18Player nameKamara
Squad number23Player nameWright
Squad number26Player nameBalogun
Squad number30Player nameSakala
Squad number37Player nameArfield
Line-ups
Celtic
Formation 4-3-3
15Hart
88Juranovic20Carter-Vickers4Starfelt3Taylor
18Rogic42McGregor41Hatate
11Abada38Maeda17Neves Filipe
15Hart88JuranovicSubstituted forRalstonat 67'minutesBooked at 120mins20Carter-Vickers4Starfelt3TaylorSubstituted forWelshat 90'minutes18RogicSubstituted forFuruhashiat 58'minutes42McGregorBooked at 40mins41HatateSubstituted forTurnbullat 109'minutes11AbadaSubstituted forO'Rileyat 58'minutes38MaedaSubstituted forForrestat 90'minutes17Neves FilipeSubstitutes
2Jullien8Furuhashi14Turnbull16McCarthy19Johnston21Ideguchi29Bain33O'Riley49Forrest56Ralston57WelshRangers
Formation 4-2-3-1
33McLaughlin
2Tavernier6Goldson3Bassey31Barisic
8Jack4Lundstram
16Ramsey17Ayodele-Aribo14Kent
25Roofe
33McLaughlin2Tavernier6GoldsonBooked at 72mins3BasseyBooked at 117mins31BarisicSubstituted forBalogunat 109'minutes8JackBooked at 45minsSubstituted forDavisat 75'minutes4LundstramSubstituted forKamaraat 102'minutes16RamseySubstituted forWrightat 43'minutes17Ayodele-AriboBooked at 36minsSubstituted forArfieldat 75'minutes14Kent25RoofeBooked at 49minsSubstituted forSakalaat 109'minutesSubstitutes
1McGregor9Diallo10Davis18Kamara19Sands23Wright26Balogun30Sakala37Arfield51Lowry61KingLive Text
Match ends, Celtic 1, Rangers 2.
Second Half Extra Time ends, Celtic 1, Rangers 2.
Ryan Kent (Rangers) wins a free kick on the left wing.
Foul by Cameron Carter-Vickers (Celtic).
Glen Kamara (Rangers) wins a free kick in the defensive half.
Foul by Matt O'Riley (Celtic).
Attempt blocked. Ryan Kent (Rangers) left footed shot from outside the box is blocked. Assisted by Scott Wright.
Anthony Ralston (Celtic) is shown the yellow card for a bad foul.
Scott Arfield (Rangers) wins a free kick in the attacking half.
Foul by Anthony Ralston (Celtic).
Steven Davis (Rangers) wins a free kick on the left wing.
Foul by David Turnbull (Celtic).
Calvin Bassey (Rangers) is shown the yellow card.
Corner, Rangers. Conceded by Stephen Welsh.
Own Goal by Carl Starfelt, Celtic. Celtic 1, Rangers 2.
Ryan Kent (Rangers) wins a free kick in the defensive half.
Foul by Stephen Welsh (Celtic).
Foul by Calvin Bassey (Rangers).
James Forrest (Celtic) wins a free kick on the right wing.
Corner, Rangers. Conceded by Cameron Carter-Vickers.