diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c152375762c73f05809dec49d022164e3c43fc4e..6766b5488426ae3dbcdde6f435d272ca142fdd87 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -35,3 +35,8 @@ repos:
     hooks:
       - id: black
         args: ["-t", "py310"]
+  - repo: https://github.com/PyCQA/autoflake
+    rev: v2.3.1
+    hooks:
+    - id: autoflake
+      args: [--remove-all-unused-imports, --in-place]
diff --git a/calendar_utils/icalevents/icalparser.py b/calendar_utils/icalevents/icalparser.py
index ea02d4e1ff7bee082b5101c38f4d6f6f1084261c..4de4373e76423956b85c1d5f87330742308e4286 100644
--- a/calendar_utils/icalevents/icalparser.py
+++ b/calendar_utils/icalevents/icalparser.py
@@ -4,7 +4,6 @@ Parse iCal data to Events.
 from datetime import date, datetime, timedelta
 
 # for UID generation
-from faulthandler import is_enabled
 from random import randint
 from typing import Optional
 from uuid import uuid4
diff --git a/district/blocks.py b/district/blocks.py
index 366440ee84a7992540504a177653822bd5a6981e..e92cd4d47e3dfa5ad927a201931aecc4e4c519e8 100644
--- a/district/blocks.py
+++ b/district/blocks.py
@@ -303,21 +303,16 @@ class CardLinkWithHeadlineBlock(CardLinkWithHeadlineBlockMixin):
         label = "Karty odkazů s nadpisem"
 
 
-class PersonCustomPositionBlock(PersonContactBlockMixin):
-    position = CharBlock(label="Název pozice", required=False)
+class PersonContactBlock(PersonContactBlockMixin):
     person = PageChooserBlock(
         label="Osoba",
         page_type=["district.DistrictPersonPage"],
     )
 
-    class Meta:
-        icon = "user"
-        label = "Osoba s volitelnou pozicí"
-
 
 class CenterContactBlock(StructBlock):
     title = CharBlock(label="Titulek", required=True)
-    contact_list = ListBlock(PersonCustomPositionBlock())
+    contact_list = ListBlock(PersonContactBlock())
 
     class Meta:
         template = "district/blocks/contact_block.html"
@@ -368,7 +363,7 @@ class PersonBadgeBlock(StructBlock):
 class PeopleGroupListBlock(StructBlock):
     group_title = CharBlock(label="Titulek", required=True)
     person_list = ListBlock(
-        PersonCustomPositionBlock(),
+        PersonContactBlock(),
         label="List osob",
     )
 
@@ -433,7 +428,7 @@ class InteractiveProgramBlock(StructBlock):
 class StaticProgramBlock(StructBlock):
     headline = CharBlock(label="Titulek bloku", required=True)
     perex = TextBlock(label="Krátký text pod nadpisem", required=True)
-    person = PersonCustomPositionBlock()
+    person = PersonContactBlock()
     completion_percentage = IntegerBlock(label="Procento dokončení", required=True)
     program_items = ListBlock(ProgramItemBlock(), label="Seznam bodů")
 
@@ -446,7 +441,7 @@ class StaticProgramBlock(StructBlock):
 class RedmineProgramBlock(StructBlock):
     headline = CharBlock(label="Titulek bloku", required=True)
     perex = TextBlock(label="Krátký text pod nadpisem", required=True)
-    person = PersonCustomPositionBlock()
+    person = PersonContactBlock()
     redmine_issue = IntegerBlock(label="Číslo Redmine issue", required=True)
     completion_percentage = IntegerBlock(
         label="Procento dokončení - bude doplněno automaticky",
diff --git a/district/migrations/0005_auto_20211108_2126.py b/district/migrations/0005_auto_20211108_2126.py
index 0cabe15ef2ab7b1729c34ddd1d06a19abd80e9aa..6baaec416f55dc305ec50d217c59964b66863ae5 100644
--- a/district/migrations/0005_auto_20211108_2126.py
+++ b/district/migrations/0005_auto_20211108_2126.py
@@ -9,7 +9,6 @@ import wagtail.images.blocks
 import wagtailmetadata.models
 from django.db import migrations, models
 
-import district.blocks
 import shared.models
 
 
diff --git a/district/migrations/0131_migrate_headers.py b/district/migrations/0131_migrate_headers.py
index 359d42fceadbbc2cb00ac7af7e8be7b2600f7fac..8ab03a5a599ab26871d1debea456ebded8977a89 100644
--- a/district/migrations/0131_migrate_headers.py
+++ b/district/migrations/0131_migrate_headers.py
@@ -3,7 +3,6 @@
 
 import wagtail
 from django.db import migrations
-from wagtail.fields import StreamField
 from wagtail.models import Page
 
 from district.blocks import FullscreenHeaderBlock
diff --git a/district/migrations/0138_auto_20240509_1227.py b/district/migrations/0138_auto_20240509_1227.py
index c395e88f7c2e2e2feec6fcc4972b6ae4b15928e4..438f891f712ed2eb472f0dbfbef133c4850aabb2 100644
--- a/district/migrations/0138_auto_20240509_1227.py
+++ b/district/migrations/0138_auto_20240509_1227.py
@@ -1,6 +1,5 @@
 # Generated by Django 5.0.4 on 2024-05-09 10:27
 
-import wagtail
 from django.db import migrations
 
 from district.blocks import ElectionsCountdownBlock
diff --git a/district/migrations/0145_auto_20240509_1642.py b/district/migrations/0145_auto_20240509_1642.py
index d7c3e0e34e66559ec44494f3eea6e68d25e16701..6445c110bad4b6a4dd8a111a77812bb08e499a5e 100644
--- a/district/migrations/0145_auto_20240509_1642.py
+++ b/district/migrations/0145_auto_20240509_1642.py
@@ -4,7 +4,6 @@ import django
 import wagtail
 from django.db import migrations, models
 
-from shared.blocks import SocialLinkBlock
 
 
 class Migration(migrations.Migration):
diff --git a/district/migrations/0146_auto_20240510_1035.py b/district/migrations/0146_auto_20240510_1035.py
index 56304c456f45293312215b9dafae93e68f50731c..711fbfa5ab8056adbcff995580bee9fc3d77569b 100644
--- a/district/migrations/0146_auto_20240510_1035.py
+++ b/district/migrations/0146_auto_20240510_1035.py
@@ -1,8 +1,6 @@
 # Generated by Django 5.0.4 on 2024-05-10 08:35
 
-import django
-import wagtail
-from django.db import migrations, models
+from django.db import migrations
 
 from shared.blocks import SocialLinkBlock
 
diff --git a/district/migrations/0148_auto_20240510_1049.py b/district/migrations/0148_auto_20240510_1049.py
index d319278bf8b2c0ac1c71b9420f3dab376d6e170b..df3003ecb8423183cb46ef17bff45b6ae12b8ecf 100644
--- a/district/migrations/0148_auto_20240510_1049.py
+++ b/district/migrations/0148_auto_20240510_1049.py
@@ -1,8 +1,6 @@
 # Generated by Django 5.0.4 on 2024-05-10 08:49
 
-import django
-import wagtail
-from django.db import migrations, models
+from django.db import migrations
 
 from shared.blocks import NavbarMenuItemBlock
 
diff --git a/district/migrations/0161_auto_20240513_1733.py b/district/migrations/0161_auto_20240513_1733.py
index 01d33c7cd87225bdf0ec3aa3862058ab4a6f7674..98f143f56267b725c82927660b803013f01afacb 100644
--- a/district/migrations/0161_auto_20240513_1733.py
+++ b/district/migrations/0161_auto_20240513_1733.py
@@ -2,7 +2,6 @@
 
 import wagtail
 from django.db import migrations, models
-from wagtail.blocks import PageChooserBlock
 
 from district.blocks import PeopleGroupBlock
 
diff --git a/district/migrations/0162_add_people_block.py b/district/migrations/0162_add_people_block.py
index 7604a12309690c2636868e4e0a451470652eda23..8504ebfaef1f54f7e472f2f0464eff5ea30e8f7c 100644
--- a/district/migrations/0162_add_people_block.py
+++ b/district/migrations/0162_add_people_block.py
@@ -1,10 +1,9 @@
 # Generated by Django 5.0.4 on 2024-05-13 15:33
 
-import wagtail
 from django.db import migrations
 
 from district.models import DistrictHomePage, DistrictPeoplePage
-from shared.blocks import BoxBlock, PeopleOverviewBlock
+from shared.blocks import PeopleOverviewBlock
 
 
 def add_people_blocks(apps, schema_editor):
diff --git a/district/migrations/0163_auto_20240509_1227.py b/district/migrations/0163_auto_20240509_1227.py
index dfd22c07c17d273a4d7e7dd3b44d1a586d35825b..a8b94f07bdf4a32ca2045349cfb45473e82848fe 100644
--- a/district/migrations/0163_auto_20240509_1227.py
+++ b/district/migrations/0163_auto_20240509_1227.py
@@ -1,6 +1,5 @@
 # Generated by Django 5.0.4 on 2024-05-09 10:27
 
-import wagtail
 from django.db import migrations
 
 from district.blocks import CalendarBlock
diff --git a/district/migrations/0170_districtpersonpage_after_name_and_more.py b/district/migrations/0170_districtpersonpage_after_name_and_more.py
index 473243336fa8e3e06ed242c03b07aab328fc0f40..fcacba9b4d8c567916d50972d691347e8cd09ce0 100644
--- a/district/migrations/0170_districtpersonpage_after_name_and_more.py
+++ b/district/migrations/0170_districtpersonpage_after_name_and_more.py
@@ -1,6 +1,6 @@
 # Generated by Django 5.0.4 on 2024-05-15 09:09
 
-from django.db import migrations, models
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
@@ -8,6 +8,4 @@ class Migration(migrations.Migration):
         ("district", "0169_alter_districtcontactpage_contact_people_and_more"),
     ]
 
-    operations = [
-
-    ]
+    operations = []
diff --git a/district/migrations/0190_remove_districthomepage_calendar_page.py b/district/migrations/0190_remove_districthomepage_calendar_page.py
index fd25fb5a84a3b9fdd5ac8c7fa99cb9f171fa3ef6..c2f90d59bed9906ae95452912ad3c79f9c4e617d 100644
--- a/district/migrations/0190_remove_districthomepage_calendar_page.py
+++ b/district/migrations/0190_remove_districthomepage_calendar_page.py
@@ -4,14 +4,13 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('district', '0189_auto_20240516_1526'),
+        ("district", "0189_auto_20240516_1526"),
     ]
 
     operations = [
         migrations.RemoveField(
-            model_name='districthomepage',
-            name='calendar_page',
+            model_name="districthomepage",
+            name="calendar_page",
         ),
     ]
diff --git a/district/migrations/0191_delete_districtpersontag.py b/district/migrations/0191_delete_districtpersontag.py
index 1d2a60e0eafb5bcb0f80dc82b7f90f986a4f5bf1..0267ac9de0e3945ca3a01841bc0dd62f0b679e40 100644
--- a/district/migrations/0191_delete_districtpersontag.py
+++ b/district/migrations/0191_delete_districtpersontag.py
@@ -4,13 +4,12 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('district', '0190_remove_districthomepage_calendar_page'),
+        ("district", "0190_remove_districthomepage_calendar_page"),
     ]
 
     operations = [
         migrations.DeleteModel(
-            name='DistrictPersonTag',
+            name="DistrictPersonTag",
         ),
     ]
diff --git a/district/migrations/0192_remove_districtarticlepage_thumb_image_and_more.py b/district/migrations/0192_remove_districtarticlepage_thumb_image_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..2a50c94f98c3ca3afe48638324fab34f18586220
--- /dev/null
+++ b/district/migrations/0192_remove_districtarticlepage_thumb_image_and_more.py
@@ -0,0 +1,29 @@
+# Generated by Django 5.0.4 on 2024-05-19 09:18
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0191_delete_districtpersontag'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='districtarticlepage',
+            name='thumb_image',
+        ),
+        migrations.RemoveField(
+            model_name='districtcontactpage',
+            name='text_backup',
+        ),
+        migrations.RemoveField(
+            model_name='districthomepage',
+            name='fallback_image',
+        ),
+        migrations.RemoveField(
+            model_name='districtpeoplepage',
+            name='content',
+        ),
+    ]
diff --git a/district/migrations/0193_remove_districthomepage_show_pirati_cz_link_and_more.py b/district/migrations/0193_remove_districthomepage_show_pirati_cz_link_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce561e2488e1e31eb1e3d0bb24b0e0e01fbf3c4d
--- /dev/null
+++ b/district/migrations/0193_remove_districthomepage_show_pirati_cz_link_and_more.py
@@ -0,0 +1,24 @@
+# Generated by Django 5.0.4 on 2024-05-19 09:49
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0192_remove_districtarticlepage_thumb_image_and_more'),
+        ('main', '0085_alter_mainpersonpage_primary_group'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='districthomepage',
+            name='show_pirati_cz_link',
+        ),
+        migrations.AddField(
+            model_name='districthomepage',
+            name='gdpr_and_cookies_page',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.mainsimplepage', verbose_name='Stránka pro GDPR'),
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index 086db4667cdae204fcda8aeb9deff555778fbb0c..dcfb25a946f0714fedb08cd40dd7024da5c873c3 100644
--- a/district/models.py
+++ b/district/models.py
@@ -5,12 +5,9 @@ from django.core.cache import cache
 from django.core.exceptions import ValidationError
 from django.db import models
 from django.http import HttpResponseNotFound, HttpResponseRedirect
-from django.shortcuts import render
-from django.utils.safestring import mark_safe
-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.admin.panels import (
     FieldPanel,
     HelpPanel,
@@ -24,7 +21,6 @@ from wagtail.blocks import RichTextBlock
 from wagtail.contrib.routable_page.models import RoutablePageMixin, route
 from wagtail.fields import RichTextField, StreamField
 from wagtail.models import Orderable, Page
-from wagtail.search import index
 from wagtailmetadata.models import MetadataPageMixin
 
 from calendar_utils.models import CalendarMixin
@@ -41,11 +37,8 @@ from shared.blocks import (
     ButtonGroupBlock,
     ChartBlock,
     FigureBlock,
-    FullSizeHeaderBlock,
-    HeadlineBlock,
     MainButtonBlock,
     MainButtonGroupBlock,
-    NavbarMenuItemBlock,
     NewsBlock,
     NewsletterSubscriptionBlock,
     PeopleOverviewBlock,
@@ -53,28 +46,19 @@ from shared.blocks import (
 )
 from shared.const import RICH_TEXT_DEFAULT_FEATURES
 from shared.models import (
-    ArticleMixin,
-    ArticlesMixin,
-    ArticlesPageMixin,
-    ExtendedMetadataHomePageMixin,
     ExtendedMetadataPageMixin,
-    FooterMixin,
     MainArticlePageMixin,
     MainArticlesPageMixin,
     MainContactPageMixin,
-    MainFooterMixin,
-    MainMenuMixin,
+    MainHomePageMixin,
     MainPeoplePageMixin,
     MainPersonPageMixin,
     MainSimplePageMixin,
-    MenuMixin,
     PdfPageMixin,
     SharedTaggedDistrictArticle,
-    SocialMixin,
     SubpageMixin,
 )
 from shared.utils import make_promote_panels, strip_all_html_tags, trim_to_length
-from tuning import admin_help
 
 from . import blocks
 from .forms import JekyllImportForm
@@ -89,21 +73,12 @@ CONTENT_BLOCKS = DEFAULT_CONTENT_BLOCKS + [
 # --- BEGIN Migrated models ---
 
 
-class DistrictHomePage(
-    RoutablePageMixin,
-    ExtendedMetadataHomePageMixin,
-    MetadataPageMixin,
-    CalendarMixin,
-    MainFooterMixin,
-    ArticlesMixin,
-    MainMenuMixin,
-    SocialMixin,
-    Page,
-):
+class DistrictHomePage(CalendarMixin, MainHomePageMixin):
     ### FIELDS
 
     # --- BEGIN New fields ---
 
+    # Main section
     content = StreamField(
         [
             ("fullscreen_header_block", blocks.FullscreenHeaderBlock()),
@@ -128,38 +103,16 @@ class DistrictHomePage(
         use_json_field=True,
     )
 
-    # footer
+    # Footer
     footer_person_list = StreamField(
-        [("person", blocks.PersonCustomPositionBlock())],
+        [("person", blocks.PersonContactBlock())],
         verbose_name="Osoby v zápatí webu",
         blank=True,
         max_num=6,
         use_json_field=True,
     )
 
-    menu_button_name = models.CharField(
-        verbose_name="Text na tlačítku pro zapojení", max_length=16
-    )
-
-    menu_button_content = StreamField(
-        [
-            ("navbar_menu_item", NavbarMenuItemBlock()),
-        ],
-        verbose_name="Obsah menu pro zapojení se",
-        blank=True,
-        use_json_field=True,
-    )
-
-    # --- END New fields ---
-
-    calendar_button_text = models.CharField(
-        "Text tlačítka kalendáře", max_length=256, default="Kalendář"
-    )
-
-    show_pirati_cz_link = models.BooleanField(
-        "Zobrazit v záhlaví odkaz 'pirati.cz'", default=True
-    )
-
+    # Settings
     newsletter_list_id = models.CharField(
         "ID newsletteru",
         max_length=20,
@@ -173,87 +126,62 @@ class DistrictHomePage(
         default="Fake news tam nenajdeš, ale dozvíš se, co chystáme doopravdy!",
     )
 
-    # Extra komentar v paticce
-    footer_extra_content = RichTextField(
-        verbose_name="Extra obsah na začátku patičky",
-        blank=True,
-        features=RICH_TEXT_DEFAULT_FEATURES,
+    calendar_button_text = models.CharField(
+        "Text tlačítka kalendáře", max_length=256, default="Kalendář"
     )
 
-    # settings
-    matomo_id = models.IntegerField(
-        "Matomo ID pro sledování návštěvnosti", blank=True, null=True
-    )
-    fallback_image = models.ForeignKey(
-        "wagtailimages.Image",
+    gdpr_and_cookies_page = models.ForeignKey(
+        # Keep this a reference to the main website's GDPR page. Not ideal, but works (for now).
+        "main.MainSimplePage",
+        verbose_name="Stránka pro GDPR",
         on_delete=models.PROTECT,
+        blank=True,
         null=True,
-        related_name="+",
     )
 
-    ### PANELS
-
-    content_panels = Page.content_panels + [
-        FieldPanel("content"),
-    ]
+    # --- END New fields ---
 
-    menu_panels = (
-        [FieldPanel("title_suffix")]
-        + SocialMixin.menu_panels
-        + MainMenuMixin.menu_panels
-        + [
-            MultiFieldPanel(
-                [
-                    FieldPanel("menu_button_name"),
-                    FieldPanel("menu_button_content"),
-                ],
-                heading="Tlačítko pro zapojení",
-            )
-        ]
+    # Extra komentar v paticce
+    footer_extra_content = RichTextField(
+        verbose_name="Extra obsah na začátku patičky",
+        blank=True,
+        features=RICH_TEXT_DEFAULT_FEATURES,
     )
 
-    promote_panels = make_promote_panels(admin_help.build(admin_help.IMPORTANT_TITLE))
+    ### PANELS
 
-    footer_panels = [
-        FieldPanel("footer_person_list"),
+    menu_panels = [FieldPanel("title_suffix")] + MainHomePageMixin.menu_panels
+
+    footer_panels = MainHomePageMixin.footer_panels + [
         FieldPanel("footer_extra_content"),
-        FieldPanel("footer_other_links"),
     ]
 
-    settings_panels = [
-        FieldPanel("matomo_id"),
-        MultiFieldPanel(
-            [
-                FieldPanel("show_pirati_cz_link"),
-            ],
-            gettext_lazy("Odkazy na webu"),
-        ),
+    settings_panels = MainHomePageMixin.settings_panels + [
         MultiFieldPanel(
             [
                 FieldPanel("calendar_button_text"),
                 FieldPanel("calendar_url"),
             ],
-            gettext_lazy("Kalendář"),
+            "Kalendář",
         ),
         MultiFieldPanel(
             [
                 FieldPanel("newsletter_list_id"),
                 FieldPanel("newsletter_description"),
             ],
-            gettext_lazy("Formulář pro odběr newsletteru"),
+            "Formulář pro odběr newsletteru",
         ),
-        FieldPanel("fallback_image"),
     ]
 
     ### EDIT HANDLERS
 
     edit_handler = TabbedInterface(
         [
-            ObjectList(content_panels, heading="Obsah"),
+            ObjectList(MainHomePageMixin.content_panels, heading="Obsah"),
             ObjectList(menu_panels, heading="Hlavička"),
             ObjectList(footer_panels, heading="Patička"),
             ObjectList(settings_panels, heading="Nastavení"),
-            ObjectList(promote_panels, heading="Propagace"),
+            ObjectList(MainHomePageMixin.promote_panels, heading="Propagace"),
         ]
     )
 
@@ -279,35 +207,6 @@ class DistrictHomePage(
     class Meta:
         verbose_name = "Oblastní sdružení"
 
-    @route(r"^sdilene/$", name="shared")
-    def shared(self, request):
-        return self.setup_article_page_context(request)
-
-    def get_context(self, request, *args, **kwargs):
-        context = super().get_context(request, args, kwargs)
-
-        context["article_data_list"] = self.materialize_shared_articles_query(
-            self.append_all_shared_articles_query(
-                DistrictArticlePage.objects.live().all()
-            ).order_by("-union_timestamp")[:3]
-        )
-
-        return context
-
-    def _first_subpage_of_type(self, page_type) -> Page or None:
-        try:
-            return self.get_descendants().type(page_type).live().specific()[0]
-        except IndexError:
-            return None
-
-    @property
-    def articles(self):
-        return self.materialize_shared_articles_query(
-            self.append_all_shared_articles_query(
-                DistrictArticlePage.objects.descendant_of(self)
-            )[:6]
-        )
-
     @property
     def articles_page_model(self):
         return DistrictArticlesPage
@@ -317,36 +216,8 @@ class DistrictHomePage(
         return DistrictArticlePage
 
     @property
-    def articles_page(self):
-        return self._first_subpage_of_type(self.articles_page_model)
-
-    @property
-    def center_page(self):
-        return self._first_subpage_of_type(DistrictCenterPage)
-
-    @property
-    def contact_page(self):
-        return self._first_subpage_of_type(DistrictContactPage)
-
-    @property
-    def election_page(self):
-        return self._first_subpage_of_type(DistrictElectionRootPage)
-
-    @staticmethod
-    def get_404_response(request):
-        return render(request, "district/404.html", status=404)
-
-    @property
-    def people_page(self):
-        return self._first_subpage_of_type(DistrictPeoplePage)
-
-    @property
-    def program_page(self):
-        return self._first_subpage_of_type(DistrictProgramPage)
-
-    @property
-    def interactive_program_page(self):
-        return self._first_subpage_of_type(DistrictInteractiveProgramPage)
+    def search_page_model(self):
+        return DistrictArticlePage
 
     @property
     def calendar_page(self):
@@ -360,15 +231,6 @@ class DistrictHomePage(
     def has_calendar(self):
         return self.calendar_id is not None
 
-    @property
-    def newsletter_info(self):
-        if not self.newsletter_list_id:
-            return None
-        return {
-            "list_id": self.newsletter_list_id,
-            "description": self.newsletter_description,
-        }
-
 
 class DistrictArticleTag(TaggedItemBase):
     content_object = ParentalKey(
@@ -390,14 +252,6 @@ class DistrictArticlePage(MainArticlePageMixin):
         through=SharedTaggedDistrictArticle,
         blank=True,
     )
-    thumb_image = models.ForeignKey(
-        "wagtailimages.Image",
-        on_delete=models.PROTECT,
-        blank=True,
-        null=True,
-        verbose_name="náhledový obrázek",
-        related_name="thumb_image",
-    )
 
     ### RELATIONS
 
@@ -417,10 +271,8 @@ class DistrictArticlesPage(MainArticlesPageMixin):
 class DistrictContactPage(MainContactPageMixin):
     ### FIELDS
 
-    text_backup = RichTextField("Text", blank=True, features=RICH_TEXT_DEFAULT_FEATURES)
-
     contact_people = StreamField(
-        [("item", blocks.PersonCustomPositionBlock())],
+        [("item", blocks.PersonContactBlock())],
         verbose_name="Kontaktní osoby",
         blank=True,
         use_json_field=True,
@@ -431,14 +283,10 @@ class DistrictContactPage(MainContactPageMixin):
     parent_page_types = ["district.DistrictHomePage"]
     subpage_types = []
 
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Kontakty"
-
 
 class DistrictPersonPage(MainPersonPageMixin):
     ### FIELDS
+
     job = models.CharField(
         "Povolání",
         max_length=128,
@@ -519,21 +367,6 @@ class DistrictPersonPage(MainPersonPageMixin):
 
 
 class DistrictPeoplePage(MainPeoplePageMixin):
-    content = StreamField(
-        [
-            (
-                "text",
-                blocks.RichTextBlock(
-                    label="Textový editor", features=RICH_TEXT_DEFAULT_FEATURES
-                ),
-            ),
-            ("people_group", blocks.PeopleGroupListBlock()),
-        ],
-        verbose_name="Obsah stránky",
-        blank=True,
-        use_json_field=True,
-    )
-
     people = StreamField(
         [
             ("people_group", blocks.PeopleGroupBlock(label="Seznam osob")),
@@ -544,22 +377,11 @@ class DistrictPeoplePage(MainPeoplePageMixin):
         use_json_field=True,
     )
 
-    content_panels = Page.content_panels + [
-        FieldPanel("perex_col_1"),
-        FieldPanel("perex_col_2"),
-        FieldPanel("people"),
-        FieldPanel("content"),
-    ]
-
     parent_page_types = ["district.DistrictHomePage"]
     subpage_types = ["district.DistrictPersonPage"]
 
 
 class DistrictCalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, Page):
-    """
-    Page for displaying full calendar
-    """
-
     ### PANELS
 
     content_panels = Page.content_panels + [FieldPanel("calendar_url")]
@@ -579,10 +401,6 @@ class DistrictCalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, Page)
 
 
 class DistrictPdfPage(PdfPageMixin, MetadataPageMixin, SubpageMixin, Page):
-    """
-    Single pdf page display
-    """
-
     ### RELATIONS
 
     parent_page_types = [
@@ -601,10 +419,6 @@ class DistrictPdfPage(PdfPageMixin, MetadataPageMixin, SubpageMixin, Page):
         verbose_name = "PDF stránka"
 
 
-class DistrictNewProgramPage():
-    pass
-
-
 # --- END Migrated models ---
 
 
@@ -1473,6 +1287,7 @@ class DistrictGeoFeatureCollectionCategory(Orderable):
 def make_feature_index_cache_key(feature: "DistrictGeoFeatureDetailPage"):
     return f"DistrictGeoFeatureDetailPage::{feature.id}::index"
 
+
 class DistrictGeoFeatureDetailPage(
     ExtendedMetadataPageMixin, MetadataPageMixin, SubpageMixin, Page, Orderable
 ):
diff --git a/donate/models.py b/donate/models.py
index eb2dacfdc13b79850c7ba1bc47fd87c3540ab3a7..0a1163ab545966bf58a9874920c88a4411bfef4f 100644
--- a/donate/models.py
+++ b/donate/models.py
@@ -16,7 +16,6 @@ from wagtail.admin.panels import (
     PublishingPanel,
     TabbedInterface,
 )
-from wagtail.blocks import URLBlock
 from wagtail.fields import RichTextField, StreamField
 from wagtail.images.blocks import ImageChooserBlock
 from wagtail.models import Orderable, Page
diff --git a/elections/blocks.py b/elections/blocks.py
index 6f011bcb3d8b0315dffd9879abd2f0a2084ce85e..e5b2cae87acacbb7df64bc43b82066c7c2bf42be 100644
--- a/elections/blocks.py
+++ b/elections/blocks.py
@@ -3,7 +3,6 @@ from wagtail.blocks import (
     IntegerBlock,
     ListBlock,
     PageChooserBlock,
-    RichTextBlock,
     StructBlock,
     TextBlock,
     URLBlock,
diff --git a/elections/models.py b/elections/models.py
index ec2ea82cf67a887aed409dc6f271006b74dcfdb6..1175e984b2a16b5e8204739c8499b9d0f2ef02ec 100644
--- a/elections/models.py
+++ b/elections/models.py
@@ -1,38 +1,24 @@
-from dateutil.relativedelta import relativedelta
-from django.conf import settings
-from django.contrib import messages
-from django.core.paginator import Paginator
 from django.db import models
-from django.forms.models import model_to_dict
-from django.http import HttpResponseRedirect, JsonResponse
-from django.shortcuts import redirect, render
+from django.shortcuts import redirect
 from django.template.loader import render_to_string
-from django.utils import timezone
 from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
-from taggit.models import Tag, TaggedItemBase
+from taggit.models import TaggedItemBase
 from wagtail.admin.panels import (
     FieldPanel,
-    HelpPanel,
-    MultiFieldPanel,
     ObjectList,
-    PageChooserPanel,
     TabbedInterface,
 )
-from wagtail.blocks import PageChooserBlock, RichTextBlock
-from wagtail.contrib.routable_page.models import RoutablePageMixin, route
+from wagtail.blocks import RichTextBlock
+from wagtail.contrib.routable_page.models import route
 from wagtail.fields import RichTextField, StreamField
 from wagtail.models import Page
-from wagtail.search import index
 from wagtailmetadata.models import MetadataPageMixin
 
 from calendar_utils.models import CalendarMixin
 from shared import blocks as shared_blocks
-from shared.forms import SubscribeForm
 from shared.models import (  # MenuMixin,
     ArticleMixin,
-    ArticlesMixin,
-    ArticlesPageMixin,
     ExtendedMetadataHomePageMixin,
     ExtendedMetadataPageMixin,
     MainArticlePageMixin,
@@ -45,8 +31,7 @@ from shared.models import (  # MenuMixin,
     SharedTaggedElectionsArticle,
     SubpageMixin,
 )
-from shared.utils import make_promote_panels, subscribe_to_newsletter
-from tuning import admin_help
+from shared.utils import make_promote_panels
 
 from . import blocks
 from .forms import JekyllImportForm
diff --git a/elections2021/parser.py b/elections2021/parser.py
index e4db916e42424cba8ba007b7d055cc0f4328f478..cab8289b1b40d9c7c6b9aa24de04fb7906d6cfa4 100644
--- a/elections2021/parser.py
+++ b/elections2021/parser.py
@@ -4,7 +4,6 @@ import sys
 import urllib
 from collections import defaultdict
 
-import bleach
 import bs4
 from django.utils.text import slugify
 
diff --git a/green_deal/models.py b/green_deal/models.py
index c428ed66074461e2dd0412d5018225441b464952..49130079e807871fe421f0c992b41d5b55292c79 100644
--- a/green_deal/models.py
+++ b/green_deal/models.py
@@ -1,5 +1,4 @@
 from django.db import models
-from django.utils import timezone
 from django.utils.translation import gettext_lazy
 from wagtail import blocks
 from wagtail.admin.panels import CommentPanel, FieldPanel, HelpPanel, MultiFieldPanel
diff --git a/instagram_utils/management/commands/update_instagram.py b/instagram_utils/management/commands/update_instagram.py
index fe532e24a7713a8fc4b5d4992ed5e71a614119bb..ab7e57dfb5721d275d13f0244a21363eb7171861 100644
--- a/instagram_utils/management/commands/update_instagram.py
+++ b/instagram_utils/management/commands/update_instagram.py
@@ -1,4 +1,3 @@
-from django.conf import settings
 from django.core.management.base import BaseCommand
 
 from ...services import InstagramDownloadService
diff --git a/instagram_utils/models.py b/instagram_utils/models.py
index 2b340c314ff4c65a6002d87bbb951f9255204138..3a3a874a2a94cf8d20a1a8f0a798b769dee8c239 100644
--- a/instagram_utils/models.py
+++ b/instagram_utils/models.py
@@ -3,7 +3,6 @@ import logging
 import mimetypes
 import uuid
 
-from django.conf import settings
 from django.db import models
 
 logger = logging.getLogger()
diff --git a/main/blocks.py b/main/blocks.py
index 430921cdeaf749c7024c5bb7b020ff937d3e84e0..1a62cee03803f17dde4441b5ff2169024d09dcfd 100644
--- a/main/blocks.py
+++ b/main/blocks.py
@@ -1,7 +1,6 @@
 from django.utils.text import slugify
 from wagtail.blocks import (
     CharBlock,
-    ChoiceBlock,
     ListBlock,
     PageChooserBlock,
     RichTextBlock,
@@ -12,11 +11,9 @@ from wagtail.blocks import (
 from wagtail.images.blocks import ImageChooserBlock
 
 from shared.blocks import (
-    PROGRAM_RICH_TEXT_FEATURES,
     BoxBlock,
     CardLinkBlockMixin,
     CardLinkWithHeadlineBlockMixin,
-    CTAMixin,
     PersonContactBlockMixin,
     ProgramGroupBlockMixin,
 )
diff --git a/main/models.py b/main/models.py
index 33bbabd9a6e552cbddb633ccc99f62abe7e8d833..cba78373b97a8cf40651991fdfcf5806b165649a 100644
--- a/main/models.py
+++ b/main/models.py
@@ -1,37 +1,19 @@
-from dateutil.relativedelta import relativedelta
-from django.conf import settings
-from django.contrib import messages
-from django.core.paginator import Paginator
 from django.db import models
-from django.forms.models import model_to_dict
-from django.http import HttpResponseRedirect, JsonResponse
-from django.shortcuts import render
-from django.utils import timezone
 from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
-from taggit.models import Tag, TaggedItemBase
+from taggit.models import TaggedItemBase
 from wagtail.admin.panels import (
     FieldPanel,
-    HelpPanel,
-    MultiFieldPanel,
-    ObjectList,
-    PageChooserPanel,
-    TabbedInterface,
 )
-from wagtail.blocks import PageChooserBlock, RichTextBlock
-from wagtail.contrib.routable_page.models import RoutablePageMixin, route
+from wagtail.blocks import RichTextBlock
+from wagtail.contrib.routable_page.models import route
 from wagtail.fields import RichTextField, StreamField
 from wagtail.models import Page
-from wagtail.search import index
 from wagtailmetadata.models import MetadataPageMixin
 
-from calendar_utils.models import CalendarMixin
 from shared import blocks as shared_blocks
-from shared.forms import SubscribeForm
 from shared.models import (  # MenuMixin,
     ArticleMixin,
-    ArticlesMixin,
-    ArticlesPageMixin,
     ExtendedMetadataHomePageMixin,
     ExtendedMetadataPageMixin,
     MainArticlePageMixin,
@@ -40,15 +22,14 @@ from shared.models import (  # MenuMixin,
     MainHomePageMixin,
     MainPeoplePageMixin,
     MainPersonPageMixin,
+    MainProgramPageMixin,
     MainSearchPageMixin,
     MainSimplePageMixin,
-    MainProgramPageMixin,
     PageInMenuMixin,
     SharedTaggedMainArticle,
     SubpageMixin,
 )
-from shared.utils import make_promote_panels, subscribe_to_newsletter
-from tuning import admin_help
+from shared.utils import make_promote_panels
 
 from . import blocks
 from .forms import JekyllImportForm
@@ -214,6 +195,12 @@ class MainPeoplePage(MainPeoplePageMixin):
         use_json_field=True,
     )
 
+    parent_page_types = ["main.MainHomePage"]
+    subpage_types = [
+        "main.MainPersonPage",
+        "main.MainSimplePage",
+    ]
+
 
 class MainPersonPage(MainPersonPageMixin):
     ### RELATIONS
diff --git a/shared/blocks/__init__.py b/shared/blocks/__init__.py
index d31603b8b661dd6f3e2770acf986a701f9063e6c..f4c0ba1a36a73602ab0328b40a32766caeee4544 100644
--- a/shared/blocks/__init__.py
+++ b/shared/blocks/__init__.py
@@ -1,2 +1,2 @@
-from .base import *
-from .main import *
+from .base import *  # noqa
+from .main import *  # noqa
diff --git a/shared/blocks/base.py b/shared/blocks/base.py
index f109f938455be7b8e5f71456423a7a88462a72a5..b10c28a80ce10552d0186d9703c5b6115b219d8b 100644
--- a/shared/blocks/base.py
+++ b/shared/blocks/base.py
@@ -9,7 +9,6 @@ import requests
 from django.core.cache import cache
 from django.core.exceptions import ValidationError
 from django.core.files.images import ImageFile
-from django.db import models
 from django.forms.utils import ErrorList
 from wagtail import blocks
 from wagtail.blocks.struct_block import StructBlockValidationError
diff --git a/shared/blocks/main.py b/shared/blocks/main.py
index c6711f9c3610fb28cd1b6f843d0f9c973e33c7da..397cbc5039e78cf48992b603da1f9d5bf763a8c4 100644
--- a/shared/blocks/main.py
+++ b/shared/blocks/main.py
@@ -2,7 +2,6 @@ from wagtail import blocks
 from wagtail.blocks import (
     CharBlock,
     ListBlock,
-    PageChooserBlock,
     RichTextBlock,
     StructBlock,
     TextBlock,
diff --git a/shared/feeds.py b/shared/feeds.py
index a60c7527b5a899145ba058ae68778eea302d10cc..46cdec90b0a02be02c4bd9fc4f355b23db26137b 100644
--- a/shared/feeds.py
+++ b/shared/feeds.py
@@ -3,7 +3,6 @@ from datetime import datetime
 
 from django.contrib.syndication.views import Feed
 from django.template.loader import render_to_string
-from django.urls import reverse
 
 
 class LatestArticlesFeed(Feed):
diff --git a/shared/jekyll_import.py b/shared/jekyll_import.py
index 58451065d958f3be37a862f0038afb1d4e8896b6..0dbe56218995eabb84047c36b1207f90d9d97162 100644
--- a/shared/jekyll_import.py
+++ b/shared/jekyll_import.py
@@ -19,7 +19,6 @@ import bleach
 import markdown.serializers
 import yaml
 from django.core.files.images import ImageFile
-from django.utils import timezone
 from markdown import Markdown
 from markdown.extensions import Extension
 from markdown.inlinepatterns import InlineProcessor
diff --git a/shared/models/__init__.py b/shared/models/__init__.py
index d31603b8b661dd6f3e2770acf986a701f9063e6c..f4c0ba1a36a73602ab0328b40a32766caeee4544 100644
--- a/shared/models/__init__.py
+++ b/shared/models/__init__.py
@@ -1,2 +1,2 @@
-from .base import *
-from .main import *
+from .base import *  # noqa
+from .main import *  # noqa
diff --git a/shared/models/main.py b/shared/models/main.py
index 65a100bd3fcc58005f160847ad7f2cdd46d2783f..6bd54cccc77801b86b9f3af6ab65616db42542d1 100644
--- a/shared/models/main.py
+++ b/shared/models/main.py
@@ -1,18 +1,12 @@
 import datetime
 from functools import cached_property
 
-from dateutil.relativedelta import relativedelta
 from django.conf import settings
 from django.contrib import messages
-from django.core.paginator import Paginator
 from django.db import models
-from django.forms.models import model_to_dict
 from django.http import HttpResponseRedirect, JsonResponse
 from django.shortcuts import render
-from django.utils import timezone
-from modelcluster.contrib.taggit import ClusterTaggableManager
-from modelcluster.fields import ParentalKey
-from taggit.models import Tag, TaggedItemBase
+from taggit.models import Tag
 from wagtail.admin.panels import (
     FieldPanel,
     HelpPanel,
@@ -36,12 +30,11 @@ from shared.blocks import (
     NavbarMenuItemBlock,
     OtherLinksBlock,
     PersonContactBoxBlock,
-    SocialLinkBlock,
-    TwoTextColumnBlock,
     ProgramGroupBlock,
     ProgramGroupBlockPopout,
+    SocialLinkBlock,
+    TwoTextColumnBlock,
 )
-from shared.const import MONTH_NAMES
 from shared.forms import SubscribeForm
 from shared.utils import make_promote_panels, subscribe_to_newsletter
 from tuning import admin_help
@@ -212,12 +205,8 @@ class MainHomePageMixin(
 
     content_panels = Page.content_panels + [
         FieldPanel("content"),
-        FieldPanel("footer_other_links"),
-        FieldPanel("footer_person_list"),
     ]
 
-    promote_panels = make_promote_panels(admin_help.build(admin_help.IMPORTANT_TITLE))
-
     menu_panels = (
         MainMenuMixin.menu_panels
         + SocialMixin.menu_panels
@@ -227,6 +216,13 @@ class MainHomePageMixin(
         ]
     )
 
+    footer_panels = [
+        FieldPanel("footer_other_links"),
+        FieldPanel("footer_person_list"),
+    ]
+
+    promote_panels = make_promote_panels(admin_help.build(admin_help.IMPORTANT_TITLE))
+
     settings_panels = [
         PageChooserPanel("gdpr_and_cookies_page"),
         FieldPanel("matomo_id"),
@@ -237,9 +233,10 @@ class MainHomePageMixin(
     edit_handler = TabbedInterface(
         [
             ObjectList(content_panels, heading="Obsah"),
-            ObjectList(promote_panels, heading="Propagovat"),
+            ObjectList(menu_panels, heading="Hlavička"),
+            ObjectList(footer_panels, heading="Patička"),
             ObjectList(settings_panels, heading="Nastavení"),
-            ObjectList(menu_panels, heading="Menu"),
+            ObjectList(promote_panels, heading="Propagace"),
         ]
     )
 
@@ -839,11 +836,9 @@ class MainPeoplePageMixin(
 
     ### RELATIONS
 
-    parent_page_types = ["main.MainHomePage"]
-    subpage_types = [
-        "main.MainPersonPage",
-        "main.MainSimplePage",
-    ]
+    # NOTE: Must be overridden
+    parent_page_types = []
+    subpage_types = []
 
     ### OTHERS
 
@@ -981,7 +976,9 @@ class MainPersonPageMixin(
         # ordering = ("title",)
 
 
-class MainProgramPageMixin(ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page):
+class MainProgramPageMixin(
+    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page
+):
     ### FIELDS
 
     program = StreamField(
diff --git a/uniweb/blocks.py b/uniweb/blocks.py
index b2b34d3d9c363c6e88f42c3244c4c372eb91aa31..fc77b839924c9c0393cf9ffc18a47d009a37c8df 100644
--- a/uniweb/blocks.py
+++ b/uniweb/blocks.py
@@ -9,7 +9,6 @@ from wagtail.blocks import (
 )
 from wagtail.contrib.table_block.blocks import TableBlock as ContribTableBlock
 
-from shared.blocks import CardLinkBlockMixin, CardLinkWithHeadlineBlockMixin
 
 
 class AlignedTableBlock(StructBlock):
@@ -72,7 +71,7 @@ class PersonUrlBlock(StructBlock):
     )
 
 
-class PersonCustomPositionBlock(StructBlock):
+class PersonContactBlock(StructBlock):
     position = CharBlock(label="Název pozice", required=False)
     person = PageChooserBlock(
         label="Osoba",
@@ -87,7 +86,7 @@ class PersonCustomPositionBlock(StructBlock):
 class PeopleGroupListBlock(StructBlock):
     group_title = CharBlock(label="Titulek", required=True)
     person_list = ListBlock(
-        PersonCustomPositionBlock(),
+        PersonContactBlock(),
         label="List osob",
     )