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
Xavier Simeon Tech 3 3 laps
Alex de Angelis Forward FTR 1 lap