A woman is killed babysitting a young boy, the killer takes him when he leaves the house. A few months later a man and cleaning woman are killed at a motel in Amarillo. Amarillo's longtime sheriff, Buck Olmstead (R. Lee Ermey), is up for reelection, so both he and opponent Jack McGinnis (William Fichtner) are eager to be the one to solve a big murder case before Election Day. Meanwhile, a hitchhiker named Lane Dixon (Jared Leto) is picked up by Bob Goodall (Danny Glover), an affable drifter.
FBI agent Frank LaCrosse (Dennis Quaid) turns up in Amarillo and tells them he is in charge of tracking down an elusive serial killer, the person he suspects is responsible for the murders. Olmstead discovers that LaCrosse has been taken off the case by superiors. LaCrosse explains that the boy that was kidnapped was in fact LaCrosse's young son Andy (Ian Blake Nelson), a fact which means he was taken off the case. Frank is now more determined than ever to catch the killer and he teams up with the Amarillo police department to continue his investigation.
The tactics of the FBI agent concern Olmstead at first, particularly after finding out Frank's personal involvement in this case and that cooperation with the suspended agent could cost him his own job. Bob tells Lane about his son as they become friends and asks him to promise to look after him if anything should happen to Bob. Lane agrees and Bob tells him his sons address.