Shaun Williams volleyed a 78th-minute equaliser to earn struggling Millwall a battling point from a 1-1 Sky Bet Championship draw at Bristol City.
The home side took the lead seven minutes into the second half when visiting defender Jake Cooper miscued an attempted clearance into his own net from a Niclas Eliasson cross.
Millwall then lost striker Aiden O'Brien to what looked a serious injury, but fought back to level when Steve Morison headed down for Williams to lash home from 12 yards.
The visiting fans behind the goal celebrated wildly, but for home boss Lee Johnson it was two more home points dropped on a frustrating afternoon.
City had all the goal attempts in a one-sided first half without forcing enough saves from Jordan Archer, who was tested on four minutes when diving to hold Eliasson's deflected shot.
Josh Brownhill's 25-yard effort dipped just over and Lloyd Kelly fired narrowly wide from distance as the hosts dominated possession without finding a killer final ball.
They almost went in front on 28 minutes when Andreas Weimann nodded on an Eros Pisano cross from the right and Famara Diedhiou's header came back off the crossbar.
Eliasson looked dangerous down the left for City and lobbed over when controlling another ball from the right at the far post.
Millwall defended strongly, but had another scare on 42 minutes when Cooper intercepted a ball into the box from left-back Kelly and was relieved to see the ball pass just wide of the near post.
The visitors had striker Morison booked for a 40th-minute foul on Eliasson and boss Neil Harris could have no complaints about his team's tenacity.
Having failed to register a goal attempt for 45 minutes, Millwall did so immediately after the break as O'Brien's hooked shot from a Shane Ferguson cross forced a diving save from Niki Maenpaa.
The Lions were enjoying their best spell when hit by Cooper's own goal. City quickly increased the tempo and regained the upper hand.
O'Brien's injury was another setback for Millwall, Jiri Skalak going on as replacement, and they nearly conceded a second when Weimann headed wide at the far post from another cross by the lively Eliasson.
But Harris' team showed plenty of spirit. Cooper headed straight at Maenpaa, who then had to dive full-length to keep out a 30-yard free kick from Jed Wallace.
Johnson was sufficiently concerned have a double substitution ready when Williams equalised. He delayed it after the goal and it was Williams, injured in striking the ball, who gave way to Jem Karacan.
When Johnson did make his changes, Callum O'Dowda and Marley Watkins went on for Jamie Paterson and Diedhiou, but City continued to fire blanks against committed opponents.
ga('create', 'UA-72310761-1', 'auto', {'name': 'pacontentapi'});
ga('pacontentapi.set', 'referrer', location.origin);
ga('pacontentapi.set', 'dimension1', 'By Press Association Sport staff');
ga('pacontentapi.set', 'dimension2', 'c0bd2c9b-5a1e-4454-ac83-0d0be93aa14c');
ga('pacontentapi.set', 'dimension3', 'paservice:sport,paservice:sport:club-news,paservice:sport:football,paservice:sport:match-reports');
ga('pacontentapi.set', 'dimension6', 'story');
ga('pacontentapi.set', 'dimension7', 'composite');
ga('pacontentapi.set', 'dimension8', null);
ga('pacontentapi.set', 'dimension9', 'sport:football');
ga('pacontentapi.send', 'pageview', { 'location': location.href, 'page': (location.pathname + location.search + location.hash), 'title': 'Shaun Williams rescues Millwall at Bristol City'});