Santi Cazorla scored early and late, forcing Real Madrid to settle for a point to open its 2019.
A brace from Santi Cazorla saw Villarreal hold Real Madrid to a 2-2 draw in the first La Liga match of 2019.
Cazorla's late header with 10 minutes remaining salvaged a point for Villarreal, which was nothing less than the hosts deserved.
They were the better side for much of the contest against a Real team who were surprisingly pedestrian.
The game started at a frantic pace and it was Villarreal who took the lead after just three minutes when Cazorla curled a first-time shot inside the far post after Samuel Chukwueze's pass.
However, Real Madrid responded instantly through Karim Benzema. The Frenchman headed home as he was left unmarked inside the 18-yard-box from Lucas Vasquez's floated cross.
The visitors then took the lead on 20 minutes, when Raphael Varane headed home with pinpoint accuracy from Toni Kroos's free kick.
Although Varane's header was well-timed, Villarreal goalkeeper Sergio Asenjo's positioning was poor as he looked to be stood too far to the right-hand side of his goal.
Real then had a third goal ruled out for offside shortly before halftime, with Luka Modric beyond the last Villarreal defender when he tapped in after Sergio Asenjo parried Benzema's shot.
The second half was less action-packed, but Villarreal came close to equalising when Gerard Moreno's effort flashed wide.
Late on, Cazorla's header meant that honors ended even in what was a thoroughly entertaining encounter.
Both sides return to action Sunday, with Villarreal traveling to Eibar and Real Madrid hosting Real Sociedad.