Niall Sludden's 64th-minute goal gave Tyrone a hard-earned 1-13 to 0-15 victory over Monaghan at Croke Park.
The resilient Farney County had just edged ahead for the first time by virtue of unanswered points from Conor McManus (2) and Kieran Hughes when the ball broke perfectly for Sludden in front of the Davin End goals and he slotted a soccer-style finish first time to the roof of the net.
The result was cruel on Monaghan, as they fell to a fourth successive defeat to the Red Hands at HQ and missed out agonisingly on what would have been only their second All-Ireland final appearance.
Instead, it's Mickey Harte's streetwise charges who advanced to a meeting with Dublin next month. It's the first time in history that a team that lost twice has ended up in an All-Ireland final.
At the end of a competitive, tough opening period, the sides turned around deadlocked on eight points apiece, with the Red Hands hitting seven first-half wides and dropping five shots short. The game was played on the winners' terms - defending deep and countering at pace - in the opening exchanges but the Farney County dug in gamely to keep themselves in the match.
Kieran McGeary and Lee Brennan were both parachuted into the Tyrone starting team at the eleventh hour in place of Mark Bradley and Rory Brennan, while Conor McCarthy - who slotted three first-half points - got the nod ahead of Dessie Mone in the Monaghan XV.
Monaghan's Fintan Kelly is surrounded by Tyrone players. ©INPHO/Oisin Keniry.
Colm Cavanagh fired the Red Hands ahead inside 20 seconds and Sludden and Connor McAliskey pointed either side of a McManus point before Frank Burns blasted a goal chance over the bar under Hill 16 to make it 0-4 to 0-1 after just four minutes.
Cathal McShane cancelled out McCarthy's first point as the patient, well-drilled, counter-attacking Red Hands continued to dictate the play and Sludden smashed over his second - off the outside of his right - in response to a steadying brace of McManus frees. A soft McAliskey free struck out Fintan Kelly's point after Niall Morgan had smothered a Vinny Corey goal chance.
A quickfire McCarthy brace drew Monaghan level for the first time in the 34th minute following an exchange between McManus (free) and Tiernan McCann. The massive Monaghan contingent amongst an attendance of 49,696 at HQ would have been delighted to turn around level at the short whistle.
McAliskey's brace had the winners two ahead within seven minutes of the restart and that gap remained as Rory Beggan and Brennan swapped frees. As the scores dried up, McManus won and converted a 55th-minute free to close the arrears to one and Monaghan led for the first time with nine minutes left following points from substitute Hughes and McManus (free).
Sludden's goal turned the game on its head and McManus replied from a free before Peter Harte slotted a brace - the first a free following a foul on Cavanagh - to leave three between them. Monaghan kept going and closed within the minimum again thanks to injury-time points from Kieran Hughes and Drew Wylie.
Only three minutes of injury time were added on at the end and the losers seemed to have won a late free when Hughes went down under pressure from McCann as Beggan skied a kick towards the Hill 16 posts - the referee pointed towards The Hill, seemingly indicating a free but instead he played on - and Tyrone advanced by the skin of their teeth.
Tyrone - N Morgan; M McKernan, R McNamee, K McGeary; T McCann (0-1), F Burns (0-1), P Harte (0-2, 1f); C Cavanagh (0-1), P Hampsey; M Donnelly, N Sludden (1-2), C McShane (0-1); L Brennan (0-1f), R Donnelly, C McAliskey (0-4, 2f). Subs: H Loughran for F Burns, M Bradley for L Brennan, R Brennan for R McNamee, C McCann for R Donnelly, D McClure for C McShane, R O'Neill for C McAliskey.
Monaghan - R Beggan (0-1f); K Duffy, D Wylie (0-1), R Wylie; C Walshe, V Corey, K O'Connell; N Kearns, D Hughes; R McAnespie, S Carey, C McCarthy (0-3); D Malone, F Kelly (0-1), C McManus (0-7, 6f). Subs: D Mone for D Malone, K Hughes (0-2) for S Carey, J McCarron for V Corey.
Referee - A Nolan.Tweet