Substitute Scott Hogan was the penalty hero as his late spot-kick gave Birmingham a much-needed 1-0 win against promotion-chasing Swansea after team-mate Lukas Jutkiewicz had missed one.
Irish striker Hogan blasted his penalty past goalkeeper Freddie Woodman in the first minute of added time after Ivan Sunjic had been bundled over by substitute Yan Dhanda. The result — Blues’ second home win in a row under new head coach Lee Bowyer — moved them up to 20th and six points above the relegation zone, but third-bottom Rotherham have four games in hand on them.
Third-placed Swansea suffered their third straight loss and appear to have almost blown their chances of automatic promotion as they are now nine points off second place.
Watford strengthened their grip on an automatic promotion place with a controversial win over struggling Sheffield Wednesday.
An early own goal from Tom Lees was all that separated the sides, but the offside flag had been up when Lees tried to beat Isaac Success to Ismaila Sarr's cross — only for the officials to determine that Success had not been interfering with play.
It was a bitter blow for the Owls, who were without manager Darren Moore after he tested positive for Covid-19. Wednesday are now six points adrift of safety.
In contrast, it was a sixth straight win for Watford, who closed the gap at the top to six points as Brad Potts' stoppage-time strike saw Preston hold leaders Norwich to a 1-1 draw.
Emi Buendia had put Norwich ahead with a superb long-range effort but managerless North End replied in the fifth minute of time added on as Potts’ strike found the net.
Philip Billing scored one and made another as Bournemouth boosted their play-off hopes with a 3-1 win over manager Jonathan Woodgate's former club Middlesbrough.
Jefferson Lerma and Dominic Solanke were also on target as the Cherries picked up their second league victory in a row, with Duncan Watmore having briefly put Boro back on level terms.
Cardiff's chances of breaking into the top six suffered a blow as they went down 1-0 at home to Nottingham Forest, who ended a six-match winless run thanks to James Garner's first-half strike.
The on-loan Manchester United midfielder's second goal of the season was enough to lift Forest 10 points clear of the relegation zone.
However, Coventry could do nothing to pull themselves clear of trouble as they went down 3-0 at QPR, leaving them only four points clear of Rotherham who have three games in hand.
Rangers needed only 75 seconds to take the lead through Chris Willock, while Michael Rose's own goal doubled their advantage before the break. Ilias Chair made sure of the points with his eighth goal of the season midway through the second half.
Rotherham could have closed the gap further but saw Michael Smith's late penalty saved by Bartosz Bialkowski as they lost 1-0 away to Millwall, having spent the late stages pushing for an equaliser despite playing most of the second half with 10 men.
A thunderbolt from Jed Wallace ultimately settled the contest at The Den, where the Millers had their captain Richard Wood sent off for pulling back Wallace when clean through.
Derby took a big step towards safety as they ended a seven-game winless run with a 2-0 victory over Luton. Lee Gregory opened the scoring with seven minutes gone and Graeme Shinnie made sure with a penalty early in the second half.
There was also victory for basement side Wycombe — only their seventh of the season — as Fred Onyedinma's goal was enough to see off Blackburn 1-0.
Nigel Pearson is still awaiting his first home win as Bristol City manager after goals in each half from Nick Powell and Steven Fletcher gave Stoke a 2-0 win at Ashton Gate.
Powell finished from close range in the 25th minute after Tommy Rowe mis-judged a long ball to allow Jacob Brown through, while Fletcher scored with a fine effort following a free-kick just after the hour.
Reading moved up to sixth with an eventful 1-1 draw away to fifth-placed Barnsley. Ovie Ajaria's first goal since November put Veljko Paunovic's men up at the break but Alex Mowatt's penalty brought Barnsley level just past the hour. Lucas Joao was guilty of a glaring miss for Reading 15 minutes from time, while Barnsley had the ball in the net from a late corner but the whistle had gone for a foul.