diff --git a/app/controllers/admin/communication/website/pages_controller.rb b/app/controllers/admin/communication/website/pages_controller.rb
index 01390214993d5d4c82a29de54431ba2342b26c8b..d9788ae24b781adb603a2cc0d37234df2e1ebdb5 100644
--- a/app/controllers/admin/communication/website/pages_controller.rb
+++ b/app/controllers/admin/communication/website/pages_controller.rb
@@ -10,13 +10,20 @@ class Admin::Communication::Website::PagesController < Admin::Communication::Web
   def reorder
     parent_id = params[:parentId].blank? ? nil : params[:parentId]
     ids = params[:ids] || []
+    pages = []
+    github_files = []
     ids.each.with_index do |id, index|
       page = @website.pages.find(id)
+      pages << page
+      pages.concat(page.descendents) if parent_id != page.parent_id
       page.update(
         parent_id: parent_id,
-        position: index + 1
+        position: index + 1,
+        skip_github_publication: true
       )
     end
+    github = Github.with_website @website
+    github.send_batch_to_website(pages, message: '[Page] Reorder pages.')
   end
 
   def children
diff --git a/app/models/concerns/with_github_files.rb b/app/models/concerns/with_github_files.rb
index 3232d8ae353e09795d52c822b4f730ea1fad1be4..f9762bb6f958267361dda84807ffe818b766795d 100644
--- a/app/models/concerns/with_github_files.rb
+++ b/app/models/concerns/with_github_files.rb
@@ -2,13 +2,15 @@ module WithGithubFiles
   extend ActiveSupport::Concern
 
   included do
+    attr_accessor :skip_github_publication
+
     has_many  :github_files,
               class_name: "Communication::Website::GithubFile",
               as: :about,
               dependent: :destroy
 
     after_save :create_github_files
-    after_save_commit :publish_github_files
+    after_save_commit :publish_github_files, unless: :skip_github_publication
     after_save_commit :unpublish_github_files, if: :should_unpublish_github_files?
   end
 
@@ -39,6 +41,10 @@ module WithGithubFiles
     ]
   end
 
+  def list_of_websites
+    respond_to?(:websites) ? websites : [website]
+  end
+
   protected
 
   def create_github_files
@@ -63,26 +69,10 @@ module WithGithubFiles
   end
 
   def publish_github_files_with_descendents
+    target_objects = [self, descendents].flatten
     list_of_websites.each do |current_website|
-      website_github = Github.with_website current_website
-      next unless website_github.valid?
-      target_github_files = []
-      github_manifest.each do |manifest_item|
-        github_file = github_files.where(website: current_website, manifest_identifier: manifest_item[:identifier]).first_or_create
-        target_github_files << github_file
-        github_file.add_to_batch(website_github)
-        descendents.each do |descendent|
-          next unless descendent.list_of_websites.include? current_website
-          descendent_github_file = descendent.github_files.where(website: current_website, manifest_identifier: manifest_item[:identifier]).first_or_create
-          target_github_files << descendent_github_file
-          descendent_github_file.add_to_batch(website_github)
-        end
-      end
-      if website_github.commit_batch("[#{self.class.name.demodulize}] Save #{to_s} & descendents")
-        target_github_files.each { |file|
-          file.update_column :github_path, file.manifest_data[:generated_path].call(file)
-        }
-      end
+      github = Github.with_website current_website
+      github.send_batch_to_website(target_objects, message: "[#{self.class.name.demodulize}] Save #{to_s} & descendents")
     end
   end
 
@@ -97,8 +87,4 @@ module WithGithubFiles
   def should_unpublish_github_files?
     respond_to?(:published?) && saved_change_to_published? && !published?
   end
-
-  def list_of_websites
-    respond_to?(:websites) ? websites : [website]
-  end
 end
diff --git a/app/services/github.rb b/app/services/github.rb
index 4a4203b28fffbb0832ffca4de3bc433bd24f0585..2dd82a4635ea4cccdaff205e6ebcb3aa1280c0fb 100644
--- a/app/services/github.rb
+++ b/app/services/github.rb
@@ -1,13 +1,14 @@
 class Github
-  attr_reader :access_token, :repository
+  attr_reader :website, :access_token, :repository
 
   def self.with_website(website)
-    new website&.access_token, website&.repository
+    new website
   end
 
-  def initialize(access_token, repository)
-    @access_token = access_token
-    @repository = repository
+  def initialize(website)
+    @website = website
+    @access_token = website&.access_token
+    @repository = website&.repository
   end
 
   def valid?
@@ -85,6 +86,27 @@ class Github
     ''
   end
 
+  def send_batch_to_website(objects, message: 'Batch objects')
+    return unless valid?
+
+    github_files = []
+    objects.each do |object|
+      next unless object.list_of_websites.include? website
+      object.github_manifest.each do |manifest_item|
+        github_file = object.github_files.where(website: website, manifest_identifier: manifest_item[:identifier]).first_or_create
+        github_files << github_file
+        github_file.add_to_batch(self)
+      end
+    end
+
+    if commit_batch(message)
+      github_files.each do |github_file|
+        github_file.update_column :github_path, github_file.manifest_data[:generated_path].call(github_file)
+      end
+    end
+  end
+  handle_asynchronously :send_batch_to_website, queue: 'default'
+
   protected
 
   def pages