Borussia Dortmund's Bundesliga title hopes suffered a significant setback as Schalke stormed to a 4-2 derby win over their nine-man hosts at Signal Iduna Park.
In an action-packed Revierderby it was Dortmund who struck first, Mario Gotze nodding home a Jadon Sancho pass.
In the celebration, the England international was hit by a pocket lighter thrown from the crowd, but the winger was able to continue.
Daniel Caligiuri equalised with a penalty and Schalke then took the lead through Salif Sane before Dortmund had Marco Reus sent off.
Caligiuri fired in his second and Schalke's third before Marius Wolf received Dortmund's second red card.
In the final minutes Axel Witsel pulled one back before Breel Embolo restored Schalke's two-goal cushion.
Defeat means second-placed Dortmund could find themselves four points behind Bayern Munich by the end of the weekend, should the leaders win their game in hand against Nurnberg on Sunday, while Schalke took a significant step to guaranteeing safety, moving nine points ahead of Stuttgart in the relegation play-off place.
Gotze opened the scoring in the 13th minute following a perfectly-weighted chipped pass from Sancho. The German was able to comfortably nod it over the goalkeeper as the Englishman recorded his 14th assist of the season.
Minutes later Schalke struck back, Caligiuri sending the goalkeeper the wrong way from the spot after the referee awarded a penalty following a VAR review for a handball by Julian Weigl.
The visitors struck again in the 27th minute, Caligiuri turning provider, crossing for Sane to send a header into the corner.
Dortmund's hopes took another blow when Reus was sent off in the 57th minute for a challenge on Suat Serdar.
And moments later Schalke extended their lead with their first clear chance of the second half, Caligiuri curling a free-kick into the top corner.
The home side's discipline deserted them completely as Marius Wolf also received his marching orders for a foul on Serdar, reducing them to to nine men in the 65th minute.
Dortmund still pulled a goal back with six minutes left, Witsel tapping in at the far post.
Schalke, however, responded just over a minute later, Embolo taking a touch on the edge of the area before firing past Roman Burki in the Dortmund net.