Borussia Monchengladbach moved off the bottom of the Bundesliga thanks to a surprise 1-0 win over leaders Borussia Dortmund which keeps the league title race open for another week.
Mohamadou Idrissou's goal after 35 minutes was enough to win the game for the Foals and take them above St Pauli, still four points from safety with three games of the season remaining.
Dortmund's lead at the top of the table has now been cut to five points as a result of this defeat and Bayer Leverkusen's 2-1 home victory over Hoffenheim earlier in the day.
Gyfli Thor Sigurdsson gave Hoffenheim the lead after 28 minutes before Michal Kadlec equalised after 40 minutes and Arturo Vidal pushed Leverkusen ahead early in the second half.
Bayern Munich needed a late penalty to secure a 1-1 draw at struggling Eintracht Frankfurt.
Sebastian Rode gave Frankfurt the lead after 54 minutes before Mario Gomez equalised from the spot in the 89th minute.
Bayern, who struggled to create chances, had cried out for a penalty in the 83rd minute but were not given it despite a clear handball by Frankfurt's Ricardo Clark in the area, but the ref pointed to the spot when Martin Fenin was ruled to have fouled Luiz Gustavo in the box in the dying minutes.
Schalke lost 1-0 in their final game before the Champions League semi-final showdown with Manchester United, suffering a home defeat to Kaiserslautern for the first time in 11 years. Srdjan Lakic's goal in the 42nd minute was enough for the visitors, who last won in Gelsenkirchen on April 8, 2000.
Claudio Pizarro struck twice in as many minutes to secure Werder Bremen a 3-1 victory at St Pauli that almost certainly ends any relegation fears.
St Pauli had led through Fin Bartels's 29th-minute opener but Bremen were level on 50 minutes thanks to a Markus Thorandt own goal. That set the stage for former Bayern Munich striker Pizarro to grab the points with his goal after 73 and 74 minutes.
Stuttgart eased to a 3-0 victory over Hamburg courtesy of two Cacau goals either side of a Christian Gentner effort.