Skipper Shaun Hutchinson struck an added-time winner to give Millwall a 1-0 Championship victory over Bristol City in a drab contest at Ashton Gate.
The centre-back went forward for a corner from the right deep into five minutes of stoppage time and, when City failed to clear, thumped a sweet left-footed volley past Max O’Leary from 12 yards.
It was enough to settle a poor quality game in which both sides struggled to create meaningful openings.
That did not worry the 600 travelling Millwall fans, who celebrated wildly at the final whistle after seeing their team continue their recent run of good results.
Both sides adopted an unadventurous approach in a drab first half, which was bereft of clear-cut chances.
Jason Knight headed wide from a Matty James corner after 11 minutes for City before producing the one save of note from Matija Sarkic.
The Millwall goalkeeper did well to dive to his right and get a firm hand to Knight’s 17th-minute downward header.
Striker Tom Bradshaw had the visitors’ only first-half goal effort when his low 22nd-minute attempt was blocked by centre-back Rob Dickie.
Andreas Weimann hit twoshots wide for City, but for all their possession Liam Manning’s side lacked tempo to their attacks and a telling final ball.
The last 15 minutes of the half were played out without a scoring opportunity and there was little to encourage supporters of either team on a cold afternoon.
Millwall threatened at the start of the second period. Ryan Leonard saw a low drive blocked by George Tanner and Murray Wallace sent a powerful header over the bar.
Manning responded with two substitutions after 54 minutes, sending on Mark Sykes and Taylor Gardner-Hickman for Weimann and James.
Still Millwall pressed and Wallace was wide with another header as the match finally showed signs of warming up.
Visiting boss Joe Edwards made his first change after 62 minutes, with Aidomo Emakhu replacing Duncan Watmore.
If anything, the play became more scrappy, with passing errors on both sides. O’Leary made his first save after 76 minutes, dealing comfortably with a Brooke Norton-Cuffy header.
City lost Sykes to injury a minute later, Harry Cornick replacing the substitute.
There was still no bite to their attacks and a goalless draw looked certain until Hutchinson’s dramatic late contribution.