Manchester City have kept their hopes of an unprecedented quadruple alive by reaching the final of the EFL Cup courtesy of a 5-3 aggregate victory over Bristol City, winning 3-2 in this evening's second leg at Ashton Gate.
Lee Johnson's Championship promotion hopefuls gave a good account over both legs - only losing the first 2-1 to a last-gasp Sergio Aguero header - but goals from Leroy Sane and Aguero either side of half time in this evening's second leg saw the Premier League outfit take control of the tie.
Marlon Pack responded by halving the deficit on the night shortly after the hour mark, and that looked like being merely a consolation until Aden Flint raised hopes of an astonishing comeback with a 94th-minute goal to level things up at 2-2.
That left the hosts needing just one more goal to force extra time, but it was the visitors who got the fifth of the evening when Kevin De Bruyne immediately restored Man City's lead on the night and their two-goal aggregate advantage.
Man City - who lead the way in the Premier League and are still in the FA Cup and Champions League too - will face either Arsenal or Chelsea in the final at Wembley on February 25.
Man City boss Pep Guardiola named a strong lineup with only two changes from his side's Premier League victory over Newcastle United at the weekend as the likes of De Bruyne, David Silva and hat-trick hero Aguero all retained their places.
Despite such a formidable attack, the visitors found clear chances difficult to come by in the first half as Bristol City held firm against wave after wave of Man City pressure.
The first major scare for the hosts came in unorthodox fashion when Aguero's cross drifted towards goal rather than into the middle, glancing the crossbar before eventually being dealt with by the Bristol City defence.
John Stones came close to getting on the end of a Silva cross moments later, but it wasn't until just before half time that Bristol City keeper Luke Steele was forced into his first save of the contest.
Sane poked the ball into the path of the overlapping Silva on the left channel, but the Spaniard's low drive across the face of goal was pushed away from both the bottom corner and the advancing Aguero by Steele.
Man City were mostly limited to long-range attempts in the opening 45 minutes, though, and Silva dragged another one wide of the target two minutes later before Fernandinho also failed to hit the target from outside the area.
Bristol City's one and only shot of the first half arrived from a throw-in as Hordur Magnusson hauled the ball into the box for Flint to flick on with a backward header, but Claudio Bravo was able to pluck it out of the air.
De Bruyne and Aguero then became the latest players to miss the target for Man City, but a rare defensive lapse from the home side did allow the Premier League leaders to finally make the breakthrough just two minutes before half time.
Magnusson turned down the chance to clear the ball out for a throw-in from inside his own area and was subsequently caught in possession by Bernardo Silva, who smuggled the ball back for Sane to sweep home despite the best efforts of Flint on the line.
The goal sent Bristol City into the break knowing that they would need two goals just to force extra time, but it was Man City who picked up where they left off at the start of the second half with Aguero drawing a save from Steele within seconds of the restart.
The visitors looked eager to kill the tie off in the opening stages of the second half, and Aguero seemingly did that in the 50th minute when he latched on to De Bruyne's through-ball before applying an unerring finish to a devastating Man City counter-attack.
Having struggled to break through for much of the first half, suddenly Man City looked capable of scoring every time they came forward and De Bruyne drew another save from Steele before Sane fired a volley well off target from the left channel.
Bristol City did soon begin to fight back, though, and substitute Famara Diedhiou drew the first meaningful save from Bravo shortly before the hour mark.
The hosts went one better and got a goal back in the 64th minute too, with Pack climbing highest in the area to plant a firm header from Jamie Paterson's cross past the Man City keeper and into the corner.
The Robins still needed two goals simply to force extra time, though, and they immediately found themselves on the back foot again as Aguero fired over just a minute later before Steele needed to get down well to stop Flint from turning the ball into his own net from Kyle Walker's cross.
It looked increasingly like Pack's header was only a consolation rather than a ray of hope, but Man City missed two good chances to kill the tie off once and for all in the closing stages when Danilo fired just wide of the far post and Bernardo saw his shot deflected off target with the hosts scrambling back onto the line.
There was still time for plenty of stoppage-time drama, though, as Bristol City threatened to pull off another memorable late show as they did against City's local rivals Manchester United in the quarter-finals.
Flint pulled the home side level on the night - and just one goal short on aggregate - in the fourth minute of added-on time when he stayed onside to tap home into an unguarded net from close range after Bobby Reid had nodded the ball back across goal.
Bristol City immediately threw caution to the wind, but they paid for that within minutes as Man City won the ball back high up the field, with Sane setting up De Bruyne for a simple finish to kill the hosts' valiant resistance once and for all.
The final, which will take place on February 25, will provide Guardiola with a chance to win his first piece of silverware at Man City following a trophiless debut season, with either Arsenal or Chelsea providing the opposition.
The two London rivals will face off in the second leg of their semi-final on Wednesday night, with that tie locked at 0-0 after the first leg.
BRISTOL CITY (4-5-1): Steele; Smith, Flint, Wright, Magnusson (Baker, 46'); Paterson (Kent, 73'), Brownhill, Pack, Walsh (Diedhiou, 46'), Bryan; Reid
MAN CITY (4-3-3): Bravo; Walker (Danilo, 85'), Stones, Otamendi, Zinchenko; De Bruyne, Fernandinho, Silva; Bernardo, Aguero (Gundogan, 82'), Sane