Match ends, Bristol City 0, Millwall 2.
Millwall brought their 10-match winless run in the Championship to an end with a comfortable victory at play-off hopefuls Bristol City.
The Lions, without a win since 28 October, went in front after 18 minutes when Tom Bradshaw's 20-yard strike was deflected beyond City goalkeeper Daniel Bentley.
Nahki Wells went closest to an equaliser when his clever free-kick was brilliantly kept out by Bartosz Bialkowski, while Mason Bennett missed a golden chance to extend Millwall's lead when he fired over from six yards.
But the former Derby County winger did make the game safe in the second half, curling superbly into the bottom corner to send his side up to 14th in the table.
City's frustration was compounded with the late sending off of striker Famara Diedhiou, who was introduced off the bench in the 59th minute and then sent off 20 minutes later for a second yellow card - all on his 28th birthday.
Until that point the Robins had bossed possession throughout, yet lacked any genuine cutting edge and have now scored just once in four games.
Prior to their trip to Ashton Gate, Millwall had also struggled for goals, but this was a controlled away display which fully merited the three points.
The scoreline may even have been more emphatic had Jed Wallace not been denied by Bentley when through on goal in the closing stages.
Bristol City head coach Dean Holden:
"Our performance was an improvement on Saturday at Rotherham. We moved the ball well up to the final third, but couldn't find a killer pass.
"Fam had his eyes only on the ball for the overhead kick that earned a second caution and it was harsh. On top of all the injuries we have, we now lose him for a game. But that's football and we don't have time to feel sorry for ourselves because we have another game on Friday.
"The first goal came from a deflection and that made life tough for us because Millwall came determined to get men behind the ball. They looked to nick a goal and defend it. We were caught trying to play in the wrong area of the pitch for the second and it has ended up a poor night for us."
Millwall boss Gary Rowett:
"We went for the simplest game plan I have used in ages and I picked a team to implement it. Bristol City have struggled against physical sides and our aim was to get the ball forward early and win the second balls.
"I took a gamble after our defeat at Middlesbrough and highlighted what I saw as a lack of honesty in the performance. That was totally unlike us and the players responded perfectly.
"When we work as hard as we did, we are a very tough team to beat. Of course, there is massive relief after so long without a win, but they weren't all poor performances."
- 22KalasSubstituted forSemenyoat 73'minutes
- 19MariappaSubstituted forO'Dowdaat 59'minutes
- 4NagySubstituted forDiédhiouat 59'minutesBooked at 79mins
- 42MassengoBooked at 85mins
- 7MartinSubstituted forEdwardsat 88'minutes
- 3M Wallace
- 6WilliamsSubstituted forWoodsat 81'minutes
- 7J Wallace
- 9BradshawSubstituted forThompsonat 81'minutes
- 20BennettSubstituted forMaloneat 73'minutes
- 22BödvarssonSubstituted forSmithat 89'minutes
- David Webb
- Shots on Target
Second Half ends, Bristol City 0, Millwall 2.
Attempt saved. Matt Smith (Millwall) right footed shot from the centre of the box is saved in the centre of the goal. Assisted by Jed Wallace.
Attempt blocked. Nahki Wells (Bristol City) right footed shot from outside the box is blocked.
Substitution, Millwall. Matt Smith replaces Jón Dadi Bödvarsson.
Substitution, Bristol City. Opi Edwards replaces Chris Martin.
Attempt saved. Jed Wallace (Millwall) right footed shot from the centre of the box is saved in the centre of the goal.
Foul by Nahki Wells (Bristol City).
Ryan Woods (Millwall) wins a free kick in the defensive half.
Han-Noah Massengo (Bristol City) is shown the yellow card for a bad foul.
Foul by Han-Noah Massengo (Bristol City).
Ryan Leonard (Millwall) wins a free kick in the defensive half.
Chris Martin (Bristol City) wins a free kick in the defensive half.
Foul by Murray Wallace (Millwall).
Foul by Han-Noah Massengo (Bristol City).
Ben Thompson (Millwall) wins a free kick in the defensive half.
Attempt missed. Shaun Hutchinson (Millwall) header from the centre of the box is too high. Assisted by Jed Wallace with a cross following a set piece situation.
Foul by Antoine Semenyo (Bristol City).
Mahlon Romeo (Millwall) wins a free kick on the right wing.
Substitution, Millwall. Ryan Woods replaces Shaun Williams.