Reading were dealt a second consecutive home defeat as Mason Bennett snatched a late winner for Millwall who came from behind to beat the Royals.
Alfa Semedo scored in odd circumstances as he stole the ball from Millwall and caught the keeper off guard to score from 40 yards out in the 17th minute.
Reading had done a good job of keeping the Millwall forwards quiet until Matt Smith blasted the ball into the roof of the net to equalise in the 76th minute.
But Millwall took the three points as substitute Bennett scored the decisive goal in the 86th minute.
Reading are still in fifth position in the Championship despite the loss, two points clear of sixth-placed Bournemouth.
Reading were looking to get back to winning ways after they were beaten in midweek by table-toppers Brentford.
Veljko Paunovic made a couple of switches as Lewis Gibson and Tom Holmes replaced Andy Yiadom and Omar Richards in the starting eleven.

Meanwhile, Millwall named three former Royals in their starting line-up as Jon Dadi Bodvarsson, George Evans and former academy graduate Jake Cooper were chosen. Another former Royals graduate, Alex Pearce, was named on the bench for the visitors.
Reading were put under some early pressure as Millwall won a corner just two minutes into the game after Shaun Williams’ shot was deflected behind.
Another corner came for the visitors and with Michael Morrison out on the sideline receiving treatment, Reading were left temporarily with 10 players and were almost made to pay with their defensive reinforcements down a number.

Former Royal George Evans found himself free in the box after a short corner routine but couldn’t keep his header down as it skimmed the top of the crossbar.
Reading’s first foray forward came after 14 minutes with a slick move involving Andy Rinomhota and Ovie Ejaria, but Josh Laurent overhit his cross when he aimed to find Lucas Joao in the box.
But having survived some early scares, it was Reading who went ahead against the run of play in the 17th minute in bizarre circumstances.

Millwall keeper Bartosz Bialkowski rolled the ball out but a poor touch allowed Alfa Semedo to claw the ball away from the visitors and hit a goalwards effort with his first touch from 40 yards which caught the Lions keeper out of position and crept into the corner to give the Royals the lead.
Paunovic’s side grew in confidence having taken the lead when Lucas Joao had his first sight at goal but scuffed an effort straight at the keeper from 20 yards.
Millwall continued to threaten from set pieces with their aerial presence as Cooper had a chance at the back post but couldn’t direct his header on target.

Ben Thompson had a brilliant chance for the visitors when a headed clearance dropped his way in the box just 12 yards out, but he miscued his volley into the ground as Rafael Cabral made a routine stop.
The best play of the half came in the 41st minute when Michael Olise showed his magic as he breezed past a cluster of Millwall defenders, cutting in from the right before playing a defence splitting pass to find Joao through on goal.
The Portuguese forward looked poised to continue his scoring streak, but Millwall keeper Bialkowski dived low to his right to make a superb stop.

Millwall made a change going into the second half as former Reading striker Bodvarsson was replaced by Mason Bennett and Williams was replaced by Jed Wallace.
The Lions looked to try and hurt the hosts with their direct approach, often looking to find the physical frame of Kenneth Zohore, but Morrison kept him under wraps with some textbook defending.

Reading got forward with a beautiful move as Ejaria and Joao traded flicks before Olise’s powerful strike from the edge of the box was well held by the keeper.
Gary Rowett made a third switch for the visitors as Matt Smith came on for Thompson to provide even more aerial ability.
Joao looked to break through the Millwall backline but was hacked down by Hutchinson and won a free-kick from 20 yards out. Olise curled an effort towards goal which was parried out by Bialkowski but Rinomhota couldn’t take advantage on the rebound as he struck wide.
McIntyre and Morrison stayed alert at the back to avert the danger as Zohore looked to get a shot away in the box but was thwarted by the two centre backs.
Paunovic made his first substitution in the 75th minute as Yiadom came on for Holmes.
Having not created too many clear cut chances throughout the match, Millwall found themselves level in the 76th minute.
A deflected shot squirmed its way through to Smith who blasted the ball into the roof of the net from close range to equalise.
Ejaria had a superb chance to put Reading back in front just moments after the Millwall goal but his shot crashed off the crossbar.
Reading then had a big appeal for a penalty turned away when Ejaria was bundled over in the box, but the referee pointed for a corner instead of a spot-kick.
Millwall stole the lead in the 85th minute as Bennett glanced a header which looped over Rafael and into the corner.
The hosts were unable to claw back an equaliser as they were beaten at home for the second consecutive match.
Reading are back in action on Tuesday evening with an away trip to Bristol City.
Reading: Rafael, Holmes, McIntyre, Morrison (c), Gibson, Rinomhota, Laurent, Semedo, Ejaria, Olise, Joao
Subs: Southwood, Esteves, Yiadom, Richards, Tetek, Aluko, Onen, Camara, Baldock
Millwall: Bialkowski, Hutchinson, Cooper, Williams, Thompson, Romeo, Zohore, Malone, Woods, Bodvarsson, Evans
Subs: Fielding, Pearce, McNamara, Mitchell, Bennett, Bradshaw, Smith, Burey, Wallace
Goals: Semedo 17′, Smith 76′