Swansea City secured a play-off place courtesy of a 2-2 draw at Reading which ended the Royals’ top-six hopes.
Yakou Meite’s header offered Reading hope of claiming the win needed to keep their season alive but Jamal Lowe levelled.
Andre Ayew put Swansea ahead late on only for Tomas Esteves to make it 2-2 in stoppage time.
Steve Cooper’s Swansea will face either Brentford, Bournemouth or Barnsley in the play-offs.
Swansea climb to fifth while Reading, who topped the table in the early stages of the season, stay seventh.
Swansea had been in top-two contention for much of the campaign, but their recent poor form means a second successive crack at the play-offs.
They sealed their top-six spot on this ground last season, when a memorable 4-1 victory saw them overhaul Nottingham Forest in the closing minutes of the campaign.
Swansea almost made the perfect start on their return to the Madesjki Stadium as Ben Cabango headed wide of the far post inside the first minute before Wayne Routledge’s drive ricocheted over the bar.
But Reading grew into the contest and took the lead with their first clear sight of goal.
The breakthrough came from a throw-in, with Omar Richards and Lucas Joao involved before John Swift marked his first start since early February with an assist.
His inviting cross was met by Meite, who rose above Jake Bidwell and powered a header into the net via the foot of the post.
Conor Hourihane’s loose pass then presented Joao with a golden chance to double Reading’s advantage before half-time, but Freddie Woodman got down sharply to save Swansea.
The visitors might have levelled early in the second period only for Liam Cullen to head Lowe’s drilled cross wide of the target.
Reading’s Andy Rinomhota volleyed into the side netting at the other end before substitute Andre Ayew inspired the Swansea leveller.
The Ghana captain took three Reading players out of the game as he flicked a backheel through Liam Moore’s legs, allowing Jay Fulton to surge into the Reading box.
When Fulton’s low drive was parried by Rafael, Lowe was on hand to sweep home his fifth goal in as many games.
Reading saw a penalty appeal turned down as Fulton grappled with Joao before a sweet Swansea passing move ended with Bidwell rolling the ball across goal for Ayew to score from point-blank range.
Swansea might have added a third goal in stoppage time but Lowe’s drive cannoned to safety of the post, then Reading replied as Tomas Esteves steered home his first senior goal from the edge of the penalty area.
But there was to be no dramatic climax as Swansea held on for the point they needed.
- 33Cabral Barbosa
- 17YiadomSubstituted forPontes Estevesat 81′minutes
- 29HolmesBooked at 19mins
- 3RichardsSubstituted forAlukoat 87′minutes
- 11MeiteSubstituted forSemedoat 65′minutes
- 10SwiftSubstituted forOliseat 65′minutes
- 14EjariaSubstituted forPuscasat 81′minutes
- 18Lucas João
- 2Pontes Esteves
- 26NaughtonSubstituted forRobertsat 64′minutes
- 5GuehiBooked at 17mins
- 6FultonBooked at 69mins
- 14HourihaneSubstituted forSmithat 87′minutes
- 15RoutledgeSubstituted forWhittakerat 64′minutes
- 20CullenSubstituted forA Ayewat 64′minutes
- 10A Ayew
Match ends, Reading 2, Swansea City 2.
Second Half ends, Reading 2, Swansea City 2.
Goal! Reading 2, Swansea City 2. Tomás Esteves (Reading) left footed shot from the centre of the box to the bottom left corner. Assisted by Sone Aluko.
Attempt blocked. Sone Aluko (Reading) right footed shot from the left side of the box is blocked. Assisted by Tomás Esteves with a cross.
Offside, Swansea City. Marc Guehi tries a through ball, but Jamal Lowe is caught offside.
Attempt missed. Morgan Whittaker (Swansea City) left footed shot from the right side of the box misses to the right.
Jamal Lowe (Swansea City) hits the left post with a right footed shot from the right side of the box. Assisted by Connor Roberts.
Marc Guehi (Swansea City) wins a free kick in the defensive half.
Foul by George Puscas (Reading).
Attempt missed. Michael Olise (Reading) left footed shot from outside the box is too high.
Substitution, Reading. Sone Aluko replaces Omar Richards.
Substitution, Swansea City. Korey Smith replaces Conor Hourihane.
Goal! Reading 1, Swansea City 2. André Ayew (Swansea City) left footed shot from very close range to the bottom right corner. Assisted by Jake Bidwell.
Attempt blocked. Morgan Whittaker (Swansea City) left footed shot from outside the box is blocked. Assisted by Jake Bidwell.
Substitution, Reading. Tomás Esteves replaces Andy Yiadom.
Substitution, Reading. George Puscas replaces Ovie Ejaria.
Ben Cabango (Swansea City) wins a free kick in the defensive half.
Foul by Alfa Semedo (Reading).
Attempt missed. Jamal Lowe (Swansea City) right footed shot from the centre of the box is close, but misses to the right. Assisted by Morgan Whittaker.
Corner, Reading. Conceded by Jay Fulton.