Millwall slipped to a third successive Championship defeat as David Meyler's first-minute goal earned Hull City a first league victory in four attempts.
The Tigers edged a dour game in south London and managed to protect the lead Meyler gave them when he fired home following a poor Mark Beevers backpass.
Millwall rarely threatened before the break but missed a glorious second-half chance through James Henry.
And despite late pressure, Hull held on for a first league win this year.
Hull are now unbeaten in six Championship matches on the road.
The game had promised much when January signing Meyler capitalised on Beevers' error after 45 seconds.
But while the visitors had the better of things before the break, neither side really dominated.
Stephen Quinn nearly made it 2-0 when a half-volley went just wide from Ahmed Elmohamady's cross and Jay Simpson was denied by home keeper David Forde.
Millwall offered little, their best effort a hooked strike from Martyn Woolford that went wide.
But the second-half introduction of of Rob Hulse and Andy Keogh slowly began to make a difference and Henry shot high over the bar after being presented with a one-on-one opportunity by Robbie Brady's mistake.
The game at last began to open up in the final quarter.
Nick Proschwitz fired over for the visitors while at the other end, Woolford sent a free-kick just off target and Tigers goalkeeper David Stockdale made a decent save from Henry's low drive.
Robert Koren almost made it 2-0 late on but the visitors did not need the security of a second goal.
Millwall manager Kenny Jackett:
"I felt we put a lot of pressure on a very good Hull team. I think we were unlucky to lose the game and I felt we did well barring finding the goal.
"We need to make sure we play with that kind of effort, commitment and energy all of the time.
"We're still in the play-off mix - 16 games to go is a long time and we'll keep going."
Hull City manager Steve Bruce:
"We're unbeaten in seven away from home now but it is nice to get that first league win of the year.
"You have to show a bit of resilience in this league and we've done that again here.
"David Meyler has been a terrific acquisition for us. He's had a really good start to his career here, particularly when you consider he's had a few knee injuries. If he can stay fit, he'll be a big player for us."
- 01 Forde
- 03 Shittu
- 12 Lowry
- 16 Beevers
- 25 Smith
- 04 Wright (Keogh - 46' )
- 06 Trotter
- 14 Henry
- 18 Woolford Booked (N'Guessan - 90' )
- 26 Abdou
- 09 Marquis Booked (Hulse - 46' Booked )
- 33 M Taylor
- 02 Dunne
- 27 Osborne
- 15 Feeney
- 07 Hulse
- 20 Keogh
- 22 N'Guessan
- 34 Stockdale
- 05 Chester
- 15 McShane
- 28 Bruce (Evans - 83' )
- 10 Koren
- 23 Faye (Hobbs - 45' )
- 27 Elmohamady
- 29 Quinn Booked
- 31 Meyler (Proschwitz - 68' )
- 11 Simpson
- 30 Brady
- 01 Jakupovic
- 02 Rosenior
- 06 Hobbs
- 08 Evans
- 14 Cairney
- 16 Olofinjana
- 33 Proschwitz
Live Text Commentary
Full Time The referee brings the game to a close.90:00 +2:16
Unfair challenge on Robbie Brady by Danny Shittu results in a free kick. Stephen Quinn restarts play with the free kick.89:53 Substitution
Substitution Dany N'Guessan is brought on as a substitute for Martyn Woolford.89:05
Free kick awarded for an unfair challenge on Jay Simpson by Mark Beevers. Robert Koren takes the free kick.87:32
Robert Koren takes a shot. Save by David Forde. Inswinging corner taken by Robert Koren.86:40
James Chester gives away a free kick for an unfair challenge on Rob Hulse. James Henry takes the indirect free kick.84:10
The assistant referee signals for offside against Nick Proschwitz. David Forde restarts play with the free kick.82:46 Substitution
Substitution Corry Evans joins the action as a substitute, replacing Alex Bruce.80:12
James Henry takes a shot. Save by David Stockdale.78:53
Handball decision goes against Rob Hulse. Free kick taken by Paul McShane.78:05
Andy Keogh takes a shot. David Stockdale makes a save.76:16
Foul by Robert Koren on Adam Smith, free kick awarded. Martyn Woolford shoots direct from the free kick.75:27
Effort on goal by Nick Proschwitz from just inside the area clears the bar.74:13
Foul by Liam Trotter on Stephen Quinn, free kick awarded. David Stockdale restarts play with the free kick.73:01
Corner taken left-footed by Robbie Brady to the near post, clearance by Rob Hulse.72:08
James Henry takes the inswinging corner, clearance by James Chester.70:11
Adam Smith challenges Stephen Quinn unfairly and gives away a free kick. Free kick taken by David Stockdale.68:55
Stephen Quinn fouled by James Henry, the ref awards a free kick. Stephen Quinn takes the indirect free kick.67:33
David Stockdale takes the free kick.67:33 Substitution
Substitution Nick Proschwitz is brought on as a substitute for David Meyler.
The referee blows for offside.66:33
Martyn Woolford takes a shot. Blocked by James Chester.65:22 Booking
Booking Stephen Quinn is cautioned.64:17
Shot from deep inside the area by James Henry clears the crossbar.63:16
Corner taken by Robert Koren from the left by-line, clearance made by Andy Keogh.58:48
Jay Simpson takes a shot from a long way out which goes wide of the right-hand post.57:55
Corner from the right by-line taken by James Henry, clearance made by Robbie Brady.55:44
Corner taken by James Henry from the right by-line, Robbie Brady manages to make a clearance.54:21
Free kick awarded for an unfair challenge on David Meyler by Shane Lowry. The free kick is delivered left-footed by Robbie Brady from right wing.52:32
Robbie Brady takes a inswinging corner.49:34
Free kick taken by Paul McShane.49:34 Booking
Booking Rob Hulse goes into the referee's book for unsporting behaviour.49:23
Free kick awarded for an unfair challenge on Stephen Quinn by Rob Hulse.47:57
Corner taken right-footed by Robert Koren, save by David Forde.46:50
Robert Koren takes a shot. Mark Beevers gets a block in.45:01
The referee blows his whistle to start the second half.45:01 Substitution
Substitution Andy Keogh replaces Josh Wright.45:01 Substitution
Substitution John Marquis goes off and Rob Hulse comes on.45:00 +4:22 Half time
Half Time The ref blows to signal half-time.45:00 +3:43
Robbie Brady challenges Nadjim Abdou unfairly and gives away a free kick. Free kick taken by David Forde.45:00 +2:44
The referee blows for offside against Stephen Quinn. David Forde restarts play with the free kick.45:00 +1:58
Robert Koren takes a shot. Blocked by Mark Beevers.45:00 +1:38
David Meyler fouled by Shane Lowry, the ref awards a free kick. James Chester takes the indirect free kick.45:00 +0:43 Substitution
Substitution Jack Hobbs comes on in place of Abdoulaye Faye.43:39
Alex Bruce is adjudged to have handled the ball. Danny Shittu takes the free kick.40:44
James Henry is ruled offside. Free kick taken by Paul McShane.39:43
Unfair challenge on Alex Bruce by John Marquis results in a free kick. Indirect free kick taken by Robbie Brady.36:29
Liam Trotter fouled by David Meyler, the ref awards a free kick. Liam Trotter restarts play with the free kick.35:57
Martyn Woolford has an effort at goal from close in which goes wide left of the goal.34:32
Mark Beevers challenges Jay Simpson unfairly and gives away a free kick. The free kick is delivered left-footed by Robbie Brady from right wing, Josh Wright makes a clearance.33:36
Martyn Woolford takes a shot. David Stockdale makes a save.33:10
John Marquis gives away a free kick for an unfair challenge on James Chester. David Meyler restarts play with the free kick.32:35
Jay Simpson takes a shot. Save made by David Forde.31:21
Free kick awarded for an unfair challenge on Abdoulaye Faye by John Marquis. Indirect free kick taken by David Stockdale.31:20 Booking
Booking John Marquis receives a yellow card for unsporting behaviour.30:14
Unfair challenge on David Meyler by Shane Lowry results in a free kick. Indirect free kick taken by Robbie Brady.29:41
Free kick awarded for a foul by Liam Trotter on David Meyler. Free kick taken by David Stockdale.25:59
James Henry takes a shot. Blocked by Robbie Brady. John Marquis produces a left-footed shot from the edge of the box and misses to the left of the target.23:38
David Meyler concedes a free kick for a foul on John Marquis. Josh Wright takes the indirect free kick.22:51
Shot by Stephen Quinn from deep inside the penalty area misses to the right of the goal.21:38
Jay Simpson is adjudged to have handled the ball. Free kick taken by Danny Shittu.19:46
John Marquis takes a shot. Save by David Stockdale.18:08
Abdoulaye Faye takes the free kick.18:08 Booking
Booking The referee shows Martyn Woolford a yellow card.17:53
Free kick awarded for an unfair challenge on Stephen Quinn by Martyn Woolford.11:53
Stephen Quinn gives away a free kick for an unfair challenge on James Henry. Danny Shittu takes the indirect free kick.10:04
James Henry takes the outswinging corner, clearance by Ahmed Elmohamady.8:03
Inswinging corner taken left-footed by Robbie Brady, clearance by Danny Shittu. Robert Koren takes a shot. Blocked by Mark Beevers.5:22
Foul by Robbie Brady on John Marquis, free kick awarded. James Henry takes the indirect free kick.4:28
Foul by Ahmed Elmohamady on Adam Smith, free kick awarded. Free kick taken by David Forde.2:37
Paul McShane gives away a free kick for an unfair challenge on James Henry. Strike comes in from James Henry from the free kick, blocked by Robert Koren.0:45 Goal scored
Goal! - David Meyler - Millwall 0 - 1 Hull City A goal is scored by David Meyler from inside the penalty box to the bottom right corner of the goal. Millwall 0-1 Hull.0:00
The match has kicked off.
Live data and text provided by our data suppliers