Millwall climbed back up the Championship table with a hard-fought win over Bristol City.
The result ended a run of three games without a victory and moved the Lions to within a place of the play-offs.
Dany N'Guessan gave Millwall a first-half lead, with Jon Stead levelling the game after the break.
Adam Smith's fierce volley, his first goal for the club since arriving on loan from Tottenham, restored Millwall's lead 15 minutes from time.
Kenny Jackett's side are only outside the top six on goal difference, while City only have Barnsley between themselves and the foot of the table.
Darius Henderson headed wide inside the first minute of the match, while Liam Trotter forced City goalkeeper Tom Heaton into making a save as the hosts started well.
Not so happy New Year
This was the first time Bristol City have tasted defeat in the first game of the calendar year since 2003.
N'Guessan drilled the ball past Heaton on 19 minutes to give Milwall a deserved lead, and the home side dominated until the break with Mark Beevers going close with a header.
City increased their tempo after half-time and began to threaten the Millwall goal, with keeper David Forde pushing a Neil Danns shot around his post two minutes after the restart.
Substitute Sam Baldock forced Forde into a fine save from 25 yards before the visitors drew level after 63 minutes, the unmarked Stead touching in Albert Adomah's long ball from in front of goal.
The equaliser pressed Millwall into action, and Smith had already gone close with one chance when he latched onto a knockdown from James Henry's free kick to volley the ball beyond Heaton for the winner.
Millwall manager Kenny Jackett: "It's great to get a win after two losses, I'm very, very pleased with that.
"Their keeper was far busier than ours and kept them in it with some excellent saves and we're very pleased with the victory.
"I am very pleased for Adam Smith because throughout his Millwall career he has looked like breaking through from the back in either setting up or scoring a goal."
Bristol City manager Derek McInnes: "We didn't deal with the free kick and it's a goal we've lost far too often - it was far too easy to score for them. But we put the game to chance with an inept first half performance. That was where we lost it.
"The second half performance was so much better, and even then after the equaliser we looked like we should go on to win it.
"At the very least we should take a draw, so it's very frustrating to come away with nothing."
Live Text Commentary
Full Time The match has reached full-time.90:00 +3:01
Direct free kick taken by Liam Trotter.90:00 +3:01 Booking
Booking Albert Adomah is given a yellow card.90:00 +2:57
Albert Adomah is penalised for a handball.90:00 +1:49
Tom Heaton takes the direct free kick.90:00 +1:49 Substitution
Substitution (Millwall) makes a substitution, with Shaun Batt coming on for Dany N'Guessan.90:00 +1:49 Booking
Booking The referee cautions James Henry for unsporting behaviour.90:00 +1:38
James Henry challenges Neil Danns unfairly and gives away a free kick.90:00 +0:18
Inswinging corner taken right-footed by Martyn Woolford from the left by-line to the near post, clearance by James Henry.89:48
Shane Lowry challenges Ryan Taylor unfairly and gives away a free kick. Free kick crossed right-footed by Albert Adomah from right channel.87:59
Tom Heaton restarts play with the free kick.87:59 Substitution
Substitution Ryan Taylor replaces Mark Wilson.87:59
Free kick awarded for an unfair challenge on Greg Cunningham by Dany N'Guessan.87:32
Albert Adomah takes a shot. Save by David Forde.85:38
Liam Trotter takes a shot. Save by Tom Heaton. James Henry takes the outswinging corner, Cole Skuse makes a clearance.83:36
Free kick awarded for a foul by Shane Lowry on Albert Adomah. Tom Heaton restarts play with the free kick.81:54 Substitution
Substitution Darius Henderson leaves the field to be replaced by Jack Smith.81:27
Free kick awarded for a foul by Martyn Woolford on Adam Smith. David Forde restarts play with the free kick.77:44
Free kick awarded for a foul by Liam Trotter on Albert Adomah. Tom Heaton restarts play with the free kick.74:39
Liam Trotter provided the assist for the goal.
Goal! - Adam Smith - Millwall 2 - 1 Bristol C Goal scored by Adam Smith from inside the box high into the middle of the goal. Millwall 2-1 Bristol City.73:39
Darius Henderson fouled by Stephen McManus, the ref awards a free kick. James Henry crosses the ball,73:04
Shot by Jon Stead from outside the box goes over the net.70:54
Mark Beevers concedes a free kick for a foul on Jon Stead. Stephen McManus takes the direct free kick.70:18
Matthew Bates gives away a free kick for an unfair challenge on Darius Henderson. Direct free kick taken by Danny Shittu.68:53
Foul by Mark Beevers on Jon Stead, free kick awarded. Free kick taken by Greg Cunningham.67:00
Darius Henderson challenges Matthew Bates unfairly and gives away a free kick. Tom Heaton takes the free kick.65:44
Foul by Adam Smith on Albert Adomah, free kick awarded. Tom Heaton takes the free kick.65:19
A cross is delivered by Liam Feeney, save by Tom Heaton.64:56
Adam Smith takes a shot. Save by Tom Heaton. Corner from left by-line taken by James Henry.64:09
Liam Trotter takes a shot. Save made by Tom Heaton.62:57
Assist by Albert Adomah.62:57 Goal scored
Goal! - Jon Stead - Millwall 1 - 1 Bristol C Jon Stead fires in a goal from inside the penalty area to the bottom right corner of the goal. Millwall 1-1 Bristol City.62:19
Dany N'Guessan is flagged offside by the assistant referee. Tom Heaton takes the free kick.61:21
Martyn Woolford challenges Nadjim Abdou unfairly and gives away a free kick. Adam Smith takes the free kick.60:38
Martyn Woolford has an effort at goal from just outside the box which goes wide of the left-hand post.60:04
Sam Baldock takes a shot. Save by David Forde. Outswinging corner taken left-footed by Greg Cunningham from the left by-line.52:14
Foul by Stephen McManus on Darius Henderson, free kick awarded. Free kick crossed right-footed by James Henry from right channel, Tom Heaton makes a comfortable save.49:17
Neil Danns takes a shot. Save made by David Forde. Outswinging corner taken from the right by-line by Albert Adomah, Danny Shittu makes a clearance.47:50
Foul by Adam Smith on Greg Cunningham, free kick awarded. Tom Heaton restarts play with the free kick.45:01
The match restarts for the second half.45:00 +2:27 Half time
Half Time The match has reached half-time.45:00 +2:01
David Forde takes the direct free kick.45:00 +2:01 Booking
Booking Booking for Neil Danns for dissent.45:00 +1:47
Free kick awarded for an unfair challenge on Darius Henderson by Neil Danns.45:00 +0:37
Dany N'Guessan takes a shot.44:23 Substitution
Substitution Martyn Woolford comes on in place of Paul Anderson.44:23 Substitution
Substitution Sam Baldock comes on in place of Liam Fontaine.42:38
Free kick awarded for a foul by Mark Beevers on Jon Stead. Albert Adomah takes the free kick.39:44
Corner from the left by-line taken by James Henry, Headed effort from deep inside the penalty area by Mark Beevers misses to the left of the goal.35:36
Headed effort on goal by Liam Trotter from inside the penalty box misses to the right of the target.35:07
Inswinging corner taken right-footed by James Henry from the left by-line.34:26
Foul by Liam Fontaine on Dany N'Guessan, free kick awarded. Free kick crossed by James Henry, clearance by Mark Wilson.28:21
The referee blows for offside. Indirect free kick taken by Tom Heaton.27:01
The assistant referee flags for offside against Dany N'Guessan. Indirect free kick taken by Tom Heaton.25:56
Free kick awarded for an unfair challenge on Neil Danns by Liam Feeney. Cole Skuse restarts play with the free kick.25:18
Unfair challenge on Albert Adomah by Shane Lowry results in a free kick. Direct free kick taken by Cole Skuse.23:41
Jon Stead challenges Mark Beevers unfairly and gives away a free kick. David Forde takes the free kick.22:17
Shot on goal by Danny Shittu from long range goes harmlessly over the target.21:32
Unfair challenge on James Henry by Paul Anderson results in a free kick. Danny Shittu restarts play with the free kick.18:33 Goal scored
Goal! - Dany N'Guessan - Millwall 1 - 0 Bristol C Dany N'Guessan scores a goal from inside the penalty box to the bottom left corner of the goal. Millwall 1-0 Bristol City.17:28
Outswinging corner taken from the right by-line by James Henry.16:50
Corner from right by-line taken by James Henry.16:34
Liam Trotter takes a shot. Save by Tom Heaton.12:54
The offside flag is raised against Dany N'Guessan. Indirect free kick taken by Tom Heaton.11:33
James Henry concedes a free kick for a foul on Mark Wilson. Mark Wilson restarts play with the free kick.7:05
Corner taken right-footed by James Henry to the near post, clearance made by Mark Wilson.5:38
Foul by Liam Fontaine on Darius Henderson, free kick awarded. Direct free kick taken by James Henry.2:26
Free kick awarded for a foul by Liam Trotter on Neil Danns. Cole Skuse takes the direct free kick.0:56
Darius Henderson has a headed effort at goal from deep inside the area missing to the left of the target.0:00
The game kicks-off.
Live data and text provided by our data suppliers