Bayern Munich suffered back-to-back Bundesliga defeats for the first time since November 2011 as Borussia Dortmund cruised to victory.
Pep Guardiola’s champions fell behind after Henrikh Mkhitaryan coolly stroked home a fine left-foot finish.
Bayern fell further behind at the Allianz Arena when Marco Reus scored after Franck Ribery lost possession.
Dortmund wrapped up the points when Jonas Hofmann found the net before Bayern’s Rafinha was sent off.
Bayern Munich have been 1-0 behind in their last five competitive matches. The last time this happened was 2001.
It completed a frustrating game for Bayern, who started with Toni Kroos, Thomas Muller and Jerome Boateng on the bench ahead of Wednesday’s German Cup semi-final with Kaiserslautern.
The hosts, who have now lost both league games since being crowned German champions last month, were a shadow of the team who has dominated on the domestic and European stage this season.
While Bayern lost at home in the league for the first time since October 2012, this result will at least soften the blow for second-placed Dortmund after a one-sided title race. Despite victory, Jurgen Klopp’s side are 17 points behind the champions with five games of the league season remaining.