diff --git a/district/models.py b/district/models.py
index 584c00bd6ad7ff2efa11ede7617a581659111be8..4663c64c6384fa1df3e4c3f70d511e99d47f3514 100644
--- a/district/models.py
+++ b/district/models.py
@@ -462,10 +462,6 @@ class DistrictArticlePage(
         )
         return context
 
-    @property
-    def articles_page(self):
-        return self.get_parent()
-
 
 class DistrictArticlesPage(
     RoutablePageMixin,
diff --git a/shared/models.py b/shared/models.py
index 85906c5ee8c95b016ac0ddedf8bce676f3048bff..144000d4ca2956fc42cd3c8e147be14ca93c3e10 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -63,8 +63,12 @@ class ArticleMixin(models.Model):
         null=True,
         verbose_name="obrázek",
     )
-    shared = models.BooleanField(
-        default=False
+    shared_from = models.ForeignKey(
+        Page,
+        null=True,
+        blank=True,
+        related_name="+",
+        on_delete=models.PROTECT,
     )  # hidden field to indicate the article is from another page
 
     ### PANELS
@@ -82,6 +86,21 @@ class ArticleMixin(models.Model):
     class Meta:
         abstract = True
 
+    @property
+    def articles_page(self):
+        return (
+            self.shared_from.get_specific()
+            if self.shared_from
+            else self.get_parent().get_specific()
+        )
+
+    @property
+    def root_page(self):
+        if self.shared_from is None:
+            return self.get_parent().get_ancestors().specific().live().last()
+
+        return self.shared_from.get_specific().root_page
+
     @classmethod
     def has_tags(cls):
         try:
@@ -298,7 +317,7 @@ class ArticlesMixin(models.Model):
 
         fields_reducer = (
             lambda assigned, field: assigned
-            if field.column == "shared"
+            if field.column == "shared_from_id"
             else assigned | {f"union_{field.column}": F(field.column)}
         )
         setup_fields_order = lambda orderBy, orderFrom: reduce(
@@ -369,42 +388,56 @@ class ArticlesMixin(models.Model):
         if filter is not None:
             main_by_slug = filter(main_by_slug)
 
+        shared_field = Value(
+            self.page_ptr.id,
+            output_field=models.ForeignKey(
+                Page, null=True, blank=True, related_name="+", on_delete=models.PROTECT
+            ),
+        )
+
         results = (
             main_by_slug.values(
                 **main_fields,
-                union_shared=Value(True, output_field=models.BooleanField()),
+                union_shared_from_id=shared_field,
             )
             .union(
                 uniweb_by_slug.values(
                     **uniweb_fields,
-                    union_shared=Value(True, output_field=models.BooleanField()),
+                    union_shared_from_id=shared_field,
                 )
             )
             .union(
                 district_by_slug.values(
                     **district_fields,
-                    union_shared=Value(True, output_field=models.BooleanField()),
+                    union_shared_from_id=shared_field,
                 )
             )
         )
 
+        empty_shared_field = Value(
+            None,
+            output_field=models.ForeignKey(
+                Page, null=True, blank=True, related_name="+", on_delete=models.PROTECT
+            ),
+        )
+
         if previous_query is not None:
             prepared_query = previous_query.live().specific()
 
             if isinstance(self, DistrictArticlesPage):
                 prepared_query = prepared_query.values(
                     **district_fields,
-                    union_shared=Value(False, output_field=models.BooleanField()),
+                    union_shared_from_id=empty_shared_field,
                 )
             elif isinstance(self, UniwebArticlesIndexPage):
                 prepared_query = prepared_query.values(
                     **uniweb_fields,
-                    union_shared=Value(False, output_field=models.BooleanField()),
+                    union_shared_from_id=empty_shared_field,
                 )
             elif isinstance(self, MainArticlesPage):
                 prepared_query = prepared_query.values(
                     **main_fields,
-                    union_shared=Value(False, output_field=models.BooleanField()),
+                    union_shared_from_id=empty_shared_field,
                 )
 
             results = results.union(prepared_query)
diff --git a/shared/templates/shared/article_preview.html b/shared/templates/shared/article_preview.html
index 7656e526dd65603a1018fe56363fe02568d507c0..4add013a934881483d502b1443e71769f0bb2dfc 100644
--- a/shared/templates/shared/article_preview.html
+++ b/shared/templates/shared/article_preview.html
@@ -7,14 +7,14 @@
   itemscope=""
 >
 
-  {% if article.shared %}
+  {% if article.shared_from %}
     <link itemprop="mainEntityOfPage" href="{{ page.url }}sdilene?sdilene={{ article.slug|urlencode }}">
   {% else %}
     <link itemprop="mainEntityOfPage" href="{{ article.url }}">
   {% endif %}
 
   <div class="article-card-cover">
-    {% if article.shared %}
+    {% if article.shared_from %}
       <a href="{{ page.url }}sdilene?sdilene={{ article.slug|urlencode }}" rel="noindex" itemprop="image" itemtype="http://schema.org/ImageObject" itemscope="">
     {% else %}
       <a href="{{ article.url }}" itemprop="image" itemtype="http://schema.org/ImageObject" itemscope="">
@@ -72,7 +72,7 @@
   </div>
 
   <div class="card__body article-card__body{% if article.is_black %} text-white{% endif %}">
-    {% if article.shared %}
+    {% if article.shared_from %}
       <a href="{{ page.url }}sdilene?sdilene={{ article.slug|urlencode }}" rel="noindex">
     {% else %}
       <a href="{{ article.url }}">