Match ends, Millwall 2, Hull City 1.
Millwall 2-1 Hull City in FA Cup third round
Substitute Shane Ferguson came off the bench to score twice in three minutes as Millwall knocked fellow Championship side Hull City out of the FA Cup.
The Tigers, beaten finalists in 2014, looked bound for Monday's fourth-round draw when Nouha Dicko set up Spaniard Jon Toral's 51st-minute opener.
But Ferguson cut inside from a half-cleared corner on the right to curl in with his left foot after 82 minutes.
Five minutes from time, Ferguson then did it again, also with his left foot.
This time he found the top-right corner from a free-kick after Ondrej Mazuch had been booked for a bad foul on Ryan Leonard 20 yards out.
Ferguson's absence from the starting line-up was one of only two changes made by Millwall boss Neil Harris to his regular Championship starting line-up.
Millwall had the better of the first half, Aiden O'Brien having a header scrambled off the line before firing just wide as the hosts created the better chances.
Hull, who had made eight changes, went ahead through Toral, but Ferguson's arrival as part of a triple substitution on 64 minutes turned the game.
The Lions were unlucky when Jed Wallace set up O'Brien, whose effort came back off the angle of post and bar. But that was a taster of what was to come for the stunned Tigers.
Millwall have reached the fourth round for three consecutive seasons.
Millwall manager Neil Harris:
"They were class goals. It's what you expect from an international footballer. He has got the ability to do that.
"The belief hasn't always been there with Shane but the run of games he has had and the form he has been in has been outstanding and those two goals were befitting of winning any game.
"His confidence should be sky-high, the team's confidence should be sky-high as well. We are finding a way to win football matches.
"I think you saw the belief in the group - even when we were behind again - to come back and win the game."
Hull manager Nigel Adkins:
"We knew it was going to be difficult coming here. We knew the threat was going to be set-pieces but we didn't expect to get done by a short one.
"Ferguson has scored two excellent finishes. It's a shame - the short corner and then an excellent free-kick - and it's frustrating because we made some changes.
"It was good to see some of the younger players making their debuts, it's good experience for them."
- 25WallaceSubstituted forWilliamsat 63'minutes
- 18TunnicliffeSubstituted forMorisonat 63'minutes
- 26SkalakSubstituted forFergusonat 64'minutes
- 3MazuchBooked at 84mins
- 10ToralSubstituted forSheafat 75'minutes
- 18BattyBooked at 90mins
- 9DickoSubstituted forLewis-Potterat 81'minutes
- Andy Woolmer
- Shots on Target
Second Half ends, Millwall 2, Hull City 1.
Corner, Millwall. Conceded by Robbie McKenzie.
Foul by Aiden O'Brien (Millwall).
Todd Kane (Hull City) wins a free kick in the defensive half.
Attempt blocked. Tom Elliott (Millwall) left footed shot from outside the box is blocked. Assisted by Jed Wallace.
Daniel Batty (Hull City) is shown the yellow card for a bad foul.
Jed Wallace (Millwall) wins a free kick on the right wing.
Foul by Daniel Batty (Hull City).
Tom Elliott (Millwall) wins a free kick in the attacking half.
Foul by Robbie McKenzie (Hull City).
Goal! Millwall 2, Hull City 1. Shane Ferguson (Millwall) from a free kick with a left footed shot to the top right corner.
Ondrej Mazuch (Hull City) is shown the yellow card for a bad foul.
Ryan Leonard (Millwall) wins a free kick in the attacking half.
Foul by Ondrej Mazuch (Hull City).
Goal! Millwall 1, Hull City 1. Shane Ferguson (Millwall) left footed shot from outside the box to the top left corner. Assisted by Jed Wallace following a corner.
Corner, Millwall. Conceded by Manuel Milinkovic.
Substitution, Hull City. Keane Lewis-Potter replaces Nouha Dicko.
Aiden O'Brien (Millwall) hits the right post with a right footed shot from very close range. Assisted by Jed Wallace.
Attempt saved. Shaun Williams (Millwall) left footed shot from outside the box is saved in the bottom left corner.
Offside, Hull City. Chris Martin tries a through ball, but Nouha Dicko is caught offside.
Attempt missed. Nouha Dicko (Hull City) left footed shot from outside the box is high and wide to the left. Assisted by Max Sheaf.
Substitution, Hull City. Max Sheaf replaces Jon Toral.
Attempt saved. Jed Wallace (Millwall) right footed shot from the centre of the box is saved in the bottom left corner. Assisted by Steve Morison.
Corner, Millwall. Conceded by Ondrej Mazuch.
Eric Lichaj (Hull City) wins a free kick in the defensive half.
Foul by Jake Cooper (Millwall).
Foul by Kevin Stewart (Hull City).
Mahlon Romeo (Millwall) wins a free kick in the attacking half.
Attempt missed. Alex Pearce (Millwall) header from the left side of the box misses to the left. Assisted by Shaun Williams with a cross following a corner.
Corner, Millwall. Conceded by George Long.
Substitution, Millwall. Shane Ferguson replaces Jiri Skalak.
Substitution, Millwall. Shaun Williams replaces Murray Wallace.
Substitution, Millwall. Steve Morison replaces Ryan Tunnicliffe.
Attempt missed. Jed Wallace (Millwall) right footed shot from outside the box is too high. Assisted by Tom Elliott with a headed pass following a set piece situation.
Foul by Kevin Stewart (Hull City).
Ryan Tunnicliffe (Millwall) wins a free kick in the attacking half.
Attempt blocked. Jed Wallace (Millwall) right footed shot from outside the box is blocked. Assisted by Jiri Skalak.
Corner, Millwall. Conceded by Todd Kane.
Corner, Hull City. Conceded by Jed Wallace.