diff --git a/district/blocks.py b/district/blocks.py
index 423bf15bc5f18bb660baf03ef8d36641a7acd565..1d10fa3ec4c3719bb904f695df0b78de8ba0650b 100644
--- a/district/blocks.py
+++ b/district/blocks.py
@@ -76,7 +76,6 @@ class CardLinkBlock(StructBlock):
             "district.DistrictPersonPage",
             "district.DistrictPostElectionStrategyPage",
             "district.DistrictProgramPage",
-            "district.DistrictTagsPage",
         ],
         required=False,
     )
diff --git a/district/migrations/0037_districtcrossroadpage_districtcustompage.py b/district/migrations/0037_districtcrossroadpage_districtcustompage.py
index e23d9d25026fcf3473c6c7332906c1c50df2492d..e5487ee0d4bab4a8d21a866685fe49a641e80b36 100644
--- a/district/migrations/0037_districtcrossroadpage_districtcustompage.py
+++ b/district/migrations/0037_districtcrossroadpage_districtcustompage.py
@@ -102,7 +102,7 @@ class Migration(migrations.Migration):
                                                     "district.DistrictElectionPage",
                                                     "district.DistrictPeoplePage",
                                                     "district.DistrictProgramPage",
-                                                    "district.DistrictTagsPage",
+                                                    # "district.DistrictTagsPage",
                                                 ],
                                             ),
                                         ),
diff --git a/district/migrations/0038_auto_20220303_1107.py b/district/migrations/0038_auto_20220303_1107.py
index 980e524fbb270f87fb86321f6c6f7d9eb35c48de..9486a7a98d6d1bda06e9da74f014306e4e87ce78 100644
--- a/district/migrations/0038_auto_20220303_1107.py
+++ b/district/migrations/0038_auto_20220303_1107.py
@@ -68,7 +68,7 @@ class Migration(migrations.Migration):
                                             "district.DistrictPeoplePage",
                                             "district.DistrictPersonPage",
                                             "district.DistrictProgramPage",
-                                            "district.DistrictTagsPage",
+                                            # "district.DistrictTagsPage",
                                         ],
                                     ),
                                 ),
diff --git a/district/migrations/0049_alter_districtcrossroadpage_cards_content.py b/district/migrations/0049_alter_districtcrossroadpage_cards_content.py
index 46f267bae8cf4a463867b80efaedced0f04dd62a..f79ec81e664c27207b93d92f2ef8da591dbf030a 100644
--- a/district/migrations/0049_alter_districtcrossroadpage_cards_content.py
+++ b/district/migrations/0049_alter_districtcrossroadpage_cards_content.py
@@ -62,7 +62,7 @@ class Migration(migrations.Migration):
                                                             "district.DistrictPeoplePage",
                                                             "district.DistrictPersonPage",
                                                             "district.DistrictProgramPage",
-                                                            "district.DistrictTagsPage",
+                                                            # "district.DistrictTagsPage",
                                                         ],
                                                         required=False,
                                                     ),
diff --git a/district/migrations/0053_alter_districtcrossroadpage_cards_content.py b/district/migrations/0053_alter_districtcrossroadpage_cards_content.py
index 48ce52621d3d959f967725dc759613b58d4e30ab..fb422a6ab4acfcf6042d89cd9e930a1e64fbe859 100644
--- a/district/migrations/0053_alter_districtcrossroadpage_cards_content.py
+++ b/district/migrations/0053_alter_districtcrossroadpage_cards_content.py
@@ -69,7 +69,7 @@ class Migration(migrations.Migration):
                                                             "district.DistrictPeoplePage",
                                                             "district.DistrictPersonPage",
                                                             "district.DistrictProgramPage",
-                                                            "district.DistrictTagsPage",
+                                                            # "district.DistrictTagsPage",
                                                         ],
                                                         required=False,
                                                     ),
diff --git a/district/migrations/0068_districtelectioncampaignpage_and_more.py b/district/migrations/0068_districtelectioncampaignpage_and_more.py
index bff113fbd5b60d7459a5c693b27ac739d88a2a12..89316b452daae5086bc4f923ef2f4a21a6223324 100644
--- a/district/migrations/0068_districtelectioncampaignpage_and_more.py
+++ b/district/migrations/0068_districtelectioncampaignpage_and_more.py
@@ -14974,7 +14974,7 @@ class Migration(migrations.Migration):
                                                             "district.DistrictPersonPage",
                                                             "district.DistrictPostElectionStrategyPage",
                                                             "district.DistrictProgramPage",
-                                                            "district.DistrictTagsPage",
+                                                            # "district.DistrictTagsPage",
                                                         ],
                                                         required=False,
                                                     ),
diff --git a/district/migrations/0087_delete_all_districttagspage_instances.py b/district/migrations/0087_delete_all_districttagspage_instances.py
new file mode 100644
index 0000000000000000000000000000000000000000..b403aa624be429a6595c90dda10f5893852c9b3b
--- /dev/null
+++ b/district/migrations/0087_delete_all_districttagspage_instances.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.4 on 2022-06-09 06:11
+
+from django.db import migrations
+
+
+def delete_all_district_tags_pages(apps, schema_editor):
+    Page = apps.get_model("wagtailcore", "Page")
+    ContentType = apps.get_model("contenttypes", "ContentType")
+
+    ct = ContentType.objects.get(app_label="district", model="districttagspage")
+
+    Page.objects.filter(content_type=ct).delete()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("district", "0086_alter_districtcontactpage_contact_people"),
+    ]
+
+    operations = [
+        migrations.RunPython(delete_all_district_tags_pages, migrations.RunPython.noop),
+    ]
diff --git a/district/migrations/0088_delete_districttagspage.py b/district/migrations/0088_delete_districttagspage.py
new file mode 100644
index 0000000000000000000000000000000000000000..c6611fdd983b1c06e1aaab6fc0049645bf01be35
--- /dev/null
+++ b/district/migrations/0088_delete_districttagspage.py
@@ -0,0 +1,16 @@
+# Generated by Django 4.0.4 on 2022-06-09 06:18
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("district", "0087_delete_all_districttagspage_instances"),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name="DistrictTagsPage",
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index b5a0ce91e94981045e72d90c7871e731c292e7d5..2f12b286e7d303b8d391d57e21c736c231315ab7 100644
--- a/district/models.py
+++ b/district/models.py
@@ -253,7 +253,6 @@ class DistrictHomePage(
         "district.DistrictElectionRootPage",
         "district.DistrictPeoplePage",
         "district.DistrictProgramPage",
-        "district.DistrictTagsPage",
         "district.DistrictGeoFeatureCollectionPage",
     ]
 
@@ -310,10 +309,6 @@ class DistrictHomePage(
     def root_page(self):
         return self
 
-    @property
-    def tags_page(self):
-        return self._first_subpage_of_type(DistrictTagsPage)
-
     @property
     def has_calendar(self):
         return self.calendar_id is not None
@@ -371,7 +366,7 @@ class DistrictArticlePage(
 
 
 class DistrictArticlesPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
+    RoutablePageMixin, ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
 ):
     ### FIELDS
 
@@ -443,71 +438,22 @@ class DistrictArticlesPage(
         ).get_page(request.GET.get("page"))
         return context
 
+    @route(r"^tagy/$", name="tags")
+    def tags(self, request):
+        return render(
+            request,
+            "district/district_tags_page.html",
+            context=self.get_tags_page_context(request=request),
+        )
 
-class DistrictContactPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
-):
-    ### FIELDS
-
-    contact_people = StreamField(
-        [("item", blocks.PersonCustomPositionBlock())],
-        verbose_name="Kontakty",
-        blank=True,
-    )
-    text = RichTextField("Text", blank=True, features=RICH_TEXT_DEFAULT_FEATURES)
-
-    ### PANELS
-
-    content_panels = Page.content_panels + [
-        StreamFieldPanel("contact_people"),
-        FieldPanel("text"),
-    ]
-
-    promote_panels = make_promote_panels()
-
-    settings_panels = []
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage"]
-    subpage_types = []
-
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Kontakty"
-
-
-class DistrictTagsPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
-):
-    ### PANELS
-
-    promote_panels = make_promote_panels()
-
-    settings_panels = []
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage"]
-    subpage_types = []
-
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Stránka s tagy"
-
-    def get_context(self, request, *args, **kwargs) -> dict:
-        context = super().get_context(request)
-
+    def get_tags_page_context(self, request) -> dict:
         # Potřebujeme IDčka článků pro správnou root_page pro filtrování zobrazených
         # tagů i samotných stránek, protože se filtrují přes specifický field
         # (tags__slug)
+        context = super().get_context(request)
+
         site_article_ids = (
-            self.root_page.articles_page.get_children()
-            .live()
-            .specific()
-            .values_list("id", flat=True)
+            self.get_children().live().specific().values_list("id", flat=True)
         )
 
         # Naplním "tag" a "article_page_list" parametry
@@ -535,7 +481,7 @@ class DistrictTagsPage(
         return {
             "article_page_list": Paginator(
                 article_page_qs.order_by("-date"),
-                self.root_page.articles_page.max_items,
+                self.max_items,
             ).get_page(request.GET.get("page")),
             "tag": tag,
         }
@@ -554,6 +500,40 @@ class DistrictTagsPage(
         )
 
 
+class DistrictContactPage(
+    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
+):
+    ### FIELDS
+
+    contact_people = StreamField(
+        [("item", blocks.PersonCustomPositionBlock())],
+        verbose_name="Kontakty",
+        blank=True,
+    )
+    text = RichTextField("Text", blank=True, features=RICH_TEXT_DEFAULT_FEATURES)
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [
+        StreamFieldPanel("contact_people"),
+        FieldPanel("text"),
+    ]
+
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
+    ### RELATIONS
+
+    parent_page_types = ["district.DistrictHomePage"]
+    subpage_types = []
+
+    ### OTHERS
+
+    class Meta:
+        verbose_name = "Kontakty"
+
+
 class DistrictPersonTag(TaggedItemBase):
     content_object = ParentalKey(
         "district.DistrictPersonPage", on_delete=models.CASCADE
@@ -1251,7 +1231,6 @@ class DistrictCrossroadPage(
         "district.DistrictPeoplePage",
         "district.DistrictPersonPage",
         "district.DistrictProgramPage",
-        "district.DistrictTagsPage",
     ]
     ### OTHERS
 
diff --git a/district/templates/district/district_article_page.html b/district/templates/district/district_article_page.html
index cf5e0a8445a5a4c344e35d7fd61de44308917010..787b3ee474ace4a5614050d0aad6df6093e38f3e 100644
--- a/district/templates/district/district_article_page.html
+++ b/district/templates/district/district_article_page.html
@@ -1,7 +1,8 @@
 {% extends "district/base.html" %}
-{% load static wagtailcore_tags wagtailimages_tags %}
+{% load static wagtailcore_tags wagtailimages_tags wagtailroutablepage_tags %}
 
 {% block content %}
+{% routablepageurl page.root_page.articles_page "tags" as articles_tag_page_url %}
     <article>
       <link itemprop="mainEntityOfPage" href="{{ page.url }}">
       <meta itemprop="datePublished" content="{{ page.last_published_at }}">
@@ -24,7 +25,7 @@
         </div>
         <div class="my-4">
           {% for tag in page.tags.all %}
-            <a href="{{ page.root_page.tags_page.url }}?tag={{ tag.slug }}" class="btn btn--grey-125 btn--condensed">
+            <a href="{{ articles_tag_page_url }}?tag={{ tag.slug }}" class="btn btn--grey-125 btn--condensed">
               <div class="btn__body ">{{ tag }}</div>
             </a>
           {% endfor %}
diff --git a/district/templates/district/district_tags_page.html b/district/templates/district/district_tags_page.html
index 5728eda556301a12138d8d1cd90ff6f836143eed..79f9bc8708109afc4633e5b61a5261f946d38d07 100644
--- a/district/templates/district/district_tags_page.html
+++ b/district/templates/district/district_tags_page.html
@@ -1,6 +1,9 @@
 {% extends "district/base.html" %}
+{% load wagtailroutablepage_tags %}
 
 {% block content %}
+{% routablepageurl page "tags" as articles_tag_page_url %}
+
   <h1 class="head-alt-md md:head-alt-lg max-w-5xl mb-4">
     {% if tag %}{{ page.title }} "{{ tag.name }}"{% else %}Výběr z článků{% endif %}
   </h1>
@@ -12,15 +15,14 @@
       {% endfor %}
     </div>
 
-    {% include 'styleguide/2.3.x/pagination.html' with paginator=article_page_list %}
+    {% include 'styleguide/2.3.x/pagination.html' with page_url=articles_tag_page_url paginator=article_page_list %}
 
     <div>
       <h2 class="head-heavy-base mb-4">Další štítky</h2>
-
       <nav class="inline-block-nogap">
         {% for tag in tag_list %}
           <a
-            href="{{ page.url }}?tag={{ tag.slug }}"
+            href="{{ articles_tag_page_url }}?tag={{ tag.slug }}"
             class="btn btn--condensed font-light text-sm btn--grey-{% if tag.slug == request.GET.tag %}500{% else %}125{% endif %} btn--hoveractive mr-1 mb-1 inline-block"
           >
             <div class="btn__body ">{{ tag.name }} ({{ tag.count }})</div>
diff --git a/shared/templates/shared/article_preview.html b/shared/templates/shared/article_preview.html
index 1fe40b946daf6559c1a3c0f5a391e321bd93c6d8..b6a1b7c3ae0e5a2f4846965cde6ee0bb149e54f2 100644
--- a/shared/templates/shared/article_preview.html
+++ b/shared/templates/shared/article_preview.html
@@ -1,4 +1,5 @@
-{% load wagtailcore_tags wagtailimages_tags %}
+{% load wagtailcore_tags wagtailimages_tags wagtailroutablepage_tags %}
+{% routablepageurl page.root_page.articles_page "tags" as articles_tag_page_url %}
 
 <article
   itemtype="http://schema.org/BlogPosting"
@@ -69,7 +70,7 @@
     <div class="inline-block-nogap mt-4">
         {% for tag in article.tags.all %}
           <a
-            href="{{ page.root_page.tags_page.url }}?tag={{ tag.slug }}"
+            href="{{ articles_tag_page_url }}?tag={{ tag.slug }}"
             class="btn article-card__category-button btn--condensed text-sm font-light btn--grey-{% if article.is_black %}700{% else %}125{% endif %} btn--hoveractive"
           >
             <div class="btn__body">{{ tag }}</div>
diff --git a/shared/templates/styleguide/2.3.x/pagination.html b/shared/templates/styleguide/2.3.x/pagination.html
index 005c5ea0f273354d46e9388e00ec606ace1187de..9725d5e45bb43e8ef1cfc3e4c4e1a2337ba2f38b 100644
--- a/shared/templates/styleguide/2.3.x/pagination.html
+++ b/shared/templates/styleguide/2.3.x/pagination.html
@@ -5,7 +5,7 @@
     <nav class="pagination space-x-1">
 
       {% if paginator.has_previous %}
-      <a href="{% pageurl page %}?page={{ paginator.previous_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed btn--inverted-icon">
+      <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ paginator.previous_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed btn--inverted-icon">
         <div class="btn__body-wrap">
           <div class="btn__body ">Předchozí</div>
           <div class="btn__icon ">
@@ -17,16 +17,16 @@
       {% get_pagination_range paginator.number paginator.paginator.page_range as pagination_range %}
       {% for i in pagination_range %}
         {% if i == paginator.number %}
-        <a href="{% pageurl page %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-500 btn--condensed hidden md:inline-block">
+        <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-500 btn--condensed hidden md:inline-block">
         {% else %}
-        <a href="{% pageurl page %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-125 btn--hoveractive btn--to-black btn--condensed hidden md:inline-block">
+        <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-125 btn--hoveractive btn--to-black btn--condensed hidden md:inline-block">
         {% endif %}
           <div class="btn__body ">{{ i }}</div>
         </a>
       {% endfor %}
 
       {% if paginator.has_next %}
-      <a href="{% pageurl page %}?page={{ paginator.next_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed">
+      <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ paginator.next_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed">
         <div class="btn__body-wrap">
           <div class="btn__body ">Další</div>
           <div class="btn__icon ">