The JR Motorsports driver had not won this season until that Darlington win.
MORE: Race results
Justin Haley, taking advantage of fresher tires than most of the field, charged to second. John Hunter Nemechek, driving for Sam Hunt Racing, placed third. Justin Allgaier finished fourth. Riley Herbst completed the top five.
Dale Earnhardt Jr., running his lone Xfinity race of the season, finished 14th.
“They race hard in the middle of the pack, especially around me,” Earnhardt told NBCSN’s Dillon Welch. “I was up for it. It was fun. We got to beating on some of them guys. They beat back on us. … We didn’t have the car, I think, that I was looking for, and maybe I just couldn’t figure how to get it around the track.
“We tried hard. We tried to make adjustments and couldn’t really figure out how to make the left front work. The car was really tight.
“It was fun. I love racing with these Xfinty Series (drivers). All these guys have got so much heart, and they race so hard. You can tell they’re trying to prove themselves, and it’s so fun to be out there with them and learn about those guys.”
STAGE 1 WINNER: AJ Allmendinger
STAGE 2 WINNER: Ty Gibbs
WHO HAD A GOOD RACE: John Hunter Nemechek’s third-place finish was the best result for Sam Hunt Racing. … Brandon Brown placed eighth, ending an 11-race streak without a top-10 finish. It was his eight top 10 of the year, the most he’s had in a season.
NOTABLE: The nine cautions were the most in a race at Richmond since there were 10 in a race there in May 2009.
NEXT: The Xfinity regular season ends Sept. 17 at Bristol Motor Speedway (7:30 p.m. ET on NBCSN)