Match ends, Swansea City 0, Millwall 1.
Swansea City 0-1 Millwall: Jed Wallace free-kick gives Lions victory
Millwall continued their revival under new manager Gary Rowett as Jed Wallace's fine free-kick secured victory at high-flying Swansea City.
A flat first-half failed to ignite despite late chances at both ends, with Wallace closest to an opening goal.
After a period of Swansea pressure in the second half, the Millwall midfielder struck with a powerful, curling free-kick.
The hosts desperately searched for an equaliser but substitute Borja Baston squandered their best opportunity, lifting a tame effort wide.
A third win from Rowett's first four games in charge lifts Millwall up to 10th in the Championship table, four points adrift of the play-off places.
Swansea now occupy the last of those spots, dropping down from fourth after a fourth defeat from their past six home fixtures.
This was a settled Swans side aiming to maintain momentum, unchanged for a fourth successive match after two wins and a draw from their previous three.
But Steve Cooper's team struggled for fluency during a scrappy start to the game, seeing plenty of the ball but lacking a cutting edge.
It was the kind of disjointed affair where a mistake felt the likeliest route to a goal, and so it almost proved when Millwall centre-back Jake Cooper was dispossessed by Nathan Dyer, before Swansea's Andre Ayew saw his shot beaten away by Bartosz Bialkowski.
Seconds later, the visitors broke and twice came close to an opening goal, first as Connor Mahoney's shot was saved by Freddie Woodman and then from the rebound as Wallace's firmly-struck shot whistled just over the bar.
Millwall finished the first half strongest but they found themselves on the back foot at the start of the second, Swansea pressing forward with George Byers forcing Bialkowski into action.
Substitute Kristoffer Peterson was the next to test the Millwall goalkeeper after a neat turn and shot, but the home side's lack of quality in the final third was to prove costly.
Wallace latched on to a long ball over the Swansea defence and, after he was brought down by Mike van der Hoorn - who was booked as Wallace seemed clean through on goal - on the edge of the area, the Millwall midfielder whipped a superb free-kick over the wall and into the net.
The Lions almost doubled their lead when substitute Jiri Skalek forced Woodman into a smart save, and it was not until the final few minutes that Swansea came close to an equaliser.
There was no shortage of effort but guile and invention was in short supply from the home side, as Rowett's side repelled them relatively comfortably.
Swansea substitute Sam Surridge then set Borja free, but the Spanish striker's lofted effort over Bialkowski drifted harmlessly wide as Millwall saw the game out to secure a first away win of the season.
Swansea City head coach Steve Cooper told BBC Radio Wales Sport: "We know that we fell short today with our performance levels.
"We're big believers in focusing on performances and think that we'll get results through that and today was not at the level required in many areas and for that we didn't get the result we wanted.
"We didn't show enough creativity and quality at the top end of the pitch to allow ourselves the opportunity to score."
Millwall manager Gary Rowett said: "It was a really nice way to end the run of games [without an away win]. The players were conscious of it and needed to do something about it.
"We've worked on a formation the last few weeks to help us away from home. We felt we needed to change something, not just from a football or tactical perspective but from a psychological perspective.
"I thought at times we did it really well. I thought we pressed Swansea in the right areas, we made it hard for them to play through us.
"We created the best chances of the match and I thought we were relatively comfortable in terms of Swansea's chances."
- 5van der HoornBooked at 64mins
- 12DyerSubstituted forBastónat 70'minutes
- 10CelinaSubstituted forSurridgeat 76'minutes
- 15RoutledgeSubstituted forPetersonat 45'minutes
- 22A Ayew
- 3WallaceBooked at 90mins
- 7WallaceSubstituted forBradshawat 90'minutes
- 23BödvarssonSubstituted forSkalakat 76'minutesBooked at 84mins
- 21MahoneySubstituted forSmithat 67'minutes
- Andy Davies
- Shots on Target
Second Half ends, Swansea City 0, Millwall 1.
Mike van der Hoorn (Swansea City) wins a free kick in the attacking half.
Foul by Alex Pearce (Millwall).
Corner, Swansea City. Conceded by Shaun Hutchinson.
Attempt blocked. Kristoffer Peterson (Swansea City) right footed shot from outside the box is blocked. Assisted by Sam Surridge with a headed pass.
Murray Wallace (Millwall) is shown the yellow card.
Substitution, Millwall. Tom Bradshaw replaces Jed Wallace.
Attempt missed. Borja Bastón (Swansea City) right footed shot from the centre of the box is close, but misses to the right. Assisted by Sam Surridge with a through ball.
Attempt missed. Ben Wilmot (Swansea City) right footed shot from outside the box misses to the left. Assisted by Mike van der Hoorn.
Jiri Skalak (Millwall) is shown the yellow card for a bad foul.
Sam Surridge (Swansea City) wins a free kick in the defensive half.
Foul by Jiri Skalak (Millwall).
Corner, Millwall. Conceded by Jake Bidwell.
Attempt blocked. Mahlon Romeo (Millwall) right footed shot from the right side of the box is blocked. Assisted by Jed Wallace with a headed pass.
Attempt saved. Jiri Skalak (Millwall) right footed shot from the left side of the box is saved in the centre of the goal. Assisted by Jed Wallace.
Matt Grimes (Swansea City) wins a free kick in the defensive half.
Foul by Matt Smith (Millwall).
Offside, Millwall. Jake Cooper tries a through ball, but Matt Smith is caught offside.
Substitution, Swansea City. Sam Surridge replaces Bersant Celina.
Substitution, Millwall. Jiri Skalak replaces Jón Dadi Bödvarsson.
Foul by Borja Bastón (Swansea City).
Jake Cooper (Millwall) wins a free kick in the defensive half.
Bersant Celina (Swansea City) wins a free kick in the attacking half.
Foul by Jed Wallace (Millwall).
Attempt missed. Shaun Williams (Millwall) left footed shot from outside the box is too high.
Substitution, Swansea City. Borja Bastón replaces Nathan Dyer.
Nathan Dyer (Swansea City) wins a free kick on the right wing.
Foul by Murray Wallace (Millwall).
Foul by André Ayew (Swansea City).
Shaun Williams (Millwall) wins a free kick in the defensive half.
Substitution, Millwall. Matt Smith replaces Connor Mahoney.
Goal! Swansea City 0, Millwall 1. Jed Wallace (Millwall) from a free kick with a right footed shot to the top right corner.
Mike van der Hoorn (Swansea City) is shown the yellow card for a bad foul.
Foul by Mike van der Hoorn (Swansea City).
Jed Wallace (Millwall) wins a free kick in the attacking half.
André Ayew (Swansea City) wins a free kick in the attacking half.
Foul by Alex Pearce (Millwall).
Attempt saved. Kristoffer Peterson (Swansea City) left footed shot from the centre of the box is saved in the centre of the goal. Assisted by George Byers.
Foul by Kyle Naughton (Swansea City).