Bayern Munich will face either Hertha BSC or Borussia Dortmund in the DFB-Pokal final after they edged past Werder Bremen.
The visitors put in a battling performance but a brace from Thomas Müller quashed their hopes of making the showpiece fixture.
While Bayern dominated for large parts, Bremen would have felt hard done by when they had a goal disallowed and a dubious penalty given against them.
Both sides made changes from their wins at the weekend. Bayern, after toppling Schalke 04 by three goals to nil opted to bring in Javi Martinez, Xabi Alonso, Franck Ribery and Thomas Müller for Mehdi Benatia, Rafinha, Arturo Vidal and Douglas Costa - all four dropped to the bench.
Bremen, who had earned a huge 3-2 win over VfL Wolfsburg, replaced Alejandro Galvez and Santiago Garcia - both benched - with Papy Djilobodji and Janek Sternberg.
Bremen enjoy promising opening
The game didn't begin like a typical, tense semi-final encounter. The two teams were happy to come forward and attack, with Werder more than keen to pressure Bayern at every opportunity and make the most of any early sluggish play in the hosts' system. A lovely breakaway almost provided the Northerners with an opener, though Florian Grillitsch's ball was just too high for Zlatko Junuzovic.
It was a period of play that was proving devoid of any real clear-cut chances, with a midfield battle beginning to break up any openness that was prevalent in the early stages. The strength of the Bavarians was beginning to tell, though. Kingsley Coman sent a drive screaming over on the angle, but not before Felix Wiedwald and the Bremen defence managed to scramble his cross clear.
Müller gives Bayern the lead
Eventually their pressure paid dividends and it was Müller who struck first. From a corner the Bayern forward managed to wriggle free from Clemens Fritz, who then slipped in his attempts to recover. Müller made him pay, rising above the rest to power a downward header past Wiedwald. The visitors' stopper managed to get a hand to it, but was unable to claw the header back out.
Müller had another chance just moments later to double his tally. He could only drag his shot past the post, however, in what was a major let off for the visitors. They would have a huge chance of their own to get back in the game as Sambou Yatabare picked up on a loose ball with Manuel Neuer off his line. Unfortunately for the midfielder, Neuer was able to scuttle back and save with ease; at the break, both sides had their chances but it was Bayern who had the lead.
Bremen begin their fightback
The second half picked up where the first left off, with Bayern coming forward in waves. Fritz, who had already seen yellow in the first half, was slightly fortunate not to be booked for a second time after a strong follow-through on Mario Götze. Junuzovic offered some momentary resistance for his side, although a lovely turn was capped off with a wild and wayward shot.
What was momentary soon turned into a real threat when Yatabare's unconventional back-heel managed to thread through Theodore Gabre Selassie down the right. His cross flashed across the face of goal, with Jannik Vestergaard inches away from finding the equaliser.
Hosts grab slice of luck
The Bremen frustrations grew further when a David Alaba own-goal was ruled out. The Austrian managed to flick the ball over Neuer when under pressure, though Tobias Stieler felt he had been impeded by Fin Bartels - a debatable decision.
To add insult to injury and rub salt in the wounds, Bayern earned a penalty for a clear Arturo Vidal dive. Not even the most staunch home fan would have begrudged a yellow card for the Chilean, but instead Stieler pointed to the spot. Müller stepped up and duly converted, and the visitors had the wind taken from their sails.
Try as they might, Viktor Skripnik's side couldn't force a goal back and the Bundesliga leaders strolled the remaining 20 minutes. They advance to Berlin but were given a real run for their money by the opposition. For Bremen, their attentions turn back to surviving in the top tier