The film opens with three teenage boys pulling up to the house of Ruben Borchardt (Peter Coyote) early on Easter Sunday in 1994. They break into Ruben's house armed with a shotgun, intending to kill Ruben on the promise of payment. Gathering at the top of the basement steps where Ruben sleeps, the boys draw their shotgun and shoot Mr. Borchardt as he makes his way up the stairs. Having carried out their deed, the three boys flee the scene.
The film cuts to seven months before the shooting, during the Fall of 1993. Diane Kay Borchardt (Ann-Margret) is a seemingly ordinary schoolteacher with a normal life. She has a loving husband, three children, and a lovely house. However, it quickly becomes apparent that she harbors deep mental instability and possible psychosis. While she dotes on and spoils her daughter Regan, she is emotionally and physically abusive towards Ruben and his two children, Brook (Hedy Burress) and Chuck (Tobey Maguire). Ruben married Diane fourteen years prior after his beloved wife Susan (Cynthia Lynch) died in a car crash when Brook and Chuck were young. Realizing his children needed a mother figure in their lives, Ruben married to Diane, only to find himself in a loveless marriage in which Diane constantly abuses him.
One day, Ruben goes to a neighbor's house to help him remodel his kitchen, as he is a work-at-home carpenter. There he gets reacquainted with Claire Brown (Leslie Hope), whom he works together with to remodel the kitchen. During the remodeling, Ruben and Claire share their personal stories with each other, becoming increasingly close friends as the project goes on.
Later that day, Ruben drops by Diane's clothes shop on account of the fact that Diane failed to pay for Chuck's new glasses, as she had spent it on new shoes for Regan despite previously agreeing to buy the glasses. Diane then accuses Ruben of spoiling his own children and neglecting Regan, and says that he ought to be making more money. Ruben tries to reason with Diane when suddenly, without provocation, Diane hits him in the head with a label gun. Ruben later admits to Claire that his marriage was a mistake. Claire also reveals that she and her husband have also grown apart in recent years. When the project is finished, Ruben admits his true feelings for Claire, and kisses her on impulse. He then leaves her confused, only to return and this time, the two proceed to kiss each other passionately. Upon realizing their feelings for each other, Claire and Ruben start meeting each other secretly, and contemplate leaving their spouses in order to marry. Although Ruben is a devout Christian who opposes divorce, his feelings for Claire remain strong and says he believes they can make it work. Claire agrees to make a decision when she is ready.
Later, Ruben and the family go to the annual Christmas party at the Church. While Diane is away, Ruben runs into Claire at the dance and the two steal the dance floor, and Claire accepts Ruben's proposal. Diane witnesses this and confronts her husband at home, where he admits he no longer wishes to be married to Diane. Diane makes excuses for her lack of empathy towards Ruben, but Ruben is convinced that their marriage is irreconcilable. Diane drives him away and vows to get even with him. Ruben tells Chuck and Brook about his decision, and the kids admit to their father that Diane has treated them as badly as she treated him, much to Ruben's distress. Ruben goes forth with the divorce proceedings against Diane's wishes.
Meanwhile at school, Diane feigns sadness in front of her students to gain sympathy from them. It becomes apparent that she maintains a close relationship with her students in order to get them to do her bidding when she feels fit. One of her closest students, Doug Vest (Christian Campbell) comforts her and Diane lies that her husband physically abuses her in front of their children, and is turning them against her. Diane hugs Doug in her drive for sympathy, saying that Ruben would not do this to her if he knew she had him. After school, Doug meets with his friends Josh Yanke (Jonah Blechman), Cory (Michael Scott Campbell), and Elgin (Aeryk Egan) to discuss "messing up" Mr. Borchardt. Doug, whose estranged father was physically abusive towards his own mother, says that Ruben's behavior is inexcusable.
One day, Ruben invites Claire to his house while Diane is away, and presents her with a necklace as a token of his affections. Unbeknownst to the couple, Cory and Elgin photograph them in the house, and when Diane shows the pictures to Shannon Johnson (Alanna Ubach), another one of her students who assists her in the shop, she declares that she wants Ruben dead. During Christmas break, Diane coaxes Doug into her car, and lets him take it for a spin. She shows him the house and says she'd be willing to let him have the car. She goes on to explain her situation with Ruben, lying to Doug about the true nature of their divorce. She then says that if she were to have Ruben killed, it would have to be someone she trusted, and to his distress, she refers to him.
Later, Diane's lawyer informs her that Ruben is seeking sole custody of the house, much to her outrage, even though he is the original proprietor. In retaliation, Diane informs the pastor of their church that Ruben has strayed from the church and violated the sacredness of their marriage. Ruben is informed by the pastor that he is not to take communion at the church for committing adultery. After New Year's Day, Ruben learns that Diane is seeking custody of Chuck as part of her ploy to secure the house, prompting Ruben to confront her. Diane reacts violently and proceeds to physically beat Ruben while Chuck and Brook struggle to stop her.
At the divorce proceedings, Ruben gains custody of Chuck and Diane gains sole custody of her shop and Regan. However, to her outrage Ruben gains custody the house. Diane is to vacate the property within one month, and silently promises to enact revenge on Ruben.
Later in March, Diane commissions another student Tim (Johnny Strong) to do away with her husband, telling him that the one person she still trusted let her down. Tim tells this to Doug, who immediately feels guilty for turning his back on Diane. Tim also admits that Diane may be contemplating the murder of her husband. Diane later accuses Ruben of stealing her jewellery, when in reality she plans on paying it to Doug to kill her husband. She also tries to secure title to Ruben's life insurance policy. Later that night, Diane approaches Doug and tells him she wants him to kill Ruben, much to Doug's horror. Once again, she makes out Ruben to be the guilty party, claiming that he is taking everything from her. She bribes Doug with her jewellery and cash to carry out the murder, and he gives in to her demands despite his reservations.
Doug later commissions Josh and his cousin Michael Maldonado (Freddy Rodriguez) to help him carry out the murder. Michael rejects the proposal, insisting that he receive higher pay to carry out the deed. Diane begins to harass Claire for stealing Ruben away, going so far as to threaten her with death. Claire becomes uneasy as the harassment persists, and insists Diane is dangerous, but Ruben insists he can handle her. At school, Diane again insists that Doug carry out the murder, and lays out her plan to kill Ruben. Doug refuses to do it, until Diane bribes him with $20,000 from Ruben's life insurance policy. Doug gives in to her demands and agrees to pay Josh and Mike part of it and they agree to help him.
While Diane is packing, Ruben confides to Brook that he has a stash of emergency cash for her and Chuck should anything happen to him, and Diane listens in. She also picks a fight with Ruben when she intends to sell Susan's sewing machine, to which Ruben objects. Diane then punches Ruben and beats him when he refuses to fight back. After grabbing her arm in an attempt to disarm her, Diane uses the marks on her arm to claim to the police that Ruben hit her. Ruben denies this and the police tell the couple to separate temporarily. Having planned on this, Diane agrees to leave the house for Easter, and has made plans to stay at Susan's parents' house with Regan. She also takes the family dog away by force. Before leaving, Diane forces Ruben to kiss her in front of the cops, and whispers to him "You're dead".
On the eve of Easter morning, Ruben is wary of Diane's death threat. He tells Claire that should anything happen to him, she is to find another man to make her happy, while insisting that all will be well. Throughout the night, Shannon contemplates warning Ruben of the impending danger, but fails to make the call. In the early morning hours of Easter Sunday, Doug and his two friends break into the house while Ruben prepares for Easter service. They gather at the top of the stairs, where they face Ruben as he goes to wake his son. Mike pulls out a shotgun and fires two rounds into Ruben, fatally wounding him. The boys then flee the scene and dump the shotgun into a vacant lot. Chuck soon wakes up to find his father bleeding to death on the stairs, and calls 911 while Ruben calls Claire. As Ruben fights for his life, he proclaims his love for her and leaves his children in her care. Ruben is rushed to the hospital where the family gathers to learn of his condition. Claire soon shows up to see Ruben, only to discover that he has died.
As the family mourns their loss, Diane also learns of the murder, and feigns shock and sadness in front of Sue's parents. They become suspicious of her when she fails to ask any questions about the murder. Meanwhile, Detectives Burstyn (Cliff De Young) and Pike (Dean Norris) are assigned to track down Ruben's killer. When Diane refuses to talk to the police after the murder, she becomes the primary suspect. In the days that follow, Diane deals further insult to her grieving family by threatening to sue the funeral home for proceeding with Ruben's service without her consent, as she had not been present to arrange it. Brook accuses her of killing her father, a charge Diane immediately denies.
The funeral soon takes place and the family pays their final respects to Ruben as he is laid to rest. Once again, Diane feigns sorrow in front of the open casket to preserve her innocence. Claire watches the burial from nearby, and soon collapses from shock.
The police soon discover that the murder weapon was a shotgun, and deduce that the shooter was an amateur, as the gun was of a cheap design. They are later tipped off about the photographs taken by Cory and Elgin, and question the boys about their activities. They learn that Diane shares her personal problems with her class, and is thus able to manipulate them to do as she pleases.
Meanwhile, Doug struggles to acquire the money promised to him by Diane. Due to her increasingly suspicious behavior in the case, Diane is denied access to Ruben's life insurance policy. Having grown impatient with Doug, Mike threatens Diane at knife-point and demands that she pay up. Frantic, Diane searches her husband's bedroom for the money he had hidden away, and soon finds a package containing $6,000. She gives $1500 to the boys, who are still not satisfied with their payment.
As the case remains at a standstill, Brook meets Claire in the hospital and pleads that she come back to them, as she was more of a mother to them than Diane ever was. Claire blames herself for Ruben's death, but Brook tells her that he was more alive with Claire than he had ever been before. Upon hearing this, Claire is soon able to overcome her personal guilt and becomes an adoptive mother to Chuck and Brook. Meanwhile, Brook has moved to Madison, Wisconsin, where she starts over without Diane in her life. Eventually, she meets a boy named Nick at her new job, and the two soon fall in love. After a night in bed, Brook discovers she is pregnant with Nick's son, and the two agree to marry each other.
Doug soon realizes that Diane will never be able to pay up, and informs his friends that he cannot obtain any more money. Meanwhile, Mike admits to his best friend Jeb (Andrew Kavovit) that he had a hand in Ruben's death, albeit without any noteworthy remorse. Jeb is unable to bring himself to confess to the police.
Five months after the murder, it becomes apparent to Diane that the cops are on to her, and tries to conceal her guilt. Shannon meets with Doug, and forces him to confess his role in the murder so that she can turn in all evidence to the cops before she commits suicide, making herself out to be the killer in an effort to protect Diane. Diane dissuades her from doing this as it will only lead the police back to her regardless. By the time school restarts, the boys are frustrated by their lack of payment, and struggle to conceal the truth about Ruben's murder.
Six months into the case, Jeb breaks down and admits to his friend Jay that Mike and Doug were responsible for Ruben's murder. Rather than force Jeb to turn in his best friend, Jay goes to the cops himself and implicates Doug as an accomplice. Doug is brought in for questioning, where he accidentally lets slip that he was in fact involved in Ruben's murder. When Burstyn confronts him on this, Doug makes a full confession, and provides him with the names of his accomplices. Mike and Shannon are arrested, and the two detectives rush to the high school. There, amidst the air of shock and outrage among the students, the police arrest Josh and Diane, with the latter desperately protesting her innocence as she is dragged away in handcuffs.
Six months later, Diane has been set free on bail as the court proceeds with the trials. Doug and Mike are both charged with first-degree murder as adults, and face life imprisonment. Josh pleads guilty to his crime in exchange for his testimony, and Shannon is charged with perjury. Josh admits his role in the conspiracy, as well as Doug's role in organizing the attack. Doug reveals the full details of the murder before the trial, and after his testimony, he is sentenced to life imprisonment. Diane is soon rearrested and brought forth to face a series of witnesses, who implicate her as the mastermind of the plot against Ruben. Among these witnesses is Shannon, who feels betrayed by Diane's reluctance to come forth to her defense. Doug also testifies against Diane, admitting that she commissioned him to carry out the murder.
After the conclusion of the testimonies, the jury makes its final verdict. To Diane's horror, she is found guilty of first-degree intentional homicide, and breaks down in front of the courtroom as her daughter Regan looks on in despair.
Having finally received justice for their father, the Borchardt family, along with Brook's husband and newborn son Ruben, visit Ruben's grave along with Claire. The family reflects on the better days of Ruben's life and welcome Brook's son, named in honor of his grandfather, into their family.
The end of the film is followed by an epilogue outlining the sentences faced by the conspirators:
SHANNON JOHNSON is found guilty of perjury, and receives an eighty-day jail sentence along with two years probation.
JOSHUA YANKE pleaded no contest to second-degree intentional homicide and is sentenced to eighteen years in prison.
MICHAEL MALDONADO is found guilty of first-degree murder and sentenced to life in prison. He will not be eligible for parole until he has served fifty years of his sentence.
DOUGLAS VEST JR. is found guilty of first-degree murder and sentenced to life in prison. He will not be eligible for parole until he has served twenty-five years of his sentence.
DIANE BORCHARDT is found guilty of first-degree murder and sentenced to life in prison, and will not be eligible for parole until she has served 40 years of her sentence, by that time being no less than eighty-six years of age.
Ulysses S. Grant High School in Los Angeles, California was used as the filming location for the external scenes at the high school where Diane Borchardt teaches.
During production, the names of several individuals involved in the case were deliberately changed for their purposes and those of the film.Diane Kay Borchardt – Ann-MargretRuben Borchardt – Peter CoyoteClaire Brown – Leslie HopeBrooke Borchardt – Hedy BurressChuck Borchardt – Tobey MaguireRegan Borchardt – Veronica LaurenDouglas Vest, Jr. – Christian CampbellMichael Maldonado – Freddy RodriguezTim – Johnny StrongJoshua Yanke – Jonah BlechmanShannon Johnson – Alanna UbachSeth – Danny MastersonElgin Thomas – Aeryk EganCory – Scott Michael CampbellDetective Burstyn – Cliff De YoungDetective Pike – Dean NorrisPrincipal – Belinda Balaski