Gareth Barry scored a 92nd-minute winner as Manchester City stunned Reading to close the gap on leaders Manchester United to three points.
Premier League champions City looked set to be held by the bottom-placed club before Barry rose above Nicky Shorey to head in David Silva's cross.
Barry and Carlos Tevez went close in a one-sided first half, while substitute Edin Dzeko had chances in the second.
Reading felt they deserved a penalty for a challenge on Jay Tabb at 0-0.
Tabb went down after contact from City's 18-year-old left-back Karim Rekik on his debut.
The visitors also argued that Barry should have been penalised for climbing on substitute Shorey for the goal.
But referee Mike Dean was unmoved on both occasions and City's win halved United's advantage at the top ahead of their trip to Swansea on Sunday,
Reading, by contrast, sit at the foot of the table with seven straight defeats, their worst run since an eight-match losing streak between December 2007 and February 2008. They were relegated that season.
Last-gasp City do it again
The last time Manchester City scored a winning goal Premier League goal in injury time at home, they clinched the 2011-12 title with a 3-2 victory over QPR in May
This was City's first match at Etihad Stadium since defeat by United and they did not look entirely convincing.
Joe Hart was almost embarrassed early on after Jimmy Kebe intercepted his pass, while Jobi McAnuff headed over the bar.
But the expected pattern of play emerged as Sergio Aguero fed Carlos Tevez with a fine touch, only for Adam Federici to save.
City had won all of the 13 previous league matches Aguero and Tevez started together, and the pair again looked sharp, Tevez crossing for Barry to head powerfully at Federici.
Yaya Toure wanted a penalty for an Alex Pearce challenge following slick work by Tevez and Silva, while a Tevez shot was deflected just over and nobody was on hand meet an Aguero cross.
While City continued to press after the break, Reading created the clearest chance when an unmarked Pearce headed off target from Ian Harte's corner.
Manager Roberto Mancini opted to bring Dzeko on for Javi Garcia - replacing a midfielder with a striker - and it almost paid immediate dividends.
Dzeko came within inches of heading home Pablo Zabaleta's cross and then nodded a Tevez corner narrowly over the bar.
At the other end, Dean ignored Reading protests following Rekik's collision with Tabb, Pavel Pogrebnyak almost picked out Kebe and Pearce headed wide for a second time.
But no side had scored more goals in the final 30 minutes of Premier League games this season than City - a tally that is at 21 - and the late rally arrived as Silva nodded over and Aguero hit the side-netting.
It was left to Barry to secure the points with his controversial winner.
- 01 Hart
- 05 Zabaleta
- 28 K Toure
- 33 Nastasic
- 44 Rekik (Milner - 84' )
- 14 Garcia (Dzeko - 58' )
- 18 Barry
- 21 Silva
- 42 Y Toure Booked
- 16 Aguero Booked
- 32 Tevez (Sinclair - 74' )
- 29 Wright
- 04 Kompany
- 06 Lescott
- 07 Milner
- 11 Sinclair
- 62 Razak
- 10 Dzeko
- 01 Federici
- 02 Gunter Booked
- 05 Pearce
- 06 Mariappa Booked
- 23 Harte (Shorey - 86' )
- 04 Karacan (Guthrie - 70' )
- 08 Leigertwood Booked
- 11 McAnuff
- 14 Kebe
- 16 Tabb
- 07 Pogrebnyak
- 41 Taylor
- 03 Shorey
- 17 Gorkss
- 19 Robson-Kanu
- 20 Guthrie
- 09 Le Fondre
- 10 Hunt
Live Text Commentary
Full Time The final whistle goes and the game is over.90:00 +3:32
Corner taken right-footed by Jobi McAnuff.90:00 +2:04
The assist for the goal came from David Silva.90:00 +2:04 Goal scored
Goal! - Gareth Barry - Man City 1 - 0 Reading Gareth Barry finds the net with a headed goal from close in. Man City 1-0 Reading.90:00 +2:02
Sergio Aguero sends in a cross,90:00 +1:01
Sergio Aguero has an effort at goal from just inside the box that misses to the right of the goal.90:00 +0:18
Free kick awarded for a foul by Pavel Pogrebnyak on Joe Hart. Direct free kick taken by Joe Hart.88:38
Close range header by David Silva misses to the right of the target.87:14
Free kick awarded for a foul by Pablo Zabaleta on Alex Pearce. Adam Federici restarts play with the free kick.85:32 Substitution
Substitution Nicky Shorey comes on in place of Ian Harte.84:56
Effort from outside the box by Scott Sinclair goes wide right of the target.83:30 Substitution
Substitution James Milner on for Karim Rekik.82:02
Inswinging corner taken right-footed by Jobi McAnuff from the left by-line, Alex Pearce produces a right-footed shot from deep inside the six-yard box which goes wide of the left-hand upright.80:35
Sergio Aguero takes a shot. Adrian Mariappa gets a block in. Inswinging corner taken by Scott Sinclair, Pavel Pogrebnyak makes a clearance.77:38
Pablo Zabaleta sends in a cross.74:43
Pavel Pogrebnyak takes a shot. Blocked by Kolo Toure.73:47 Substitution
Substitution Scott Sinclair is brought on as a substitute for Carlos Tevez.72:03
Inswinging corner taken from the left by-line by Carlos Tevez.71:10
Sergio Aguero fouled by Mikele Leigertwood, the ref awards a free kick. David Silva takes the direct free kick.69:38
Jobi McAnuff restarts play with the free kick. Mikele Leigertwood concedes a free kick for a foul on Yaya Toure. Joe Hart takes the free kick.
Substitution Danny Guthrie on for Jem Karacan.69:38 Booking
Booking The referee shows Yaya Toure a yellow card for unsporting behaviour.69:30
Free kick awarded for an unfair challenge on Jobi McAnuff by Yaya Toure.68:24
Adrian Mariappa fouled by Sergio Aguero, the ref awards a free kick. Direct free kick taken by Adam Federici.66:58
Free kick awarded for an unfair challenge on Karim Rekik by Jimmy Kebe. Joe Hart takes the direct free kick.66:31
David Silva decides to take a short corner.65:48
Free kick taken by Yaya Toure.65:48 Booking
Booking The referee books Mikele Leigertwood for unsporting behaviour.65:45
Foul by Mikele Leigertwood on Karim Rekik, free kick awarded.64:46
Carlos Tevez takes a outswinging corner from the right by-line played to the near post, Close range strike by Edin Dzeko goes over the bar.63:47
Pablo Zabaleta sends in a cross, Adam Federici makes a save.62:52
Yaya Toure crosses the ball.59:04
Jimmy Kebe fouled by Sergio Aguero, the ref awards a free kick. Adam Federici takes the direct free kick.57:40 Substitution
Substitution Francisco Javi Garcia leaves the field to be replaced by Edin Dzeko.57:40
Yaya Toure delivers the ball.56:22
David Silva sends in a cross, save by Adam Federici.55:05
Jobi McAnuff crosses the ball, save by Joe Hart.53:56
Pavel Pogrebnyak concedes a free kick for a foul on Francisco Javi Garcia. Francisco Javi Garcia takes the direct free kick.52:47
Inswinging corner taken by Ian Harte, Alex Pearce produces a left-footed shot from deep inside the six-yard box which goes wide of the right-hand post.49:55
Jem Karacan gives away a free kick for an unfair challenge on Francisco Javi Garcia. Carlos Tevez crosses the ball in from the free kick, save by Adam Federici.48:58
Foul by Chris Gunter on Gareth Barry, free kick awarded. Francisco Javi Garcia restarts play with the free kick.47:57
Kolo Toure takes a shot. Adrian Mariappa gets a block in. Effort from the edge of the area by Carlos Tevez goes wide of the right-hand upright.47:06
Foul by Alex Pearce on Sergio Aguero, free kick awarded. Gareth Barry restarts play with the free kick.45:29
The ball is crossed by Jem Karacan, Pablo Zabaleta makes a clearance.45:01
The referee blows his whistle to start the second half.45:00 +1:17 Half time
Half Time The match has reached half-time.45:00 +0:45
Outswinging corner taken from the left by-line by David Silva, Adrian Mariappa manages to make a clearance.41:16
Pablo Zabaleta takes a shot. Blocked by Jem Karacan. Carlos Tevez decides to take a short corner. Matija Nastasic produces a right-footed shot from inside the area that goes over the bar.37:09
The official flags Chris Gunter offside. Karim Rekik takes the free kick.35:01
Free kick awarded for an unfair challenge on Mikele Leigertwood by Yaya Toure. Jay Tabb takes the direct free kick.34:25
Gareth Barry takes a shot. Adam Federici makes a save.33:39
Jimmy Kebe concedes a free kick for a foul on Karim Rekik. Direct free kick taken by Karim Rekik.33:12
Foul by Karim Rekik on Chris Gunter, free kick awarded. Direct free kick taken by Adam Federici.31:30
Jem Karacan takes a shot from inside the box clearing the bar.26:58
Yaya Toure takes the free kick.26:58 Booking
Booking Chris Gunter is cautioned by the ref for unsporting behaviour.26:54
Foul by Chris Gunter on Carlos Tevez, free kick awarded.26:22
Unfair challenge on David Silva by Jem Karacan results in a free kick. Direct free kick taken by Gareth Barry.25:24
David Silva fouled by Mikele Leigertwood, the ref awards a free kick. Gareth Barry restarts play with the free kick.21:41
Foul by Pavel Pogrebnyak on Francisco Javi Garcia, free kick awarded. The free kick is swung in right-footed by Carlos Tevez.19:55
Adam Federici takes the direct free kick.19:55 Booking
Booking Booking for Sergio Aguero for unsporting behaviour.19:47
Sergio Aguero challenges Jem Karacan unfairly and gives away a free kick.17:12
Foul by David Silva on Jobi McAnuff, free kick awarded. Free kick taken by Adam Federici.15:14
Carlos Tevez takes a shot. Save by Adam Federici. Carlos Tevez takes a shot. Alex Pearce gets a block in. David Silva takes a outswinging corner to the near post. Corner taken left-footed by David Silva. Francisco Javi Garcia takes a shot. Blocked by Ian Harte. Outswinging corner taken by Carlos Tevez, Adrian Mariappa makes a clearance.13:55
Headed effort from inside the area by Adrian Mariappa misses to the left of the target.12:59
Matija Nastasic gives away a free kick for an unfair challenge on Jimmy Kebe. The free kick is swung in left-footed by Ian Harte.12:16
Carlos Tevez takes the inswinging corner, clearance made by Adrian Mariappa.11:57
David Silva takes a shot. Adam Federici makes a save.10:07
The ball is crossed by Sergio Aguero, Jimmy Kebe manages to make a clearance. Corner taken left-footed by David Silva to the near post, Matija Nastasic takes a shot. Sergio Aguero takes a shot. Clearance by Pavel Pogrebnyak. Blocked by Adrian Mariappa.8:45
Free kick awarded for an unfair challenge on Jobi McAnuff by David Silva. Ian Harte takes the direct free kick.7:31
Jobi McAnuff produces a header from deep inside the six-yard box that clears the bar.6:45
Francisco Javi Garcia challenges Pavel Pogrebnyak unfairly and gives away a free kick. Ian Harte takes the free kick.4:47
Handball by Carlos Tevez. Free kick taken by Adam Federici.2:21
Corner taken left-footed by David Silva to the near post, Pavel Pogrebnyak manages to make a clearance.1:32
Kolo Toure takes the direct free kick.1:32 Booking
Booking Caution for Adrian Mariappa.1:25
Adrian Mariappa challenges Carlos Tevez unfairly and gives away a free kick.0:00
The referee gets the game started.
Live data and text provided by our data suppliers