Ryan McGivern's late own goal gave Luxembourg an unlikely World Cup draw with Northern Ireland at Windsor Park.
The hosts dominated from the start and a classy dinked finish from Dean Shiels put them ahead.
Northern Ireland squandered numerous chances and away goalkeeper Jonathan Joubert denied Kyle Lafferty and Jamie Ward before Chris Brunt struck a post.
And Luxembourg grabbed a point when Daniel da Mota's shot deflected off McGivern and flew past Roy Carroll.
It is the first time in 10 competitive games that Luxembourg have avoided defeat, an outcome that looked unlikely when the home side made a bright start.
With Michael O'Neill's side looking to bounce back from a Friday's 2-0 defeat by Russia in their Group F opener, Gareth McAuley headed straight at Joubert in the opening minute and the hosts capitalised on their early pressure with a quality goal after 14 minutes.
Jonny Evans and Shiels had already exchanged passes before the striker ran on to the Manchester United defender's throughball and floated a delicate chip over the advancing Joubert.
With the visitors restricted to long-range efforts, Northern Ireland continued to threaten and Lafferty hit the net twice. However, his first effort was ruled out for a push before an offside decision denied him again.
After home defender McAuley received a booking for a foul on Da Mota that rules him out of month's qualifier against Portugal, Lafferty saw a low strike saved by Joubert and also lobbed wide from 16 yards, while Chris Baird sent a glancing header just wide.
Northern Ireland continued to press at the beginning of the second half but frustration crept into their game at the failure to score a deserved second goal.
Lafferty completed an unwanted hat-trick when he slotted in from a Shiels cross, only for the big striker to hear the familiar sound of referee Vlado Glodjovic's whistle, this time for offside.
Joubert made good saves to keep out shots from Lafferty and Jamie Ward before Brunt wasted an excellent opportunity six minutes from time.
Davis provided the the throughball to send the midfielder clear but his low strike hit the outside of the woodwork.
It was a costly miss as Luxembourg snatched a unlikely draw two minutes later when Da Mota's shot cannoned off McGivern and past a stranded Carroll.
Live Text Commentary
Full Time The referee blows for the end of the match.90:00 +3:32
Header from deep inside the penalty area by Chris Baird goes harmlessly over the crossbar.90:00 +2:02 Substitution
Substitution Gilles Bettmer goes off and Eric Hoffmann comes on.88:20
Corner taken by Oliver Norwood from the left by-line played to the near post.88:08
Jamie Ward takes the chance to get an effort at goal. Blocked by Mathias Janisch.87:51
Corner taken by Chris Brunt, Jonathan Joubert makes a save.87:09
Unfair challenge on Jamie Ward by Ante Bukvic results in a free kick. Oliver Norwood crosses the ball in from the free kick, Mathias Janisch makes a clearance.85:52
Assist by Maurice Deville.85:52 Goal scored
Goal! - Daniel Da Mota Alves - N Ireland 1 - 1 Luxembourg A goal is scored by Daniel Da Mota Alves from just outside the penalty box to the bottom left corner of the goal. Northern Ireland 1-1 Luxembourg.83:41
Shot by Chris Brunt from deep inside the penalty area hits the post.82:25 Substitution
Substitution Dean Shiels leaves the field to be replaced by Oliver Norwood.81:43
Maurice Deville has a headed effort at goal from deep inside the area missing to the left of the target.80:37
Foul by Dean Shiels on Mathias Janisch, free kick awarded. Tom Schnell takes the free kick.79:26
Inswinging corner taken from the right by-line by Chris Brunt.78:58
Shot by Jamie Ward. Save by Jonathan Joubert.78:25
The referee blows for offside. Jonathan Joubert takes the free kick.75:58
Corner taken right-footed by Steven Davis.75:37
Kyle Lafferty takes a shot. Save by Jonathan Joubert.73:20
Mario Mutsch delivers the ball from the free kick right-footed from right channel, clearance made by Ryan McGivern.73:20 Substitution
Substitution Jamie Ward joins the action as a substitute, replacing Shane Ferguson.
Unfair challenge on Tom Schnell by Ryan McGivern results in a free kick.70:51
The offside flag is raised against Kyle Lafferty. Mathias Janisch takes the indirect free kick.69:25
Effort on goal by Maurice Deville from just outside the penalty area goes harmlessly over the target.69:08
Free kick awarded for a foul by Steven Davis on Mathias Janisch. Gilles Bettmer restarts play with the free kick.64:47
Jonathan Evans gives away a free kick for an unfair challenge on Chris Philipps. Gilles Bettmer takes the free kick.64:12
Shane Ferguson produces a cross.63:23
The referee blows for offside. Mathias Janisch takes the free kick.62:29
The offside flag is raised against Chris Baird. Jonathan Joubert takes the free kick.61:59
Dean Shiels fouled by Guy Blaise, the ref awards a free kick. Jonathan Evans takes the free kick.60:42
Free kick awarded for a foul by Dean Shiels on Daniel Da Mota Alves. Gilles Bettmer takes the free kick.59:48
The assistant referee flags for offside against Shane Ferguson. Free kick taken by Mathias Janisch.58:26
Free kick taken by Tom Schnell.58:26 Booking
Booking Chris Brunt shown a yellow card.58:14
Chris Brunt concedes a free kick for a foul on Gilles Bettmer.57:46
Unfair challenge on Chris Brunt by Gilles Bettmer results in a free kick. Indirect free kick taken by Steven Davis.56:47
Foul by Chris Brunt on Mathias Janisch, free kick awarded. Free kick taken by Mathias Janisch.55:09
Kyle Lafferty is ruled offside. Jonathan Joubert takes the free kick.54:41
Inswinging corner taken from the left by-line by Steven Davis.54:29
Dean Shiels takes a shot. Ante Bukvic gets a block in.54:08
Inswinging corner taken right-footed by Steven Davis, clearance made by Mathias Janisch.53:57
The ball is sent over by Ryan McGivern, Guy Blaise manages to make a clearance.52:13
Foul by Mathias Janisch on Chris Brunt, free kick awarded. Chris Brunt restarts play with the free kick.50:59
The referee blows for offside. Indirect free kick taken by Jonathan Joubert.49:48
Inswinging corner taken from the right by-line by Gilles Bettmer.49:32 Substitution
Substitution Chris Philipps joins the action as a substitute, replacing Lars Krogh Gerson.47:34
Roy Carroll restarts play with the free kick.47:34 Booking
Booking Maurice Deville booked.47:30
Free kick awarded for a foul by Maurice Deville on Gareth McAuley.47:15
Foul by Kyle Lafferty on Guy Blaise, free kick awarded. Jonathan Joubert restarts play with the free kick.45:01
The referee gets the second half started.45:00 +3:04 Half time
Half Time The first half comes to an end.45:00 +1:47
Aaron Hughes restarts play with the free kick.45:00 +1:47 Booking
Booking Gilles Bettmer receives a caution.45:00 +1:40
Free kick awarded for an unfair challenge on Chris Brunt by Mathias Janisch.45:00 Substitution
Substitution Maurice Deville is brought on as a substitute for Aurelien Joachim.43:24
Inswinging corner taken left-footed by Chris Brunt from the right by-line to the near post, Headed effort from inside the area by Chris Baird misses to the left of the goal.42:27
Kyle Lafferty produces a right-footed shot from the edge of the box and misses to the right of the target.40:45
Chris Brunt takes a shot. Blocked by Tom Schnell.37:31
Free kick taken by Jonathan Joubert.37:31 Booking
Booking The referee shows Kyle Lafferty a yellow card.37:26
Unfair challenge on Mathias Janisch by Kyle Lafferty results in a free kick.32:02
Kyle Lafferty takes a shot. Save made by Jonathan Joubert.31:21
Centre by Daniel Da Mota Alves, Headed effort from inside the area by Mario Mutsch misses to the right of the target.30:45
Kyle Lafferty is caught offside. Jonathan Joubert takes the indirect free kick.28:44
Free kick crossed right-footed by Gilles Bettmer from left channel, Jonathan Evans manages to make a clearance. Corner from the right by-line taken by Gilles Bettmer, save made by Roy Carroll.28:44 Booking
Booking Gareth McAuley is booked.28:37
Unfair challenge on Daniel Da Mota Alves by Gareth McAuley results in a free kick.26:12
Centre by Guy Blaise, Jonathan Evans makes a clearance.24:39
The referee blows for offside against Kyle Lafferty. Indirect free kick taken by Jonathan Joubert.22:46
The ball is sent over by Shane Ferguson, blocked by Lars Krogh Gerson.21:23
The ball is crossed by Chris Brunt, free kick awarded for a foul by Kyle Lafferty on Aurelien Joachim. Jonathan Joubert takes the free kick.20:52
Chris Brunt takes a short corner.20:03
Shot from long distance by Steven Davis goes wide of the left-hand upright.19:11
Gilles Bettmer takes a inswinging corner from the left by-line played to the near post, clearance made by Steven Davis.18:26
Chris Brunt delivers the ball.17:42
Shot by Gilles Bettmer. Save by Roy Carroll.16:45
Unfair challenge on Aurelien Joachim by Ryan McGivern results in a free kick. Free kick taken by Mario Mutsch.14:37
The referee blows for offside against Kyle Lafferty. Jonathan Joubert restarts play with the free kick.13:12
Assist by Jonathan Evans.13:12 Goal scored
Goal! - Dean Shiels - N Ireland 1 - 0 Luxembourg A goal is scored by Dean Shiels from the edge of the area low into the middle of the goal. Northern Ireland 1-0 Luxembourg.12:17
Steven Davis gives away a free kick for an unfair challenge on Gilles Bettmer. Guy Blaise takes the indirect free kick.10:42
Ryan McGivern delivers the ball.9:57
Foul by Jonathan Evans on Mario Mutsch, free kick awarded. Ben Payal takes the direct free kick.8:56
Aurelien Joachim takes a shot. Jonathan Evans gets a block in.8:07
Shot by Tom Schnell from a long way out goes over the net.6:39
Free kick awarded for a foul by Kyle Lafferty on Ben Payal. Jonathan Joubert takes the indirect free kick.5:27
The assistant referee signals for offside against Kyle Lafferty. Jonathan Joubert takes the free kick.3:35
The offside flag is raised against Kyle Lafferty. Jonathan Joubert restarts play with the free kick.1:01
Foul by Steven Davis on Mario Mutsch, free kick awarded. Guy Blaise takes the direct free kick.0:22
Chris Brunt takes the inswinging corner, Gareth McAuley takes a shot. Save made by Jonathan Joubert.0:00
The referee starts the match.
Live data and text provided by our data suppliers