Bayern Munich defeated 10-man Hamburg to remain perfect under their recently reappointed coach, Jupp Heynckes. They are now tied on points with Borussia Dortmund, who let a two-goal lead slip in Frankfurt.
Matchday 9 saw table-changing results in the Bundesliga.
Defending champions Bayern Munich are now tied on 20 points Borussia Dortmund at the top of the table after their win in Hamburg and Dortmund's draw in Frankfurt. Leipzig are right behind them, they won their third straight league game, beating Stuttgart 1-0 and are on 19.
Bayer Leverkusen also had a big day, scoring five unanswered goals in the second half of their game against Borussia Mönchengladbach. Their 5-1 win in Borussia Park lifts them into mid-table, and they are now unbeaten in their last four Bundesliga games.
But the Werkself weren't the only ones to complete a comeback. Hannover overcame a 1-0 halftime deficit to beat Augsburg 2-1 in WWK Arena.
Scroll through the page to see how the Saturday games on Matchday 9 unfolded.
90' — Fulltime
90+3' Bayern SUB — Joshua Kimmich replaces Kingsley Coman... for five seconds...
90+1' — Two minutes added on.
87' — Arjen Robben one-times a cross from Kingsley Coman, but his shot flies just wide.
85' — Arturo Vidal unleashes a shot from range, but Mathenia gets his gloves down to it.
83' — David Alaba picks out Corentin Tolisso in the penalty area and Tolisso's header hits the post.
82' — Robert Lewandowski plays a ball through to Arjen Robben. Robben runs into the box and tries to chip Christian Mathenia, but Mathenia gets a hand to it for the save.
77' — Mats Hummels connects with an Arjen Robben corner, but his header sails just wide of the top corner.
76' Hamburg SUBS — Tatsuya Ito and Filip Kostic replaces André Hahn and Rick van Drongelen
76' — Corentin Tolisso also sees yellow for stepping on the ankle of Dennis Diekmeier.
73' — Marco Fritz shows Gotoku Sakai yellow for a reckless tripping of Kingsley Coman.
71' — Thiago smacks a shot from distance off the post. The goal frame is probably still rattling.
67' — Kingsley Coman squares up a shot from distance in front of Kyriakos Papadopoulos, but Christian Mathenia taps it down for the save.
64' — Rafinha puts a cross in from near the goal line as three Bayern players were sitting at the far post, but the cross sails over all of them as Hamburg clears.
62' Hamburg SUB — Lewis Holtby replaces Aaron Hunt.
54' Bayern SUB — Thiago replaces Thomas Müller, who appears to have injured his right hamstring.
53' — Nearly a quick response! Gotoku Sakai makes arun into the penalty area before he is dispossessed by Niklas Süle. Douglas Santos passes the ball to André Hahn, and Hahn's shot from distance is tipped over the bar by Sven Ulreich.
52' GOAL — Mergim Mavraj mishandles David Alaba's cross in the penalty area. Thomas Müller picks up the loose ball and plays it through to Corentin Tolisso, who finishes off the shot. Hamburg 0, Bayern 1
50' — Marco Fritz has a conversation with Christian Mathenia — presumably for time wasting — after Mathenia take his time setting up his goal kick.
48' — Arturo Vidal's shot from distance is deflected by Kyriakos Papadopoulos and out for a corner. Mats Hummels commits a foul on the ensuing corner to end the chance.
46' Bayern SUB — Thomas Müller replaces James Rodriguez.
46' — Kickoff! The second half is underway in Hamburg.
19:35 — Former Bayern and Hamburg player Ivica Olic appeared on Sky television at half time. He was just appointed as an assistant coach for the Croatian national team.
19:24 — Gideon Jung stayed on the sideline near the tunnel until halftime despite being sent off.
45' — Halftime!
45+1' — One minute added on.
45' — Marco Fritz books James Rodriguez for knocking down Aaron Hunt.
42' — Dennis Diekmeier gets in the face of Corentin Tolisso (looks like for diving) after Tolisso collides with Diekmeier and Mavraj.
39' — Straight red! Marco Fritz sends Gideon Jung off after the Hamburg midfielder tackles Kingsley Coman from behind on a counter-attack.
33' — Hamburg with chance after chance! André Hahn crosses a ball into the penalty area that Niklas Süle clears away. Aaron Hunt gives Hahn another chance on the right wing, but Arturo Vidal stops the cross before it could find Bobby Wood or Gideon Jung in the penalty area.
30' — David Alaba tries to pick out Robert Lewandowski, who has just nine touches of the ball in the game, but the Austrian's cross was too high.
28' — Douglas Santos stops Kingsley Coman in his tracks with a tremendous standing tackle.
25' — Rafinha crosses in a ball from the right after James Rodriguez switches the play in his direction. Kingsley Coman lunged in for a header, but Hamburg's defense clears it away.
21' — Kingsley Coman plays a ball through for Arjen Robben over the lunge of Kyriakos Papadopoulos. Robben's touch is too strong as it takes him towards the goal line and his shot from the left side of the penalty area hits the side netting.
18' — Kingsley Coman crosses in a ball for James Rodriguez on the right wing, but Christian Mathenia comes off his line to scoop up the pass.
17' — Hamburg's defense is five defenders with a double pivot in midfield covering for the wing-backs. Not sure a team can get much more defensive!
13' — Arjen Robben does a Robben cut-in on the right wing before firing a Robben left-footed shot, but Mergim Mavraj was ready for it and blocks the shot away.
9' — Kingsley Coman cuts inside and tries to get a shot off, but he cannot beat van Drongelen and his shot skips out of bounds.
5' — Hamburg, playing with five defenders and two other defensive players in midfield, are letting Bayern control the tempo as Bobby Wood, Andre Hahn and Aaron Hunt press the Bayern defense.
3' — First chance of the game goes to Hamburg as Andre Hahn's shot in the penalty area is snapped up by Sven Ulreich.
1' — Kickoff! We're underway in Hamburg.
18:31 — Arjen Robben is wearing the captain's armband for Bayern Munich with Thomas Müller benched, Manuel Neuer hurt and Philipp Lahm retired.
18:25 — Leverkusen coach Heiko Herrlich sees his side's big result in Mönchengladbach as retribution. "Maybe the five goals were compensation for all the chances that we didn't score in other matches."
18:17 — Hamburg's 18-year-old Dutch defender Rick van Drongelen returns to the starting line-up after missing four games with an ankle injury. Van Drongelen, who joined Hamburg from Sporta Rotterdam over the summer, started Hamburg's first three games, the first two of which the Dinosaurier won.
18:14 — Almost there! Robert Lewandowski needs two more Bundesliga goals to draw level with Karl-Heinz Rummenigge, who is 11th on the league's all-time top scorers list with 162 goals.
18:08 — RB Leipzig's Ralph Hasenhüttl reveals Bruma was a late scratch with a thigh injury.
18:06 — "When you lead by two goals, you have to win." Peter Bosz disappointed in his team's performance in Frankfurt.
17:58 — James Rodriguez, Arturo Vidal, Corentin Tolisso, Niklas Süle and Rafinha get their first starts under Jupp Heynckes, replacing Joshua Thomas Müller, Sebastian Rudy, Thiago, Jerome Boateng and Joshua Kimmich.
17:30 — Time to turn out attention to the north where Hamburg host Bayern Munich in the late game. Jupp Heynckes makes plenty of changes for this one, but will they take advantage of Dortmund's draw in Frankfurt.
90' — Fulltime!
90+1' Frankfurt 2, Dortmund 2 — Makoto Hasebe clears a shot from Nuri Sahin from the goal line.
90' WINNER — Clearance, header, finish! Salif Sané clears the ball towards Jonathas, who heads the ball down for Niclas Füllkrug. Füllkrug finishes to give Hannover the lead. Augsburg 1, Hannover 2
88' Augburg SUB — Jan Movarek replaces Rani Khedira
88' Augsburg 1-1 Hannover — Jonathas nearly scores the winner on a counter attack, but Marwin Hitz stops the shot.
85' Leverkusen SUB — Karim Bellarabi replaces Leon Bailey
83' Dortmund SUB — Jadon Sancho comes on for his debut, replacing Maximilian Philipp.
81' GOAL — Julian Brandt stays on side and picks out Joel Pohjanpalo. Gladbach 1, Leverkusen 5
79' Leverkusen SUB — Joel Pohjanpalo replaces Kevin Volland.
77' EQUALIZER — Second time's the charm! Niklas Füllkrug scores from the left side of the penalty area after missing the ball on his first attempt.
76' Frankfurt SUB — Taleb Tawatha replaces Marius Wolf, who scored the equalizer for Frankfurt.
75' Hannover SUB — Pirmin Schwegler replaces Sebastian Maier.
75' Stuttgart SUB — Josip Brekalo replaces Andreas Beck as Hannes Wolf brings a more attacking player onto the field on the right.
73' Leipzig SUB — Konrad Laimer replaces Emil Forsberg. Ralph Hasenhüttl makes a defensive switch to try to see out the result.
71' Augsburg SUB — Marcel Heller and Ja-Cheol Koo replace Alfred Finnbogason and Jonathan Schmid.
69' GOAL — Wendell plays a terrific pass to Kevin Volland in stride, and Volland finishes to increase Leverkusen's lead. Gladbach 1, Leverkusen 4
68' Equalizer — Marius Wolf levels the scoreline with a shot from the right side of the penalty area. Frankfurt 2, Dortmund 2
66' Frankfurt 1, Dortmund 2 — Lukas Hradecky goes to the turf to save a shot from Christian Pulisic.
65' Stuttgart SUB — Chadrac Akolo replaces Takuma Asano.
64' Hannover SUB — Niclas Füllkrug replaces Iver Fossum.
64' GOAL — Sebastien Haller beats Roman Bürki from the spot with a terrific stutter step. Frankfurt 1, Dortmund 2
63' Leipzig SUB — Kevin Kampl replaces Naby Keita.
63' PENALTY — Roman Bürki takes out Ante Rebic at the edge of the six-yard box. Frankfurt 0, Dortmund 2
61' Leipzig SUB — Jean-Kevin Augustin replaces Timo Werner, who had an assist in his first game against his former side.
61' GOAL — Another one! Kai Havertz takes the ball away from Mickael Cuisance and breaks with the ball. Haverts then plays Julian Brandt through, and Brandt's shot rolls through the legs of Yann Sommer. Two goals for Leverkusen in 84 seconds! Gladbach 1, Leverkusen 3
60' GOAL — Leverkusen comeback complete! Leon Bailey beats Yann Sommer with a terrific curling shot. Gladbach 1, Leverkusen 2
58' Frankfurt SUB — Branmir Hrgota come on for Marco Russ as Kovac switches to a four-man defense.
58' Dortmund SUBS — Dan-Axel Zagado and Shinji Kagawa come on for Julian Weigl and Gonzalo Castro.
57' GOAL — Maximilian Philipp doubles Dortmund's lead, scoring from the top of the penalty area. Frankfurt 0, Dortmund 2
55' Leipzig 1, Stuttgart 0 — Takuma Asano had a pair of great chances as Stuttgart look for the equalizer. He forced a leg save from Peter Gulasci, and then hit the post with an effort off of an Andreas Beck cross.
51' Frankfurt 0, Dortmund 1 — A spectacular miss from Pierre-Emerick Aubameyang! Mario Götze slides him the ball, and Aubameyang's shot from the right side of the penalty area sails over the crossbar.
48' EQUALIZER — Sven Bender scores from a corner to level the score. Gladbach 1, Leverkusen 1
46' Leverkusen SUB — Julian Brandt replaces Lucas Alario.
46' Hannover SUB — Marvin Bakalorz replaces Kenan Karaman, a defensive substitution from André Breitenreiter.
46' — Second half underway!
16:30 — With his goal in the first half, Marcel Sabitzer has now been responsible for four goals in Leipzig's last four games.
16:28 — Roman Weidenfeller is warming up for Dortmund a it appears Roman Bürki was injured after a collision in the first half.
45' — Halftime!
38' Gladbach 1, Leverkusen 0 — Bernd Leno makes a leg save on a shot from Oscar Wendt after Raffael plays the Swedish defender through.
36' Frankfurt SUB — Carlos Salcedo replaces Timothy Chandler.
35' Frankfurt 0, Dortmund 1 — Timothy Chandler falls to the ground without contact. Trainers appear to be doing ligament tests on his right knee.
33' GOAL — Michael Gregoritsch fires a shot off Julian Korb and the deflected ball sails over Philipp Tschauner and into the goal. Gregoritsch has scored in three of Augsburg's last five games. Augsburg 1, Hannover 0
23' GOAL — A terrific finish from Marcel Sabitzer! Naby Keita and Timo Werner get the ball to Sabitzer, who sets up his shot and curls his effort over the stretch of Ron-Robert Zieler. Leipzig 1, Stuttgart 0
22' Frankfurt 0, Dortmund 1 — Maximilian Philipp runs down the left and crosses the ball towards Pierre-Emerick Aubameyang, but the ball is cleared by Marco Russ.
19' GOAL — Marc Bartra picks out the run of Nuri Sahin into the penalty area, who finishes off the chance. He ran to Roman Bürki, who has received a lot of criticism in the press, straight after his goal. Frankfurt 0, Dortmund 1
17' Augsburg 0, Hannover 0 — Rani Khedira sees yellow for a foul on Martin Harnik. Hannover could not take advantage of the good free kick position.
10' Stuttgart SUB — Dzenis Burnic replaces Dennis Aogo, who left with an unknown injury.
7' GOAL — Thorgan Hazard picks out Fabian Johnson at the far post, and the Gladbach midfielder scores with a one-touch finish. Gladbach 1, Leverkusen 0
1' Leipzig 0, Stuttgartt 0 — Before the start, both sides honored Thomas Albeck, who worked in both team's academy set-ups. Albeck passed a way earlier this week at the age of 61.
1' Frankfurt 0, Dortmund 0 — Peter Bosz's side playing in a 4-3-3. Back four is in fact Marc Bartra, Julian Weigl, Neven Subotic and Jeremy Toljan (from right to left).
1' — Kickoff! Afternoon game are underway.
15:29 — Pierre-Emerick Aubameyang is the captain for Borussia Dortmund, the first time he has worn the armband since October 22, 2016.
15:29 — Heiko Herrlich is facing his former Gladbach for the first time as a coach. He won the Torkanone (award given to the top scorer in the Bundesliga) in 1995 for the Foals.
15:24 — Mickael Cuisance makes his second start for Borussia Mönchengladbach. He starts in place of Christoph Kramer, who is injured. The 18-year-old Frenchman joined the Foals before the season from the academy of French club Nancy.
15:17 — Mario Götze makes his 100th Bundesliga appearance for Borussia Dortmund.
15:13 — Julian Brandt is starting on the bench for the third time this season. Leverkusen have won once and lost once when Brandt has come off the bench.
15:05 — As a result, Neven Subotic starts in Dortmund's defense, the first time he is in the Schwarzgelben line-up since March 17, 2016.
15:04 — Borussia Dortmund will field a makeshift defense against Frankfurt because most of their regulars are injured. Here is who is sidelined and suspended:
15:01 — RB Leipzig's Timo Werner faces Stuttgart for the first time since he left in the summer of 2016.
Eintracht Frankfurt vs. Borussia Dortmund
Commerzbank Arena, Frankfurt
Borussia Mönchengladbach vs. Bayer Leverkusen
Borussia Park, Mönchengladbach
Augsburg vs. Hannover
WWK Arena, Augsburg
RB Leipzig vs. Stuttgart
Red Bull Arena, Leipzig