McLaren's Lewis Hamilton became the seventh different winner in as many races in a slow-burn Canadian Grand Prix that came alive in the final laps.
Hamilton fought up from third place past Fernando Alonso and Sebastian Vettel in the closing laps.
Alonso's one-stop strategy, Hamilton did two, failed - he dropped from the lead to fifth as his tyres faded.
He was passed by Romain Grosjean's Lotus, Sauber's Sergio Perez and Vettel, who made a late second stop.
Alonso just managed to hold on to fifth from the fast closing Mercedes of Nico Rosberg on the last lap.
The result moves Hamilton into the championship lead, two points ahead of Alonso, who is one ahead of Vettel.
Hamilton said: "What a great feeling this is [to win here] where I won my first grand prix.
"I knew this was going to be a tough, tough race but I loved every minute of it. I never had a doubt in my mind that there wasn't a possibility to win.
"I was thinking these guys are falling quite far behind, I assume they're doing a one-stop. So I decided to keep pushing and build a gap.
"It's five years since I first won here and it feels just as good. This for me feels like one of the best races I've had for a very long time."
Hamilton's team-mate Jenson Button had a terrible race and finished 16th, slipping in the process to eighth in the championship, 43 points off the lead.
Hamilton ran second in the opening laps, behind Vettel and ahead of Alonso in the order in which they had qualified for the race.
Alonso briefly took the lead by running a couple of laps longer than his rivals to his first pit stop but Hamilton was able to pass him straightaway as the Spaniard struggled to get his tyres up to working temperature.
Hamilton then led the middle portion of the race, building a four-second lead over Alonso and Vettel.
McLaren were always planning a two-stop strategy and were initially sure that Ferrari and Red Bull would have to do the same. Indeed, at one point Hamilton asked his pit crew: "Are you sure they're not doing a one-stop?" To which his engineer replied: "Yes, we're sure."
Hamilton came in for his final stop on lap 50, with 20 to go, and although that demoted him to third, the greater grip from his tyres meant he caught his rivals quickly.
He passed Vettel on lap 62 and then Alonso on lap 64 on his way to his first win since last November's Abu Dhabi Grand Prix.
Vettel, feeling his tyres were finished, stopped for a fresh set on the lap after Hamilton had passed him, but Alonso and Ferrari decided to hang on.
It was the wrong call - those behind him closed rapidly and he was helpless to hold them off.
Vettel said: "Lewis went for the second stop, we tried then to get the place back by going for one stop, same as Ferrari.
"But it turned out to be the wrong call. We decided in the end to come in again which was a great call at the time, given what you can lose with seven laps to go.
"It was an interesting race again, another winner - Lewis deserved to win, we have to learn the lesson, take it on board, don't do it again and make a step forward in Valencia."
It was an especially impressive race from Grosjean and Perez - both men were on the same one stop strategy as the Ferrari but did not run into the same tyre problems.
Grosjean and Lotus took the same approach as Alonso, stopping one lap later to change from the 'super-soft' tyres to 'softs' and running to the end.
Grosjean said: "We thought about a one-stop and see what was going on later on. The car felt pretty good when I put the prime tyre on.
"I was fighting with and pushing quite hard but I knew I was going for a one-stoop.
"Then I saw Mark [Webber] come in, then I saw Fernando in front of me.
"It was a crazy end to the race and I was thinking, 'What is going on?'"
Perez, who had qualified only 15th, started on the hard tyres and ran a long first stint before switching to the 'super-softs' at the end.
Vettel's team-mate Mark Webber was seventh, ahead of Lotus's Kimi Raikkonen, Sauber's Kamui Kobayashi and Ferrari's Felipe Massa.
While McLaren will be celebrating Hamilton's win, there will be some head-scratching about Button, who had his worst weekend for years - the culmination of a downward slide in form over the last few races.