In 1969, firefighter Frank Sullivan (Quaid) dies in a warehouse fire, leaving behind his wife Julia and son John. Thirty years later, in 1999, John (Caviezel), now an NYPD detective, is dumped by his girlfriend Samantha for refusing to move out of his father's house. John's old friend Gordo (Noah Emmerich) finds a Heathkit single-sideband ham radio that once belonged to Frank, but fails to get it working. The night before the anniversary of his father's death, John is surprised to find the radio broadcasting and has a brief conversation with another man concerning the 1969 World Series, which John is able to recount in surprising detail. Eventually, he realizes that the other man is Frank and tries to warn him of his impending death. The next day, while attempting to rescue a young girl, Frank heeds his son's warning and manages to escape. That evening, the two reconnect and learn a great deal about each other's lives.
Subsequently, John begins to notice little changes in the present: Julia (Elizabeth Mitchell) no longer lives at her current address, Samantha doesn't recognize him, and he learns that Frank died ten years earlier from lung cancer. His boss, Sgt. Satch DeLeon (Andre Braugher), assigns him to investigate the "Nightingale", a serial killer who murdered three nurses in the 1960's. However, John discovers that the Nightingale has now been connected to ten murders, including that of his mother two weeks after Frank's supposed death. Overwhelmed with guilt for the killings, John persuades his father to help him prevent these crimes from occurring. Frank manages to save the first victim, but when he tries to rescue the second, the Nightingale subdues him and steals his driver's license, which he plants to frame Frank for the murder.
When Frank shares his experience with John, the latter instructs him to wrap his wallet in plastic and hide it. Using the preserved fingerprints from the wallet, John identifies the Nightingale as Jack Shepard (Shawn Doyle), a former detective who, in the original timeline, died from a medical error the same night Frank was killed. Because Julia did not leave the hospital early, she was able to save his life. Meanwhile, Frank is approached by then-Detective Satch DeLeon, who tries to arrest him on suspicion of murder. In the resulting struggle, the radio is knocked over and sustains damage, shutting it off. While awaiting questioning, Frank fakes a fire, escapes the precinct, and breaks into Shepard's apartment, where he finds jewelry taken from the victims. Shepard catches him in the act and pursues him, ending with a fight underwater where he seemingly drowns.
While fixing the radio, both John and Frank are attacked by the 1969 and 1999 versions of Shepard. Using a shotgun, Frank blows off Shepard's right hand, causing his older self to lose his just as he is about to kill John. With the timeline rapidly fixing itself, an elderly Frank kills Shepard and embraces his son. The film concludes with a baseball game including John, Samantha (now his wife), John's young son, Frank, Satch, Julia, and Gordo, who is now wealthy on account of having invested in Yahoo on John's advice.
Who attacks John and Frank as they are fixing the radio?
Shepard