Fabio Quartararo crusied to a maiden grand prix victory, while second-placed Miguel Oliveira cut Francesco Bagnaia's Moto2 standings lead to just one point at Catalunya.
Alex Marquez took the holeshot at the start ahead of Marcel Schrotter, while poleman Quartararo dropped to fourth ahead of Miguel Oliveira, who started from 17th.
Quartararo moved into third ahead of Francesco Bagnaia on the second lap, with his main championship rival Oliveira moving past a few turns later.
Marquez continued to lead Schrotter at the start of lap three, though Oliveira found himself in second two tours later after Quartararo ran wide at Turn 5 having just seized second from Schrotter.
Oliveira hounded Marquez, but the Marc VDS rider repelled the KTM man's advances for a short time. However, he could do nothing to stop Oliveira and Quartararo picking him off at Turn 10 on laps eight and nine.
The top two were able to quickly put daylight between themselves and Marquez, though Oliveira could not break Quartararo's resolve, and a mistake at Turn 4 on lap 10 allowed the Speed Up rider to hit the front for the first time.
Quartararo eased away from Oliveira over the next few laps, with the KTM rider opting to settle for second in the closing stages as Bagnaia struggled to hand onto the top six.
A comfortable advantage of 2.4s allowed Quartararo to cruise to his first-ever grand prix victory, and his first in motorcycle racing since his CEV Moto3 days in 2014.
Oliveira crossed the line in second, while Bagnaia was shuffled down to eighth in the closing stages and maintains a standings lead of just a single point.
Drama unfolded after the chequered flag, when Oliveira was struck by Simone Corsi while the KTM rider was slowing. Luckily, both were unscathed.
Marquez repelled late pressure from a recovering Schrotter, who fell to eighth in the early stages after running off at Turn 1, to secure the final podium place, while Schrotter's Intact GP team-mate Xavi Vierge was fifth.
Brad Binder was sixth on the sister Ajo KTM, with Lorenzo Baldassarri pipping Bagnaia to seventh late on.
A fuel pump issue for Sam Lowes meant he had to start from the back of the grid, but recovered to ninth ahead of CGBM Evolution stablemate Iker Lecuona.
Suzuki MotoGP-bound Joan Mir was unable to maintain his podium run from the previous two races, after crashing out 10th with 10 laps remaining.
The Marc VDS rider was joined on the sidelines by fellow rookie Romano Fenati, while Jorge Navarro tallied up his fourth non-finish of the year.
Isaac Vinales, Mattia Pasini and Federico Fuligini also dropped out of contention, while Bo Bendsneyder, Niki Tuuli and Stefano Manzi tangled at Turn 4 on the first lap.