Robert Lewandowski scored for an eighth consecutive Bundesliga home game as Bayern Munich edged to a scrappy 1-0 victory against bottom-of-the-table Cologne.
A sixth consecutive Bundesliga title looks to be a mere formality as Bayern moved nine points clear of nearest challengers Schalke with another win and clean sheet.
On paper, this should have been the easiest game of the season, but Bayern were again indebted to 36-year-old academy coach Tom Starke, called out of retirement in the autumn, to preserve a nervy three points against winless, relegation-bound Cologne.
Manager rating out of 10
7 -- Making four changes to the team that scrapped to a bitty win in Frankfurt, Jupp Heynckes took his tally to 13 wins in 14 games since his return for a fourth spell. One last push remains before the winter break with a games against Stuttgart and Borussia Dortmund (DFB Pokal).
Player ratings (1-10; 10 = best. Players introduced after 70 minutes get no rating)
GK Tom Starke, 8 -- Hardly tested until producing an outstanding save of a Lukas Klunter shot in the dying minutes to preserve Bayern's slender advantage and secure his second clean sheet in four days. As Heynckes has said, Starke is always there when his team needs him.
DF David Alaba, 7 -- Reunited with his old friend Franck Ribery on the left flank after enjoying a breather against Frankfurt. He missed a great chance to score, poking wide when well placed, but Bayern are a better side all round with the Austrian fit and firing.
DF Jerome Boateng, 7 -- The German defender is slowly returning to his best after a lengthy battle with a succession of muscle injuries, evidenced as he started spraying some "Beckenbaueresque" passes around the pitch, including the delicate pass to Thomas Muller for the crucial goal.
DF Niklas Sule, 7 -- Always a threat from set pieces heading narrowly over in the first half before almost turning provider to feed his captain Muller. Sule also tested Timo Horn with a fierce drive midway through the second half.
DF Rafinha, 6 -- Continues to prove his versatility, filling in at right-back this time for Joshua Kimmich, but the Brazil international provides little of the German's attacking flair.
MF Sebastian Rudy, 5 -- Solid yet very unspectacular on a freezing night in Munich.
MF Arturo Vidal, 5 -- Had found the net in the previous four Bundesliga games against Augsburg, Gladbach, Hanover and Frankfurt, but failed to unlock a resolute Cologne defence to keep his scoring record intact. Subsequently, Heynckes, no respecter of records, replaced the combative Chilean with the fresh legs of Kingsley Coman at half-time.
MF Corentin Tolisso, 5 -- Bayern's record signing could not repeat the two-goal heroics of PSG and was hooked off at the break.
MF Franck Ribery, 5 -- Fed Muller with a delightful pass in the first half but otherwise largely anonymous and still has not scored or provided an assist in nine Bundesliga games. On a brighter note, Ribery made his 366th appearance in all competitions for Bayern, the most by a foreigner in the history of the club.
MF Thomas Muller, 6 -- Missed Bayern's best two chances in the first half to remain stranded on just one Bundesliga goal this season. But he did lay on the crucial winner with a cute back header into Robert Lewandowski's path to rack up a team-best six assists for the campaign.
FW Robert Lewandowski, 7 -- Only a seven-minute cameo against Frankfurt but was always going to play on home soil, inevitably finding the net for his 15th goal of the season and the eighth home game in a row at the Allianz Arena.
MF James Rodriguez, 7 -- The Colombian playmaker was on the receiving end of some rough treatment and his marker, former 1860 Munich talent Marius Wolf, only spared a red card after the stressed referee changed his mind after consulting VAR. Replaced Tolisso at the break and added much-needed impetus into a listless Bayern, almost getting the goal his efforts deserved but denied by Horn with five minutes to go.
MF Kingsley Coman, 7 -- Came on for Vidal after half-time, breathing new life and pace into the ranks, heading onto the bar after 65 minutes.
DF Joshua Kimmich, N/R -- Given a breather with the trip to his boyhood club Stuttgart at the weekend in mind. He replaced Ribery for the final 14 minutes, but also took a heavy knock late on.