Det började dystert för hemmalaget Barcelona, som hamnade i underläge på Camp Nou. Denis Cheryshev vinklade in 0-1 för Villarreal efter en halvtimmes spel.
Och ledningen verkade stå sig fram till pausvilan. Men bara sekunder innan domaren blåste av anföll Barca en sista gång och Lionel Messi bröt in i högerkanten av straffområdet och hittade Rafinha som testade ett skott. Det blev retur - och där dök Neymar upp med en enkel bredsida. 1-1 vid värsta tänkbara tillfälle för Villarreal.
I andra halvlek blev det dramatiskt direkt. Först bjöd Gerard Piqué på ett kontringsläge och Giovanni Dos Santos sprintade fram mot mål. Där fintade han bort såväl målvakten som en back innan han spelade vidare till Luciano Vietto som satte 1-2.
Men jublet blev inte långvarigt. För i nästa anfall kvitterade Rafinha på en passning från Luis Suarez. Och i ytterligare ett anfall efter det smekte Lionel Messi upp ett finfint skott med högern, i krysset till 3-2.
Barcelona: Bravo; Alves, Pique, Mascherano, Alba; Busquets, Iniesta, Rafinha; Suarez, Messi, Neymar.
Bänken: Ter Stegen, Adriano, Mathieu, Xavi, Sergi Roberto, Rakitic, Pedro.
Villarreal: Asenjo; Mario, Musacchio, Ruiz, Costa; Bruno, Pina, Dos Santos, Cheryshev; Vietto, Giovani.
Bänken: Juan Carlos, Dorado, Rukavina, Trigueros, Gomez, Gerard, Uche.