Aston Villa started the game brightly, creating early chances and racing into a two-goal lead before the 20-minute mark.
The opener came from Morgan Rogers, who showed superb touch and composure to slot the ball into the bottom corner after a perfectly weighted through ball from Youri Tielemans.
Just minutes later, Ian Maatsen beat his man down the left and delivered a pinpoint cross to fellow Dutchman Donyell Malen, who tapped in at the back post to make it 2-0.
Nottingham Forest came out strong in the second half, creating more chances than they managed in the entire first period.
Their pressure paid off when a cross from the right found Jota Silva unmarked in the box, his low shot deflecting off substitute Ezri Konsa and wrong-footing Emiliano Martinez.
Despite the scare, Villa held firm to see out the win, a result that moves them into the top six of the Premier League. Forest, meanwhile, remain third - now five points adrift of leaders Arsenal.
Emiliano Martinez (6)
Wasn't tested much in the first half, with Forest only managing one shot on target. The goal he conceded took a deflection, making it difficult to stop, and he was booked for time-wasting late on.
Andres Garcia (6)
Found space to attack down the right flank but had a quiet first half overall. Moved the ball well at times but lacked impact and was subbed off for Konsa to add more defensive stability.
Axel Disasi (6)
Started strongly, showing composure in possession and making some key tackles. After shifting to right-back, he initially struggled as Forest targeted his side but recovered well and ended the match looking defensively solid.
Tyrone Mings (7)
Handled the pace of Hudson-Odoi and Elanga impressively, keeping both relatively quiet. Stayed calm on the ball and played a key role in limiting Forest’s attacking threat.
Ian Maatsen (7)
Linked up well with Rogers early on and assisted the second goal with a confident run and pinpoint cross. Continued to be a constant attacking threat, creating chances throughout.
Amadou Onana (7)
Imposed himself physically in midfield, breaking up play and distributing well. Grew into the game and played a crucial role in controlling the tempo before being substituted.
Youri Tielemans (8)
Pulled the strings in midfield and assisted the opening goal with a lovely ball over the top. Was instrumental in linking defense to attack and kept Villa ticking with his smart distribution.
Donyell Malen (7)
Scored Villa's second with a composed finish at the back post. Was a menace going forward, drawing fouls and beating defenders with ease before making way for Ramsey.
Marco Asensio (7)
Created a few promising chances and drew in defenders with his trickery. Despite missing a couple of opportunities, he was involved in plenty of positive attacking play throughout the game.
Morgan Rogers (8)
Opened the scoring with a classy touch and finish, and consistently caused problems for the Forest defense. His directness and ability to get to the byline made him a standout performer.
Ollie Watkins (5)
Had a very quiet game by his standards, struggling to get involved throughout. Offered little attacking threat and failed to influence the match as he usually does.
Substitutes:
Ezri Konsa (6)
Came on to provide more defensive cover and settled into the game well, despite a slight deflection off him for Forest's goal. Was solid on the ball and helped tighten things up at the back.
Marcus Rashford (6)
Found himself in good positions but couldn't get enough of the ball to make a real impact. Had a decent chance late on but couldn’t convert.
Boubacar Kamara (6)
Put in a couple of good tackles and supported the attack with his runs, though nothing concrete came from his efforts.
Jacob Ramsey (6)
Had some neat link-up play and helped maintain possession, but didn’t have much end product.
John McGinn (7)
Brought much-needed energy and balance to the midfield during a tough spell for Villa. His presence helped Villa regain control and close the game out effectively.