Match ends, Millwall 1, Bournemouth 0.
Millwall secured their Championship status for another season by beating Bournemouth through a Martyn Woolford goal as Doncaster were relegated.
The former Bristol City and Scunthorpe midfielder glanced a header past Lee Camp midway through the first half.
Stefan Maierhofer also went close for the home side before both Steve Morison and Owen Garvan hit the woodwork.
Yann Kermorgant and Shaun MacDonald had chances to equalise but found David Forde in excellent form.
It should have been all wrapped up way before the final whistle for Ian Holloway's side but second-half substitute Simeon Jackson fired wide when he had a open goal to aim for.
Despite securing four draws and three wins from their previous seven games, Millwall still needed another victory to ensure survival.
And without a home win since 18 January and up against a Bournemouth side who had lost only one of their past nine games, that was no foregone conclusion.
The Lions were ready for the battle, though, and Woolford had two early chances to give them the lead, first firing just wide before Camp saved well down low to his left.
Kermorgant had the first chance for the Cherries, whose play-off bid had only recently foundered, but his free-kick was tipped round the post by Forde.
In the main though it was the home side creating the chances, Maierhofer seeing a header blocked before Morison put the rebound wide.
The former Norwich striker also hit the post after an excellent chip over Camp.
The goal was no more than Millwall deserved, therefore, Woolford glancing a superb cross from Garvan beyond the despairing dive of the former Nottingham Forest keeper.
Bournemouth started the second half brightly, MacDonald twice going close, but could not find the goals to end their season on a high.
The result means Millwall finished 19th, four points clear of the relegation zone, while Bournemouth slipped to 10th, six points off the top six.
Millwall boss Ian Holloway: "I'm so chuffed for everyone associated with this great football club.
"It's the greatest achievement of my managerial career. We've got a proper Millwall team now.
"Everybody's rallied, everyone's been honest and hard-working. We could have capitulated but it's typical of this place, we've grabbed it by the bootstraps.
"Now I can't wait to put a plan in place with the chairman and the board. It's going to be a big summer."
Bournemouth boss Eddie Howe: "I thought it was a poor-quality game from both sides, but under the circumstances that was understandable.
"We got caught up in the atmosphere and didn't play to our normal level. We had a spell on top during the second half but found their keeper in good form.
"But it's been a very good season, we have improved from the first half of the season and I've been impressed with how the team has developed.
"If we can keep this group together and maybe add to it, we will be stronger next season."
- 28MaloneSubstituted forFredericksat 86'minutes
- 16BeeversBooked at 12minsSubstituted forRobinsonat 34'minutes
- 10BaileyBooked at 44mins
- 42MaierhoferSubstituted forJacksonat 64'minutes
- 11WoolfordBooked at 45mins
- 15A SmithBooked at 45minsSubstituted forFrancisat 45'minutes
- 3S Cook
- 30RitchieBooked at 81mins
- 32O'KaneSubstituted forMacDonaldat 45'minutes
- 20FraserSubstituted forPitmanat 72'minutes
- Michael Naylor
- Shots on Target
Second Half ends, Millwall 1, Bournemouth 0.
Attempt saved. Brett Pitman (Bournemouth) header from the centre of the box is saved in the centre of the goal. Assisted by Yann Kermorgant with a cross.
Corner, Millwall. Conceded by Tommy Elphick.
Attempt missed. Brett Pitman (Bournemouth) left footed shot from more than 40 yards on the right wing misses to the left.
Offside, Bournemouth. Tokelo Rantie tries a through ball, but Yann Kermorgant is caught offside.
Substitution, Millwall. Ryan Fredericks replaces Scott Malone.
Attempt saved. Tokelo Rantie (Bournemouth) left footed shot from the centre of the box is saved in the centre of the goal. Assisted by Brett Pitman.
Corner, Millwall. Conceded by Steve Cook.
Matt Ritchie (Bournemouth) is shown the yellow card for a bad foul.
Foul by Matt Ritchie (Bournemouth).
Simeon Jackson (Millwall) wins a free kick in the attacking half.
Corner, Bournemouth. Conceded by David Forde.
Attempt saved. Andrew Surman (Bournemouth) left footed shot from the left side of the box is saved in the bottom left corner. Assisted by Brett Pitman.
Tokelo Rantie (Bournemouth) wins a free kick on the right wing.
Foul by Alan Dunne (Millwall).
Attempt missed. Simeon Jackson (Millwall) right footed shot from the centre of the box misses to the left.
Attempt blocked. Simeon Jackson (Millwall) right footed shot from outside the box is blocked. Assisted by Owen Garvan.
Foul by Yann Kermorgant (Bournemouth).
Nicky Bailey (Millwall) wins a free kick in the defensive half.