Mihailo Ivanovic was Millwall’s match-winner with a second-half strike to secure a 1-0 Championship victory over fellow play-off contenders Bristol City in a game that ended in ugly touchline scenes.
The only goal came on 59 minutes when City goalkeeper Radek Vitek made a double save from Femi Azeez following a fast break down the right, only for the ball to fall into the path of striker Ivanovic, who blasted it home from eight yards.
It took a brilliant injury time save from Max Crocombe to protect Millwall’s lead as he tipped a low drive from substitute Ross McCrorie around a post.
City then had a last-gasp goal ruled out for offside before the final whistle at Ashton Gate was followed by a mass brawl in front of the two dug-outs featuring staff and players from both clubs.
City welcomed skipper Jason Knight back to their starting line-up for the first time since an injury lay-off in midfield, while Millwall made one change at the back with Zak Sturge replacing Danny McNamara, who dropped to the bench.
The home side began brightly and came closest to a first-half goal after only five minutes when Anis Mehmeti’s low cross from the left drifted narrowly wide of the far post.
From then until the break defences dominated, with City edging possession and creating a couple of half-chances which saw a Scott Twine shot deflected and cleared before Adam Randell fired straight at Crocombe on 43 minutes.
The Lions’ only effort at goal before the break was fired high over from distance by Aidomo Emakhu, but they impressed with an organised defensive display that thwarted all City’s efforts to produce a clinical final pass.
Millwall made a change for the start of the second half, with Camiel Neghli replacing Casper De Norre. Again City began sharply with Mark Sykes twice having fierce shots blocked.
At the other end, Azeez fired over from an Ivanovic cross before the deadlock was broken by the latter.
The goal seemed to waken the hosts, who roared back with a spell of concerted pressure that saw Twine have a shot deflected wide, while Rob Dickie had a close range effort cleared off the line.
A couple of penalty appeals went unanswered before Millwall regained their composure and created a great chance to go 2-0 up on 85 minutes when Sturge ran onto a pass from substitute Thierno Ballo only to fire over from inside the box.
City threw everything at their opponents in the closing stages, but in the end Millwall’s strong defence took the honours.