diff --git a/district/migrations/0161_auto_20240513_1733.py b/district/migrations/0161_auto_20240513_1733.py
index e6310b3d465eeded35ce901fdd109588378f6bef..01d33c7cd87225bdf0ec3aa3862058ab4a6f7674 100644
--- a/district/migrations/0161_auto_20240513_1733.py
+++ b/district/migrations/0161_auto_20240513_1733.py
@@ -1,7 +1,7 @@
 # Generated by Django 5.0.4 on 2024-05-13 15:33
 
 import wagtail
-from django.db import migrations
+from django.db import migrations, models
 from wagtail.blocks import PageChooserBlock
 
 from district.blocks import PeopleGroupBlock
@@ -189,5 +189,85 @@ class Migration(migrations.Migration):
                 verbose_name="Lidé a týmy",
             ),
         ),
+        migrations.AddField(
+            model_name="districtpersonpage",
+            name="after_name",
+            field=models.CharField(
+                blank=True, max_length=16, null=True, verbose_name="Tituly za jménem"
+            ),
+        ),
+        migrations.AddField(
+            model_name="districtpersonpage",
+            name="before_name",
+            field=models.CharField(
+                blank=True, max_length=32, null=True, verbose_name="Tituly před jménem"
+            ),
+        ),
+        migrations.AddField(
+            model_name="districtpersonpage",
+            name="perex",
+            field=models.TextField(default=""),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name="districtpersonpage",
+            name="position",
+            field=models.CharField(
+                blank=True, max_length=200, null=True, verbose_name="Pozice/povolání"
+            ),
+        ),
+        migrations.AddField(
+            model_name="districtpersonpage",
+            name="primary_group",
+            field=models.CharField(
+                blank=True,
+                help_text="např. 'Europarlament' nebo 'Sněmovna'",
+                max_length=32,
+                null=True,
+                verbose_name="Kategorie",
+            ),
+        ),
+        migrations.AddField(
+            model_name="districtpersonpage",
+            name="related_people",
+            field=wagtail.fields.StreamField(
+                [
+                    (
+                        "person",
+                        wagtail.blocks.PageChooserBlock(
+                            label="Detail osoby", page_type=["main.MainPersonPage"]
+                        ),
+                    )
+                ],
+                blank=True,
+                verbose_name="Další lidé",
+            ),
+        ),
+        migrations.AddField(
+            model_name="districtpersonpage",
+            name="social_links",
+            field=wagtail.fields.StreamField(
+                [
+                    (
+                        "social_links",
+                        wagtail.blocks.StructBlock(
+                            [
+                                ("text", wagtail.blocks.CharBlock(label="Název")),
+                                ("link", wagtail.blocks.URLBlock(label="Odkaz")),
+                                (
+                                    "icon",
+                                    wagtail.blocks.CharBlock(
+                                        help_text="Seznam ikon - https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons <br/>Název ikony zadejte bez tečky na začátku",
+                                        label="Ikona",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    )
+                ],
+                blank=True,
+                verbose_name="Odkazy na sociální sítě",
+            ),
+        ),
         migrations.RunPython(migrate_people_blocks),
     ]
diff --git a/district/migrations/0170_districtpersonpage_after_name_and_more.py b/district/migrations/0170_districtpersonpage_after_name_and_more.py
index 0df093d123415c2cf0f00e79e350d72aa2adc311..473243336fa8e3e06ed242c03b07aab328fc0f40 100644
--- a/district/migrations/0170_districtpersonpage_after_name_and_more.py
+++ b/district/migrations/0170_districtpersonpage_after_name_and_more.py
@@ -1,7 +1,5 @@
 # Generated by Django 5.0.4 on 2024-05-15 09:09
 
-import wagtail.blocks
-import wagtail.fields
 from django.db import migrations, models
 
 
@@ -11,84 +9,5 @@ class Migration(migrations.Migration):
     ]
 
     operations = [
-        migrations.AddField(
-            model_name="districtpersonpage",
-            name="after_name",
-            field=models.CharField(
-                blank=True, max_length=16, null=True, verbose_name="Tituly za jménem"
-            ),
-        ),
-        migrations.AddField(
-            model_name="districtpersonpage",
-            name="before_name",
-            field=models.CharField(
-                blank=True, max_length=32, null=True, verbose_name="Tituly před jménem"
-            ),
-        ),
-        migrations.AddField(
-            model_name="districtpersonpage",
-            name="perex",
-            field=models.TextField(default=""),
-            preserve_default=False,
-        ),
-        migrations.AddField(
-            model_name="districtpersonpage",
-            name="position",
-            field=models.CharField(
-                blank=True, max_length=200, null=True, verbose_name="Pozice/povolání"
-            ),
-        ),
-        migrations.AddField(
-            model_name="districtpersonpage",
-            name="primary_group",
-            field=models.CharField(
-                blank=True,
-                help_text="např. 'Europarlament' nebo 'Sněmovna'",
-                max_length=32,
-                null=True,
-                verbose_name="Kategorie",
-            ),
-        ),
-        migrations.AddField(
-            model_name="districtpersonpage",
-            name="related_people",
-            field=wagtail.fields.StreamField(
-                [
-                    (
-                        "person",
-                        wagtail.blocks.PageChooserBlock(
-                            label="Detail osoby", page_type=["main.MainPersonPage"]
-                        ),
-                    )
-                ],
-                blank=True,
-                verbose_name="Další lidé",
-            ),
-        ),
-        migrations.AddField(
-            model_name="districtpersonpage",
-            name="social_links",
-            field=wagtail.fields.StreamField(
-                [
-                    (
-                        "social_links",
-                        wagtail.blocks.StructBlock(
-                            [
-                                ("text", wagtail.blocks.CharBlock(label="Název")),
-                                ("link", wagtail.blocks.URLBlock(label="Odkaz")),
-                                (
-                                    "icon",
-                                    wagtail.blocks.CharBlock(
-                                        help_text="Seznam ikon - https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons <br/>Název ikony zadejte bez tečky na začátku",
-                                        label="Ikona",
-                                    ),
-                                ),
-                            ]
-                        ),
-                    )
-                ],
-                blank=True,
-                verbose_name="Odkazy na sociální sítě",
-            ),
-        ),
+
     ]
diff --git a/district/migrations/0190_remove_districthomepage_calendar_page.py b/district/migrations/0190_remove_districthomepage_calendar_page.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd25fb5a84a3b9fdd5ac8c7fa99cb9f171fa3ef6
--- /dev/null
+++ b/district/migrations/0190_remove_districthomepage_calendar_page.py
@@ -0,0 +1,17 @@
+# Generated by Django 5.0.4 on 2024-05-17 09:31
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0189_auto_20240516_1526'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='districthomepage',
+            name='calendar_page',
+        ),
+    ]
diff --git a/district/migrations/0191_delete_districtpersontag.py b/district/migrations/0191_delete_districtpersontag.py
new file mode 100644
index 0000000000000000000000000000000000000000..1d2a60e0eafb5bcb0f80dc82b7f90f986a4f5bf1
--- /dev/null
+++ b/district/migrations/0191_delete_districtpersontag.py
@@ -0,0 +1,16 @@
+# Generated by Django 5.0.4 on 2024-05-17 11:43
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0190_remove_districthomepage_calendar_page'),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name='DistrictPersonTag',
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index 5a42dd37c50f9af75725f8b460d9f50d8cec8792..086db4667cdae204fcda8aeb9deff555778fbb0c 100644
--- a/district/models.py
+++ b/district/models.py
@@ -86,6 +86,9 @@ CONTENT_BLOCKS = DEFAULT_CONTENT_BLOCKS + [
 ]
 
 
+# --- BEGIN Migrated models ---
+
+
 class DistrictHomePage(
     RoutablePageMixin,
     ExtendedMetadataHomePageMixin,
@@ -149,14 +152,6 @@ class DistrictHomePage(
 
     # --- END New fields ---
 
-    calendar_page = models.ForeignKey(
-        "DistrictCalendarPage",
-        verbose_name="Stránka s kalendářem",
-        on_delete=models.PROTECT,
-        null=True,
-        blank=True,
-    )
-
     calendar_button_text = models.CharField(
         "Text tlačítka kalendáře", max_length=256, default="Kalendář"
     )
@@ -236,15 +231,9 @@ class DistrictHomePage(
         MultiFieldPanel(
             [
                 FieldPanel("calendar_button_text"),
-                MultiFieldPanel(
-                    [
-                        FieldPanel("calendar_url"),
-                        PageChooserPanel("calendar_page"),
-                    ],
-                    "Kalendář",
-                ),
+                FieldPanel("calendar_url"),
             ],
-            gettext_lazy("Nastavení lišty s kalendářem a mapou"),
+            gettext_lazy("Kalendář"),
         ),
         MultiFieldPanel(
             [
@@ -359,6 +348,10 @@ class DistrictHomePage(
     def interactive_program_page(self):
         return self._first_subpage_of_type(DistrictInteractiveProgramPage)
 
+    @property
+    def calendar_page(self):
+        return self._first_subpage_of_type(DistrictCalendarPage)
+
     @property
     def root_page(self):
         return self
@@ -444,14 +437,6 @@ class DistrictContactPage(MainContactPageMixin):
         verbose_name = "Kontakty"
 
 
-class DistrictPersonTag(TaggedItemBase):
-    content_object = ParentalKey(
-        "district.DistrictPersonPage",
-        on_delete=models.CASCADE,
-        related_name="tagged_items",
-    )
-
-
 class DistrictPersonPage(MainPersonPageMixin):
     ### FIELDS
     job = models.CharField(
@@ -570,6 +555,59 @@ class DistrictPeoplePage(MainPeoplePageMixin):
     subpage_types = ["district.DistrictPersonPage"]
 
 
+class DistrictCalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, Page):
+    """
+    Page for displaying full calendar
+    """
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [FieldPanel("calendar_url")]
+
+    ### RELATIONS
+
+    parent_page_types = [
+        "district.DistrictCenterPage",
+        "district.DistrictHomePage",
+    ]
+    subpage_types = []
+
+    ### OTHERS
+
+    class Meta:
+        verbose_name = "Stránka s kalendářem"
+
+
+class DistrictPdfPage(PdfPageMixin, MetadataPageMixin, SubpageMixin, Page):
+    """
+    Single pdf page display
+    """
+
+    ### RELATIONS
+
+    parent_page_types = [
+        "district.DistrictHomePage",
+        "district.DistrictArticlePage",
+    ]
+    subpage_types = []
+
+    ### PANELS
+
+    content_panels = Page.content_panels + PdfPageMixin.content_panels
+
+    ### OTHER
+
+    class Meta:
+        verbose_name = "PDF stránka"
+
+
+class DistrictNewProgramPage():
+    pass
+
+
+# --- END Migrated models ---
+
+
 class DistrictElectionBasePage(
     ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
 ):
@@ -1435,30 +1473,6 @@ class DistrictGeoFeatureCollectionCategory(Orderable):
 def make_feature_index_cache_key(feature: "DistrictGeoFeatureDetailPage"):
     return f"DistrictGeoFeatureDetailPage::{feature.id}::index"
 
-
-class DistrictCalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, Page):
-    """
-    Page for displaying full calendar
-    """
-
-    ### PANELS
-
-    content_panels = Page.content_panels + [FieldPanel("calendar_url")]
-
-    ### RELATIONS
-
-    parent_page_types = [
-        "district.DistrictCenterPage",
-        "district.DistrictHomePage",
-    ]
-    subpage_types = []
-
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Stránka s kalendářem"
-
-
 class DistrictGeoFeatureDetailPage(
     ExtendedMetadataPageMixin, MetadataPageMixin, SubpageMixin, Page, Orderable
 ):
@@ -1660,28 +1674,9 @@ class DistrictGeoFeatureDetailPage(
             self.geojson = maps_validators.normalize_geojson_feature_collection(
                 self.geojson, allowed_types=SUPPORTED_FEATURE_TYPES
             )
-        except ValueError as exc:
-            raise ValidationError({"geojson": str(exc)}) from exc
-
-
-class DistrictPdfPage(PdfPageMixin, MetadataPageMixin, SubpageMixin, Page):
-    """
-    Single pdf page display
-    """
-
-    ### RELATIONS
 
-    parent_page_types = [
-        "district.DistrictHomePage",
-        "district.DistrictArticlePage",
-    ]
-    subpage_types = []
-
-    ### PANELS
-
-    content_panels = Page.content_panels + PdfPageMixin.content_panels
-
-    ### OTHER
+            print(self.geojson)
+        except ValueError as exc:
+            print(exc)
 
-    class Meta:
-        verbose_name = "PDF stránka"
+            raise ValidationError({"geojson": str(exc)}) from exc
diff --git a/district/templates/district/blocks/contact_block.html b/district/templates/district/blocks/contact_block.html
index 162d56baa64a2843fc9046006f39c2acaea76d7a..4d7801a4a76468db07d98c3b6501dbe943fcda16 100644
--- a/district/templates/district/blocks/contact_block.html
+++ b/district/templates/district/blocks/contact_block.html
@@ -5,7 +5,7 @@
 <div class="space-y-4">
   {% for contact_details in self.contact_list %}
     {% with contact_details.person as person_page %}
-      {% include "shared/person_badge_snippet.html" with title=contact_details.position|default:person_page.job_function %}
+      {% include "shared/person_badge_snippet.html" with title=contact_details.position|default:person_page.job %}
     {% endwith %}
   {% endfor %}
 </div>
diff --git a/district/templates/district/blocks/people_group_block.html b/district/templates/district/blocks/people_group_block.html
index 752458f02285438ff0a0e9c5d014660541bca857..7956df0e94ab0fc4bd33e40dde70807b811b6507 100644
--- a/district/templates/district/blocks/people_group_block.html
+++ b/district/templates/district/blocks/people_group_block.html
@@ -5,7 +5,7 @@
   <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 row-gap-8 col-gap-8">
     {% for person_details in self.person_list %}
         {% with person_details.person as person_page %}
-            {% include "shared/person_badge_snippet.html" with title=person_details.position|default:person_page.job_function %}
+            {% include "shared/person_badge_snippet.html" with title=person_details.position|default:person_page.job %}
         {% endwith %}
     {% endfor %}
   </div>
diff --git a/district/templates/district/blocks/program_block.html b/district/templates/district/blocks/program_block.html
index 29446bced76896f2a91106742402698d0cd65364..0b600586cf72fc78b302dde2f96e900328b8c245 100644
--- a/district/templates/district/blocks/program_block.html
+++ b/district/templates/district/blocks/program_block.html
@@ -15,7 +15,7 @@
         <div class="card__body">
 
             {% with self.person.person as person_page %}
-                {% include "shared/person_badge_snippet.html" with title=self.person.position|default:person_page.job_function %}
+                {% include "shared/person_badge_snippet.html" with title=self.person.position|default:person_page.job %}
             {% endwith %}
 
           <div class="content-block">
diff --git a/district/templates/district/district_calendar_page.html b/district/templates/district/district_calendar_page.html
index ea4930b2c32cedfe8a3dee305dd92d9abef275b4..7d008b1a6aaba50351252c1fd6682212a5c7345c 100644
--- a/district/templates/district/district_calendar_page.html
+++ b/district/templates/district/district_calendar_page.html
@@ -1,10 +1,17 @@
-{% extends "district/base.html" %}
-{% load wagtailcore_tags %}
+{% extends "styleguide2/simple_page.html" %}
 
-{% block content %}
-<main>
-  <section class="my-8 lg:my-16 container-padding--zero lg:container-padding--auto">
-    {% include "shared/calendar_current_events_snippet.html" with fullscreen=True calendar=page.calendar %}
-  </section>
-</main>
+{% block navbar %}
+  {% include 'styleguide2/includes/organisms/layout/district/navbar.html' with selected_item=page.get_menu_title %}
+{% endblock %}
+
+{% block inner_content %}
+  <div class="__js-root">
+    <ui-full-calendar
+      {% if page.calendar_url %}
+        events='{{ page.get_fullcalendar_data|safe }}'
+      {% else %}
+        events='{{ page.root_page.get_fullcalendar_data|safe }}'
+      {% endif %}
+    ></ui-full-calendar>
+  </div>
 {% endblock %}
diff --git a/district/templates/district/district_pdf_page.html b/district/templates/district/district_pdf_page.html
index dd4bd8bceaa0f05392b415c7a655eed2958feaf8..b6040ebda49d2e9e3041fe05c2b50e7cb3182020 100644
--- a/district/templates/district/district_pdf_page.html
+++ b/district/templates/district/district_pdf_page.html
@@ -1,5 +1,9 @@
-{% extends "district/base.html" %}
+{% extends "styleguide2/simple_page.html" %}
 
-{% block content %}
+{% block navbar %}
+  {% include 'styleguide2/includes/organisms/layout/district/navbar.html' with selected_item=page.get_menu_title %}
+{% endblock %}
+
+{% block inner_content %}
     {% include "shared/pdf_snippet.html" with download_link=True %}
 {% endblock %}
diff --git a/main/blocks.py b/main/blocks.py
index 2c3509dfe41a60b42b096ca72a46ccda9b63068e..430921cdeaf749c7024c5bb7b020ff937d3e84e0 100644
--- a/main/blocks.py
+++ b/main/blocks.py
@@ -18,6 +18,7 @@ from shared.blocks import (
     CardLinkWithHeadlineBlockMixin,
     CTAMixin,
     PersonContactBlockMixin,
+    ProgramGroupBlockMixin,
 )
 from shared.blocks import ProgramGroupBlockPopout as SharedProgramGroupBlockPopout
 
@@ -44,20 +45,6 @@ class CardLinkBlock(CardLinkBlockMixin):
         label = "Karta s odkazem"
 
 
-class ProgramGroupBlockMixin(StructBlock):
-    title = CharBlock(label="Titulek části programu")
-    # point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")
-
-    class Meta:
-        icon = "date"
-        # label = "Skupina programů"
-
-    def get_prep_value(self, value):
-        value = super().get_prep_value(value)
-        value["slug"] = slugify(value["title"])
-        return value
-
-
 class BoxesBlock(StructBlock):
     title = CharBlock(label="Nadpis")
     list = ListBlock(BoxBlock, label="Boxíky")
@@ -128,34 +115,6 @@ class PeopleGroupBlock(StructBlock):
         return value
 
 
-class ProgramBlock(StructBlock):
-    url = URLBlock(
-        label="Odkaz pokrývající celou tuto část",
-        required=False,
-    )
-    icon = ImageChooserBlock(
-        label="Ikona",
-        required=False,
-    )
-    title = CharBlock(label="Titulek článku programu")
-    text = RichTextBlock(
-        label="Obsah",
-        features=PROGRAM_RICH_TEXT_FEATURES,
-    )
-
-    class Meta:
-        icon = "date"
-        label = "Článek programu"
-
-
-class ProgramGroupBlock(ProgramGroupBlockMixin):
-    point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")
-
-    class Meta:
-        icon = "date"
-        label = "Běžný program"
-
-
 class ProgramGroupBlockCrossroad(ProgramGroupBlockMixin):
     point_list = ListBlock(CardLinkBlock(), label="Karty programu")
 
diff --git a/main/models.py b/main/models.py
index ce8305162b4e11f525f72f0728099030b91d68e1..33bbabd9a6e552cbddb633ccc99f62abe7e8d833 100644
--- a/main/models.py
+++ b/main/models.py
@@ -42,6 +42,7 @@ from shared.models import (  # MenuMixin,
     MainPersonPageMixin,
     MainSearchPageMixin,
     MainSimplePageMixin,
+    MainProgramPageMixin,
     PageInMenuMixin,
     SharedTaggedMainArticle,
     SubpageMixin,
@@ -181,14 +182,12 @@ class MainArticlePage(MainArticlePageMixin):
     subpage_types = []
 
 
-class MainProgramPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page
-):
+class MainProgramPage(MainProgramPageMixin):
     ### FIELDS
 
     program = StreamField(
         [
-            ("program_group", blocks.ProgramGroupBlock()),
+            ("program_group", shared_blocks.ProgramGroupBlock()),
             ("program_group_crossroad", blocks.ProgramGroupBlockCrossroad()),
             ("program_group_popout", blocks.ProgramGroupBlockPopout()),
             ("elections_program", blocks.ElectionsProgramBlock()),
@@ -198,24 +197,11 @@ class MainProgramPage(
         use_json_field=True,
     )
 
-    ### PANELS
-
-    content_panels = Page.content_panels + [FieldPanel("program")]
-
-    promote_panels = make_promote_panels()
-
-    settings_panels = []
-
     ### RELATIONS
 
     parent_page_types = ["main.MainHomePage"]
     subpage_types = []
 
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Program"
-
 
 class MainPeoplePage(MainPeoplePageMixin):
     people = StreamField(
diff --git a/maps_utils/blocks.py b/maps_utils/blocks.py
index ba478faedabfaa1718c6c9cc9a86ed15788d85c0..9b3b17405fc6161fdc026e27f16a8053a98a2a95 100644
--- a/maps_utils/blocks.py
+++ b/maps_utils/blocks.py
@@ -111,6 +111,8 @@ class MapFeatureBlock(blocks.StructBlock):
                     value["geojson"], allowed_types=SUPPORTED_FEATURE_TYPES
                 )
             except ValueError as exc:
+                print(exc)
+
                 errors["geojson"] = ErrorList(str(exc))
 
         if errors:
diff --git a/shared/blocks/main.py b/shared/blocks/main.py
index 6572055a95157f5507515974a15487cac5b611d0..c6711f9c3610fb28cd1b6f843d0f9c973e33c7da 100644
--- a/shared/blocks/main.py
+++ b/shared/blocks/main.py
@@ -274,3 +274,48 @@ class MainButtonGroupBlock(StructBlock):
         template = "styleguide2/includes/atoms/buttons/group.html"
         icon = "group"
         label = "Skupina tlačítek"
+
+
+# Program
+
+
+class ProgramGroupBlockMixin(StructBlock):
+    title = CharBlock(label="Titulek části programu")
+    # point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")
+
+    class Meta:
+        icon = "date"
+        # label = "Skupina programů"
+
+    def get_prep_value(self, value):
+        value = super().get_prep_value(value)
+        value["slug"] = slugify(value["title"])
+        return value
+
+
+class ProgramBlock(StructBlock):
+    url = URLBlock(
+        label="Odkaz pokrývající celou tuto část",
+        required=False,
+    )
+    icon = ImageChooserBlock(
+        label="Ikona",
+        required=False,
+    )
+    title = CharBlock(label="Titulek článku programu")
+    text = RichTextBlock(
+        label="Obsah",
+        features=PROGRAM_RICH_TEXT_FEATURES,
+    )
+
+    class Meta:
+        icon = "date"
+        label = "Článek programu"
+
+
+class ProgramGroupBlock(ProgramGroupBlockMixin):
+    point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")
+
+    class Meta:
+        icon = "date"
+        label = "Běžný program"
diff --git a/shared/models/main.py b/shared/models/main.py
index a47a6fdcfa01c2f2725a38e14645319129ada443..65a100bd3fcc58005f160847ad7f2cdd46d2783f 100644
--- a/shared/models/main.py
+++ b/shared/models/main.py
@@ -38,6 +38,8 @@ from shared.blocks import (
     PersonContactBoxBlock,
     SocialLinkBlock,
     TwoTextColumnBlock,
+    ProgramGroupBlock,
+    ProgramGroupBlockPopout,
 )
 from shared.const import MONTH_NAMES
 from shared.forms import SubscribeForm
@@ -977,3 +979,37 @@ class MainPersonPageMixin(
         verbose_name = "Detail osoby"
         abstract = True
         # ordering = ("title",)
+
+
+class MainProgramPageMixin(ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page):
+    ### FIELDS
+
+    program = StreamField(
+        [
+            ("program_group", ProgramGroupBlock()),
+            ("program_group_popout", ProgramGroupBlockPopout()),
+        ],
+        verbose_name="Program",
+        blank=True,
+        use_json_field=True,
+    )
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [FieldPanel("program")]
+
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
+    ### RELATIONS
+
+    # NOTE: Needs to be overridden
+    parent_page_types = []
+    subpage_types = []
+
+    ### OTHERS
+
+    class Meta:
+        verbose_name = "Program"
+        abstract = True
diff --git a/shared/templates/shared/pdf_snippet.html b/shared/templates/shared/pdf_snippet.html
index 2c69fb22a88cefdf54a24d93d947f11f7cea7dac..b1bc8d7dfcb93166289c997adce58e1793ad755c 100644
--- a/shared/templates/shared/pdf_snippet.html
+++ b/shared/templates/shared/pdf_snippet.html
@@ -61,17 +61,13 @@
         </script>
     </div>
 
-    <div class="text-gray-500 my-6" id="loading">
+    <div id="loading">
         Načítání ...
     </div>
 
     {% if download_link %}
-        <div class="flex flex-col md:flex-row lg:flex-col lg:items-end space-y-2 md:space-y-0 md:space-x-2 lg:space-x-0 lg:space-y-2">
-            <a href="{{ request.scheme }}://{{ request.get_host }}{{ page.pdf_url }}">
-                <button class="btn btn--inline-icon btn--condensed btn--hoveractive btn--grey-500">
-                    <div class="btn__body">Odkaz ke stažení PDF</div>
-                </button>
-            </a>
+        <div class="inline-block py-8">
+            {% include "styleguide2/includes/atoms/buttons/round_button.html"  with button_text="Stáhnout dokument" url=page.pdf_url %}
         </div>
     {% endif %}
 {% endblock %}
diff --git a/shared/templates/styleguide2/includes/organisms/layout/district/navbar.html b/shared/templates/styleguide2/includes/organisms/layout/district/navbar.html
index b50096bbc84187dd52b9fa1f413c4e9888b2c69f..f3668d80505a0d7a252b83e8f307ca9a1eaddcaa 100644
--- a/shared/templates/styleguide2/includes/organisms/layout/district/navbar.html
+++ b/shared/templates/styleguide2/includes/organisms/layout/district/navbar.html
@@ -49,3 +49,26 @@
     </div>
   </div>
 {% endblock %}
+
+{% block after_desktop_search %}
+  {% if page.root_page.calendar_page %}
+    <div class="w-24 h-11 min-w-[9rem]">
+      <a
+        href="{{ page.root_page.calendar_page.url }}"
+        class="
+          navbar__border-button
+
+          font-alt flex items-center justify-center border-none border-4 w-24 h-11 py-4 px-3 duration-150 cursor-pointer text-lg gap-1
+
+          hover:no-underline
+
+          xl:w-auto
+        "
+      >
+        <i class="ico--calendar"></i>
+
+        {{ page.root_page.calendar_button_text }}
+      </a>
+    </div>
+  {% endif %}
+{% endblock %}
diff --git a/shared/templates/styleguide2/includes/organisms/layout/navbar.html b/shared/templates/styleguide2/includes/organisms/layout/navbar.html
index 5d6ade14276ee38ae217240d942d019f94d79d42..f7d3c5ed98fbaaf5e56eb413635a42c8d699b748 100644
--- a/shared/templates/styleguide2/includes/organisms/layout/navbar.html
+++ b/shared/templates/styleguide2/includes/organisms/layout/navbar.html
@@ -41,8 +41,10 @@
         </div>
 
         <form method="GET" action="{{ page.root_page.search_page.url }}">
-          {% include 'styleguide2/includes/atoms/form_fields/form_input.html' with placeholder='Hledej' classes='font-condensed text-black px-2 py-1 w-80' name='q' value=global_search_query %}
+          {% include 'styleguide2/includes/atoms/form_fields/form_input.html' with placeholder='Hledej' classes='text-black p-3 w-60' name='q' value=global_search_query %}
         </form>
+
+        {% block after_desktop_search %}{% endblock %}
       </div>
       <!-- END Social media -->
 
diff --git a/shared/templates/styleguide2/simple_page.html b/shared/templates/styleguide2/simple_page.html
index 21ee68c5c8a441a8372fa8f32e45b73896614e0e..fd7f7428d4f33e544e291c8124cba6daf8bf73eb 100644
--- a/shared/templates/styleguide2/simple_page.html
+++ b/shared/templates/styleguide2/simple_page.html
@@ -11,12 +11,14 @@
   {% endblock %}
 
   <main class="container--wide mb-2 lg:mb-12">
-    {% for block in page.content %}
-      {% include_block block %}
-    {% endfor %}
+    {% block inner_content %}
+      {% for block in page.content %}
+        {% include_block block %}
+      {% endfor %}
 
-    {% for block in page.new_content %}
-      {% include_block block %}
-    {% endfor %}
+      {% for block in page.new_content %}
+        {% include_block block %}
+      {% endfor %}
+    {% endblock %}
   </main>
 {% endblock %}
diff --git a/uniweb/templates/uniweb/blocks/people_group_block.html b/uniweb/templates/uniweb/blocks/people_group_block.html
index 8630f953772de8ac9744df41d9ef7d4cff01b089..d268139f0cf98e0b9c5a64632595c359f624e3e0 100644
--- a/uniweb/templates/uniweb/blocks/people_group_block.html
+++ b/uniweb/templates/uniweb/blocks/people_group_block.html
@@ -5,7 +5,7 @@
   <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
     {% for person_details in self.person_list %}
         {% with person_details.person as person_page %}
-            {% include "shared/person_badge_snippet.html" with title=person_details.position|default:person_page.job_function %}
+            {% include "shared/person_badge_snippet.html" with title=person_details.position|default:person_page.job %}
         {% endwith %}
     {% endfor %}
   </div>