James Maddison showed why he is Norwich City's most valuable player once again at Ashton Gate, blasting his eighth goal of the season to snatch a 1-0 win at high-flying Bristol City.

The Robins were fourth in the Championship table ahead of kick-off but suffered their fifth straight defeat as Maddison fired a superb winner in the 79th minute.

With Angus Gunn also making a fantastic save in injury-time it meant the Canaries held out for a third win in four league games and a fourth clean sheet during their five-game revival.

Daniel Farke was forced into two changes, bringing in Nelson Oliveira – subject of a reported £8m bid from Derby during the week – for Alex Pritchard following the playmaker's sale to Huddersfield in a deal worth an initial £11million, sticking with the 3-4-3 formation deployed in last weekend's 0-0 draw with Chelsea in the FA Cup.

Mario Vrancic was also brought in for the injured Tom Trybull, missing out with a back problem, with Sean Raggett and Todd Cantwell included among the substitutes.

The Canaries had the better of a tame opening 45 minutes, with James Maddison testing Bristol keeper Frank Fielding with a swerving 20-yard shot in the 15th minute

The Robins caught City out with a routine from a Liam Walsh corner from the left two minutes later, Marlon Park and Jamie Paterson stepping over the low cross to allow left-back Joe Bryan to thump a long-range effort, which flew over City's crossbar.

Josh Murphy had the best chance of the half, after James Maddison seized on loose play from Robins top scorer Bobby Reid to play the winger into the left channel, who fired under Fielding from the left of the six-yard box but saw Nathan Baker superbly turn the ball behind for a corner, in the 22nd minute.

Bryan thumped another speculative long-range effort in the 29th minute but Angus Gunn held the shot comfortably enough.

Murphy won a corner five minutes later after slick play with Maddison and Oliveira, Maddison swung in the set-piece from the left and Grant Hanley saw his initial effort blocked before lifting the loose ball over the bar from close range.

Gunn punched a Walsh corner clear as the half-time break neared but the visitors had a fine chance to break the deadlock before the whistle, loose play from the hosts allowing Oliveira to tear clean through with just Fielding to beat, only to fire wide from 15 yards.

The Canaries were living dangerously early in the second half, the already booked Jamal Lewis challenging Josh Brownhill late and Grant Hanley getting up well to head clear Bryan's whipped free-kick at the back post.

Alex Tettey went in the book in the 57th minute for an angry reaction to Flint clattering Gunn and Brownhill struck the bar for the hosts five minutes later with a spectacular 25-yard effort after Walsh cut back another corner.

Maddison was chopped down by Walsh 22 yards from goal in the 65th minute but the 21-year-old didn't beat the wall with his set-piece and blasted an awful follow-up effort well over.

Maddison burst through after a Robins counter broke down in the 68th minute but put too much on his pass to Murphy, forcing him too wide in the left channel and allowing Flint to get back with a vital tackle.

Pack and Brownhill both tried their luck from range as Bristol became more desperate, with Maddison also teeing up Murphy to shoot from the left again in the 73rd minute, only for the winger to blast a shot over.

Gunn held a thumping effort from 15 yards from substitute Ryan Kent after a slaloming run soon after – before Maddison struck his eight goal of the season in fine style.

Vrancic sprayed a fine pass to the right to Pinto, who found Maddison to the right of the box, before the England U21 international turned to find space and blasted a left-footed thunderbolt into the bottom-left corner in front of the 1,200 travelling supporters.

Grant Hanley made some fine blocks in the closing stages but it was Gunn to the rescue in the second minute of added time, making a breathtaking save from Brownhill from point-blank range as City struggled to clear their lines amid late pressure.

The Canaries return to action on Wednesday night when they head to Stamford Bridge for their FA Cup third round replay against Premier League giants Chelsea.

Norwich: Gunn; Hanley, Zimmermann, Klose; Pinto (C), Tettey, Vrancic, Lewis; Maddison (Reed 90+2), Oliveira (Raggett 90+5), Murphy (Stiepermann 89). Unused subs: McGovern (GK), Husband, Hoolahan, Cantwell

Goal: Maddison (79)

Booked: Maddison (foul on Bryan, 25), Lewis (foul on Brownhill, 42), Tettey (dissent, 57), Oliveira (foul on Flint, 83), Pinto (dissent 90+7)

Bristol City: Fielding; Wright, Flint, Baker, Bryan; Brownhill, Smith, Pack, Walsh (Kent 69); Paterson (Taylor 76); Reid (Magnusson 89). Unused subs: Steele (GK), Kelly, Vyner, Woodrow

Booked: Baker (foul on Oliveira, 64)

Referee: Simon Hooper

Attendance: 21,282 (1,217)

• Follow all the post-match reaction and analysis in our Matchday Live blog at pinkun.com/live