Kolo Toure's first-half goal edged Arsenal towards the Champions League final with a narrow victory against Villarreal at Highbury.
Toure's goal was just reward for Arsenal's endeavour
Toure turned home Aleksander Hleb's pass after 41 minutes to give Arsene Wenger's side a slender advantage.
Cesar Arzo headed Thierry Henry's shot off the line after the break as Arsenal struggled to break down Villarreal.
The Spanish side rarely threatened, although Juan Roman Riquelme and Marcos Senna forced saves from Jens Lehmann.
Arsenal were denied a crucial early breakthrough after 11 minutes when Henry slotted home Robert Pires' pass, but he was adjudged marginally offside.
Villarreal were well-organised and Riquelme tested Lehmann from long range, then almost created an opening for Diego Forlan as the Spanish side grew in confidence.
But it was Arsenal who broke the deadlock four minutes before the interval, when Henry played in Hleb, whose cross was slotted in by Toure.
Villarreal responded instantly, with Lehmann forced to punch away Riquelme's free-kick.
Arsenal were then fortunate not to concede a penalty when Jose Mari was hauled down by Gilberto Silva, but Villarreal's appeals were waved away.
The Gunners almost doubled their advantage after 55 minutes when Emmanuel Eboue's cross was met by Henry, but Arzo recovered to clear off the line.
Lehmann had been relatively untroubled, but he was forced to scramble to make a low save from Senna's 20-yard drive.
Arsenal boss Wenger made a double change with 10 minutes to go, sending on Dennis Bergkamp and Robin van Persie for Hleb and Freddie Ljungberg.
And Bergkamp almost snatched the crucial second in injury-time, but he was just beaten to the ball by Javi Venta as he looked to slide in Henry's cross.
Arsenal: Lehmann, Eboue, Toure, Senderos, Flamini, Hleb (Bergkamp 80), Ljungberg (Van Persie 80), Silva, Fabregas, Pires, Henry.
Subs Not Used: Almunia, Diaby, Song Billong, Walcott, Djourou.
Goals: Toure 41.
Villarreal: Barbosa, Javi Venta, Quique Alvarez, Arzo, Arruabarrena, Senna, Tacchinardi, Sorin (Josico 72), Riquelme, Jose Mari (Franco 55), Forlan (Calleja 90).
Subs Not Used: Lopez Vallejo, Guayre, Hector Font, Edu Caballer.
Booked: Arzo, Riquelme, Tacchinardi, Franco, Quique Alvarez.
Ref: Konrad Plautz (Austria).