ARTICLE AD BOX
Riyad Mahrez had a penalty saved but Manchester City still sealed top spot in their Champions League group with a draw that also took Borussia Dortmund into the last 16.
Mahrez was fouled by Emre Can and stepped up himself, but Gregor Kobel went the right way to save his kick.
Both sides knew a draw would be enough to achieve their goals, so each will be happy with the result.
City boss Pep Guardiola surprisingly replaced top scorer Erling Haaland at half-time after just 13 touches in a half in which Mats Hummels dealt with him expertly.
Dortmund had good chances too, with 17-year-old Youssoufa Moukoko slotting wide and debutant City keeper Stefan Ortega making several saves.
City get job done but below best again
City will be happy to have won their Champions League group with a game to spare, but it is just one win in their past four games in all competitions now.
Last time out in Europe they drew 0-0 in Copenhagen, and then lost their unbeaten record to Liverpool in the league - before beating Brighton on Saturday.
Guardiola mixed things up with his line-up in Dortmund, giving a debut to 29-year-old keeper Ortega, a summer signing, with Ederson left on the bench.
The German did well to deny Karim Adeyemi and Moukoko in the first half.
Julian Alvarez, who played behind Haaland, made his fourth start for the club, and was one of only three players to test Kobel - along with Ilkay Gundogan and Mahrez with his failed penalty, all in the second half.
Nathan Ake headed a decent chance over too.
Mahrez has now missed three of his last four penalties for City in all competitions, after scoring nine of his first 10.
City have failed to convert 25 of their 80 penalties under Guardiola. No Premier League team have missed more penalties in that time.
Maybe if Haaland, with 22 goals in his first three months at City, was still on, he might have taken it.
But he was replaced after a quiet first half. Perhaps Guardiola is saving him for the game at struggling Leicester at the weekend.
Joao Cancelo was taken off too, another player who will not be happy with his first half - with Adeyemi getting the better of him on several occasions out wide.
It is all ultimately academic, with City topping the group amid a relentless pre-World Cup fixture list - but recent performances continue to dip below their early-season swashbuckling form.
How to play
Rate players out of 10 throughout or after the game. The rater will close 30 minutes after the final whistle.
Rating range key1 = Give it up10 = Pure perfection
Borussia Dortmund
Squad number1Player nameKobel
Squad number25Player nameSüle
Squad number15Player nameHummels
Squad number4Player nameSchlotterbeck
Squad number10Player nameT Hazard
Squad number27Player nameAdeyemi
Squad number22Player nameBellingham
Squad number23Player nameCan
Squad number19Player nameBrandt
Squad number7Player nameReyna
Squad number18Player nameMoukoko
Squad number17Player nameWolf
Squad number20Player nameModeste
Squad number21Player nameMalen
Squad number47Player namePapadopoulos
Manchester City
Squad number18Player nameOrtega
Squad number5Player nameStones
Squad number3Player nameRúben Dias
Squad number6Player nameAké
Squad number7Player nameJoão Cancelo
Squad number26Player nameMahrez
Squad number16Player nameRodri
Squad number8Player nameGündogan
Squad number47Player nameFoden
Squad number9Player nameHaaland
Squad number19Player nameÁlvarez
Squad number10Player nameGrealish
Squad number20Player nameBernardo Silva
Squad number25Player nameAkanji
Squad number80Player namePalmer
Line-ups
B Dortmund
Formation 4-5-1
- 1Kobel
- 25Süle
- 15HummelsBooked at 87mins
- 4Schlotterbeck
- 10T HazardSubstituted forWolfat 82'minutes
- 27AdeyemiSubstituted forMalenat 73'minutes
- 22Bellingham
- 23Can
- 19Brandt
- 7ReynaSubstituted forPapadopoulosat 87'minutes
- 18MoukokoSubstituted forModesteat 82'minutes
Substitutes
- 17Wolf
- 20Modeste
- 21Malen
- 30Passlack
- 33Meyer
- 36Rothe
- 38Unbehaun
- 44Coulibaly
- 47Papadopoulos
Man City
Formation 4-4-2
- 18Ortega
- 5Stones
- 3Rúben Dias
- 6Aké
- 7CanceloBooked at 7minsSubstituted forAkanjiat 45'minutesBooked at 72mins
- 26MahrezSubstituted forPalmerat 88'minutes
- 16Rodri
- 8GündoganBooked at 58mins
- 47FodenSubstituted forGrealishat 81'minutes
- 9HaalandSubstituted forBernardo Silvaat 45'minutes
- 19ÁlvarezBooked at 31mins
Substitutes
- 10Grealish
- 14Laporte
- 17De Bruyne
- 20Bernardo Silva
- 25Akanji
- 31Ederson
- 33Carson
- 80Palmer
- 82Lewis
- 97Wilson-Esbrand
Live Text
Match ends, Borussia Dortmund 0, Manchester City 0.
Second Half ends, Borussia Dortmund 0, Manchester City 0.
Offside, Borussia Dortmund. Julian Brandt tries a through ball, but Anthony Modeste is caught offside.
Dangerous play by Rúben Dias (Manchester City).
Jude Bellingham (Borussia Dortmund) wins a free kick in the attacking half.
Substitution, Manchester City. Cole Palmer replaces Riyad Mahrez.
Mats Hummels (Borussia Dortmund) is shown the yellow card for a bad foul.
Julián Álvarez (Manchester City) wins a free kick in the defensive half.
Foul by Mats Hummels (Borussia Dortmund).
Substitution, Borussia Dortmund. Antonios Papadopoulos replaces Giovanni Reyna.
Offside, Manchester City. Jack Grealish tries a through ball, but Bernardo Silva is caught offside.
Offside, Manchester City. John Stones tries a through ball, but Riyad Mahrez is caught offside.
Substitution, Borussia Dortmund. Anthony Modeste replaces Youssoufa Moukoko.
Substitution, Borussia Dortmund. Marius Wolf replaces Thorgan Hazard.
Substitution, Manchester City. Jack Grealish replaces Phil Foden.
Corner, Manchester City. Conceded by Mats Hummels.
Attempt blocked. Thorgan Hazard (Borussia Dortmund) right footed shot from outside the box is blocked.
Substitution, Borussia Dortmund. Donyell Malen replaces Karim Adeyemi.
Manuel Akanji (Manchester City) is shown the yellow card for hand ball.
Hand ball by Manuel Akanji (Manchester City).
- Our coverage of Manchester City is bigger and better than ever before - here's everything you need to know to make sure you never miss a moment
- Everything City - go straight to all the best content