Championship wrap: Sunderland snatch play-off spot
Sunderland snatched a place in the Sky Bet Championship play-offs at Millwall's expense on a dramatic final round of regular games, while Coventry also secured a top-six finish.
Tony Mowbray's Black Cats took sixth spot following a 3-0 win at Preston, where Amad Diallo, Alex Pritchard and Jack Clarke netted after the break.
Millwall had started the day in that position and looked set to seal a play-off berth at half-time against Blackburn Rovers, leading 3-1 with Duncan Watmore having scored a brace either side of Adam Wharton's reply before Oliver Burke added a third for Gary Rowett's men.
But things turned around in remarkable fashion in the second half as a goal from Joe Rankin-Costello and two from Ben Brereton Diaz secured a 4-3 victory for Rovers.
It left Millwall in eighth place, with Blackburn coming seventh as their own top-six hopes came to an end as they just missed out to Sunderland.
Coventry, meanwhile, claimed the point they needed with a 1-1 draw at fourth-placed Middlesbrough, who had already secured their spot in the play-offs.
Gustavo Hamer put Mark Robins' Sky Blues ahead before Cameron Archer equalised in first-half stoppage time.
West Brom were the other team starting the day with a chance of making the top six but they suffered a 3-2 defeat at Swansea, for whom Joel Piroe scored a stoppage-time winner.
Albion had led twice, with efforts from Okay Yokuslu and Semi Ajayi being cancelled out by Luke Cundle and Olivier Ntcham.
Luton, already confirmed as finishing third, drew 0-0 at home against Hull and will now face Sunderland in the play-off semi-finals, while Middlesbrough take on Coventry.
Champions Burnley beat Cardiff 3-0 at Turf Moor, Josh Brownhill, Ashley Barnes and Scott Twine getting on the scoresheet