diff --git a/app/models/communication/website/category.rb b/app/models/communication/website/category.rb
index b64503042ce45abb936f5a941c4effdec037e89d..e3af2efb67b0a62de24afbeb381320f96619601b 100644
--- a/app/models/communication/website/category.rb
+++ b/app/models/communication/website/category.rb
@@ -46,6 +46,7 @@ class Communication::Website::Category < ApplicationRecord
   include WithTree
   include WithPosition
   include WithWebsitePermalink
+  include WithWebsitePreviousLinks
 
   has_one                 :imported_category,
                           class_name: 'Communication::Website::Imported::Category',
@@ -111,6 +112,10 @@ class Communication::Website::Category < ApplicationRecord
     raw_permalink_for_website(website).gsub(':slug', self.path)
   end
 
+  def previous_computed_permalink_for_website(website)
+    raw_permalink_for_website(website).gsub(':slug', self.path_was)
+  end
+
   protected
 
   def last_ordered_element
diff --git a/app/models/communication/website/page.rb b/app/models/communication/website/page.rb
index 29e2add7d11a578cd2588a6fb44f8406f8745cef..2ca22a7865088800e0f540227cfd21a5b48ffe1e 100644
--- a/app/models/communication/website/page.rb
+++ b/app/models/communication/website/page.rb
@@ -54,6 +54,7 @@ class Communication::Website::Page < ApplicationRecord
   include WithTree
   include WithPath
   include WithWebsitePermalink
+  include WithWebsitePreviousLinks
 
   has_summernote :text
 
@@ -145,6 +146,10 @@ class Communication::Website::Page < ApplicationRecord
     path
   end
 
+  def previous_computed_permalink_for_website(website)
+    path_was
+  end
+
   protected
 
   def check_accessibility
diff --git a/app/models/communication/website/post.rb b/app/models/communication/website/post.rb
index 50488f275d671640b2ed4a47831b661549f32f6d..9f0286c191222495ee38ee8a764b3d5c93eea90b 100644
--- a/app/models/communication/website/post.rb
+++ b/app/models/communication/website/post.rb
@@ -44,6 +44,7 @@ class Communication::Website::Post < ApplicationRecord
   include WithMenuItemTarget
   include WithSlug # We override slug_unavailable? method
   include WithWebsitePermalink
+  include WithWebsitePreviousLinks
 
   has_summernote :text
 
@@ -150,6 +151,13 @@ class Communication::Website::Post < ApplicationRecord
       .gsub(':year/:month/:day', published_at.strftime("%Y/%m/%d"))
   end
 
+  def previous_computed_permalink_for_website(website)
+    return unless website.id == communication_website_id && published_was && published_at_was
+    raw_permalink_for_website(website)
+      .gsub(':slug', self.slug_was)
+      .gsub(':year/:month/:day', published_at_was.strftime("%Y/%m/%d"))
+  end
+
   def to_s
     "#{title}"
   end
diff --git a/app/models/communication/website/previous_link.rb b/app/models/communication/website/previous_link.rb
index 44ca9255ebae2bbbebb5c22e8a0d90e9fdc80186..b099d84c6c297b5082cfa0198e65b5ec479e8c6e 100644
--- a/app/models/communication/website/previous_link.rb
+++ b/app/models/communication/website/previous_link.rb
@@ -30,15 +30,10 @@ class Communication::Website::PreviousLink < ApplicationRecord
   belongs_to :about, polymorphic: true
 
   before_validation :set_university, on: :create
-  after_destroy_commit :sync_about
 
   private
 
   def set_university
     self.university_id = website.university_id
   end
-
-  def sync_about
-    about.sync_with_git
-  end
 end
diff --git a/app/models/concerns/with_website_permalink.rb b/app/models/concerns/with_website_permalink.rb
index f3691e458ba44ed0c4daf2a6c1594afb1678be23..d9a08b7d460cbb23e8ca439e348780f904de9405 100644
--- a/app/models/concerns/with_website_permalink.rb
+++ b/app/models/concerns/with_website_permalink.rb
@@ -8,8 +8,17 @@ module WithWebsitePermalink
       computed_permalink.present? ? Static.clean_path(computed_permalink) : nil
     end
 
+    def previous_permalink_for_website(website)
+      computed_permalink = previous_computed_permalink_for_website(website)
+      computed_permalink.present? ? Static.clean_path(computed_permalink) : nil
+    end
+
     def computed_permalink_for_website(website)
-      raw_permalink_for_website(website).gsub(':slug', self.slug)
+      raw_permalink_for_website(website)&.gsub(':slug', self.slug)
+    end
+
+    def previous_computed_permalink_for_website(website)
+      raw_permalink_for_website(website)&.gsub(':slug', self.slug_was)
     end
 
     protected
diff --git a/app/models/concerns/with_website_previous_links.rb b/app/models/concerns/with_website_previous_links.rb
new file mode 100644
index 0000000000000000000000000000000000000000..09134b509b1a838dba7c3ef476b4ef656f9b624a
--- /dev/null
+++ b/app/models/concerns/with_website_previous_links.rb
@@ -0,0 +1,24 @@
+module WithWebsitePreviousLinks
+  extend ActiveSupport::Concern
+
+  included do
+
+    has_many  :previous_links,
+              class_name: "Communication::Website::PreviousLink",
+              as: :about,
+              dependent: :destroy
+
+    after_validation :manage_previous_links, on: [:create, :update]
+
+    def manage_previous_links
+      websites_for_self.each do |website|
+        old_permalink = previous_permalink_for_website(website)
+        new_permalink = permalink_for_website(website)
+
+        # If the object had a permalink and now is different, we create a previous link
+        previous_links.create(website: website, link: old_permalink) if old_permalink.present? && new_permalink != old_permalink
+      end
+    end
+
+  end
+end
diff --git a/app/models/university/person.rb b/app/models/university/person.rb
index 622c91a590a3176f55f118be32eb51e16130e8ae..0585737af091341856bf573751788237518dc67d 100644
--- a/app/models/university/person.rb
+++ b/app/models/university/person.rb
@@ -57,6 +57,7 @@ class University::Person < ApplicationRecord
   include WithRoles
   include WithBlocks
   include WithWebsitePermalink
+  include WithWebsitePreviousLinks
 
   LIST_OF_ROLES = [
     :administration,