Зав’язка. У сторожці серед волинських борів старий дід Максим починає розповідь про часи кріпацтва. Ми дізнаємося про лісника Романа, якого пан наказав висікти канчуками, щоб змусити одружитися з Оксаною. Роман, ображений на весь світ, спочатку ненавидить свою «нав’язану» дружину, але її доброта та спільне життя в лісовій тиші поступово розтоплюють його серце.

Розвиток дії. Спокій лісу порушує приїзд Пана та музики Опанаса. Пан, захоплений Оксаною, влаштовує гостину, а Опанас співає пісень, у яких звучить прихована загроза та туга за волею. Пан замислює підступ: він відправляє Романа в нічну бурю на полювання («на ведмедя»), щоб залишитися з Оксаною наодинці. Опанас намагається застерегти пана, але той лише сміється. Тоді Опанас у гніві розбиває свою бандуру об дерево і їде геть.

Кульмінація. Починається страшна гроза. Пан намагається вдертися до хати до Оксани, яка зачинилася зсередини. У цей момент повертається Роман. У темряві та шумі негоди відбувається розправа: Роман убиває пана та його вірного псаря Богдана, що кинувся на допомогу господарю. Це момент найвищої справедливості, де людська лють зливається зі стихією природи.

Розв’язка. На ранок малий Максим бачить тіла загиблих на галявині. Роман зникає в лісі, ставши вільним вигнанцем (гайдамакою), як і Опанас. Історія завершується тим самим вічним шумом сосен, який слухав дід. Це шум, що нагадує: панська влада минула, а пам'ять про людську гідність і відплату за злочини живе вічно.