diff --git a/district/models.py b/district/models.py
index 0aec9c918f27f2734e7f78a08300fc7d7ac57ac1..161e08ac2c3aa5a5ca6635dc5c0c8969e6e766c8 100644
--- a/district/models.py
+++ b/district/models.py
@@ -345,9 +345,11 @@ class DistrictHomePage(
 
     @property
     def articles(self):
-        return self.append_all_shared_articles(
-            DistrictArticlePage.objects.descendant_of(self)
-        )[:6]
+        return self.materialize_shared_articles_query(
+            self.append_all_shared_articles_query(
+                DistrictArticlePage.objects.descendant_of(self)
+            )[:6]
+        )
 
     @property
     def articles_page(self):
@@ -541,7 +543,7 @@ class DistrictArticlesPage(
 
     def get_context(self, request):
         context = super().get_context(request)
-        context["articles"] = self.materialize_page_object_content(
+        context["articles"] = self.materialize_shared_articles_query(
             Paginator(
                 self.append_all_shared_articles_query(
                     DistrictArticlePage.objects.child_of(self)
@@ -613,7 +615,7 @@ class DistrictArticlesPage(
             )
 
         return {
-            "article_page_list": self.materialize_page_object_content(
+            "article_page_list": self.materialize_shared_articles_query(
                 Paginator(
                     article_page_qs,
                     self.max_items,
diff --git a/main/models.py b/main/models.py
index f4a97e6b47bff7e08d79b942b1ab4890e677f312..f73fb97c533259702322307153df0e44bdb7f9f1 100644
--- a/main/models.py
+++ b/main/models.py
@@ -154,7 +154,7 @@ class MainHomePage(
 
     content_panels = Page.content_panels + [
         FieldPanel("content"),
-        *ArticleMixin.content_panels,
+        *ArticlesMixin.content_panels,
         FieldPanel("footer_other_links"),
         FieldPanel("footer_person_list"),
     ]
@@ -509,7 +509,7 @@ class MainArticlesPage(
             ).order_by("union_date", "union_title"),
             10,
         )
-        article_page = self.materialize_page_object_content(
+        article_page = self.materialize_shared_articles_query(
             article_paginator.get_page(request.GET.get("page", 1))
         )
         context = {"article_data_list": article_page.object_list}
@@ -532,7 +532,7 @@ class MainArticlesPage(
             ),
             10,
         )
-        article_page = self.materialize_page_object_content(
+        article_page = self.materialize_shared_articles_query(
             article_paginator.get_page(request.GET.get("page", 1))
         )
         context = {"article_data_list": article_page.object_list}
@@ -558,9 +558,12 @@ class MainArticlesPage(
         if request.method == "GET" and "q" in request.GET:
             query = request.GET["q"]
 
-            article_results = self.append_all_shared_articles(
-                MainArticlePage.objects,
-            ).search(query)[:11]
+            article_results = self.materialize_shared_articles_query(
+                self.append_all_shared_articles_query(
+                    MainArticlePage.objects.search(query),
+                    custom_article_query=lambda query: query.search(query),
+                )[:11]
+            )
 
             return render(
                 request,
diff --git a/shared/models.py b/shared/models.py
index 7a29cb4de43e04efba30a18c2afd3afec4356a28..1025dc97e04115990e6a4fd4d0b1a67ddc7c018c 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -3,12 +3,13 @@ from enum import Enum
 from functools import reduce
 
 from django.apps import apps
-from django.core.paginator import Page as PaginatorPage
 from django.db import models
+from django.db.models import F, Q
 from django.db.models.expressions import F, Value
+from django.db.models.functions import Coalesce
 from django.utils import timezone
 from modelcluster.fields import ParentalKey, ParentalManyToManyField
-from taggit.models import ItemBase, TagBase
+from taggit.models import ItemBase, Tag, TagBase
 from wagtail.admin.panels import FieldPanel, MultiFieldPanel, PublishingPanel
 from wagtail.fields import StreamField
 from wagtail.models import Page
@@ -361,8 +362,8 @@ class ArticlesMixin(models.Model):
             main_fields,
             reduce(fields_reducer, district_meta_fields, {})
             | {
-                "union_region": Value("", models.CharField()),
-                "union_article_type": Value(0, models.PositiveSmallIntegerField()),
+                "union_region": Value(None, models.CharField()),
+                "union_article_type": Value(2, models.PositiveSmallIntegerField()),
             },
         )
 
@@ -376,8 +377,8 @@ class ArticlesMixin(models.Model):
                         DistrictArticlePage, blank=True, on_delete=models.SET_NULL
                     ),
                 ),
-                "union_region": Value("", models.CharField()),
-                "union_article_type": Value(0, models.PositiveSmallIntegerField()),
+                "union_region": Value(None, models.CharField()),
+                "union_article_type": Value(2, models.PositiveSmallIntegerField()),
                 "union_is_black": Value(False, models.BooleanField()),
                 "union_thumb_image_id": F("search_image_id"),
             },
@@ -446,8 +447,6 @@ class ArticlesMixin(models.Model):
             ),
         )
 
-        results = main_by_values.union(uniweb_by_values).union(district_by_values)
-
         empty_shared_field = Value(
             None,
             output_field=models.ForeignKey(
@@ -478,10 +477,18 @@ class ArticlesMixin(models.Model):
                     union_shared_from_id=empty_shared_field,
                     union_shared_type=empty_shared_type,
                 )
-
-            results = results.union(prepared_query)
-
-        return results.order_by("union_date")
+            return (
+                prepared_query.union(main_by_values)
+                .union(uniweb_by_values)
+                .union(district_by_values)
+                .order_by("union_date")
+            )
+        else:
+            return (
+                main_by_values.union(uniweb_by_values)
+                .union(district_by_values)
+                .order_by("union_date")
+            )
 
     def materialize_shared_articles_query(self, results):
         """
@@ -548,10 +555,6 @@ class ArticlesMixin(models.Model):
         )
         return articles[0]
 
-    def materialize_page_object_content(self, page: PaginatorPage):
-        page.object_list = self.materialize_page_object_content(page.object_list)
-        return page
-
     def setup_article_page_context(self, request):
         slug = request.GET.get("sdilene", "")
         return self.get_article_page_by_slug(slug).serve(request)
@@ -561,10 +564,6 @@ class ArticlesMixin(models.Model):
         articles: list,
         tags_model_query=None,
     ):
-        DistrictArticleTag = apps.get_model(app_label="district.DistrictArticleTag")
-        UniwebArticleTag = apps.get_model(app_label="uniweb.UniwebArticleTag")
-        MainArticleTag = apps.get_model(app_label="main.MainArticleTag")
-
         get_ids_by_page_type = lambda page_type: list(
             map(
                 lambda article: article.page_ptr.id,
@@ -575,23 +574,23 @@ class ArticlesMixin(models.Model):
             )
         )
 
-        district_tags = DistrictArticleTag.objects.filter(
-            content_object_id__in=get_ids_by_page_type(
-                SharedArticlesPageType.DISTRICT.value
+        tag_query = Tag.objects.filter(
+            Q(
+                district_districtarticletag_items__content_object_id__in=get_ids_by_page_type(
+                    SharedArticlesPageType.DISTRICT.value
+                )
             )
-        ).select_related("tag_id")
-        uniweb_tags = UniwebArticleTag.objects.filter(
-            content_object_id__in=get_ids_by_page_type(
-                SharedArticlesPageType.UNIWEB.value
+            | Q(
+                main_mainarticletag_items__content_object_id__in=get_ids_by_page_type(
+                    SharedArticlesPageType.MAIN.value
+                )
             )
-        ).select_related("tag_id")
-        main_tags = MainArticleTag.objects.filter(
-            content_object_id__in=get_ids_by_page_type(
-                SharedArticlesPageType.MAIN.value
+            | Q(
+                uniweb_uniwebarticletag_items__content_object_id__in=get_ids_by_page_type(
+                    SharedArticlesPageType.UNIWEB.value
+                )
             )
-        ).select_related("tag_id")
-
-        tag_query = district_tags.union(uniweb_tags).union(main_tags)
+        )
 
         if tags_model_query is not None:
             tag_query = tags_model_query(tag_query)
diff --git a/uniweb/models.py b/uniweb/models.py
index b9f553b2841f7136157161503ce1842951871af7..916c8776ce938eeac1a6e1b6cad9864f58a1bed6 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -7,7 +7,7 @@ from django.db import models
 from django.utils.translation import gettext_lazy
 from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
-from taggit.models import Tag, TaggedItemBase
+from taggit.models import TaggedItemBase
 from wagtail import blocks
 from wagtail.admin.panels import (
     FieldPanel,
@@ -566,7 +566,7 @@ class UniwebArticlesIndexPage(
             else articles,
         )
 
-        context["articles"] = self.materialize_page_object_content(
+        context["articles"] = self.materialize_shared_articles_query(
             Paginator(articles, ARTICLES_PER_PAGE).get_page(num)
         )
         context["tags"] = self.search_tags_by_unioned_id_query(articles_ids)