In a game of very few chances, Juventus dented Milan's Scudetto bid as they held Stefano Pioli's side to a goalless draw at the San Siro.
The pattern of the game was clear from the outset, with Juve prepared to cede territory in order to open up spaces in behind Milan.
Massimiliano Allegri's approach was almost vindicated inside 11 minutes when Juan Cuadrado dragged his left-footed effort wide of the post after skipping inside Theo Hernandez.
Milan responded with an opportunity of their own seven minutes later. Rafael Leao combined on the edge of the area with Junior Messias and Zlatan Ibrahimovic, but Wojciech Szczesny was equal to his driven effort.
Davide Calabria then had Szczesny worried with a succession of efforts from range, but both flew inches wide of the upright.
Olivier Giroud - who replaced the injured Ibrahimovic on the half hour mark - ought to have done better from Junior Messias' cut-back. The Frenchman did well to get across Daniele Rugani in the penalty area, but he failed to connect with the ball.
Juventus fashioned their best opportunity of the game just five minutes after the interval. Mattia De Sciglio delivered an unerring cross onto the head of Alvaro Morata, but the Spaniard sent a tame header wide of the post.
Milan then created their own crossing opportunity which was met by the head of Giroud, but the forward inexplicably sent his header back across goal with only Szczesny to beat.
Theo Hernandez, uncharacteristically quiet as an attacking force, strode forward with purpose on hour mark but, as was the theme of his side's evening, his effort was comfortably collected by the Juventus No.1.
Szczesny was called into action again by a Giroud header with 20 minutes remaining, but the Frenchman could not get sufficient purchase on his effort and it was secured easily.
Weston McKennie went close with a header five minutes from time as the game fizzled out towards its conclusion.
Here's how both teams rated.
Milan player ratings
1. Goalkeeper & defenders
Mike Maignan (GK) - 5/10 - Barely had anything to do with Juventus terrible in front of goal.
Davide Calabria (RB) - 6/10 - Dominated his side of the pitch, often moving infield to create danger for Milan.
Pierre Kalulu (CB) - 5/10 - Barely put a foot wrong and marshalled the threat of Morata and Dybala.
Alessio Romagnoli (CB) - 5/10 - Really accomplished showing on the defensive side, sniffing out danger before it reached the Milan penalty area.
Theo Hernandez (LB) - 5/10 - Not at his buccaneering best on the left hand side, but stood up to the physical challenge against Cuadrado.
Rade Krunic (CM) - 5/10 - Intelligent with his defensive positioning and screened the Milan defence effectively.
Sandro Tonali (CM) - 5/10 - Got his foot on the ball during the rare frantic spells in the game.
Brahim Diaz (AM) - 4/10 - Picked up some really intelligent spaces, but he was quickly stifled when he arrived at the Juventus penalty area.
Junior Messias (RW) - 5/10 - Quiet in comparison to Leao on the opposite flank, although he did threaten briefly in the second half.
Zlatan Ibrahimovic (ST) - N/A - Limped off just shy of the half-hour mark with an injury.
Rafael Leao (LW) - 7/10 - The ball seems permanently stuck to his feet, as Mattia De Sciglio discovered to his detriment.
Olivier Giroud (ST) - 4/10 - Replaced the injured Ibrahimovic and had a couple of opportunities which he failed to convert.
Alexis Saelemaekers (RW) - N/A
Ismael Bennacer (CM) - N/A
Ante Rebic (LW) - N/A
Alessandro Florenzi (RB) - N/A
Juventus player ratings
5. Goalkeeper & defenders
Wojciech Szczesny (GK) - 5/10 - Wasn't forced into any acrobatics, with most of Milan's efforts driven straight down his throat.
Mattia De Sciglio (RB) - 5/10 - Struggled in one-on-one defensive duels, often being ghosted past by Rafael Leao or Brahim Diaz.
Daniele Rugani (CB) - 6/10 - Has dislodged Matthijs de Ligt in the Juventus defence and he showed exactly why.
Giorgio Chiellini (CB) - 8/10 - One of those evening's where the Italian showed every inch of his experience, reading the game exceptionally well.
Alex Sandro (LB) - 5/10 - Improved in the second half, but he didn't have much license to burst beyond the halfway line.
Juan Cuadrado (RM) - 7/10 - Juve's greatest attacking threat, carrying his side up the pitch with searing pace.
Manuel Locatelli (CM) - 5/10 - Booked inside ten minutes, with Juventus' defensive approach limiting his touches of the ball.
Rodrigo Bentancur (CM) - 6/10 - Subject of serious interest from Aston Villa and he did himself no harm with an assured performance.
Weston McKennie (LM) - 2/10 - Anonymous and offered Juventus very little in an attacking sense.
Alvaro Morata (ST) - 3/10 - His hold-up play was erratic and he couldn't get the better of Milan's central defensive pairing.
Paulo Dybala (ST) - 4/10 - His movement made him impossible to pin down as a Milan defender, but he didn't threaten goal with any great menace.
Arthur (CM) - N/A
Federico Bernardeschi (RW) - N/A
Moise Kean (ST) - N/A
Adrien Rabiot (LM) - N/A
Dejan Kulusevski (ST) - N/A