Zian Flemming hit a 76th-minute winner to give Millwall a 2-1 Championship victory over Bristol City at Ashton Gate.
The visitors took a 44th-minute lead when Tom Bradshaw’s diving header was well saved by Max O’Leary, only for the striker to get up and shoot home from the rebound.
City responded on 71 minutes when substitute Cameron Pring’s low cross from the left was turned into his own net by Millwall skipper Shaun Hutchinson as he stretched to intercept.
But an error from O’Leary, failing to collect the ball when advancing towards the edge on to claim a high ball, allowed Flemming to slot into an unguarded net from 15 yards.
The City keeper saved an injury-time penalty from substitute Benek Afobe after a foul by Alex Scott on George Saville, but it counted for nothing.
City started brightly with Antoine Semenyo having an early shot blocked and Andreas Weimann sending a glancing header wide from Scott’s free-kick.
But soon the home side were making too many passing errors and Millwall grew into the game, Bradshaw threatening on a couple of occasions.
City defender Timm Klose suffered a head injury and returned to the pitch after treatment swathed in a bandage.
Millwall almost broke the deadlock on 32 minutes when a header Hutchinson was nodded off the line by Mark Sykes.
Neither side could create much in a poor quality first half, although O’Leary did have to deal with a long-range effort from Murray Wallace two minutes before Bradshaw’s goal.
There were jeers from some home fans at the half-time whistle, while the sizeable contingent of Millwall supporters were in high spirits.
City began the second half as they had the first, Semenyo’s driven cross flashing across the six-yard box with no one to apply the finishing touch.
Semenyo was looking the most dangerous attacker on view and his low 59th-minute shot was saved at his near post by George Long’s outstretched legs.
City boss Nigel Pearson responded to his team’s lack of cutting edge by making four substitutions between the 60th and 70th minute, while Millwall’s Gary Rowett made two changes on 61 minutes.
The visitors looked threatening from set-pieces and Hutchinson saw a 65th-minute shot deflected for a corner.
Soon Millwall captain inadvertently put the hosts level as one of Pearson’s replacements, Pring, made a telling contribution.
Bradshaw volleyed over in a strong Millwall response before O’Leary’s error gave City an uphill battle again. It proved beyond them and, but for Afobe’s penalty miss with almost the last kick they would have lost more decisively.