Match ends, Fulham 1, Bristol City 2.
Fulham 1-2 Bristol City
Bristol City fought back from 1-0 down to earn a crucial victory at fellow Championship strugglers Fulham.
After City's Joe Bryan was denied in the opening seconds, Ross McCormack chipped Richard O'Donnell to give Fulham a third-minute lead.
But Marlon Pack levelled from long range midway through the second half and Lee Tomlin's late free-kick won it for the visitors at Craven Cottage.
The defeat leaves Fulham just one point above the relegation zone.
City are four points ahead of third-from-bottom Rotherham and the survival prospects of Lee Johnson's side could have been much better, had the Millers not come from 3-0 behind to draw with Derby.
Fulham went 4-0 up after 36 minutes of the reverse fixture at Ashton Gate in October and they made another fast start against the same opposition on home soil, McCormack netting an exquisite lob from a tight angle for his 21st goal of the season.
City boss Lee Johnson introduced Peter Odemwingie at half-time following his loan move from Stoke on Friday and the Nigeria international came close to a debut goal, but Ryan Fredericks made an excellent block to preserve Fulham's 1-0 advantage.
But the visitors avoided a third successive league defeat in spectacular fashion as Pack equalised and O'Donnell made a stunning late save to keep City on level terms before Tomlin won it with a superb set-piece in added time.
Fulham manager Slavisa Jokanovic:
"We started the game very well and scored a good goal. But we didn't control the last 30 minutes in the second-half. We got confused and started making mistakes.
"Our supporters are unhappy. They don't deserve this at this moment at the level we are now. We are in a relegation battle and our situation is really clear. We have a war in front of us and we have to be ready for this situation. It's not acceptable.
"I can say sorry to the fans as they push us and try and help us. Now it's our turn to be obligated to do something different in our next game. I don't want to think about relegation. It's in our hands still so we must be brave to resolve this situation."
Bristol City manager Lee Johnson:
"For Lee to get it up and over like he did, it always had a chance. It was a very big feeling when that nestled in the bottom corner. After training sessions he always has the ball out. The keepers stay out with him. Practise makes perfect. He can bend it like Beckham. He can't run so he has to!
"That's our fourth win in five away games. Sometimes we are better suited playing away. At home there's been a lot of pressure on our players. It's important we keep striving to go in one direction.
"We had a punch in the gut last game when we conceded in the last few minutes. This time we've won with the boldness in our decisions in the second half. I'm delighted for the players."
- 15MadlBooked at 89mins
- 7FredericksBooked at 79mins
- 8ParkerSubstituted forO'Haraat 80'minutes
- 3GarbuttSubstituted forReamat 77'minutes
- 25DembeleSubstituted forWoodrowat 85'minutes
- 26MatthewsSubstituted forAylingat 90'minutes
- 15FreemanSubstituted forReidat 45'minutes
- 21PackBooked at 63mins
- 22KodjiaSubstituted forOdemwingieat 45'minutes
- Phil Gibbs
- Shots on Target
Second Half ends, Fulham 1, Bristol City 2.
Foul by Dan Burn (Fulham).
Nathan Baker (Bristol City) wins a free kick in the defensive half.
Attempt saved. Michael Madl (Fulham) right footed shot from the left side of the six yard box is saved in the bottom left corner. Assisted by Ross McCormack with a cross.
Attempt missed. Ross McCormack (Fulham) right footed shot from the right side of the box misses to the left following a corner.
Corner, Fulham. Conceded by Lee Tomlin.
Corner, Fulham. Conceded by Aden Flint.
Ryan Fredericks (Fulham) wins a free kick on the right wing.
Foul by Peter Odemwingie (Bristol City).
Goal! Fulham 1, Bristol City 2. Lee Tomlin (Bristol City) from a free kick with a right footed shot to the bottom left corner.
Substitution, Bristol City. Luke Ayling replaces Adam Matthews.
Michael Madl (Fulham) is shown the yellow card for a bad foul.
Foul by Michael Madl (Fulham).
Joe Bryan (Bristol City) wins a free kick in the attacking half.
Offside, Fulham. Michael Madl tries a through ball, but Cauley Woodrow is caught offside.
Attempt blocked. Cauley Woodrow (Fulham) right footed shot from the left side of the six yard box is blocked.
Attempt saved. Ryan Tunnicliffe (Fulham) right footed shot from the centre of the box is saved in the centre of the goal. Assisted by Ross McCormack.
Attempt blocked. Ross McCormack (Fulham) right footed shot from the centre of the box is blocked. Assisted by Ryan Fredericks.
Substitution, Fulham. Cauley Woodrow replaces Moussa Dembele.
Moussa Dembele (Fulham) wins a free kick in the defensive half.
Foul by Marlon Pack (Bristol City).
Foul by Ryan Fredericks (Fulham).
Peter Odemwingie (Bristol City) wins a free kick on the left wing.
Foul by Jamie O'Hara (Fulham).
Bobby Reid (Bristol City) wins a free kick in the defensive half.
Substitution, Fulham. Jamie O'Hara replaces Scott Parker.
Ryan Fredericks (Fulham) is shown the yellow card for a bad foul.
Foul by Ryan Fredericks (Fulham).
Scott Golbourne (Bristol City) wins a free kick in the defensive half.
Substitution, Fulham. Tim Ream replaces Luke Garbutt.
Foul by Fernando Amorebieta (Fulham).
Lee Tomlin (Bristol City) wins a free kick on the right wing.
Offside, Bristol City. Adam Matthews tries a through ball, but Peter Odemwingie is caught offside.
Attempt missed. Aden Flint (Bristol City) header from the centre of the box misses to the left. Assisted by Lee Tomlin with a cross following a corner.
Corner, Bristol City. Conceded by Fernando Amorebieta.
Attempt saved. Nathan Baker (Bristol City) header from the centre of the box is saved in the centre of the goal. Assisted by Lee Tomlin with a cross.
Foul by Scott Parker (Fulham).
Bobby Reid (Bristol City) wins a free kick on the left wing.
Goal! Fulham 1, Bristol City 1. Marlon Pack (Bristol City) right footed shot from outside the box to the bottom left corner.