diff --git a/shared/models.py b/shared/models.py
index 4001687010ba8f370aa8f8a04440fb565d85fa3d..187a4be4c0e86467d530540e84807039a38a5272 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -421,31 +421,68 @@ class ArticlesMixin(models.Model):
 
         results = results.order_by("union_date")
 
-        evaluated = list(results)
-
-        mapped_to_real_values = list(
-            map(
-                lambda unioned: {
-                    "id": unioned["union_id"],
-                    "page_ptr_id": unioned["union_page_ptr_id"],
-                    "perex": unioned["union_perex"],
-                    "date": unioned["union_date"],
-                    "author": unioned["union_author"],
-                    "image_id": unioned["union_image_id"],
-                    "search_image_id": unioned["union_search_image_id"],
-                    "content": unioned["union_content"],
-                    "author_page_id": unioned["union_author_page_id"],
-                    "region": unioned["union_author_page_id"],
-                    "article_type": unioned["union_article_type"],
-                    "is_black": unioned["union_is_black"],
-                    "thumb_image_id": unioned["union_thumb_image_id"],
-                    "shared": unioned["shared"],
-                },
-                evaluated,
+        evaluated = list(
+            results
+        )  # We MUST eval here since we can't turn values() into concrete class instances in QuerySet after union
+
+        if source is SharedArticleTypes.DISTRICT:
+            return list(
+                map(
+                    lambda unioned: DistrictArticlePage(
+                        id=unioned["union_id"],
+                        page_ptr_id=unioned["union_page_ptr_id"],
+                        perex=unioned["union_perex"],
+                        date=unioned["union_date"],
+                        author=unioned["union_author"],
+                        image_id=unioned["union_image_id"],
+                        search_image_id=unioned["union_search_image_id"],
+                        content=unioned["union_content"],
+                        author_page_id=unioned["union_author_page_id"],
+                        is_black=unioned["union_is_black"],
+                        thumb_image_id=unioned["union_thumb_image_id"],
+                    ),
+                    evaluated,
+                )
             )
-        )
 
-        return mapped_to_real_values
+        if source is SharedArticleTypes.UNIWEB:
+            return list(
+                map(
+                    lambda unioned: UniwebArticlePage(
+                        id=unioned["union_id"],
+                        page_ptr_id=unioned["union_page_ptr_id"],
+                        perex=unioned["union_perex"],
+                        date=unioned["union_date"],
+                        author=unioned["union_author"],
+                        image_id=unioned["union_image_id"],
+                        search_image_id=unioned["union_search_image_id"],
+                        content=unioned["union_content"],
+                    ),
+                    evaluated,
+                )
+            )
+
+        if source is SharedArticleTypes.MAIN:
+            return list(
+                map(
+                    lambda unioned: MainArticlePage(
+                        id=unioned["union_id"],
+                        page_ptr_id=unioned["union_page_ptr_id"],
+                        perex=unioned["union_perex"],
+                        date=unioned["union_date"],
+                        author=unioned["union_author"],
+                        image_id=unioned["union_image_id"],
+                        search_image_id=unioned["union_search_image_id"],
+                        content=unioned["union_content"],
+                        author_page_id=unioned["union_author_page_id"],
+                        region=unioned["union_author_page_id"],
+                        article_type=unioned["union_article_type"],
+                        is_black=unioned["union_is_black"],
+                        thumb_image_id=unioned["union_thumb_image_id"],
+                    ),
+                    evaluated,
+                )
+            )
 
     def get_article_page_by_slug(self, slug: str):
         articles = self.append_all_shared_articles()