Aston Villa moved to within two points of the summit of the Premier League with a narrow win over Arsenal, who missed out on a chance to go top.
Villa took the lead through skipper John McGinn, who brought Leon Bailey's cross under control before hammering the ball into the net.
Arsenal had a late Kai Havertz late goal ruled out for handball by referee Jarred Gillett, with the video assistant referee upholding the call after a lengthy review.
Despite late Arsenal pressure, Villa held on to back up their statement victory over champions Manchester City on Wednesday and record a club record 15th straight home league victory.
Defeat will be a blow for title-chasing Arsenal, whose run of six straight wins in all competitions came to an end at Villa Park.
Villa beat Arsenal - reactionHow did you rate Aston Villa's performance? Have your say hereWhat did you make of Arsenal's display? Send us your views hereAre Villa title contenders?
Only in 1980-81, when they last won the title, have Aston Villa taken more points after 16 games of a top-flight season, and there is a real belief that they can break into the top four.
There are even whispers that Unai Emery, once of Arsenal, could manage an outside push for the title.
Villa are the only Premier League club not to have dropped a point from a winning position this season, and, although Arsenal had the better chances after falling behind, Villa did create a few more of their own.
Ollie Watkins forced two good saves from Arsenal goalkeeper David Raya, one of them when clean through, although the England striker was soon flagged for offside.
In the second period Lucas Digne and Watkins both had shots saved following counter-attacks.
Villa defended with discipline and intensity, ultimately benefitting from a late VAR call to leapfrog Arsenal into second place and win their opening eight home matches in a top-flight season for the first time since 1932-33.
More to follow.
How to play
Rate players out of 10 throughout or after the game. The rater will close 30 minutes after the final whistle.
Rating range key1 = Give it up10 = Pure perfection
Aston Villa
Squad number1Player nameE Martínez
Squad number4Player nameKonsa
Squad number3Player nameDiego Carlos
Squad number14Player nameP Torres
Squad number12Player nameDigne
Squad number31Player nameBailey
Squad number44Player nameKamara
Squad number6Player nameDouglas Luiz
Squad number7Player nameMcGinn
Squad number8Player nameTielemans
Squad number11Player nameWatkins
Squad number2Player nameCash
Squad number15Player nameÁlex Moreno
Squad number19Player nameDiaby
Squad number32Player nameDendoncker
Squad number41Player nameJ Ramsey
Arsenal
Squad number22Player nameRaya
Squad number4Player nameWhite
Squad number2Player nameSaliba
Squad number6Player nameGabriel Magalhães
Squad number35Player nameZinchenko
Squad number8Player nameØdegaard
Squad number41Player nameRice
Squad number29Player nameHavertz
Squad number7Player nameSaka
Squad number9Player nameGabriel Jesus
Squad number11Player nameGabriel Martinelli
Squad number14Player nameNketiah
Squad number19Player nameTrossard
Squad number24Player nameNelson
Line-ups
Aston Villa
Formation 4-4-1-1
1E Martínez4KonsaSubstituted forCashat 66'minutes3Diego CarlosBooked at 88mins14P Torres12DigneBooked at 53minsSubstituted forMorenoat 78'minutes31BaileySubstituted forDiabyat 45'minutes44KamaraSubstituted forDendonckerat 66'minutes6Douglas LuizBooked at 62mins7McGinnBooked at 73mins8TielemansSubstituted forJ Ramseyat 56'minutes11WatkinsSubstitutes
2Cash15Moreno17Lenglet19Diaby22Zaniolo24Durán32Dendoncker41J Ramsey42MarschallArsenal
Formation 4-3-3
22Raya4White2Saliba6Gabriel35ZinchenkoBooked at 28minsSubstituted forNelsonat 90+4'minutes8Ødegaard41RiceBooked at 77mins29Havertz7Saka9Gabriel JesusSubstituted forNketiahat 82'minutes11MartinelliSubstituted forTrossardat 70'minutesSubstitutes
1Ramsdale14Nketiah15Kiwior17Cédric Soares19Trossard20Jorginho24Nelson25Elneny76WaltersLive Text
Match ends, Aston Villa 1, Arsenal 0.
Second Half ends, Aston Villa 1, Arsenal 0.
Attempt missed. Eddie Nketiah (Arsenal) header from the centre of the box is too high. Assisted by Declan Rice with a cross.
Foul by Kai Havertz (Arsenal).
Emiliano Martínez (Aston Villa) wins a free kick in the defensive half.
Attempt blocked. Leander Dendoncker (Aston Villa) left footed shot from outside the box is blocked.
Attempt blocked. John McGinn (Aston Villa) left footed shot from the right side of the box is blocked. Assisted by Douglas Luiz.
Substitution, Arsenal. Reiss Nelson replaces Oleksandr Zinchenko.
Hand ball by Kai Havertz (Arsenal).
Diego Carlos (Aston Villa) is shown the yellow card for a bad foul.
Eddie Nketiah (Arsenal) wins a free kick in the attacking half.
Foul by Diego Carlos (Aston Villa).
Delay over. They are ready to continue.
Delay in match because of an injury Leandro Trossard (Arsenal).
Delay over. They are ready to continue.
Delay in match because of an injury Oleksandr Zinchenko (Arsenal).
Eddie Nketiah (Arsenal) wins a free kick in the attacking half.
Foul by Leander Dendoncker (Aston Villa).
Oleksandr Zinchenko (Arsenal) wins a free kick in the defensive half.
Foul by John McGinn (Aston Villa).