Brentford extended their unbeaten Sky Bet League One run to 17 games with a comfortable home win over Bristol City.
The Bees went ahead early on but were pegged back as former Brentford defender Karleigh Osborne smashed home from distance.
Brentford were under the cosh but Alan Judge put them back in front and from then on there was only one winner.
Marcello Trotta made it 3-1 before half time and the game was over.
The Bees couldn’t add to their tally in the second half but had already done enough to record their 11th straight home win in all competitions and remain at the top of League One.
The game sprung to life immediately.
By the time 15 minutes had elapsed, Bristol City had scored in both ends, there had been other chances and a visiting player had been lucky to escape with a caution.
The City player fortunate to stay on was Simon Gillett, who caught Shaleum Logan with a tackle so late it was almost tomorrow.
Referee James Linington decided it was only worthy of a yellow card when many officials would have given a red.
George Saville curled a shot over for The Bees, who then went ahead nine minutes in.
Jake Bidwell delivered a cross from the left and Aden Flint inexplicably turned it past goalkeeper Elliot Parish, who was rushing out and seemed to be calling loudly.
The goal came before a pattern to the game had been set and City came back well.
They had a chance to equalise when Flint headed wide at the far post and were behind for less than two minutes.
Brentford were perhaps unfortunate that Mr Linington decided a push by Marvin Elliott on Saville in the centre of the field was not a foul but when Marlon Pack spread the play, Osborne had yards of space, he moved forward in to the gap left by Bidwell – who had rushed forward to join a potential attack – and fired an unstoppable shot across David Button and in to the corner.
The act of scoring injured the defender and he limped off before play resumed.
That didn’t harm City, however, who took control of the game.
They exploited space on Brentford’s left, overloading on that side and pushing first Osborne and then his replacement Brendan Moloney right up the pitch.
They tried to take the pitch, which cut up badly but played very well throughout, out of the equation with balls aimed at Bidwell’s head.
They constantly looked to that side and Brentford had to rush men over to cover on numerous occasions.
City should arguably have been ahead by the time the first half reached its midway point.
Tyrone Barnett volleyed wide when he latched on to a Flint nod down; Bidwell blocked a Moloney shot and a Derrick Williams shot deflected wide.
Adam El-Abd then saw a header from a corner blocked by a busy Brentford defence.
When Brentford scored their second, 25 minutes in, it came against the run of play.
Alan McCormack started the move, ironically moving through Brentford’s inside left channel, he fed Trotta and the striker back heeled to Judge, the Irishman’s shot was too hot for Parish to handle, he got a palm to it but it looped up and bounced over the line.
This time there was no quick response from City.
Brentford’s second goal affected them more than the first and The Bees set about extending their lead.
Trotta saw a shot blocked after a good run before a Judge free kick was blocked and a McCormack effort was also cleared by the visitors’ defence.
Parish made a great save to deny Clayton Donaldson after Jonathan Douglas had run forward and found the striker and Judge shot over soon after.
Whenever City lost possession in midfield, Brentford broke with such pace and purpose, they simply couldn’t get enough men back.
With McCormack, Saville and Douglas hunting like a pack in the centre of the pitch, City were robbed often and it was no surprise the third goal came from such a move.
Saville robbed Gillett and McCormack started the charge, he fed Judge on the left and he crossed for Trotta to drill it under Parish.
Trotta could have made it four before the break when City failed to clear a Bidwell cross but his shot was blocked.
The visitors had offered nothing since Brentford’s second goal; they were simply overwhelmed in the middle of the field and unable to stop the red and white tide.
Gillett had a shot from 25 yards at the end of the first period that flew well wide, their only real attacking move since Brentford went in front for the second time.
City stemmed the flow a little after the break but Brentford were still doing most of the attacking.
Judge had a shot blocked and Saville’s follow-up deflected wide early in the half before Button had to be alert to save at the feet of Sam Baldock.
When City failed to clear a Donaldson cross, Judge was tackled as he prepared to shoot and Saville fired over.
Logan had a shot blocked and Douglas failed to control when through after picking up a Donaldson lay off from a Kevin O’Connor pass.
Douglas had a shot blocked soon after and substitute Jake Reeves fired well over from distance.
Barnett missed the target from 25 yards for the visitors, who were not looking likely to salvage anything as the minutes ticked by.
Reeves shot wide again for The Bees when well-placed and he then fired across the face of goal after latching on to a Donaldson flick.
A looping Donaldson header was saved as the minutes ticked down and Logan blasted over before Mr Linington called a halt to proceedings and Brentford had another win.
Brentford: Button; Logan, O’Connor, Craig, Bidwell; McCormack (sub Reeves 70 mins), Douglas, Saville; Donaldson, Trotta (sub Akpom 74 mins), Judge (sub Grigg 74 mins)
Subs (not used): Lee, Yennaris, Diagouraga, Dallas
Bookings: Logan (63 mins) (second of season)
Bristol City: Parish; Osborne (sub Moloney 13 mins), El-Abd, Flint, Williams, Cunningham; Gillett, Pack (sub W. Elliott h/t), M. Elliott; Barnett, Baldock (sub Emmanuel-Thomas 64 mins)
Subs (not used): Fielding, Reid, Bryan, Burns
Bookings: Gillett (3 mins), W. Elliott (55 mins), Cunningham (85 mins)
Attendance: 6,517 (941 away fans)
By Chris Wickham