Jacob Brown’s early strike set up Stoke City’s first win in nine games as they dealt a blow to Millwall’s Championship play-off hopes.
Brown nodded in Lewis Baker’s corner to put the Potters in control before George Saville’s own goal made it 2-0.
Stoke dominated and should have scored more – although Jed Wallace might have reduced the deficit after Tom Bradshaw was fouled in the box.
However, Jack Bonham saved Wallace’s penalty and the home side went on to close out the game.
Defeat brought the Lions’ eight-match unbeaten run to an end, leaving them four points outside the top six, and eased the pressure on Stoke manager Michael O’Neill.
O’Neill’s side started strongly with the lively Brown posing problems, and the 23-year-old had already gone close twice before he opened the scoring in the 20th minute.
Brown was perfectly positioned to meet Baker’s ball into the box, rising above his marker to head his 10th league goal of the campaign.
Millwall struggled to fashion a response before half-time, although Danny McNamara and Mason Bennett combined to set up a chance for Saville, who drilled it over the crossbar.
The home side pushed for a second goal after the break and Baker and Mario Vrancic were both off target, while Jake Cooper came to Millwall’s rescue after Joe Allen won possession and played Brown in again.
The Stoke striker squandered an even better opportunity when another incisive Baker cross reached him at the far post, but he headed against the woodwork from close range.
Instead, it was Saville who doubled the Potters’ advantage, turning Baker’s cross into his own net with 20 minutes remaining.
Millwall were handed a lifeline soon afterwards when substitute Bradshaw was held back by Phil Jagielka, but Bonham kept out the spot-kick.
Stoke manager Michael O’Neill told BBC Radio Stoke:
“Very good performance, I thought a lot of control on the performance, real good application, defensively we were excellent. But some of our play was excellent in the game as well.
“Ironically, the two goals came off set-pieces when we’ve made so many other aspects of good play as well. I think we thoroughly deserved to win the game.
“It’s important your full-backs don’t get overly aggressive and then leave space in behind, particularly against a team like Millwall who want to play a lot of direct balls. That’s what caught us out in the game against Cardiff to be honest.
“I thought we were very disciplined in how we played and again we showed some real good quality as well.”
Millwall manager Gary Rowett told BBC Radio London:
“I think in this period of games that we’ve had, where we’ve been excellent, I think it’s been nine games since the Fulham game. We’ve won six, drawn two and now we’ve lost one at the end of it.
“Whichever way round that run looks it’s a very, very good run and it’s a very impressive run from our players in light of the fact that we’ve got very few options available to us.
“You saw today a few coming back, but I don’t think they were quite match fit. But it was nice to get them out there.
“Disappointing end to the run, disappointing way to go into the international break, but I think the team can take massive, massive credit from this recent period.”
- 14TymonBooked at 56mins
- 8VrancicSubstituted forThompsonat 70′minutesBooked at 84mins
- 18BrownBooked at 65mins
- 33MaySubstituted forFletcherat 90+5′minutes
- 32Wright-PhillipsSubstituted forCampbellat 89′minutes
- 26BallardBooked at 85mins
- 3M Wallace
- 11MaloneSubstituted forBradshawat 62′minutes
- 7J Wallace
- 20BennettSubstituted forEyeat 78′minutes
- 32BureySubstituted forKieftenbeldat 62′minutes
- John Brooks
Match ends, Stoke City 2, Millwall 0.
Second Half ends, Stoke City 2, Millwall 0.
Substitution, Stoke City. Steven Fletcher replaces Josh Maja.
Attempt missed. Maikel Kieftenbeld (Millwall) right footed shot from outside the box misses to the left.
Murray Wallace (Millwall) wins a free kick in the defensive half.
Foul by Jacob Brown (Stoke City).
Substitution, Stoke City. Tyrese Campbell replaces D’Margio Wright-Phillips because of an injury.
Corner, Millwall. Conceded by Jacob Brown.
Danny Ballard (Millwall) is shown the yellow card for a bad foul.
D’Margio Wright-Phillips (Stoke City) wins a free kick on the left wing.
Foul by Danny Ballard (Millwall).
Jordan Thompson (Stoke City) is shown the yellow card for a bad foul.
Foul by Jordan Thompson (Stoke City).
Jed Wallace (Millwall) wins a free kick in the defensive half.
Offside, Millwall. George Saville tries a through ball, but Sheyi Ojo is caught offside.
Attempt blocked. Jed Wallace (Millwall) right footed shot from outside the box is blocked.
Foul by Phil Jagielka (Stoke City).
George Saville (Millwall) wins a free kick in the attacking half.
Foul by Taylor Harwood-Bellis (Stoke City).
Sheyi Ojo (Millwall) wins a free kick in the defensive half.