Millwall beat Swindon but were forced to settle for a place in the League One play-offs after Leeds overcame Bristol Rovers to seal automatic promotion.
Swindon, who were also in contention to go straight up, went ahead early on when Danny Ward volleyed home.
But hosts Millwall levelled after Shaun Batt was fouled by Jonathon Douglas and Steve Morison scored from the spot.
Gordon Greer put into his own net and Morrison hit a deflected third before Billy Paynter's header pulled one back.
The result was a fair reflection of a ferociously-contested match and both sides will go into the play-offs - in which Millwall will face Huddersfield and Swindon will play Charlton - in confident mood.
But there was a sense of deflation around the New Den at full-time after it emerged that Leeds had come from behind to take three points against Rovers and seal second place.
Millwall and Swindon each started the day on 82 points, one point adrift of Leeds and still very much in contention for automatic promotion.
With so much potentially at stake, the match got off to a pulsating start, and only three minutes were on the clock when Swindon struck.
Millwall failed to clear a Douglas free-kick and Ward, on loan from Bolton, volleyed into the bottom corner for his seventh goal this season.
It was a strike that stunned the home crowd but not the Lions, who went straight on the attack and were rewarded for a high-tempo brand of pass-and-move football.
Batt, at the heart of most of Millwall's early forays into opposition territory, drove into the Swindon box but was hauled down by Douglas and Morison sent visiting keeper David Lucas the wrong way from the spot.
The home side immediately pressed for a second and Darren Ward's header was tipped to safety before Liam Trotter nodded over from a Scott Barron cross.
Neither side could sustain the frenetic tempo as half-time neared but, shortly after the break, news of a Rovers goal at Leeds began to filter through and it breathed new life into the game.
The New Den was rocking again and half-chances came and went at both ends before Morison raced up the right wing and whipped in a low cross that Greer diverted into his own net.
By now Leeds had equalised against Rovers but, as things stood, Millwall were in possession of second place.
That changed when 10-man Leeds went 2-1 up and suddenly the atmosphere fell flat.
Swindon should have levelled - top-scorer Paynter drilling over from close range - and the visitors were swiftly punished for that miss as Morison looped a half-volley beyond Lucas via a deflection off Greer's arm.
There was still time for Charlie Austin to miss a glorious opportunity after Paynter flicked on Alan Sheehan's cross, and Paynter to deflect home Sheehan's free-kick, but Millwall held on.
Millwall boss Kenny Jackett told BBC London 94.9:
"It was a good win for us and a very good standard game.
"We did well to comeback from 1-0 down early on and win the game.
"Unfortunately things didn't go well for us elsewhere in the country but we have to get over that quickly and now be positive and push for the play-offs."
Live text and stats
Saturday, 8 May 2010
League One
Home Team
Score
Away Team
Time
Millwall
3-2
Swindon
FT
(HT 1-1)
Morison (pen) 14
Greer (og) 62
Morison 73
Ward 3
Paynter 85
Millwall
01 Forde
05 Robinson
16 Barron
18 Ward
21 Smith
12 Hackett
25 Batt yellow card (Harris 54)
26 Abdou
40 Trotter
10 Grabban (Laird 67)
20 Morison yellow card
Substitutes
13 Sullivan,
03 Frampton,
15 Craig,
24 Laird,
08 Alexander,
09 Harris,
30 Obika
Swindon
01 Lucas
03 Sheehan
06 Greer
19 Jean-Francois Lescinel yellow card
21 Darby (Amankwaah 76)
04 Douglas
07 McGovern (O'Brien 75)
24 Ward
30 Ferry
20 Paynter yellow card
32 Austin (Nouble 87)
Substitutes
12 Smith,
02 Cuthbert,
15 Amankwaah,
08 Easton,
10 Timlin,
18 O'Brien,
09 Nouble
Ref: StroudAtt: 17,083
MILLWALL
SWINDON
Possession
Millwall51%
Swindon49%
Attempts on target
Millwall7
Swindon3
Attempts off target
Millwall6
Swindon1
Corners
Millwall8
Swindon3
Fouls
Millwall19
Swindon13
Final Result
Full Time
90:00+4:03 The match has reached full-time.
90:00+3:48 Attacking throw-in by Jack Smith (Millwall).
90:00+3:11 Attacking throw-in by Jack Smith (Millwall).
90:00+3:06 Attacking throw-in by Jack Smith (Millwall).
90:00+2:54 Attacking throw-in by Jack Smith (Millwall).
90:00+1:32 Corner from right by-line taken short right-footed by Chris Hackett (Millwall). Corner from right by-line taken short right-footed by Chris Hackett (Millwall). Goal kick taken long by David Lucas (Swindon).
90:00+0:44 Attacking throw-in by Jack Smith (Millwall).
87:41 Attacking throw-in by Kevin Amankwaah (Swindon).
87:01 Shot by Steve Morison (Millwall) right-footed from right channel (30 yards), over the bar. Goal kick taken long by David Lucas (Swindon).
86:28 Substitution Swindon substitution: Charlie Austin replaced by Frank Nouble (tactical).
84:27 Assist by Alan Sheehan (Swindon) from left channel.
84:27 GOAL - Billy Paynter:Millwall 3 - 2 Swindon headed goal by Billy Paynter (Swindon) (bottom-left of goal) from centre of penalty area (6 yards).Millwall 3-2 Swindon.
83:47 Foul by Darren Ward (Millwall) on Billy Paynter (Swindon). Free kick taken right-footed by Alan Sheehan (Swindon) from left channel,
83:01 Goal kick taken long by David Forde (Millwall).
81:08 Inswinging corner from right by-line taken left-footed by Scott Barron (Millwall) to far post, resulting in open play.
80:29 Foul by Daniel Ward (Swindon) on Nadjim Abdou (Millwall). Free kick taken left-footed by Scott Barron (Millwall) from own half, resulting in open play.
80:05 Defending throw-in by Kevin Amankwaah (Swindon).
79:49 Defending throw-in by Kevin Amankwaah (Swindon).
77:44 Attacking throw-in by Jack Smith (Millwall).
77:29 Defending throw-in by Alan Sheehan (Swindon).
76:18 Foul by Neil Harris (Millwall) on Billy Paynter (Swindon). Free kick taken left-footed by Alan Sheehan (Swindon) from left channel, resulting in open play.
76:00 Attacking throw-in by Alan Sheehan (Swindon).
75:56 Attacking throw-in by Alan Sheehan (Swindon).
75:15 Substitution Swindon substitution: Stephen Darby replaced by Kevin Amankwaah (tactical).
Correction - 74:53 Substitution (Swindon) makes a substitution, with Alan O'Brien coming on for Jon-Paul McGovern.
74:53 Substitution Swindon substitution: Jon-Paul McGovern replaced by Alan O'Brien (tactical).
74:04 Foul by Jon-Paul McGovern (Swindon) on Jack Smith (Millwall). Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
Correction - 72:01 GOAL - Steve Morison:Millwall 3 - 1 Swindon Steve Morison gets on the score sheet with a goal from just inside the penalty area to the top left corner of the goal. Millwall 3-1 Swindon.
72:01 GOAL - Steve Morison:Millwall 3 - 1 Swindon Goal by Steve Morison (Millwall) right-footed (top-left of goal) from right channel (18 yards).Millwall 3-1 Swindon.
71:15 Foul by Steve Morison (Millwall) on Alan Sheehan (Swindon). Free kick taken left-footed by Alan Sheehan (Swindon) from left channel, resulting in open play.
70:35 Neil Harris (Millwall) caught offside. Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
70:03 Foul by Billy Paynter (Swindon) on Liam Trotter (Millwall). Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
68:57 Foul by Paul Robinson (Millwall) on Billy Paynter (Swindon). Free kick taken left-footed by Alan Sheehan (Swindon) from left wing, resulting in open play.
68:24 Foul by Steve Morison (Millwall) on Lescinel Jean-Francois (Swindon). Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
68:11 Goal kick taken long by David Forde (Millwall).
67:58 Shot by Billy Paynter (Swindon) right-footed from right side of six-yard box (6 yards), over the bar.
67:20 Inswinging corner from left by-line taken right-footed by Jon-Paul McGovern (Swindon) to far post, shot by Jonathan Douglas (Swindon) left-footed from right channel (18 yards), blocked by David Forde (Millwall).
66:57 Attacking throw-in by Alan Sheehan (Swindon).
66:29 Inswinging corner from right by-line taken left-footed by Alan Sheehan (Swindon) to centre, clearance by Steve Morison (Millwall).
66:06 Substitution Millwall substitution: Lewis Grabban replaced by Marc Laird (tactical).
61:42 Assist (cross) by Steve Morison (Millwall) from right wing.
61:42 GOAL - Gordon Greer:Millwall 2 - 1 Swindon Own goal by Gordon Greer (Swindon) right-footed (bottom-left of goal) from own half (6 yards).Millwall 2-1 Swindon.
61:14 Attacking throw-in by Jack Smith (Millwall).
60:05 Booking Billy Paynter (Swindon) booked for dissent.
59:05 Attacking throw-in by Stephen Darby (Swindon). Foul by Chris Hackett (Millwall) on Jon-Paul McGovern (Swindon). Free kick taken left-footed by Alan Sheehan (Swindon) from right wing, resulting in open play.
58:18 Foul by Billy Paynter (Swindon) on Paul Robinson (Millwall). Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
57:49 Foul by Darren Ward (Millwall) on Billy Paynter (Swindon). Free kick taken right-footed by Jonathan Douglas (Swindon) from right channel, resulting in open play.
57:35 Goal kick taken long by David Lucas (Swindon).
57:18 Shot by Jack Smith (Millwall) left-footed from right channel (35 yards), missed left.
56:37 Attacking throw-in by Scott Barron (Millwall).
56:04 Attacking throw-in by Scott Barron (Millwall).
55:19 Handball by Daniel Ward (Swindon). Free kick taken right-footed by Jack Smith (Millwall) from right channel, shot by Chris Hackett (Millwall) right-footed from right channel (20 yards), comfortable save (caught) by David Lucas (Swindon).
54:16 Attacking throw-in by Stephen Darby (Swindon).
53:13 Substitution Millwall substitution: Shaun Batt replaced by Neil Harris (injury).
51:58 Foul by Shaun Batt (Millwall) on Gordon Greer (Swindon). Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
51:42 Defending throw-in by Scott Barron (Millwall).
50:31 Attacking throw-in by Alan Sheehan (Swindon).
50:01 Booking Shaun Batt (Millwall) booked for unsporting behaviour.
49:14 Foul by Shaun Batt (Millwall) on Alan Sheehan (Swindon). Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
48:34 Attacking throw-in by Stephen Darby (Swindon).
48:25 Attacking throw-in by Stephen Darby (Swindon).
48:11 Attacking throw-in by Stephen Darby (Swindon).
47:26 Foul by Lewis Grabban (Millwall) on Jonathan Douglas (Swindon). Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
47:17 Attacking throw-in by Jack Smith (Millwall).
46:54 Defending throw-in by Alan Sheehan (Swindon).
46:00 Defending throw-in by Stephen Darby (Swindon).
45:29 Foul by Charlie Austin (Swindon) on David Forde (Millwall). Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
45:01 The referee gets the second half underway.
45:00+3:07 The whistle is blown to end the first half.
Half Time
45:00+1:20 Shot by Shaun Batt (Millwall) right-footed from left channel (30 yards), blocked by Gordon Greer (Swindon).
45:00+0:17 Foul by Chris Hackett (Millwall) on Jon-Paul McGovern (Swindon). Free kick taken left-footed by Alan Sheehan (Swindon) from right channel, resulting in open play.
44:25 Goal kick taken long by David Forde (Millwall).
44:03 Defending throw-in by Scott Barron (Millwall).
43:53 Attacking throw-in by Stephen Darby (Swindon).
42:48 Inswinging corner from left by-line taken right-footed by Jon-Paul McGovern (Swindon) to centre, foul by Billy Paynter (Swindon) on David Forde (Millwall). Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
41:19 Shot by Shaun Batt (Millwall) right-footed from right channel (30 yards), blocked by Lescinel Jean-Francois (Swindon).
40:28 Attacking throw-in by Scott Barron (Millwall).
40:14 Defending throw-in by Scott Barron (Millwall).
39:59 Goal kick taken long by David Lucas (Swindon).
39:31 Header by Liam Trotter (Millwall) from centre of penalty area (12 yards), over the bar.
38:18 Attacking throw-in by Stephen Darby (Swindon).
35:36 Foul by Stephen Darby (Swindon) on Chris Hackett (Millwall). Free kick taken right-footed by Chris Hackett (Millwall) from left channel, resulting in open play.
35:22 Handball by Billy Paynter (Swindon). Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
34:36 Foul by Liam Trotter (Millwall) on Billy Paynter (Swindon). Free kick taken left-footed by Alan Sheehan (Swindon) from left wing, resulting in open play.
34:23 Defending throw-in by Alan Sheehan (Swindon).
33:59 Attacking throw-in by Alan Sheehan (Swindon).
32:49 Attacking throw-in by Chris Hackett (Millwall).
32:13 Billy Paynter (Swindon) caught offside. Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
31:32 Goal kick taken short by David Lucas (Swindon).
31:20 Attacking throw-in by Chris Hackett (Millwall).
30:44 Inswinging corner from left by-line taken right-footed by Chris Hackett (Millwall) to far post, clearance by Stephen Darby (Swindon).
30:00 Attacking throw-in by Stephen Darby (Swindon).
29:51 Attacking throw-in by Stephen Darby (Swindon).
28:46 Foul by Charlie Austin (Swindon) on David Forde (Millwall). Free kick taken right-footed by David Forde (Millwall) from own half, resulting in open play.
27:57 Steve Morison (Millwall) caught offside. Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
27:36 Shot by Lewis Grabban (Millwall) right-footed from right side of penalty area (18 yards), blocked by Alan Sheehan (Swindon). Attacking throw-in by Jack Smith (Millwall).
25:52 Foul by Billy Paynter (Swindon) on Liam Trotter (Millwall). Free kick taken left-footed by Scott Barron (Millwall) from own half, resulting in open play.
25:40 Goal kick taken long by David Lucas (Swindon).
25:17 Shot by Liam Trotter (Millwall) right-footed from right channel (25 yards), over the bar.
24:33 Foul by Steve Morison (Millwall) on Lescinel Jean-Francois (Swindon). Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
23:48 Inswinging corner from right by-line taken left-footed by Scott Barron (Millwall) to centre, clearance by Jon-Paul McGovern (Swindon).
23:48 Booking Lescinel Jean-Francois (Swindon) booked for dissent.
22:13 Inswinging corner from right by-line taken left-footed by Scott Barron (Millwall) to centre, clearance by Alan Sheehan (Swindon).
21:15 Attacking throw-in by Alan Sheehan (Swindon).
20:40 Goal kick taken long by David Lucas (Swindon).
20:17 Shot by Lewis Grabban (Millwall) left-footed from right channel (30 yards), missed right.
20:07 Attacking throw-in by Jack Smith (Millwall).
Correction - 19:39 Inswinging corner taken right-footed by Chris Hackett.
19:39 Inswinging corner from left by-line taken right-footed by Chris Hackett (Millwall) to far post, resulting in ball out of play.
19:01 Inswinging corner from left by-line taken right-footed by Chris Hackett (Millwall) to far post, header by Darren Ward (Millwall) from centre of penalty area (12 yards), save (tipped over) by David Lucas (Swindon).
18:47 Shot by Nadjim Abdou (Millwall) right-footed from left channel (25 yards), blocked by Simon Ferry (Swindon).
18:32 Attacking throw-in by Scott Barron (Millwall).
17:16 Foul by Nadjim Abdou (Millwall) on Billy Paynter (Swindon). Free kick taken right-footed by Jonathan Douglas (Swindon) from left channel, resulting in open play.
16:42 Defending throw-in by Alan Sheehan (Swindon).
16:12 Defending throw-in by Jack Smith (Millwall).
14:50 Foul by Paul Robinson (Millwall) on Billy Paynter (Swindon). Free kick taken right-footed by Jon-Paul McGovern (Swindon) from left wing, resulting in open play.
14:15 Free kick taken left-footed by Lescinel Jean-Francois (Swindon) from own half, resulting in open play.
14:15 Booking Steve Morison (Millwall) booked for unsporting behaviour.
14:02 Foul by Steve Morison (Millwall) on Alan Sheehan (Swindon).
13:31 GOAL - Steve Morison:Millwall 1 - 1 Swindon Placed penalty taken right-footed by Steve Morison (Millwall) (bottom-left of goal), scored.Millwall 1-1 Swindon.
12:19 Foul by Jonathan Douglas (Swindon) on Shaun Batt (Millwall).
11:57 Attacking throw-in by Jack Smith (Millwall).
11:08 Goal kick taken long by David Lucas (Swindon).
Correction - 9:30 Steve Morison concedes a free kick for a foul on Gordon Greer. David Lucas takes the direct free kick.
9:30 Foul by Steve Morison (Millwall) on Gordon Greer (Swindon). Free kick taken left-footed by David Lucas (Swindon) from own half, resulting in open play.
8:23 Goal kick taken long by David Lucas (Swindon).
8:07 Header by Paul Robinson (Millwall) from centre of penalty area (6 yards), missed left.
7:35 Foul by Charlie Austin (Swindon) on Jack Smith (Millwall). Free kick taken left-footed by Scott Barron (Millwall) from right wing, resulting in open play.
6:45 Foul by Stephen Darby (Swindon) on Chris Hackett (Millwall). Free kick taken right-footed by Chris Hackett (Millwall) from left wing, passed.
6:20 Foul by Lescinel Jean-Francois (Swindon) on Steve Morison (Millwall). Free kick taken right-footed by Steve Morison (Millwall) from right channel, passed.
5:44 Attacking throw-in by Jack Smith (Millwall).
5:33 Defending throw-in by Jack Smith (Millwall).
5:17 Attacking throw-in by Scott Barron (Millwall).
5:11 Defending throw-in by Scott Barron (Millwall).
4:31 Goal kick taken long by David Forde (Millwall).
3:58 Foul by Chris Hackett (Millwall) on Stephen Darby (Swindon). Free kick taken right-footed by Jonathan Douglas (Swindon) from right wing, resulting in open play.
3:38 Defending throw-in by Scott Barron (Millwall).
2:31 GOAL - Daniel Ward:Millwall 0 - 1 Swindon Goal by Daniel Ward (Swindon) right-footed (bottom-right of goal) from left side of penalty area (12 yards).Millwall 0-1 Swindon.
1:59 Foul by Paul Robinson (Millwall) on Billy Paynter (Swindon). Free kick taken right-footed by Jonathan Douglas (Swindon) from left channel, resulting in open play.
1:38 Goal kick taken long by David Lucas (Swindon).
0:32 Goal kick taken long by David Forde (Millwall).
0:00 The game begins.
Live text and data provided by The Press Association.
Bookmark with:
What are these?