diff --git a/app/models/communication/block/heading.rb b/app/models/communication/block/heading.rb
index 186320adca87be8c2484a44c3a19b37882498614..cbf44bb4f99c80d350c1f8b8ca74bbb853a9559e 100644
--- a/app/models/communication/block/heading.rb
+++ b/app/models/communication/block/heading.rb
@@ -54,6 +54,12 @@ class Communication::Block::Heading < ApplicationRecord
     [about]
   end
 
+  def duplicate
+    heading = self.dup
+    heading.save
+    heading
+  end
+
   def translate!(about_translation, parent_id = nil)
     translation = self.dup
     translation.about = about_translation
diff --git a/app/models/concerns/with_duplication.rb b/app/models/concerns/with_duplication.rb
index 3285ff9a664e02dcabd2f992dd2b0561b16f85cf..d83d03803db1423e6e1a489741c9a1fab5b1a3d7 100644
--- a/app/models/concerns/with_duplication.rb
+++ b/app/models/concerns/with_duplication.rb
@@ -3,7 +3,7 @@ module WithDuplication
 
   def duplicate
     instance = duplicate_instance
-    duplicate_blocks_to(instance)
+    duplicate_contents_to(instance)
     duplicate_featured_image_to(instance)
     instance
   end
@@ -18,13 +18,35 @@ module WithDuplication
     instance
   end
 
-  def duplicate_blocks_to(instance)
-    return unless respond_to?(:blocks)
-    blocks.ordered.each do |block|
-      b = block.duplicate
-      b.about = instance
-      b.position = block.position
-      b.save
+  def duplicate_contents_to(instance)
+    return unless respond_to?(:contents)
+    blocks.without_heading.ordered.each do |block|
+      duplicate_block(instance, block)
+    end
+    headings.root.ordered.each do |heading|
+      duplicate_heading(instance, heading)
+    end
+  end
+
+  def duplicate_block(instance, block, heading_id = nil)
+    b = block.duplicate
+    b.about = instance
+    b.position = block.position
+    b.heading_id = heading_id
+    b.save
+  end
+
+  def duplicate_heading(instance, heading, parent_id = nil)
+    h = heading.duplicate
+    h.about = instance
+    h.position = heading.position
+    h.save
+
+    heading.blocks.ordered.each do |block|
+      duplicate_block(instance, block, h.id)
+    end
+    heading.children.ordered.each do |child|
+      duplicate_heading(instance, child, h.id)
     end
   end