diff --git a/app/controllers/admin/communication/websites/pages_controller.rb b/app/controllers/admin/communication/websites/pages_controller.rb
index c6c290817899f759a8648cd5b61c6146260fafc3..b7c8e6a92b9c313266f33ed7f1a74eb749d8fce1 100644
--- a/app/controllers/admin/communication/websites/pages_controller.rb
+++ b/app/controllers/admin/communication/websites/pages_controller.rb
@@ -71,6 +71,11 @@ class Admin::Communication::Websites::PagesController < Admin::Communication::We
     end
   end
 
+  def duplicate
+    redirect_to [:admin, @page.duplicate],
+                notice: t('admin.successfully_duplicated_html', model: @page.to_s)
+  end
+
   def destroy
     if @page.is_special_page?
       redirect_back(fallback_location: admin_communication_website_page_path(@page), alert: t('admin.communication.website.pages.delete_special_page_notice'))
diff --git a/app/helpers/admin/application_helper.rb b/app/helpers/admin/application_helper.rb
index 16d3c914b50005f4ee99f47f9d664b55b9ca7494..5fc82b00583fa0e3604fcc76d3131ad65797214c 100644
--- a/app/helpers/admin/application_helper.rb
+++ b/app/helpers/admin/application_helper.rb
@@ -45,6 +45,13 @@ module Admin::ApplicationHelper
                   aria-controls=\"preview\">#{ t 'preview.button'}</button>"
   end
 
+  def duplicate_link(object)
+    link_to t('admin.duplicate'),
+            [:duplicate, :admin, object], 
+            method: :post,
+            class: button_classes
+  end
+
   def button_classes(additional = '', **options)
     classes = "btn btn-primary btn-xs #{additional}"
     classes += ' disabled' if options[:disabled]
@@ -68,13 +75,6 @@ module Admin::ApplicationHelper
                 form: form.options.dig(:html, :id)
   end
 
-  def duplicate(object)
-    link_to t('admin.duplicate'),
-            [:duplicate, :admin, object], 
-            method: :post,
-            class: button_classes
-  end
-
   def prepare_html_for_static(html, university)
     text = html.to_s
     text = sanitize text
diff --git a/app/models/communication/website/page.rb b/app/models/communication/website/page.rb
index ad4e22bd9ef15307423e01999ed6457684374a37..85c2006d56dd76368a4f13c530897f78ceea8c49 100644
--- a/app/models/communication/website/page.rb
+++ b/app/models/communication/website/page.rb
@@ -145,6 +145,18 @@ class Communication::Website::Page < ApplicationRecord
     "/#{language.iso_code}" if website.languages.any? && language_id
   end
 
+  def duplicate
+    page = self.dup
+    page.published = false
+    page.save
+    blocks.each do |block|
+      b = block.duplicate
+      b.about = page
+      b.save
+    end
+    page
+  end
+
   def to_s
     "#{title}"
   end
diff --git a/app/views/admin/communication/blocks/_list.html.erb b/app/views/admin/communication/blocks/_list.html.erb
index 0d172f9597ae2d3d50731ee754de8dad495829f9..4f407759b07e695e229ca57b0b80b846bf9db95f 100644
--- a/app/views/admin/communication/blocks/_list.html.erb
+++ b/app/views/admin/communication/blocks/_list.html.erb
@@ -32,8 +32,10 @@
             <td><%= block.template_kind_i18n  %></td>
             <td><%= render 'admin/application/a11y/status', about: block %></td>
             <td class="text-end">
-              <%= duplicate block %>
-              <%= edit_link block %>
+              <div class="btn-group">
+                <%= duplicate_link block %>
+                <%= edit_link block %>
+              </div>
             </td>
           </tr>
         <% end %>
diff --git a/app/views/admin/communication/blocks/edit.html.erb b/app/views/admin/communication/blocks/edit.html.erb
index 117a5a802bde92ad9beff96496d4030f4dcc3db9..940c473ec23af60f7dbb6806b0974377a349e4b5 100644
--- a/app/views/admin/communication/blocks/edit.html.erb
+++ b/app/views/admin/communication/blocks/edit.html.erb
@@ -14,7 +14,7 @@
             <%= f.input :title %>
           </div>
           <div class="col-xxl-3 col-lg-6">
-            <label class="form-label">&nbsp;</label>
+            <label class="form-label d-none d-lg-block">&nbsp;</label>
             <%= f.input :published %>
           </div>
         </div>
diff --git a/app/views/admin/communication/websites/pages/_treebranch.html.erb b/app/views/admin/communication/websites/pages/_treebranch.html.erb
index 370aac563f0fdb3dffa7a8562a91506164fed5eb..47459b77cb0ef3f89570c4337ac36c47a8e379b9 100644
--- a/app/views/admin/communication/websites/pages/_treebranch.html.erb
+++ b/app/views/admin/communication/websites/pages/_treebranch.html.erb
@@ -28,6 +28,7 @@
           <span class="me-3 show-on-hover"><%= t("communication.website.pages.defaults.#{page.kind}.admin_description") %></span>
         <% end %>
         <div class="btn-group">
+          <%= duplicate_link page if page.is_regular_page?%>
           <%= edit_link page %>
           <%= destroy_link page, confirm_message: page.children.any? ? t('please_confirm_with_children') : t('please_confirm') if page.is_regular_page? %>
         </div>
diff --git a/config/routes/admin/communication.rb b/config/routes/admin/communication.rb
index 99410189a417e71f2a0fec24e28dc5b8d5786983..c8f3af92d272bf049aa7c52cf9552f8fa054dd93 100644
--- a/config/routes/admin/communication.rb
+++ b/config/routes/admin/communication.rb
@@ -15,6 +15,7 @@ namespace :communication do
         get :children
         get :static
         get :preview
+        post :duplicate
       end
     end
     resources :categories, controller: 'websites/categories' do