Coventry scored twice in six first-half minutes after going seven hours without a goal
Coventry secured their first win in five games to leapfrog out-of-form Millwall in the Championship table.
The opener arrived when Jordan Shipley's shot cannoned back off the post and was diverted in by Lions defender Jake Cooper after 20 minutes.
Gustavo Hamer stretched the lead six minutes later, firing home after his initial free-kick was blocked.
A foul on Troy Parrott allowed Jed Wallace to halve the deficit from the penalty spot but namesake Murray Wallace was sent off in stoppage time for a second yellow card as Coventry held on.
- Relive Saturday's EFL action
Coventry were without a goal or win in four games going into this fixture and the omens did not look good when joint top-scorer Matt Godden was forced off with an injury after only 15 minutes.
But the Sky Blues went ahead five minutes later when Shipley's shot struck the post and rebounded against retreating Lions defender Cooper, who could not stop it going over the line.
Hamer extended the lead from just outside the penalty area. The midfielder's initial free-kick was blocked by the wall but the rebound came back to him and he fired a deflected shot past the helpless Bartosz Bialkowski.
Millwall failed to register a single shot at goal in the first half, prompting Lions boss Gary Rowett to make two changes at the break, introducing Scott Malone and Troy Parrott for Jon Dadi Bodvarsson and Mason Bennett.
However, they had little immediate impact and Coventry almost scored seconds after the restart when Shipley hit the post.
The hosts eventually called Ben Wilson into action in the Coventry goal after 50 minutes but he was comfortably behind Shaun Williams' shot, and Tom Bradshaw volleyed over soon after.
Millwall were given a lifeline with 16 minutes remaining when half-time substitute Parrott was brought down in the penalty area by Dom Hyam, allowing Wallace to halve the deficit with his sixth goal of the season.
But their chances of salvaging a point evaporated when Murray Wallace was dismissed in second-half injury time, with defeat meaning the Londoners drop to 17th, with Coventry moving a place above them.
Coventry boss Mark Robins told BBC Coventry & Warwickshire:
"It was a brilliant performance. Absolutely outstanding and a good start to the new year. I think there's only one complaint and that's that we didn't finish the game off earlier.
"We've had a number of chances today to have a really healthy scoreline. We finished last year by not scoring for four games in a row so it was nice to get back on the scoresheet.
"There were outstanding performances from Gustavo (Hamer) and Callum O'Hare. The confidence should be coming, certainly with performances like this one today. It was outstanding."
- Line-upsMatch StatsLive Text
Line-upsMillwall
- 33Bialkowski12RomeoSubstituted forBureyat 86'minutes4Hutchinson5Cooper3M WallaceBooked at 90mins19WoodsBooked at 45mins6WilliamsSubstituted forSmithat 86'minutes7J Wallace9BradshawSubstituted forZohoreat 68'minutes20BennettSubstituted forMaloneat 45'minutes22BödvarssonSubstituted forParrottat 45'minutes
Substitutes
- 1Fielding8Thompson10Smith11Ferguson13Zohore14Malone18Leonard25Parrott32Burey
Coventry
- 13Wilson2ØstigardBooked at 90mins5McFadzean15Hyam23Dabo38Hamer14Sheaf21McCallum11O'Hare26ShipleySubstituted forGilesat 67'minutes24GoddenSubstituted forBiamouat 15'minutes
Substitutes
- 8Allen9Biamou17Hilßner18Giles20Bakayoko22Camp27Thompson29Da Costa41Bapaga
Referee:James LiningtonMatch StatsHome TeamMillwallAway TeamCoventryPossessionHome49%Away51%ShotsHome6Away16Shots on TargetHome3Away5CornersHome3Away9FoulsHome17Away9Live TextPost update
Match ends, Millwall 1, Coventry City 2.
90'+6'Full Time
Second Half ends, Millwall 1, Coventry City 2.
90'+5'Post update
Corner, Millwall. Conceded by Leo Østigard.
90'+5'Post update
Attempt blocked. Kenneth Zohore (Millwall) right footed shot from the centre of the box is blocked. Assisted by Matt Smith with a headed pass.
90'+5'Post update
Foul by Gustavo Hamer (Coventry City).
90'+5'Post update
Ryan Woods (Millwall) wins a free kick in the defensive half.
90'+4'Post update
Corner, Coventry City. Conceded by Jake Cooper.
90'+4'Post update
Attempt blocked. Gustavo Hamer (Coventry City) left footed shot from the centre of the box is blocked. Assisted by Maxime Biamou.
90'+3'Dismissal
Second yellow card to Murray Wallace (Millwall) for a bad foul.
90'+3'Post update
Callum O'Hare (Coventry City) wins a free kick on the right wing.
90'+3'Post update
Foul by Murray Wallace (Millwall).
90'+1'Booking
Leo Østigard (Coventry City) is shown the yellow card.
86'Post update
Maxime Biamou (Coventry City) wins a free kick on the right wing.
86'Post update
Foul by Tyler Burey (Millwall).
86'Substitution
Substitution, Millwall. Tyler Burey replaces Mahlon Romeo.
86'Substitution
Substitution, Millwall. Matt Smith replaces Shaun Williams.
85'Post update
Corner, Coventry City. Conceded by Bartosz Bialkowski.
85'Post update
Attempt saved. Callum O'Hare (Coventry City) right footed shot from the centre of the box is saved in the bottom left corner. Assisted by Maxime Biamou.
84'Post update
Gustavo Hamer (Coventry City) wins a free kick in the defensive half.
84'Post update
Foul by Shaun Williams (Millwall).
Page 1 of 6rewindpreviousNavigate to the next pagenextNavigate to the last pageforward
Source: bbc.com