La Liga leaders Real Madrid dropped points at home for only the second time this season when Villarreal fought back from a goal down in an entertaining 1-1 draw that left Real two points ahead of Barcelona on Sunday.
Champions Atletico Madrid also stumbled, a 0-0 stalemate at Sevilla denting their chances of a second consecutive Spanish title and leaving them five points behind Barca in third.
With a King’s Cup semi-final second leg against Barca looming on Wednesday, Villarreal coach Marcelino fielded a weakened side at the Bernabeu but it took Real until seven minutes into the second half to break the deadlock.
Eric Bailly hauled Cristiano Ronaldo down in the penalty area and the Portugal captain picked himself up and sent goalkeeper Sergio Asenjo the wrong way with his spot-kick for his 30th goal of the campaign.
Villarreal had the best chances in an even first half. Real keeper Iker Casillas did well to block a close-range Moises Gomez effort in the 12th minute and fullback Dani Carvajal cleared Gerard Moreno’s follow-up shot off the line.
Moreno made up for his earlier miss and stunned the European champions when he lashed a shot low into the corner in the 64th minute.
Ronaldo had two chances to restore Real’s lead but was twice denied by excellent Asenjo saves before substitute Jese missed an open goal after the Villarreal keeper had misjudged a cross.
The visitors could even have claimed their first win at the Bernabeu when Luciano Vietto, another substitute, tested Casillas with a diving header four minutes from time.
Villarreal withstood intense pressure in the final minutes, Ronaldo again going close with a header.
It was the first game Real have failed to win at home in La Liga since they were beaten 2-1 by Atletico in September and was their first draw in Spain's top flight this season.
Carlo Ancelotti’s side lead on 61 points with 13 games left, and Barca, who host their great rivals at the Nou Camp in three weeks, are on 59 after they won a scrappy game at Granada 3-1 on Saturday.
Simeone content with a point after battle at Sevilla
Atletico Madrid coach Diego Simeone said he was happy with a point after the champions were held to a 0-0 draw at Sevilla.
Simeone has insisted Atletico are focused on securing third place and a lucrative Champions League berth rather than challenging Barca and leaders Real Madrid to win a second consecutive Spanish title.
"We are taking each game at a time," Simeone told a news conference after the clash at the Sanchez Pizjuan in which the referee booked 11 players, including seven from Atletico.
"Obviously, it's a good point because we were playing a direct rival and now we have to think about the next," added the former Argentina captain, who had spells as a player at both Atletico and Sevilla.
Following their 1-0 Champions League reverse at Bayer Leverkusen on Wednesday, Atletico coach Diego Simeone deployed a defensive lineup for their game at Sevilla's Sanchez Pizjuan.
Antoine Griezmann initially played as a lone forward in front of a five-man midfield and the champions struggled to impose themselves against the fired-up Europa League holders.
In a match littered with yellow cards, Sevilla had the best chance of the first half when midfielder Vicente Iborra clipped a first-time shot against a post in the 27th minute.
Atletico, beaten 2-0 at Celta Vigo two weeks ago, looked more dangerous when Fernando Torres came on for Arda Turan with half an hour left.
The Spain forward almost had an immediate impact when he charged down the left and crossed for Griezmann but the Frenchman was unable to hit the target.
'This is the best formula that can happen in J&K'
World Cup Blog: Why won't Eoin Morgan sing God Save The Queen?
5 things FM ignored in the Budget
VOTE: Who will win the 2015 World Cup?