It's been two years since Jesse (Jason James Richter) saved and freed his orca friend, Willy. Jesse, now 14 years old, has since been adopted by his foster parents, Glen and Annie Greenwood (Michael Madsen and Jayne Atkinson). Jesse and his adoptive parents are preparing to go on a family camping trip to the Pacific Northwest. Glen has been trying to teach Jesse to drive their motorboat, but Jesse is more interested in girls. However, before they leave town, Dwight (Mykelti Williamson), Jesse's former social worker, shows up to inform them that they have found Jesse's biological mother, who abandoned him 8 years ago in New York City. Jesse's mother has died and left behind another son, Jesse's younger half-brother named Elvis (Francis Capra). Jesse is devastated about this news, but comes to terms, after talking his feelings out with Glen. When Elvis arrives, he is morose, overly talkative and mischievous, and he is also prone to telling lies and easily gets on Jesse's nerves. He is invited on their trip to San Juan Island so that he and Jesse might get to know each other.
At the environmental institute, Jesse reunites with his old Native American friend, Randolph Johnson (August Schellenberg) whom Jesse met at the aquatic park when he met Willy years back. Jesse quickly becomes smitten with Randolph's attractive and kindly goddaughter, Nadine (Mary Kate Schellhardt). Jesse also tracks down and reunites with Willy one night. Jesse cautiously begins to show his interest in Nadine, and as the awkward teenagers grow closer, Jesse helps Nadine befriend Willy and his orca siblings, Luna and Littlespot. Elvis spies on the two, forming his own bond with the young playful Littlespot, and lies to Glen and Annie telling them that Jesse kissed Nadine. Glen talked to Jesse who says that he didn't kiss Nadine, and Glen locks Elvis in his tent.
As they continue to enjoy their camping trip, an oil tanker runs aground on a reef and spills oil into the ocean due to an engine malfunction, trapping the three young killer whales in a small cove. When word gets out that the orcas are trapped and Luna is dying from the oil in her lungs having swam through the oil when the tanker ran aground, John Milner (Jon Tenney), the CEO of the oil company arrives and announces a plan to move the orcas into captivity where they can recover from their injuries. His real plan, however, is to sell the orcas to marine mammal parks. Elvis, who runs away believing that Jesse is more important and after Annie breaks her promise to allow him to help the whales, overhears Milner and Bill Wilcox (M. Emmet Walsh), a whaler discussing the real plan and rushes back to warn everybody.
With Luna's condition worsening, Randolph and Jesse eventually use an old Indian remedy that they administer to Luna, who recovers. Shortly afterwards, with the oil spill reaching dangerous proximity to the cove, the oil company and the whalers boom it off despite Jesse, Randolph and Nadine's objections and begin extracting the whales. As the extraction of Littlespot commences, Elvis returns in time to warn Jesse and the brothers expose Milner's plot. With the help of a distraction by Jesse and Elvis, Willy manages to rescue his little brother by tipping Wilcox's boat while Milner and his men are arrested for trying to sell the whales to an aquarium.
With time running out before the oil reaches the cove, Jesse, Elvis and Nadine hijack Glen's boat to lead the whales to safety. On Jesse's signal, Willy is able to break the boom and leads his siblings out of the cove. However, an explosion on the tanker, due to fuel vapors igniting after trying to start the tanker's generator, results in the crude oil in the water catching fire. Despite the danger, the three whales are able to swim under the flaming oil to safety. Having followed the whales to ensure they got safely past the oil, Jesse, Nadine and Elvis fall into danger when they take their boat into another cove to avoid the flaming oil, hitting a rock and beginning to sink while the flames seal off the cove.
At the same time, Glen, Annie and Randolph search for the three in Randolph's boat with Randolph sending a distress signal that summons the Coastal Marine Patrol to the trio's aid. A search and rescue helicopter locates the three, and Elvis and Nadine are pulled to safety. However, the boat then submerges completely, leaving Jesse struggling in the oily water, and unable to secure himself sufficiently in the helicopter's harness. He ultimately slips out and falls back into the ocean, just inches away from the helicopter and, due to smoke choking the helicopter's engine, it is forced to leave Jesse behind. Jesse nearly drowns but is rescued by Willy who returns for his friend. Willy is able to carry Jesse safely under the fire to Randolph's nearby boat, where Glen and Annie pull him to safety. Jesse says goodbye to him before Willy's departs back to his family.
Shortly after, the Coastal Marine Patrol brings Nadine and Elvis to Randolph's boat. Elvis gives Jesse an old picture of him and their mother, and explains that he once ripped it up out of anger, but taped it back together for him. He also tells Jesse that their mother always talked about him and that she felt bad about abandoning him. Jesse thanks him for the picture and hugs him, finally able to put his past at rest. Glen and Annie decide to adopt Elvis so the brothers can stay together. When asked by Elvis about Littlespot's whereabouts, Jesse tells him that Willy and his siblings are back with their mom. He then says the same Haida prayer to himself after knowing that they are all free.
Sometime later with the oil spill cleaned up, Willy, Luna and Littlespot reunite with Catspaw, and the other orcas are shown swimming happily in the ocean near the coast of the Pacific Northwest.
Jason James Richter as Jesse
August Schellenberg as Randolph Johnson
Jayne Atkinson as Annie Greenwood
Jon Tenney as John Milner
Elizabeth Peña as Dr. Kate Haley
Francis Capra as Elvis
Mary Kate Schellhardt as Nadine
Mykelti Williamson as Dwight Mercer
M. Emmet Walsh as Bill Wilcox
Michael Madsen as Glen Greenwood
Steve Kahan as Captain Nilson
John Considine as Commander Blake
Paul Tuerpe as Milner's assistant
Al Sapienza as Engineer
Neal Matarazzo as Helmsman Kelly
Basil Wallace as Reporter
Marguerite Moreau as Julie
Joan Lunden as herself