Mayo ended the reign of champions Dublin to set up a western seaboard All-Ireland final against Donegal.
A gripping Croke Park encounter saw James Horan’s men cling on for victory in the face of a furious Dubs fightback.
All six Mayo forwards scored, with Cillian O’Connor converting three ‘45s, as they built up a 0-12 to 0-06 half-time lead.
Mayo moved 10 clear, but Dublin fought back with a string of Bernard Brogan frees, but Mayo hung on to win 0-19 to 0-16.
In front of a bumper crowd of 81,364, Bernard Brogan stroked over a couple of 20-metre frees to get the Dubs going, but two sweetly struck ‘45s by Cillian O’Connor had the westerners level, before Michael Conroy shot them ahead in the 12th minute.
Alan Dillon’s creativity began to shine, and after punching over a point, he carved the opening for Barry Moran to thump over the score that made it 0-05 to 0-02 with 20 minutes played.
The Dubs were struggling for momentum, although Paul Flynn did smash a shot against the crossbar, and they went 17 minutes without scoring before Diarmuid Connolly angled over their first point from play.
Connolly and teenager Ciaran Kilkenny, a late pre-match replacement for Alan Brogan, hit the target to narrow the gap to one, but Mayo outscored the champions by six points to one in the last seven minutes of the half.
Kevin McLoughlin nailed two gems, O’Connor converted his third ’45, and Enda Varley struck a couple of scores, while at the back, Kevin Keane and Keith Higgins warmed to the contest with some assured defending.
Mayo held a deserved 0-12 to 0-06 interval lead, but with Alan Brogan in the game for the second half, Dublin narrowed the gap via a Stephen Cluxton ’45, after David Clarke had saved superbly from Connolly.
Referee Joe McQuillan flashed a rash of yellow cards as a tense contest threatened to boil over, and Mayo were soon back in control, exploiting alarming gaps in a disorientated Dublin defence.
O’Connor calmly stroked over two frees, substitute Richie Feeney also hit the target, and defensive lapses allowed O’Connor and Dillon in for scores to open up a massive 10 points lead.
Alan Brogan was forced to retire injured, but the Sam Maguire Cup holders pulled back scores through Cluxton and Kilkenny, before Paul Flynn landed a supber effort, and Bernard Brogan’s fourth free narrowed the gap to five with 15 minutes to play.
Injuries to Enda Varley and Kevin McLoughlin weakened Mayo’s attacking effort, and with Ger Brennan and James McCarthy driving the Sam Maguire Cup holders’ challenge from the back, the Dubs continued to build.
Brogan still hadn’t scored from play, but his fifth free made it a four points game with seven minutes to play
Goalkeeper Clarke rescued Mayo with a stunning save from Brogan, and at the other end, O’Connor’s bad miss allowed the Dubs off the hook
Mayo had gone 21 minutes without a score when O’Connor landed his sixth from a free, and it was Seamus O’Shea who kicked the insurance point in stoppage time.
Mayo scorers: C O’Connor 0-07 (3 ’45, 3f), A Dillon 0-03, K McLoughlin, E Varley (1f) 0-02 each, B Moran, M Conroy, R Feeney, S O’Shea, J Doherty 0-01 each.
Dublin scorers: B Brogan 0-06 (6f), C Kilkenny, S Cluxton (3 ’45) 0-03 each, D Connolly, P Flynn 0-02 each.
Dublin: S Cluxton, M Fitzsimons, R O'Carroll, C O'Sullivan, J McCarthy, G Brennan, K Nolan, E Fennell, D Bastick; P Flynn, MD Macauley, B Cullen, C Kilkenny, D Connolly, B Brogan.
Subs: A Brogan for Cullen, P McMahon for Fitzsimons, E O’Gara for Bastick, K McMemamin for A Brogan
Mayo: D Clarke, K Keane, G Cafferkey, K Higgins, L Keegan, D Vaughan, C Barrett, B Moran, A O'Shea, K McLoughlin, J Doherty, A Dillon, E Varley, C O'Connor, M Conroy.
Subs: R Feeney for Keegan, A Freeman for Varley (blood), C Boyle for McLoughlin (blood), J Gibbons for Feeney, S McHale for Keane, McLoughlin for Doherty, S O’Shea for A O’Shea