diff --git a/shared/blocks/children.py b/shared/blocks/children.py
new file mode 100644
index 0000000000000000000000000000000000000000..b950742fc6c5a934306c0789bd9e63bfd82f6ab5
--- /dev/null
+++ b/shared/blocks/children.py
@@ -0,0 +1,115 @@
+from django.utils.text import slugify
+from wagtail.blocks import (
+    CharBlock,
+    IntegerBlock,
+    ListBlock,
+    PageChooserBlock,
+    RichTextBlock,
+    StructBlock,
+    TextBlock,
+    URLBlock,
+)
+from wagtail.documents.blocks import DocumentChooserBlock
+from wagtail.images.blocks import ImageChooserBlock
+
+
+class CTAMixin(StructBlock):
+    button_link = URLBlock(label="Odkaz tlačítka")
+    button_text = CharBlock(label="Text tlačítka")
+
+    class Meta:
+        icon = "doc-empty"
+        label = "Tlačítko s odkazem"
+
+
+class LinkBlock(StructBlock):
+    text = CharBlock(label="Název")
+    link = URLBlock(label="Odkaz")
+
+    class Meta:
+        icon = "link"
+        label = "Odkaz"
+
+
+class NavbarMenuItemBlock(CTAMixin):
+    class Meta:
+        label = "Tlačítko"
+        template = "styleguide2/includes/molecules/navbar/additional_button.html"
+
+
+class PersonContactBlockMixin(StructBlock):
+    position = CharBlock(label="Název pozice", required=False)
+
+    @property
+    def person(self):
+        # NOTE: Needs to be implemented
+
+        raise NotImplementedError
+
+    # email, phone?
+
+    class Meta:
+        abstract = True
+        icon = "user"
+        label = "Osoba s volitelnou pozicí"
+
+
+class ProgramBlockPopout(StructBlock):
+    title = CharBlock(label="Titulek vyskakovacího bloku")
+    content = RichTextBlock(
+        label="Obsah",
+        features=PROGRAM_RICH_TEXT_FEATURES,
+    )
+
+    # TODO: Change in mixed-in blocks
+    guarantor = PageChooserBlock(
+        label="Garant", page_type=["district.DistrictPersonPage"], required=False
+    )
+
+    class Meta:
+        icon = "date"
+        label = "Blok programu"
+
+
+class ProgramPopoutCategory(StructBlock):
+    name = CharBlock(label="Název")
+    icon = ImageChooserBlock(label="Ikona", required=False)
+
+    description = RichTextBlock(label="Popis", required=False)
+
+    point_list = ListBlock(ProgramBlockPopout(), label="Jednotlivé bloky programu")
+
+    class Meta:
+        icon = "date"
+        label = "Kategorie programu"
+
+
+class FlipCardBlock(StructBlock):
+    bg_color = CharBlock(label="Barva pozadí", default="FEC900")
+
+    image = ImageChooserBlock(label="Obrázek", required=False)
+
+    title = TextBlock(label="Nadpis", help_text="Řádkování je manuální.")
+
+    content = RichTextBlock(label="Obsah")
+
+    button_text = CharBlock(
+        label="Nadpis tlačítka",
+        help_text="Pokud není vyplněn, tlačítko se neukáže.",
+        required=False,
+    )
+    button_url = CharBlock(label="Odkaz tlačítka", required=False)
+
+    class Meta:
+        icon = "view"
+        label = "Obracecí karta"
+        template = "styleguide2/includes/molecules/boxes/flip_card_box.html"
+
+
+class PersonBoxBlock(CTAMixin, StructBlock):
+    title = CharBlock(label="Nadpis")
+    image = ImageChooserBlock(label="Logo/obrázek")
+
+    class Meta:
+        icon = "form"
+        label = "Box"
\ No newline at end of file
diff --git a/shared/blocks/parents.py b/shared/blocks/parents.py
new file mode 100644
index 0000000000000000000000000000000000000000..51e86b00b52d041649057aa80ab1b591b6af40d1
--- /dev/null
+++ b/shared/blocks/parents.py
@@ -0,0 +1,323 @@
+from django.utils.text import slugify
+from wagtail.blocks import (
+    CharBlock,
+    IntegerBlock,
+    ListBlock,
+    PageChooserBlock,
+    RichTextBlock,
+    StructBlock,
+    TextBlock,
+    URLBlock,
+)
+from wagtail.documents.blocks import DocumentChooserBlock
+from wagtail.images.blocks import ImageChooserBlock
+from .children import CTAMixin, LinkBlock, NavbarMenuItemBlock, PersonContactBlockMixin, ProgramBlockPopout, ProgramPopoutCategory, FlipCardBlock, PersonBoxBlock
+
+# Mixins (or used as such)
+
+
+PROGRAM_RICH_TEXT_FEATURES = [
+    "h3",
+    "h4",
+    "h5",
+    "bold",
+    "italic",
+    "ol",
+    "ul",
+    "hr",
+    "link",
+    "document-link",
+    "image",
+    "superscript",
+    "subscript",
+    "strikethrough",
+    "blockquote",
+    "embed",
+]
+
+
+# Navbar
+
+
+class SocialLinkBlock(LinkBlock):
+    icon = CharBlock(
+        label="Ikona",
+        help_text="Seznam ikon - https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons <br/>"
+        "Název ikony zadejte bez tečky na začátku",
+    )  # TODO CSS class name or somthing better?
+
+    class Meta:
+        icon = "link"
+        label = "Odkaz"
+
+
+# Articles
+
+
+class NewsBlock(StructBlock):
+    title = CharBlock(
+        label="Titulek",
+        help_text="Nejnovější články se načtou automaticky",
+    )
+    description = TextBlock(label="Popis", required=False)
+
+    class Meta:
+        icon = "doc-full-inverse"
+        label = "Novinky"
+
+
+class ArticleQuoteBlock(StructBlock):
+    quote = CharBlock(label="Citace")
+    autor_name = CharBlock(label="Jméno autora")
+
+    class Meta:
+        icon = "user"
+        label = "Blok citace"
+        template = "styleguide2/includes/legacy/article_quote_block.html"
+
+
+class ArticleDownloadBlock(StructBlock):
+    file = DocumentChooserBlock(label="Stáhnutelný soubor")
+
+    class Meta:
+        icon = "user"
+        label = "Blok stáhnutelného dokumentu"
+        template = "styleguide2/includes/molecules/blocks/download_block.html"
+
+
+# People
+
+
+# TODO: Merge
+class TwoTextColumnBlock(StructBlock):
+    text_column_1 = RichTextBlock(label="První sloupec textu")
+    text_column_2 = RichTextBlock(label="Druhý sloupec textu")
+
+    class Meta:
+        icon = "doc-full"
+        label = "Text ve dvou sloupcích"
+
+
+class PersonContactBoxBlock(StructBlock):
+    title = CharBlock(label="Titulek")
+    image = ImageChooserBlock(label="Ikona")
+    subtitle = CharBlock(label="Podtitulek")
+
+    class Meta:
+        icon = "mail"
+        label = "Kontakty"
+
+
+# Footer
+
+
+class OtherLinksBlock(StructBlock):
+    title = CharBlock(label="Titulek")
+    list = ListBlock(LinkBlock, label="Seznam odkazů")
+
+    class Meta:
+        icon = "link"
+        label = "Odkazy"
+
+
+# Program
+
+
+class FlipCardsBlock(StructBlock):
+    cards = ListBlock(
+        FlipCardBlock(label="Karta"),
+        label="Karty",
+    )
+
+    class Meta:
+        icon = "group"
+        label = "Seznam obracecích karet"
+        template = "styleguide2/includes/organisms/cards/flip_card_list.html"
+
+
+class PeopleOverviewBlock(StructBlock):
+    title_line_1 = CharBlock(label="První řádek titulku")
+    title_line_2 = CharBlock(label="Druhý řádek titulku")
+
+    description = TextBlock(label="Popis")
+
+    list = ListBlock(PersonBoxBlock, label="Boxíky")
+
+    class Meta:
+        template = (
+            "styleguide2/includes/organisms/main_section/representatives_section.html"
+        )
+        icon = "group"
+        label = "Skupina osob"
+
+
+# Program
+
+
+class ProgramGroupBlockPopout(StructBlock):
+    categories = ListBlock(ProgramPopoutCategory(), label="Kategorie programu")
+
+    class Meta:
+        icon = "date"
+        label = "Vyskakovací program"
+
+
+class ProgramGroupBlockMixin(StructBlock):
+    title = CharBlock(
+        label="Název programu",
+        help_text="Např. 'Krajské volby 2024', 'Evropské volby 2024', ...",
+    )
+    # point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")
+
+    class Meta:
+        icon = "date"
+        template = "styleguide2/includes/molecules/program/program_block.html"
+        # 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"
+
+
+# Candidates
+
+
+class CandidateBlock(StructBlock):
+    # NOTE: Page type should be restricted in mixed-in classes
+    page = PageChooserBlock(label="Stránka")
+
+    image = ImageChooserBlock(
+        label="Obrázek",
+        help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta",
+        required=False,
+    )
+
+    description = TextBlock(label="Popis", required=False)
+
+    class Meta:
+        template = (
+            "styleguide2/includes/molecules/candidates/candidate_primary_box.html"
+        )
+        icon = "form"
+        label = "Kandidát"
+
+
+class SecondaryCandidateBlock(StructBlock):
+    number = CharBlock(label="Číslo")
+
+    # NOTE: Page type should be restricted in mixed-in classes
+    page = PageChooserBlock(label="Stránka")
+
+    image = ImageChooserBlock(
+        label="Obrázek",
+        help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta",
+        required=False,
+    )
+
+    class Meta:
+        template = (
+            "styleguide2/includes/molecules/candidates/candidate_secondary_box.html"
+        )
+        icon = "form"
+        label = "Kandidát"
+
+
+class CandidateListBlock(StructBlock):
+    # NOTE: should be changed in mixed-in blocks.
+    candidates = ListBlock(
+        CandidateBlock(),
+        label="Kandidáti",
+    )
+
+    class Meta:
+        template = (
+            "styleguide2/includes/organisms/candidates/candidate_primary_list.html"
+        )
+        icon = "form"
+        label = "Seznam kandidátů"
+
+
+class CandidateSecondaryListBlock(StructBlock):
+    heading = CharBlock(label="Nadpis zbytku kandidátky", default="Ostatní kandidátky")
+
+    # NOTE: should be changed in mixed-in blocks.
+    candidates = ListBlock(
+        SecondaryCandidateBlock(),
+        label="Zbylí kandidáti na listině",
+    )
+
+    class Meta:
+        template = (
+            "styleguide2/includes/organisms/candidates/candidate_secondary_list.html"
+        )
+        icon = "form"
+        label = "Sekundární seznam kandidátů"
+
+
+class CarouselProgramCategoryItemBlock(StructBlock):
+    content = TextBlock(label="Obsah")
+
+    class Meta:
+        icon = "form"
+        label = "Bod"
+
+
+class CarouselProgramCategoryBlock(StructBlock):
+    number = IntegerBlock(label="Číslo")
+
+    name = CharBlock(label="Název")
+
+    points = ListBlock(CarouselProgramCategoryItemBlock(), label="Body")
+
+    class Meta:
+        icon = "form"
+        label = "Kategorie"
+
+
+class CarouselProgramBlock(StructBlock):
+    label = CharBlock(label="Nadpis", help_text="Např. 'Program'", default="Program")
+
+    categories = ListBlock(CarouselProgramCategoryBlock(), label="Kategorie")
+
+    long_version_url = URLBlock(
+        label="Odkaz na celou verzi programu",
+        help_text="Pro zobrazení odkazu na celou verzi programu musí být obě následující pole vyplněná.",
+        required=False,
+    )
+    long_version_text = CharBlock(
+        label="Nadpis odkazu na celou verzi programu", required=False
+    )
+
+    class Meta:
+        icon = "form"
+        label = "Priority programu, carousel"
+        template = "styleguide2/includes/molecules/program/card_program.html"
diff --git a/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html b/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html
index 66d8766ce6cefd3ecfa40e27533674d55e3d2928..eb93869ac2458b00b6c161ebc70d34ff9cf7b832 100644
--- a/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html
+++ b/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html
@@ -3,7 +3,7 @@
 <div
   class="
     {% block classes %}
-      grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 content-stretch gap-4
+      grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 content-stretch gap-4 py-8
     {% endblock %}
   "
 >
diff --git a/shared_legacy/blocks/main.py b/shared_legacy/blocks/main.py
index a2668a3ce404519250308266d30b0857598c47ce..174325dd87db7f04606bea487fdba600568233e5 100644
--- a/shared_legacy/blocks/main.py
+++ b/shared_legacy/blocks/main.py
@@ -221,15 +221,3 @@ class FlipCardBlock(StructBlock):
         icon = "view"
         label = "Obracecí karta"
         template = "styleguide2/includes/molecules/boxes/flip_card_box.html"
-
-
-class FlipCardsBlock(StructBlock):
-    cards = ListBlock(
-        FlipCardBlock(label="Karta"),
-        label="Karty",
-    )
-
-    class Meta:
-        icon = "group"
-        label = "Seznam obracecích karet"
-        template = "styleguide2/includes/organisms/cards/flip_card_list.html"
diff --git a/uniweb/models.py b/uniweb/models.py
index e54380a7e89da64f59987d637faa2824b594bc12..a3d2cb0ba9da1b2d652dc90adabdf807d1beaa62 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -35,6 +35,8 @@ from shared.blocks import (
     NewsletterSubscriptionBlock,
     PictureHeadlineBlock,
     PictureListBlock,
+    FlipCardsBlock,
+    DEFAULT_CONTENT_BLOCKS
 )
 from shared.const import RICH_TEXT_DEFAULT_FEATURES
 from shared.models import (
@@ -50,7 +52,6 @@ from shared.models import (
     SocialMixin,
     SubpageMixin,
 )
-from shared_legacy.blocks import FlipCardsBlock
 from shared_legacy.models import FooterMixin as LegacyFooterMixin
 from shared_legacy.utils import make_promote_panels, strip_all_html_tags, trim_to_length
 from tuning import admin_help
@@ -70,46 +71,6 @@ from .constants import (
 )
 
 
-class ColorBlock(blocks.StructBlock):
-    """
-    Intended as parent class for blocks with color option.
-    """
-
-    color = blocks.ChoiceBlock(COLOR_CHOICES, label="barva", default=BLACK_ON_WHITE)
-
-    def get_context(self, value, parent_context=None):
-        context = super().get_context(value, parent_context=parent_context)
-        if "css_class" not in context:
-            context["css_class"] = []
-        context["css_class"] += COLOR_CSS[value["color"]]
-        return context
-
-
-class AlignBlock(blocks.StructBlock):
-    """
-    Intended as parent class for blocks with align option.
-    """
-
-    align = blocks.ChoiceBlock(ALIGN_CHOICES, label="zarovnání", default=LEFT)
-
-    def get_context(self, value, parent_context=None):
-        context = super().get_context(value, parent_context=parent_context)
-        if "css_class" not in context:
-            context["css_class"] = []
-        context["css_class"] += ALIGN_CSS[value["align"]]
-        return context
-
-
-class AdvancedTitleBlock(ColorBlock, AlignBlock):
-    title = blocks.CharBlock(label="nadpis")
-
-    class Meta:
-        label = "nadpis (pokročilý)"
-        icon = "title"
-        group = "nadpisy"
-        template = "uniweb/blocks/advanced_title.html"
-
-
 class ArticlesBlock(blocks.StructBlock):
     page = blocks.PageChooserBlock(
         label="Sekce článků", page_type=["uniweb.UniwebArticlesIndexPage"]
@@ -196,79 +157,8 @@ class CalendarAgendaBlock(blocks.StructBlock):
         return context
 
 
-class ButtonBlock(blocks.StructBlock):
-    text = blocks.CharBlock(label="Nadpis")
-
-    url = blocks.URLBlock(
-        label="Odkaz",
-        help_text="Pokud je odkaz vyplněný, není nutno vyplňovat stránku.",
-        required=False,
-    )
-
-    page = blocks.PageChooserBlock(
-        label="Stránka",
-        help_text="Pokud je stránka vyplněná, není nutno vyplňovat odkaz.",
-        required=False,
-    )
-
-    class Meta:
-        label = "Tlačítko"
-        icon = "link-external"
-        group = "ostatní"
-        template = "uniweb/blocks/button.html"
-
-
-CONTENT_STREAM_BLOCKS = [
-    # title, advanced_title
-    ("headline", HeadlineBlock()),
-    # picture_title
-    ("picture_title", PictureHeadlineBlock()),
-    # text
-    (
-        "text",
-        blocks.RichTextBlock(
-            label="Textový editor",
-            features=RICH_TEXT_DEFAULT_FEATURES,
-            template="styleguide2/includes/atoms/text/prose_richtext.html",
-        ),
-    ),
-    # advanced_text
-    ("advanced_text", AdvancedTextBlock()),
-    # text_columns
-    ("text_columns", ColumnsTextBlock()),
-    # advanced_text_columns
-    ("advanced_text_columns", AdvancedColumnsTextBlock()),
-    # gallery
-    ("new_gallery", GalleryBlock()),
-    # picture_list
-    ("picture_list", PictureListBlock()),
-    # aligned_table
-    (
-        "aligned_table",
-        AlignedTableBlock(
-            group="ostatní",
-            template="styleguide2/includes/atoms/table/aligned_table.html",
-        ),
-    ),
-    # table
-    (
-        "table",
-        TableBlock(
-            label="Tabulka",
-            group="ostatní",
-            template="styleguide2/includes/atoms/table/table.html",
-        ),
-    ),
-    # articles
-    ("articles", ArticlesBlock()),
-    # calendar_agenda
-    ("calendar_agenda", CalendarAgendaBlock()),  # Unfinished
-    # button
-    ("new_button", SharedButtonBlock()),
-    # chart
-    ("chart", ChartBlock()),
-    # cards
-    ("cards", FlipCardsBlock(template="uniweb/blocks/flip_cards.html")),  # Unfinished
+CONTENT_STREAM_BLOCKS = DEFAULT_CONTENT_BLOCKS + [
+    ("calendar_agenda", CalendarAgendaBlock())
 ]