diff --git a/district/models.py b/district/models.py
index dc205b42d2aa9805af999dc859eeadfdecf86aca..afb5594fccf4198f536a15e2339cadc7c85b18b0 100644
--- a/district/models.py
+++ b/district/models.py
@@ -458,14 +458,7 @@ class DistrictArticlePage(
     @property
     def get_tags(self):
         if self.shared_from is not None:
-            return self.articles_page.search_tags_by_unioned_id_query(
-                [
-                    {
-                        "union_page_ptr_id": self.pk,
-                        "union_page_kind": "district",
-                    }
-                ]
-            )
+            return self.articles_page.search_tags_by_unioned_id_query([self])
         return self.tags.all
 
     def get_context(self, request):
@@ -572,17 +565,15 @@ class DistrictArticlesPage(
         # (tags__slug)
         context = super().get_context(request)
 
-        article_ids_with_type = self.append_all_shared_articles_ids_with_type(
+        articles = self.append_all_shared_articles(
             DistrictArticlePage.objects.child_of(self)
         )
 
-        page_ids = list(
-            map(lambda unioned: unioned["union_page_ptr_id"], article_ids_with_type)
-        )
+        page_ids = list(map(lambda article: article.page_ptr.id, articles))
 
         # Naplním "tag" a "article_page_list" parametry
         context.update(**self.get_tag_and_articles(request, page_ids))
-        context["tag_list"] = self.get_tag_qs(article_ids_with_type)
+        context["tag_list"] = self.get_tag_qs(articles)
 
         # Pro obecnou paginaci posílám "extra_query", abych si podržel tag pro další GET
         context["extra_query"] = "&tag={}".format(request.GET.get("tag", ""))
@@ -623,13 +614,13 @@ class DistrictArticlesPage(
             "tag": tag,
         }
 
-    def get_tag_qs(self, article_ids_with_type: list) -> models.QuerySet:
+    def get_tag_qs(self, articles: list) -> models.QuerySet:
         """
         Getuje Tagy pouze pro DistrictArticlePage omezeno IDčky getnutých přes
         root_page. Počítá, kolik článků je s daným tagem.
         """
         return self.search_tags_by_unioned_id_query(
-            article_ids_with_type,
+            articles,
             tags_model_query=lambda query: query.annotate(count=models.Count("slug"))
             .order_by("slug")
             .values("name", "slug", "count"),
diff --git a/main/models.py b/main/models.py
index 4fd9eccb138af20b0f82fe69dabcb7f028bee0f7..4f85221b6d35dfe770a424f0abecf68af17d9ceb 100644
--- a/main/models.py
+++ b/main/models.py
@@ -669,14 +669,7 @@ class MainArticlePage(
     @property
     def get_tags(self):
         if self.shared_from is not None:
-            return self.articles_page.search_tags_by_unioned_id_query(
-                [
-                    {
-                        "union_page_ptr_id": self.pk,
-                        "union_page_kind": "uniweb",
-                    }
-                ]
-            )
+            return self.articles_page.search_tags_by_unioned_id_query([self])
         return self.tags.all
 
     # def get_context(self, request): chceme/nechceme?
diff --git a/shared/models.py b/shared/models.py
index 944790014e573b579c848f4cd4c0f311a5d1373c..68dc2e308d44bb91174ca125e1f6b93706217972 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -64,6 +64,9 @@ class ArticleMixin(models.Model):
         null=True,
         verbose_name="obrázek",
     )
+    shared_type = models.TextField(
+        null=True, blank=True
+    )  # hidden field describing the source of shared articles
     shared_from = models.ForeignKey(
         Page,
         null=True,
@@ -338,7 +341,7 @@ class ArticlesMixin(models.Model):
 
         fields_reducer = (
             lambda assigned, field: assigned
-            if field.column == "shared_from_id"
+            if field.column == "shared_from_id" or field.column == "shared_type"
             else assigned | {f"union_{field.column}": F(field.column)}
         )
         setup_fields_order = lambda orderBy, orderFrom: reduce(
@@ -349,9 +352,6 @@ class ArticlesMixin(models.Model):
 
         main_fields = reduce(fields_reducer, main_meta_fields, {}) | {
             "union_thumb_image_id": F("search_image_id"),
-            "union_page_kind": Value(
-                SharedArticlesPageType.MAIN.value, output_field=models.CharField()
-            ),
         }
 
         district_fields = setup_fields_order(
@@ -360,10 +360,6 @@ class ArticlesMixin(models.Model):
             | {
                 "union_region": Value("", models.CharField()),
                 "union_article_type": Value(0, models.PositiveSmallIntegerField()),
-                "union_page_kind": Value(
-                    SharedArticlesPageType.DISTRICT.value,
-                    output_field=models.CharField(),
-                ),
             },
         )
 
@@ -381,9 +377,6 @@ class ArticlesMixin(models.Model):
                 "union_article_type": Value(0, models.PositiveSmallIntegerField()),
                 "union_is_black": Value(False, models.BooleanField()),
                 "union_thumb_image_id": F("search_image_id"),
-                "union_page_kind": Value(
-                    SharedArticlesPageType.UNIWEB.value, output_field=models.CharField()
-                ),
             },
         )
 
@@ -429,14 +422,23 @@ class ArticlesMixin(models.Model):
         main_by_values = main_by_slug.values(
             **main_fields,
             union_shared_from_id=shared_field,
+            union_shared_type=Value(
+                SharedArticlesPageType.MAIN.value, output_field=models.TextField()
+            ),
         )
         uniweb_by_values = uniweb_by_slug.values(
             **uniweb_fields,
             union_shared_from_id=shared_field,
+            union_shared_type=Value(
+                SharedArticlesPageType.UNIWEB.value, output_field=models.TextField()
+            ),
         )
         district_by_values = district_by_slug.values(
             **district_fields,
             union_shared_from_id=shared_field,
+            union_shared_type=Value(
+                SharedArticlesPageType.DISTRICT.value, output_field=models.TextField()
+            ),
         )
 
         results = main_by_values.union(uniweb_by_values).union(district_by_values)
@@ -448,6 +450,8 @@ class ArticlesMixin(models.Model):
             ),
         )
 
+        empty_shared_type = Value(None, output_field=models.TextField())
+
         if previous_query is not None:
             prepared_query = previous_query.live().specific()
 
@@ -455,30 +459,25 @@ class ArticlesMixin(models.Model):
                 prepared_query = prepared_query.values(
                     **district_fields,
                     union_shared_from_id=empty_shared_field,
+                    union_shared_type=empty_shared_type,
                 )
             elif page_type == SharedArticlesPageType.UNIWEB:
                 prepared_query = prepared_query.values(
                     **uniweb_fields,
                     union_shared_from_id=empty_shared_field,
+                    union_shared_type=empty_shared_type,
                 )
             elif page_type == SharedArticlesPageType.MAIN:
                 prepared_query = prepared_query.values(
                     **main_fields,
                     union_shared_from_id=empty_shared_field,
+                    union_shared_type=empty_shared_type,
                 )
 
             results = results.union(prepared_query)
 
         return results.order_by("union_date")
 
-    def append_all_shared_articles_ids_with_type(
-        self, previous_query: models.QuerySet | None = None, filter=None
-    ):
-        results = self.append_all_shared_articles_query(previous_query, filter)
-        return self.unique_page_query_materialized(
-            results.values("union_page_ptr_id", "union_page_kind")
-        )
-
     def append_all_shared_articles(
         self, previous_query: models.QuerySet | None = None, filter=None
     ):
@@ -547,7 +546,7 @@ class ArticlesMixin(models.Model):
 
     def search_tags_by_unioned_id_query(
         self,
-        site_article_id_page_list: list,
+        articles: list,
         additional_query=None,
         tags_model_query=None,
     ):
@@ -557,10 +556,10 @@ class ArticlesMixin(models.Model):
 
         get_ids_by_page_type = lambda page_type: list(
             map(
-                lambda unioned: unioned["union_page_ptr_id"],
+                lambda article: article.page_ptr.id,
                 filter(
-                    lambda unioned: unioned["union_page_kind"] == page_type,
-                    site_article_id_page_list,
+                    lambda article: article.shared_type == page_type,
+                    articles,
                 ),
             )
         )
diff --git a/uniweb/models.py b/uniweb/models.py
index 1fbfd2115e8759ec722b3fd604e5049b0781e4ab..a30db27cda7d8292e17b86924e923d858ac65259 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -609,14 +609,7 @@ class UniwebArticlePage(
     @property
     def get_tags(self):
         if self.shared_from is not None:
-            return self.articles_page.search_tags_by_unioned_id_query(
-                [
-                    {
-                        "union_page_ptr_id": self.pk,
-                        "union_page_kind": "uniweb",
-                    }
-                ]
-            )
+            return self.articles_page.search_tags_by_unioned_id_query([self])
         return self.tags.all
 
     def get_context(self, request):