Pol Espargaro claimed his third win of the season on home spoil after a scintillating three-way battle with Moto2 championship rivals Marc Marquez and Andrea Iannone.
The trio had been part of a larger group before gradually easing away in the closing stages, their battle building into a thrilling climax.
On lap 16 alone Marquez traded position with Iannone five times in as many corners, with the Italian eventually coming out in front.
That was by no means the end of their scrap, but it was decisive in another fashion as it allowed Espargaro to build a small gap at the front.
That advantage would ultimately never be closed, although that owed as much to Iannone and Marquez cancelling each other out as it did to Espargaro raising his pace at the crucial moment.
Marquez and Iannone remained in touching distance of Espargaro, but equally continued trading blows until the very final lap.
The Spaniard eventually stole ahead after the pair swapped positions twice more through the first half of the track, before Iannone was denied a chance to respond when Scott Redding pounced to sneak into third.
The Briton, along with compatriot Bradley Smith, had closed in on the Marquez/Iannone battle in the final laps.
The order would remain that way, with Marquez and Redding completing the podium ahead of Iannone, Smith, Johann Zarco and poleman Simone Corsi, who also spent time at the front of the field.
Results - 21 laps: Pos Rider Team/Bike Time/Gap 1. Pol Espargaro Pons Kalex 40m25.260s 2. Marc Marquez Monlau Suter + 1.447s 3. Scott Redding Marc VDS Kalex + 1.743s 4. Andrea Iannone Speed Master Speed Up + 1.825s 5. Bradley Smith Tech 3 + 2.193s 6. Johann Zarco JIR Motobi + 2.999s 7. Simone Corsi Ioda FTR + 4.317s 8. Jordi Torres Aspar Suter + 5.115s 9. Claudio Corti Italtrans Kalex + 5.519s 10. Anthony West QMMF Speed Up + 5.631s 11. Tom Luthi Paddock Suter + 5.851s 12. Esteve Rabat Pons Kalex + 6.548s 13. Nico Terol Aspar Suter + 7.549s 14. Mike di Meglio Kiefer Kalex + 14.075s 15. Dominique Aegerter Technomag-CIP Suter + 17.322s 16. Mika Kallio Marc VDS Kalex + 17.390s 17. Axel Pons Pons Kalex + 17.492s 18. Julian Simon Avintia Suter + 17.837s 19. Alex Marinelarena CNS Suter + 30.579s 20. Marcel Schrotter SAG Bimota + 32.748s 21. Steven Odendaal Arguinano AJR + 32.879s 22. Gino Rea Gresini Suter + 33.271s 23. Yuki Takahashi Forward FTR + 34.311s 24. Tomoyoshi Koyama Technomag-CIP Suter + 36.563s 25. Ratthapark Wilairot Gresini Suter + 38.261s 26. Eric Granado JIR Motobi + 56.020s 27. Elena Rosell QMMF Speed Up + 1m17.202s 28. Jesko Raffin Switzerland Kalex + 1m17.670s 29. Marco Colandrea SAG FTR + 1m18.363s 30. Takaaki Nakagami Italtrans Kalex + 1m24.244s 31. Alessandro Andreozzi Speed Master Speed Up + 1m25.153s Retirements: Xavier Simeon Tech 3 3 laps Alex de Angelis Forward FTR 1 lap