Stoke City's revival came to a shuddering halt at the New Den as Millwall ended the visitors' seven-match unbeaten run to keep them firmly stuck in the relegation dogfight.
Neil Harris gave the home side a first-half lead and goals from Andy Roberts and David Livermore early in the second period quickly ended Stoke's hopes of a fightback, though Sergei Shtaniuk did grab a consolation.
Striker Harris, who scored a last-minute winner at Bradford last weekend, powered in a header from Mark McCammon's left-wing cross in the 19th minute for his ninth of the season.
The goal was only the third Stoke had conceded in 10 games and it came in Millwall's first dangerous attack of a tentative opening spell which they dominated without causing undue worries for the visitors.
Paul Ifill's shot from the edge of the box, which went wide, was their only sniff of a goal before the breakthrough - but home goalkeeper Tony Warner was largely redundant as Stoke looked completely toothless in attack.
Millwall continued to press forward but though they looked the more likely to carve out an opening, there was little more to trouble Stoke until Ifill headed wide from close in just before half-time.
Stoke withdrew surprise starter Ade Akinbiyi - who has been struggling with a hamstring strain - at half-time and within four minutes they were two down when Roberts robbed Brynjar Gunnarsson and strode forward to fire a 25-yard shot past Mark Crossley.
Six minutes later it was all over as the home side made it three, David Livermore latching on to Roberts' long ball and hitting a 20-yard shot into goal.
Stoke tried to step up their efforts and won a couple of corners that did no damage before McCammon went close to a fourth for Millwall with a close-range header from a Dennis Wise corner.
Stoke finally hit the target in the 73rd minute when Clive Clarke swung over a left-wing free-kick and Shtaniuk headed the ball past Warner, but there was no way back and Crossley made a superb save from Steve Claridge at the death.
Teams
Millwall: Warner, Lawrence, Nethercott, Ward, Ryan,
Ifill (Braniff 88), Wise, Roberts, Livermore, Harris,
McCammon (Claridge 77).
Subs Not Used: Gueret, Kinet, Craig.
Booked: Ifill, Ryan.
Goals: Harris 19, Roberts 49, Livermore 55.
Stoke: Crossley, Handyside, Shtaniuk, Williams (Hoekstra 45),
Thomas, Gunnarsson, Warhurst (Clarke 68), O'Connor,
Marcus Hall, Cooke, Akinbiyi (Mills 45).
Subs Not Used: Banks, Iwelumo.
Goals: Shtaniuk 73.
Att: 8,725
Ref: P Walton (Northamptonshire).