Villarreal scored three late goals to move into the Champions League quarter-finals as Juventus went out in the last 16 for a third successive year.
The Spanish side did not have a shot on target before substitute Gerard Moreno converted a 78th-minute penalty after Daniele Rugani fouled Francis Coquelin.
Defender Pau Torres added a second when he finished from six yards as Juventus failed to deal with a corner.
Arnaud Danjuma made it 3-0 with another penalty after Matthijs De Ligt handled.
“We had a gameplan and knew there’d be tough moments,” said Villarreal boss Unai Emery.
“Whoever we get in the draw will be a top side, just like the one we faced.”
The draw for the quarter-finals takes place on Friday at 11:00 GMT and Villarreal will be in the last eight of the competition for the first time since 2008-09 and only the third time in their history.
Following a 1-1 draw in Spain last week, two-time European champions Juventus were clear favourites to advance and they dominated the first half at the Allianz Stadium.
However, Juventus’ Dusan Vlahovic, a goalscorer in the first leg, hit the crossbar and was also twice denied by Villarreal goalkeeper Gero Rulli, who also saved an effort from ex-Chelsea striker Alvaro Morata.
Villarreal, managed by former Arsenal boss Emery, had to defend deep and in numbers for the majority of the second half.
However, in a rare attack, substitue Coquelin was fouled by Rugani with referee Szymon Marciniak awarding the penalty after watching it on a pitchside monitor.
Moreno, only on the pitch for four minutes, kept his cool to put his side ahead as home goalkeeper Wojciech Szczesny got both hands to the shot but could not keep it out.
Juventus had been eliminated at this phase of the competition in both the past two years, going out to Lyon in 2020 and Porto in 2021, and fell apart in the last 10 minutes.
Terrible defending from a corner allowed Torres to double Villarreal’s advantage before former Bournemouth striker Danjuma converted another spot-kick in injury time.
Juventus coach Massimiliano Allegri said: “I think the team played well for over 75 minutes.
“In the second half, Villarreal decided to just defend and block but they had one chance and they took it. Football is like that: one episode can change everything.
“Villarreal defended with 11 men, clearly trying to bring the game to extra time. Then that goal changed everything.”
Villarreal, seventh in La Liga, had qualified for the Champions League courtesy of winning last season’s Europa League final – beating Manchester United 11-10 in an epic penalty shootout as United goalkeeper David de Gea missed the decisive penalty.
Line-ups
Juventus
Formation 3-5-2
- 1Szczesny
- 6Danilo
- 4de LigtBooked at 90mins
- 24RuganiSubstituted forDybalaat 79′minutes
- 11Ju Cuadrado
- 27LocatelliSubstituted forBernardeschiat 83′minutes
- 5Arthur
- 25Rabiot
- 2De Sciglio
- 7Vlahovic
- 9MorataSubstituted forKeanat 86′minutes
Substitutes
- 3Chiellini
- 10Dybala
- 17Pellegrini
- 18Kean
- 20Bernardeschi
- 23Pinsoglio
- 36Perin
- 47Miretti
Villarreal
Formation 4-4-1-1
- 13Rulli
- 25Aurier
- 3Albiol
- 4Torres
- 12Estupiñán
- 21PinoSubstituted forChukwuezeat 65′minutes
- 6Capoue
- 5ParejoSubstituted forPedrazaat 86′minutes
- 14Trigueros MuñozSubstituted forCoquelinat 64′minutes
- 17Lo CelsoSubstituted forMorenoat 74′minutes
- 15Danjuma
Substitutes
- 1Asenjo
- 2Pérez Martínez
- 7Moreno
- 8Foyth
- 10Iborra
- 11Chukwueze
- 16Dia
- 19Coquelin
- 20Peña
- 22Mandi
- 23Gómez Bardonado
- 24Pedraza
- Referee:
- Szymon Marciniak
- Attendance:
- 30,385
Live Text
-
Match ends, Juventus 0, Villarreal 3.
-
Second Half ends, Juventus 0, Villarreal 3.
-
Foul by Moise Kean (Juventus).
-
Etienne Capoue (Villarreal) wins a free kick in the attacking half.
-
Matthijs de Ligt (Juventus) wins a free kick in the attacking half.
-
Foul by Gerard Moreno (Villarreal).
-
Goal! Juventus 0, Villarreal 3. Arnaut Danjuma (Villarreal) converts the penalty with a right footed shot to the bottom left corner.
-
Penalty conceded by Matthijs de Ligt (Juventus) with a hand ball in the penalty area.
-
Matthijs de Ligt (Juventus) is shown the yellow card for hand ball.
-
Attempt blocked. Arnaut Danjuma (Villarreal) right footed shot from the centre of the box is blocked. Assisted by Gerard Moreno.
-
Substitution, Villarreal. Alfonso Pedraza replaces Daniel Parejo.
-
Substitution, Juventus. Moise Kean replaces Álvaro Morata.
-
Goal! Juventus 0, Villarreal 2. Pau Torres (Villarreal) right footed shot from very close range to the top left corner. Assisted by Serge Aurier following a corner.
-
Corner, Villarreal. Conceded by Danilo.
-
Substitution, Juventus. Federico Bernardeschi replaces Manuel Locatelli.
-
Hand ball by Danilo (Juventus).
-
Hand ball by Serge Aurier (Villarreal).
-
Substitution, Juventus. Paulo Dybala replaces Daniele Rugani.
-
Goal! Juventus 0, Villarreal 1. Gerard Moreno (Villarreal) converts the penalty with a left footed shot to the bottom right corner.
-
VAR Decision: Penalty Villarreal.