Mihailo Ivanovic had headed the hosts ahead early in the second half, as they looked to climb four points clear of third place ahead of their automatic promotion rivals, who play later in the afternoon.

Pelle Mattsson made it three goals in three successive games just after the hour mark, with a screamer from the edge of the box into the top right-hand corner of the net to dampen the noise around The Den.

Then came the winning goal with 15 minutes left on the clock, as Oscar Schwartau came off the bench to sweep the ball into the back of the net after a quick counter had seen Mohamed Toure find him in space a few yards out to seal a well-deserved three points.

Philippe Clement made five changes from the side that drew with Portsmouth at Carrow Road on Good Friday, with Jack Stacey, Jose Cordoba, Sam Field, Anis Ben Slimane and Ali Ahmed returning to the line-up.

Field came into the side to partner Mattsson in midfield, with captain McLean pushed onto the right of the attacking trio behind Mathias Kvistgaarden.

The Canaries started brightly in the South London sunshine. Stacey initially burst clear down the right before being dispossessed but quickly won the ball back and found Kvistgaarden inside the area. The Dane laid it off to Slimane, whose strike took a deflection and spun behind for a corner.

The sell-out home crowd were appealing for a penalty inside seven minutes when Josh Coburn tangled with Cordoba as he attempted to get a shot away, but any hopes of a spot-kick were quickly extinguished by the offside flag.

Millwall looked jittery in the opening stages, and when Kvistgaarden picked out Ahmed in space on the edge of the box, the Canadian drove into the area before seeing his effort blocked well by Caleb Taylor.

City continued to apply pressure and came close again when Ahmed slipped Kellen Fisher into space down the left. The young full-back drove into the box and attempted to cut the ball back towards Slimane, but the hosts scrambled clear.

Norwich’s best opening of the half to that point arrived on 27 minutes. Slimane threaded a pass through to Kvistgaarden, who surged towards goal with Tristan Crama in close pursuit. The Millwall defender appeared to give the Dane a nudge as he got his shot away, but Anthony Patterson was down smartly to keep out the tame effort.

The highly rated Femi Azeez then tried his luck from distance in a rare attacking moment for the hosts, but his low strike drifted comfortably wide of Vladan Kovacevic’s right-hand post.

The visitors went even closer on 35 minutes. Cordoba found Slimane, who quickly slipped Stacey into acres of space down the right. The full-back drove into the area from a tight angle but flashed his effort agonisingly across the face of goal and wide.

Another glorious chance followed almost immediately. Ahmed delivered a deep cross towards McLean at the back post, but the City captain could not generate enough power on his effort to seriously test Patterson.

Millwall finally threatened again on the break shortly before the interval. Cordoba did well to clear Azeez’s first cross, but the ball dropped invitingly straight back to the winger, who delivered again for Crama to head narrowly wide.

The Lions then threatened from a short corner in the closing moments of the half. Azeez’s delivery was flicked goalwards by Jake Cooper, but the defender could only send his effort over the crossbar.

The half-time whistle brought an end to a first period dominated by the Canaries, who were left to rue a lack of clinical edge despite creating the clearer openings.

Alex Neil’s side started with more intensity and purpose in the second period and had two chances within the first five minutes. Camiel Neghli beat Stacey and forced Kovacevic into a save before Azeez crossed for Ivanovic, who had come off the bench at half-time, but the Serbian headed wide.

The Lions’ breakthrough came on 57 minutes after some lovely play eventually led to Casper De Norre having room to cross. He picked out Ivanovic, who nipped in ahead of Harry Darling to thump his header into the back of the net.

City found a deserved equaliser for their first-half efforts on 62 minutes. Ahmed slipped in Toure, who had been introduced at half-time; he initially hesitated before rolling the ball across to Pelle Mattsson in space on the edge of the box. The Dane, who had already scored two goals in his last two games, smashed the ball into the top right corner of the net.

Clement made a double change on 67 minutes, with Fisher and Slimane replaced by Ben Chrisene and Oscar Schwartau, and it paid dividends shortly after.

A quick counter saw Stacey find Schwartau to create a three-on-two. The young attacking midfielder drove into space and played in Toure. The Australian took a touch, waited, and laid it back across to Schwartau, who swept it into the back of the net in front of the noisy travelling City fans.

Toure, who had completely changed the game, was then played in by Field. He drove into the box before his effort was charged down by Cooper and put behind for a corner.

McLean had a chance early in stoppage time when Toure got away again out wide and laid it across to the midfielder, who took a touch to cut inside before curling over the top, but it didn’t matter as City held on to pick up an impressive three points ahead of Saturday’s East Anglian Derby at Carrow Road.

The Canaries will be full of confidence as they look to avenge their October defeat at Portman Road and reclaim local bragging rights. Millwall, meanwhile, head to West Bromwich Albion on Friday night looking to return to winning ways quickly.

Norwich starting X (Image: Adam Harvey)

Substitutes:

13 Daniel Grimshaw (GK)
5 Jakov Medic
8 Liam Gibbs
14 Ben Chrisene (for Fisher, 67)
16 Jacob Wright
18 Amankwah Forson
25 Paris Maghoma
29 Oscar Schwartau (for Slimane, 67)
37 Mohamed Toure (for Kvistgaarden, 46)

Bookings: Cordoba (25), Schwartau (88)

Goals: Mattsson (62), Schwartau (76)

Millwall starting XI (Image: Adam Harvey)

Substitutes:

15 Max Crocombe (GK)
2 Dan McNamara
7 Thierno Ballo
9 Mihailo Ivanovic (for Cundle, 46)
17 Macaulay Langstaff
18 Ryan Leonard
22 Tom Watson (for De Norre, 80)
23 Joe Bryan (for Sturge, 87)
49 Derek Mazou-Sacko (for Bannan, 87)

Bookings: Bryan (88)

Goals: Ivanovic (57)

KEY MOMENTS:

2: 0-0 Stacey bursts down the right before being dispossessed, he then recovers possession, plays it in to Kvistgaarden, who lays it back to Slimane, whose effort deflects behind for a corner off a Millwall defender.

7: 0-0 Coburn goes down in the penalty area after tangling with Cordoba, the referee is unmoved, but the linesman flags the Millwall striker offside anyway.

27: 0-0 Kvistgaarden is played through in behind the Lions defence by Slimane, Crama quickly gets back to nudge the Dane, who falls as he gets his effort away. Patterson gets down to make a comfortable save in the end.

35: 0-0 Stacey gallops into acres of space down the right. The full-back drove into the area from a tight angle but flashed his effort agonisingly across the face of goal and wide.

57: 1-0 GOAL MILLWALL (Ivanovic) De Norre has space in the channel to cross, he picks out Millwall’s Serbian striker, who gets ahead of Darling and thumps his header past Kovacevic.

62: 1-1 GOAL CITY (Mattsson) Ahmed slips in Toure wide in the box, he crosses low to Mattsson in space on the edge of the box. The Dane thunders his effort into the top right corner past Patterson.

76: 1-2 GOAL CITY (Schwartau). City break quickly and have a three on two. Schwartau plays in Toure, who puts it back across to the Dane to sweep City ahead.

Full Time: Millwall 1-2 Norwich City

PLAYER RATINGS

Kovacevic 7; Stacey 8, Darling 8, Cordoba 8, Fisher 7; Field 7, McLean (C) 8, Mattsson 8; Ahmed 7, Slimane 8, Kvistgaarden 6. (Subs): Toure 9, Schwartau 9, Chrisene 7.

MATCH STATISTICS

Possession: 47pc-53pc

Shots: 10-12

On target: 2-5

Corners: 2-5

Fouls: 12-7

Added time: 1 min / 6 mins

Attendance: 18, 885 (2998 away)

Referee: Samuel Allison