David Villa gave the Catalans the lead after 22 minutes and Pedro thought he had made it two shortly afterwards, but saw his effort ruled out by an erroneous offside decision. Nilmar then levelled for Villarreal as the Nou Camp continued to jeer the officials.
But as he has done so often in the past, Messi came to the Catalans’ rescue with a brilliant goal after 59 minutes and the Argentinian wrapped up the points with a contentious second late on.
Athletic Bilbao had two players sent off and missed a penalty but still ran out 1-0 winners over struggling Primera Liga side Almeria thanks to star striker Fernando Llorente.
The tall Spain forward netted what turned out to be the only goal of the game in the 11th minute after Athletic had already spurned a great chance to take the lead when Mikel San Jose saw his penalty saved.
Athletic were looking in control of the match but two dismissals left them needing to hold on for the final 21 minutes.
Lertxundi Koikili was the first to receive his marching orders on the stroke of half-time for a second booking and he was joined on the sidelines by fellow defender Xabier Castillo, who was shown a straight red for a professional foul in the 69th minute.
Diego Forlan brought an end to his goal drought in fine style to help Atletico Madrid record a comfortable 3-0 victory over 10-man Osasuna at the Vicente Calderon.
Forlan had not scored in his 12 previous appearances for Atletico stretching back to mid-September, but the Uruguay international put that slump behind him with a brace tonight while he also put the Rojiblancos’ other goal on a plate for Sergio Aguero.
Osasuna had no answer to that and their already slim hopes of getting anything out of the match were all but ended in the 60th minute when left-back Nacho Monreal was sent off for a second booking.