Kaulder (Vin Diesel) is a witch-hunter who was cursed with eternal life in the Middle Ages by the Witch Queen (Julie Engelbrecht). The Witch Queen had unleashed the Black Plague to wipe out humanity and killed Kaulder’s family, but Kaulder was able to defeat her. Before she meets her end, the Witch Queen curses Kaulder with eternal life as punishment because all he wants to do was die. 800 years later, Kaulder prevents a teenage witch from unintentionally destroying an airplane with weather controlling runes she does not know how to use properly. Kaulder is working as a witch hunter for an organization called The Axe and Cross, which aims to keep the truce between humans and witches and executes or imprisons witches who break the law into the Witches Prison. He is accompanied by a priest called a “Dolan” whose main purpose is to record the achievements of Kaulder and to be his keeper. One night, the 36th Dolan (Michael Caine) tells Kaulder that he is retiring from his duties and has chosen a new Dolan to work alongside Kaulder. The very same night he dies in his sleep.
While investigating his apartment, Kaulder and the 37th Dolan (Elijah Wood) discover traces of magic and deduce that the 36th Dolan was murdered by a witch. While tracking down the witch responsible, Kaulder finds traces of old dark magic, not seen since before he killed the Witch Queen. As it turns out, the Dolan is not dead but rather under a dark magic spell that can only be broken if the witch that casted it is killed. Using clues that the 36th Dolan left behind which asked him to “remember his death,” Kaulder goes to a witch bar owned by young witches named Chloe (Rose Leslie) and Miranda (Aimee Carrero) to buy a memory spell to help him remember how he died and came back. Chloe is hesitant to give him the spell but eventually agrees out of curiosity. While in the process of reliving his memory, the bar is attacked by Baltasar Ketola (Ólafur Darri Ólafsson), better known as Belial, the witch that cursed the 36th Dolan. After attacking Kaulder he proceeds to burn down the bar, and attack Chloe at her apartment later in the evening, though Kaulder saves her. After Chloe’s friend Miranda is killed by Belial, she agrees to help Kaulder get what he needs to kill him. Unfortunately, Belial destroys what is needed to make the memory spell in Miranda’s garden, where she is found dead by Chloe and Kaulder.
In order to get the ingredients to create another memory spell, they visit Danique (Dawn Olivieri), an old and powerful witch who runs the fashion scene. However, Danique drugs Kaulder with an endless dream, and intends to lock him away forever. Chloe is able to enter his mind (because she is a dream walker), convinces him to break free from the hold of the spell, and the two escape together. Later that night Kaulder shows Chloe the history of witches, and how the Witch Queen used dream walkers as soldiers because they were able to enter someone’s mind and twist any good memory into something horrible. He then asks Chloe to enter his mind and pull out a memory. Using Chloe’s dream walking abilities, she enters his mind and guides him to the memory of his death, where Kaulder discovers that though the Witch Queen’s body burned to ash her heart was saved. Kaulder’s fellow warriors tried to destroy the heart, but decided to spare it because they saw the more damage was done to the heart the more pain Kaulder felt. His immortality was tied to the Witch Queen’s heart, and if it were to die, so would he. The 36th Dolan was attacked because like other Dolans before him, he knew of where the heart was hidden, and was tortured into revealing its location.
Leaving Chloe and the 37th Dolan behind, Kaulder goes to face Belial and the Witch Queen to prevent her from returning. Though he kills Belial, the Witch Queen reenters the world through the sacrifice of another witch, a blind merchant named Max Schlesinger (Isaach De Bankolé), and escapes into the city, stealing Kaulder’s immortality, revealing she only gave it to him so her heart would survive. Back at Kaulder’s apartment, the 36th Dolan is recovering. There, he encourages Kaulder to continue to fight again.
Kaulder, Chloe, and the 37th Dolan drive to the church that holds the Witches’ Prison, where the Witch Queen plans to enact another plague curse using the prisoners as a magical power source. Using her dream walking ability, Chloe enters the mind of one of the weakest prisoners and kills him in his dream, also killing him in real life, severing the connection of the Queen to the prisoners and temporarily stalling her plan. Kaulder fights the Witch Queen, and appears close to killing her, until the 37th Dolan reveals himself a traitor with a grudge against Kaulder for killing his witch parents. He asked the Witch Queen to “make him whole again,” as he was born without any magic. She replies, “Clay cannot be turned to gold. Without magic, you are just a human.” The Witch Queen kills the 37th Dolan and uses Chloe instead to complete the connection between the witches for the plague curse to form again.
Willed by the images of his deceased wife (Lotte Verbeek) and child telling him to get up and fight, Kaulder uses the runes he took from the teenage witch to summon a thunderstorm and throws his sword into the Witch Queen where it acts as a lightning rod and burns her body to ash. But as Kaulder prepares to kill both the Witch Queen’s heart and himself to end her once and for all, Chloe stops him, convincing him that she and the world still need him around.
After congratulating him on defeating the Witch Queen, the 36th Dolan agrees to delay his retirement and stay by Kaulder’s side who is immortal once again. Chloe does as well, and the three form a new team, free from The Axe and Cross organization he served under before. The film ends with a faint sound of the heartbeat of the Witch Queen, heard within Kaulder’s weapon stash in his apartment.