Riyad Mahrez missed another penalty but Manchester City did enough to seal top spot in Group G as they played out a goalless draw with Borussia Dortmund.
The winger was brought down in the second-half by a rash challenge from Emre Can and stepped up to the spot to take the penalty himself, though his effort was nowhere near the corner and Gregor Kobel produced the save.
A point was all City needed to book their place in the knockout stages as group winners and they got it, while it was also enough to send Dortmund through to the last 16 with a match to spare.
Erling Haaland and Ilkay Gundogan both started against their former club, while Stefan Ortega was handed a debut by Pep Guardiola as Ederson was given a rare night off.
City dominated possession for much of the first-half, with Dortmund content to sit off and pick their moments on the counter. They had the biggest chance of the half too, as Karim Adeyemi played the ball across the face of and found Youssoufa Moukoko completely free in the middle, but his finish from close-range was wayward.
The visitors didn’t look like scoring until seconds before the break, when Nathan Ake powered a header over the bar at the far post as he get on the end of a brilliant delivery from Phil Foden.
Nobody was happier than Mats Hummels when Haaland did not emerge for the second-half, brought off at half-time along with Joao Cancelo as Guardiola shuffled his pack in the middle of a hectic period.
The striker had to watch on from the bench as Can made a ridiculous challenge in the box to bring Mahrez down and gift City a penalty, but, as was the case a fortnight ago in Copenhagen, the Algerian could not convert from the spot.
Neither side looked particularly likely to find a winner in the final half an hour, as the match petered out to an almost inevitable conclusion that leaves next week’s final group-stage matches as dead rubbers.