Mughal Ruler Aurangzeb bans music in India, since he believes that music turns a person away from God. This ban continues in the next generations. Music lovers and singers start living in secret places away from cities. Baba Makhdum (Mukesh Rishi) is staying near Kasur with some of his followers and practices music; Waris Shah (Gurdas Maan) comes and joins him. Baba Makhdum tells Waris that he appreciates his talent, but asks Waris to feel the pain in order to get best out of him.
On Baba Ji’s suggestion Waris moves to the village of Malkan Hans, where music is not banned. The Mughal Ruler finds out about Baba Makhdum and kills him. Waris Shah meets Bhaagpari (Juhi Chawla) in Malkan Hans. The two fall in love. Saabo (Divya Dutta), too, gets attracted to Waris Shah, and is willing to do anything to get Waris. Waris starts living in the masjid of the village and starts working on the poem Heer. Village youngsters get attracted to his work and become his fans. Qazi (Gurkirtan) of the village becomes furious after seeing Waris's popularity. Waris is arrested by the area Subedar after complaints from Qazi. Waris convinces the Subedar that by singing he is worshiping God. Bhaagpari is forced to merry Saabo's brother (Sushant Singh) as they were betrothed at a young age. Waris Shah realizes that in order to feel pain and complete Heer, he must let Bhaagpari go. On the other hand, Saabo tries her best but fails to get Waris. Finally she accepts her fate and lets Waris go. Waris and Bhaagpari are accused of having a sexual relationship without marriage. They prove their innocence by walking unharmed on burning coals. In the end Waris leaves the village upon the completion of Heer.