Match ends, Oxford United 3, Swansea City 2.
Oxford United 3-2 Swansea City
Kemar Roofe scored twice as League Two Oxford knocked Premier League strugglers Swansea out of the FA Cup.
The in-form hosts recovered from Jefferson Montero's sublime strike to score either side of half-time.
Liam Sercombe levelled from the penalty spot before Roofe curled into the bottom corner from 20 yards.
And Roofe finished off a counter-attack to ensure Oxford reached the fourth round for the first time in 17 years, despite a Bafetimbi Gomis strike.
Swansea's rally came too late and the home side fully deserved their place in the next round following a vibrant performance.
The U's are third in League Two and a number of their young players impressed against a Swansea team that surrendered possession too often and looked shaky at the back in the absence of skipper Ashley Williams.
What it means for Oxford
Michael Appleton's side are already regarded as one of the best teams in their division, and a cup run is likely to further strengthen their promotion push.
Appleton, a former Portsmouth, Blackpool and Blackburn manager, has been promised 50% of the gate receipts generated from the tie for player recruitment.
More than 11,600 supporters packed into the 12,500-capacity Kassam Stadium, guaranteeing a sizeable pay day for the promotion chasers.
Even when under some late pressure, they refused to go long, and in ball-playing John Lundstram, the pacy Roofe and midfield schemer Sercombe they have players who will surely interest clubs from higher divisions.
Swansea swept away
There was little to cheer for the visitors, who looked to have weathered some early pressure when they took the lead against the run of play from Montero's backheel after a clever one-two with Marvin Emnes.
Alan Curtis' side felt aggrieved at Oxford's leveller - McDonald tumbling without any real contact from Kyle Bartley - but the challenge was reckless and epitomised the muddled nature of some of Swansea's play.
It was desperate stuff - Jonjo Shelvey continually firing long-range shots over the bar - and more slack defending allowed Roofe time to cut inside and bury a fine finish into the bottom corner.
Again, for Oxford's third, the Swansea defence could have done better as the impressive Roofe knocked the ball past Jordi Amat and raced through to finish.
There was a late rally following a Gomis goal laid on by Jack Cork, but the sheer desperation about the Premier League side will be a concern ahead of stiffer tests in the top flight.
What they said
Oxford manager Michael Appleton: "I've got to be delighted beating a Premier League side - but not just that, it's the way we did it.
"I think a few people fancied us beforehand and I did too but we also wanted to play the same way we've been doing it all season and play with no fear.
"I've been saying since the start of the season that we've got three or four players who could play at a higher level and Kemar Roofe is one of them.
"But sometimes as a player you want to be at a football club that is also playing to your potential and hopefully they can achieve the success they want here.
"We need more days and nights like this."
Swansea manager Alan Curtis: "We made changes and there was a certain amount of rustiness but I am disappointed. We were poor for the first hour of the game.
"The team we picked was strong enough to win, but all credit to Oxford. They were the better team and deserved to win.
"The league was always going to be the priority but we wanted a cup run and to get some momentum going. It's a huge setback for the club."
Swansea, who made 10 changes, can now focus on Premier League survival, starting with a home game against fellow strugglers Sunderland on Wednesday.
Oxford, who have a four-point cushion in the automatic promotion places in League Two, face Millwall in the first leg of the Football League Trophy area final on Thursday.
- 11MacDonaldSubstituted forO'Dowdaat 71'minutes
- 20TaylorSubstituted forHyltonat 80'minutes
- 4RoofeSubstituted forHobanat 90'minutes
- 2AmatBooked at 46mins
- 14TabanouBooked at 52minsSubstituted forKingsleyat 60'minutes
- 21GrimesBooked at 39minsSubstituted forBarrowat 76'minutes
- 8ShelveyBooked at 56mins
- 17Macedo Lopes
- Kevin Friend
- Shots on Target
Second Half ends, Oxford United 3, Swansea City 2.
Corner, Oxford United. Conceded by Jack Cork.
Attempt blocked. Jordi Amat (Swansea City) right footed shot from outside the box is blocked.
Corner, Swansea City. Conceded by John Lundstram.
Offside, Oxford United. Danny Hylton tries a through ball, but George Baldock is caught offside.
Substitution, Oxford United. Pat Hoban replaces Kemar Roofe.
Offside, Swansea City. Jonjo Shelvey tries a through ball, but Bafétimbi Gomis is caught offside.
Attempt saved. Stephen Kingsley (Swansea City) right footed shot from outside the box is saved in the bottom right corner.
Corner, Swansea City. Conceded by John Mullins.
Attempt blocked. Bafétimbi Gomis (Swansea City) right footed shot from the centre of the box is blocked. Assisted by Modou Barrow.
Corner, Oxford United. Conceded by Kristoffer Nordfeldt.
Attempt saved. Callum O'Dowda (Oxford United) right footed shot from outside the box is saved in the top left corner. Assisted by George Baldock.
Attempt missed. Liam Sercombe (Oxford United) right footed shot from the centre of the box is high and wide to the left. Assisted by George Baldock.
Jack Cork (Swansea City) wins a free kick in the defensive half.
Foul by Callum O'Dowda (Oxford United).
Foul by Jordi Amat (Swansea City).
Chris Maguire (Oxford United) wins a free kick on the right wing.
Substitution, Oxford United. Danny Hylton replaces Ryan Taylor.
Offside, Swansea City. Kristoffer Nordfeldt tries a through ball, but Bafétimbi Gomis is caught offside.
Substitution, Swansea City. Modou Barrow replaces Matt Grimes.
Attempt saved. Jefferson Montero (Swansea City) left footed shot from the left side of the six yard box is saved in the bottom left corner. Assisted by Jonjo Shelvey.
Corner, Oxford United. Conceded by Stephen Kingsley.
Attempt saved. Matt Grimes (Swansea City) left footed shot from outside the box is saved in the top right corner.
Matt Grimes (Swansea City) wins a free kick in the attacking half.
Foul by Liam Sercombe (Oxford United).
Substitution, Oxford United. Callum O'Dowda replaces Alexander MacDonald.
Jefferson Montero (Swansea City) wins a free kick in the defensive half.
Foul by George Baldock (Oxford United).
Jefferson Montero (Swansea City) wins a free kick on the left wing.
Foul by George Baldock (Oxford United).
Goal! Oxford United 3, Swansea City 2. Bafétimbi Gomis (Swansea City) right footed shot from the centre of the box to the bottom right corner. Assisted by Jack Cork.
Offside, Swansea City. Jonjo Shelvey tries a through ball, but Kyle Bartley is caught offside.
Marvin Emnes (Swansea City) wins a free kick in the attacking half.
Foul by John Lundstram (Oxford United).
Substitution, Swansea City. Stephen Kingsley replaces Franck Tabanou.
Goal! Oxford United 3, Swansea City 1. Kemar Roofe (Oxford United) right footed shot from the centre of the box to the centre of the goal. Assisted by Chris Maguire following a fast break.
Corner, Swansea City. Conceded by Sam Slocombe.
Attempt saved. Jack Cork (Swansea City) header from the centre of the box is saved in the top right corner. Assisted by Jonjo Shelvey with a cross.
Corner, Swansea City. Conceded by George Baldock.