Elijah Adebayo's winning goal was his 12th of the season for Luton Town
Luton Town moved up to 10th in the Championship after beating Bristol City at Kenilworth Road to earn their fourth win in six league games.
Despite being the better side in the first half, Bristol City failed to create many clear-cut chances and were made to pay when Tom Lockyer headed home shortly before half-time to give Luton the lead.
Andreas Weimann levelled 11 minutes after the break as he calmly finished after great work by Antoine Semenyo.
But Luton's top-scorer Elijah Adebayo bundled in the winner after rising highest from James Bree's free-kick.
The Robins failed to win away for the seventh successive time and remain in 16th place.
- Relive Tuesday's EFL action
City looked good for much of the first period as they had the better of the possession, but a Chris Martin header over the bar was the sum of their attacking efforts.
Luton had not registered a shot on target until Lockyer's goal - his first for the Hatters since joining from Charlton in September 2020 - after Bree swung in a cross after a short corner routine.
The Hatters started the second half brightly, but it was City that struck next as Semenyo superbly set up Weimann after controlling a high ball midway in the Luton half, drawing the defenders and playing an excellent pass with the outside of his foot to release the Austrian.
City should have gone in front four minutes later when Cameron Pring forced a superb save from James Shea from the edge of the box before Bree claimed his second assist as Adebayo scored his 12th of the season.
Substitute Nahki Wells could have earned at least a point for the visitors with two late efforts but he missed the target on both occasions.
The second chance came in stoppage time when Weimann headed across the face of goal but the Bermuda forward could only divert the ball into the side netting.
- Line-upsMatch StatsLive Text
- 1Shea15LockyerSubstituted forKiosoat 87'minutesBooked at 90mins32Osho4Naismith2Bree8BerryBooked at 24minsSubstituted forCampbellat 61'minutes6Rea17Mpanzu29Bell26MuskweSubstituted forOnyedinmaat 61'minutes11Adebayo
- 3Potts12Sluga14Mendes Gomes20Kioso22Campbell23Lansbury24Onyedinma
- 12O'Leary26Vyner22Kalas16PringBooked at 67mins3DasilvaSubstituted forConwayat 85'minutes42Massengo36Scott11O'DowdaSubstituted forWilliamsat 76'minutes14Weimann18SemenyoBooked at 62minsSubstituted forWellsat 76'minutes9Martin
Referee:Andy DaviesAttendance:9,202Match StatsHome TeamLutonAway TeamBristol CityPossessionHome41%Away59%ShotsHome8Away12Shots on TargetHome3Away3CornersHome8Away9FoulsHome11Away9Live TextPost update
Match ends, Luton Town 2, Bristol City 1.
Second Half ends, Luton Town 2, Bristol City 1.
Peter Kioso (Luton Town) is shown the yellow card.
Hand ball by Pelly-Ruddock Mpanzu (Luton Town).
Attempt saved. Joe Williams (Bristol City) right footed shot from outside the box is saved in the bottom right corner. Assisted by Alex Scott.
Alex Scott (Bristol City) wins a free kick in the defensive half.
Foul by Elijah Adebayo (Luton Town).
Foul by Nahki Wells (Bristol City).
Kal Naismith (Luton Town) wins a free kick in the defensive half.
Offside, Bristol City. Joe Williams tries a through ball, but Andreas Weimann is caught offside.
Foul by Joe Williams (Bristol City).
James Bree (Luton Town) wins a free kick in the attacking half.
Attempt missed. Nahki Wells (Bristol City) right footed shot from the centre of the box misses to the left. Assisted by Cameron Pring following a corner.
Attempt blocked. Zak Vyner (Bristol City) header from the centre of the box is blocked. Assisted by Alex Scott with a cross.
Corner, Bristol City. Conceded by Kal Naismith.
Substitution, Luton Town. Peter Kioso replaces Tom Lockyer.
Substitution, Bristol City. Tommy Conway replaces Jay Dasilva.
Attempt missed. Andreas Weimann (Bristol City) left footed shot from the centre of the box is just a bit too high. Assisted by Chris Martin with a headed pass.
Foul by Nahki Wells (Bristol City).
Tom Lockyer (Luton Town) wins a free kick in the defensive half.
Page 1 of 5rewindpreviousNavigate to the next pagenextNavigate to the last pageforward