Borussia Dortmund suffered a severe setback in the Bundesliga title race when their shock 4-2 home loss to lowly Schalke in the Ruhr valley derby on Saturday left them a point behind leaders Bayern Munich.
Dortmund, who had two players sent off, are on 69 points, with three games left to play, with Bayern, who face strugglers Nuremberg on Sunday, on 70.
The Bavarians will open up a four-point lead with a win on Sunday, leaving Dortmund hoping that Bayern might slip up twice in the remaining three games.
Schalke are now all but certain of staying up, having moved up to 30 points in 15th place, nine ahead of the relegation playoff spot occupied by Stuttgart, who are in action against Borussia Moenchengladbach later on Saturday.
Daniel Caligiuri's 18th-minute penalty drew the visitors level after Mario Goetze's close-range header from a superb Jadon Sancho assist had put Dortmund in front in the 14th.
Salif Sane's powerful header from a Caligiuri corner in the 28th made it 2-1 for Schalke, who looked nothing like the team that have been battling to avoid relegation much of this season.
Disciplined at the back and waiting for their chances on the break, Schalke were able to successfully soak up attack after attack from Dortmund, who had more than 75 percent of possession in the first half but clearly lacked the final pass.
Things took a turn for the worse after the break with Dortmund captain Marco Reus sent off on the hour with a straight red card for a studs-up challenge on Suat Serdar.
Caligiuri curled the resulting free kick into the top corner before Dortmund were reduced to nine men with Marius Wolf getting his marching orders in the 65th for another rough challenge on Serdar.
Dortmund gave it all they had and Axel Witsel cut the deficit in the 85th minute but Breel Embolo netted Schalke's fourth goal a minute later to seal a memorable derby win in what has otherwise been a disappointing season for last year's league runners-up.
RB Leipzig made sure of their top-four finish and a return to the Champions League by beating Freiburg 2-1 to remain in third place on 64, 10 ahead of fourth-placed Eintracht Frankfurt.