Coventry City had to come from behind as Haji Wright’s two goals in three minutes beat Millwall to lift the Sky Blues into the Championship top six.
Despite wasting a lot of chances, Mark Robins’ side looked in danger of being beaten by teenager Romain Esse’s first-half strike.
But Wright went down in the penalty area in a tangle of legs with Millwall defender Japhet Tanganga to earn himself a 67th-minute spot-kick.
Then, having sent Matija Sarkic the wrong way from the spot, US international Wright fired a 70th-minute winner when his near-post shot beat Sarkic’s weak attempt to keep it out – for his 11th goal of the campaign.
While City avoided the threat of a second home defeat of the season to climb four places to sixth, it was 18th-placed Millwall’s sixth game without a win across all competitions.
Coventry’s victory was undoubtedly reward for their overall dominance.
They should have been ahead after an early scramble when Tatsuhiro Sakamoto had a shot blocked, then Wright’s follow-up came off the left post – ricocheting on to the woodwork for a second time and back into Sarkic’s safe clutches.
But Millwall’s Michael Obafemi also went close with a shot straight at Coventry keeper Brad Collins, before the visitors stunned the arena by going in front.
The move came straight from Millwall keeper Sarkic, whose long clearance was flicked on down the left and transferred back inside by Zian Flemming before Esse let fly, his powerful right-foot shot getting a big touch off Luis Binks to divert past Collins.
Obafemi should then have made it two when he shot straight at Collins, before Coventry midfielder Victor Torp’s free-kick was tipped over by Sarkic, and Kasey Palmer’s shot was deflected over for a corner off Wes Harding’s head.
The home chances continued to come after the break as Callum O’Hare played in Sakamoto, whose shot was pushed out by Sarkic before Torp had an effort from just outside the area deflected wide.
But, just when impatience levels appeared to be increasing among home fans, Wright went down in the box – and put the resulting penalty in the right corner.
Three minutes later, O’Hare picked out Wright on the left side of the area unmarked and, despite Sarkic’s outstretched right hand getting to it, he found the bottom left corner.
Both sides return to Championship action on Wednesday.
Coventry travel to Devon to play Plymouth Argyle while Millwall host promotion hopefuls Ipswich Town.
Coventry City manager Mark Robins told BBC CWR:
“We’ve had to work hard for that. We want to play quickly and they made it very difficult for us.
“We could even have been out of the game as they had a couple of chances. But then Haji planted his foot, had his leg taken away and got the penalty, which I thought was stonewall.
“There was a bit of rock, paper, scissors with the penalty [to decide who took it] but he’s taken them before in Turkey. He knows what to do. Then he gets the winner and we had other chances. Haji could even have had a hat-trick as he hit the post too.
“The pitch is not in great nick, by the way, and needs sorting out. We have to do some work on that.”
Millwall manager Joe Edwards told BBC Radio London:
“You can see the threat Coventry City have all over the pitch, so to come here and make life uncomfortable for them was good.
“We’ve started a lot of games well and Romain Esse took his opportunity and we had other chances.
“We’ve showed we can trade blows with any team in this league, but we have to do it more consistently.
“It’s quite a soft challenge for the penalty but nothing to really complain about. He gets the wrong side and that one was always going to be given.”
28EcclesSubstituted forThomasat 57′minutes
45PalmerSubstituted forSimmsat 57′minutes
39HoneymanSubstituted forSavilleat 77′minutes
25EsseBooked at 23minsSubstituted forWatmoreat 63′minutes
10FlemmingSubstituted forMayorat 77′minutes
21ObafemiSubstituted forBradshawat 63′minutes
Match ends, Coventry City 2, Millwall 1.
Second Half ends, Coventry City 2, Millwall 1.
Foul by Joel Latibeaudiere (Coventry City).
Casper De Norre (Millwall) wins a free kick in the attacking half.
Milan van Ewijk (Coventry City) wins a free kick on the right wing.
Foul by Adam Mayor (Millwall).
Callum O’Hare (Coventry City) wins a free kick on the right wing.
Foul by George Saville (Millwall).
Tatsuhiro Sakamoto (Coventry City) wins a free kick on the right wing.
Foul by Joe Bryan (Millwall).
Attempt blocked. Bobby Thomas (Coventry City) header from the centre of the box is blocked. Assisted by Victor Torp with a cross.
Corner, Coventry City. Conceded by Japhet Tanganga.
Attempt missed. Tom Bradshaw (Millwall) header from the centre of the box misses to the right. Assisted by Adam Mayor with a cross.
Foul by Tatsuhiro Sakamoto (Coventry City).
Joe Bryan (Millwall) wins a free kick in the defensive half.
Ellis Simms (Coventry City) wins a free kick in the defensive half.
Foul by George Saville (Millwall).
Corner, Millwall. Conceded by Milan van Ewijk.
Attempt missed. Haji Wright (Coventry City) header from the centre of the box is close, but misses to the left.
Substitution, Millwall. Adam Mayor replaces Zian Flemming.