Match ends, Borussia Dortmund 1, TSG 1899 Hoffenheim 0.
Borussia Dortmund moved off the bottom of the Bundesliga as midfielder Ilkay Gundogan's diving header secured only their second league win in 11 matches.
The Germany international, 24, met Pierre-Emerick Aubameyang's right-wing cross at the far post to nod in.
Dortmund boss Jurgen Klopp showed his relief by racing down the touchline and jumping into the air to celebrate.
Aubameyang had two second-half strikes disallowed for offside as Dortmund dominated but missed a host of chances.
The final whistle was met by huge cheers from the 80,000 home fans at Signal Iduna Park, with a relieved Klopp turning to his bench and hugging members of his backroom staff.
It was a comfortable home victory for last season's runners-up, who climb five places to 13th ahead of the Bundesliga's remaining weekend fixtures.
Klopp, who steered Dortmund to back-to-back German titles in 2011 and 2012, insisted he would not quit after his team made their worst start to a top-flight season.
But, despite losing eight of their opening 14 league matches, Dortmund have cruised into the Champions League knockout phase by winning four of their five Group D matches.
- 5KehlBooked at 23mins
- 17AubameyangSubstituted forImmobileat 90+2'minutes
- 8GündoganSubstituted forGinterat 90+1'minutes
- 20RamosSubstituted forGroßkreutzat 83'minutes
- 25SüleBooked at 26mins
- 16SchweglerBooked at 63minsSubstituted forSalihovicat 78'minutesBooked at 85mins
- 8PolanskiBooked at 88mins
- 6RudySubstituted forElyounoussiat 78'minutes
- 9SchipplockSubstituted forModesteat 45'minutes
- Felix Zwayer
- Shots on Target
Second Half ends, Borussia Dortmund 1, TSG 1899 Hoffenheim 0.
Offside, TSG 1899 Hoffenheim. Sejad Salihovic tries a through ball, but Niklas Süle is caught offside.
Foul by Neven Subotic (Borussia Dortmund).
Anthony Modeste (TSG 1899 Hoffenheim) wins a free kick in the attacking half.
Substitution, Borussia Dortmund. Ciro Immobile replaces Pierre-Emerick Aubameyang.
Pierre-Emerick Aubameyang (Borussia Dortmund) wins a free kick in the defensive half.
Foul by Eugen Polanski (TSG 1899 Hoffenheim).
Offside, Borussia Dortmund. Henrikh Mkhitaryan tries a through ball, but Kevin Großkreutz is caught offside.
Substitution, Borussia Dortmund. Matthias Ginter replaces Ilkay Gündogan.
Attempt missed. Sejad Salihovic (TSG 1899 Hoffenheim) left footed shot from outside the box is too high from a direct free kick.
Foul by Sebastian Kehl (Borussia Dortmund).
Eugen Polanski (TSG 1899 Hoffenheim) wins a free kick in the attacking half.
Attempt blocked. Henrikh Mkhitaryan (Borussia Dortmund) right footed shot from outside the box is blocked.
Eugen Polanski (TSG 1899 Hoffenheim) is shown the yellow card.
Ilkay Gündogan (Borussia Dortmund) wins a free kick in the attacking half.
Foul by Tarik Elyounoussi (TSG 1899 Hoffenheim).
Foul by Ilkay Gündogan (Borussia Dortmund).
Andreas Beck (TSG 1899 Hoffenheim) wins a free kick in the defensive half.
Sejad Salihovic (TSG 1899 Hoffenheim) is shown the yellow card.