diff --git a/elections2021/migrations/0037_bannerorder_elections2021bannerlistpage.py b/elections2021/migrations/0037_bannerorder_elections2021bannerlistpage.py
new file mode 100644
index 0000000000000000000000000000000000000000..f62a31c8a67f357db80a39ccf89e246d9087c1b5
--- /dev/null
+++ b/elections2021/migrations/0037_bannerorder_elections2021bannerlistpage.py
@@ -0,0 +1,133 @@
+# Generated by Django 3.2.5 on 2021-08-17 10:18
+
+import django.db.models.deletion
+import wagtail.contrib.routable_page.models
+import wagtail.core.blocks
+import wagtail.core.fields
+import wagtail.images.blocks
+import wagtailmetadata.models
+from django.db import migrations, models
+
+import shared.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("wagtailimages", "0023_add_choose_permissions"),
+        ("wagtailcore", "0062_comment_models_and_pagesubscription"),
+        ("elections2021", "0036_auto_20210811_1505"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="BannerOrder",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("code", models.CharField(max_length=10)),
+                ("name", models.CharField(max_length=35)),
+                ("surname", models.CharField(max_length=70)),
+                ("place_of_birth", models.CharField(max_length=70)),
+                ("date_of_birth", models.DateField()),
+                ("phone", models.CharField(max_length=20)),
+                ("email", models.EmailField(max_length=70)),
+            ],
+        ),
+        migrations.CreateModel(
+            name="Elections2021BannerListPage",
+            fields=[
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "subtitle",
+                    models.CharField(
+                        blank=True, max_length=100, verbose_name="podtitulek"
+                    ),
+                ),
+                (
+                    "banners",
+                    wagtail.core.fields.StreamField(
+                        [
+                            (
+                                "banners",
+                                wagtail.core.blocks.StructBlock(
+                                    [
+                                        (
+                                            "code",
+                                            wagtail.core.blocks.CharBlock(
+                                                label="kód banneru"
+                                            ),
+                                        ),
+                                        (
+                                            "candidate1",
+                                            wagtail.core.blocks.CharBlock(
+                                                label="první kandidát", required=False
+                                            ),
+                                        ),
+                                        (
+                                            "candidate2",
+                                            wagtail.core.blocks.CharBlock(
+                                                label="druhý kandidát", required=False
+                                            ),
+                                        ),
+                                        (
+                                            "tagline",
+                                            wagtail.core.blocks.CharBlock(
+                                                label="slogan", required=False
+                                            ),
+                                        ),
+                                        (
+                                            "preview",
+                                            wagtail.images.blocks.ImageChooserBlock(
+                                                label="náhled"
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            )
+                        ],
+                        blank=True,
+                        verbose_name="plachty",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "Plachty",
+            },
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                wagtail.contrib.routable_page.models.RoutablePageMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
+        ),
+    ]
diff --git a/elections2021/models.py b/elections2021/models.py
index 60d9789d1e98f14a6783f5a5a3ce00c270b910eb..defff4a33bc2161dc88c419448284efea9d9c02e 100644
--- a/elections2021/models.py
+++ b/elections2021/models.py
@@ -302,6 +302,7 @@ class Elections2021HomePage(MetadataPageMixin, RoutablePageMixin, Page):
         "elections2021.Elections2021DownloadsPage",
         "elections2021.Elections2021GovernmentTeamPage",
         "elections2021.Elections2021CalendarPage",
+        "elections2021.Elections2021BannerListPage",
     ]
 
     ### OTHERS
@@ -2447,3 +2448,99 @@ class Elections2021CalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin,
             event["pir"]["name"] = " ".join(pir_name)
 
         return self.calendar
+
+
+class BannerBlock(blocks.StructBlock):
+    code = blocks.CharBlock(label="kód banneru")
+    candidate1 = blocks.CharBlock(label="první kandidát", required=False)
+    candidate2 = blocks.CharBlock(label="druhý kandidát", required=False)
+    tagline = blocks.CharBlock(label="slogan", required=False)
+    preview = ImageChooserBlock(label="náhled")
+
+    class Meta:
+        label = "plachta"
+        icon = "flag"
+        template = "elections2021/_banner_block.html"
+
+
+class BannerOrder(models.Model):
+    code = models.CharField(max_length=10)
+    name = models.CharField(max_length=35)
+    surname = models.CharField(max_length=70)
+    place_of_birth = models.CharField(max_length=70)
+    date_of_birth = models.DateField()
+    phone = models.CharField(max_length=20)
+    email = models.EmailField(max_length=70)
+
+
+class BannerForm(forms.ModelForm):
+    class Meta:
+        model = BannerOrder
+        fields = [
+            "code",
+            "name",
+            "surname",
+            "place_of_birth",
+            "date_of_birth",
+            "phone",
+            "email",
+        ]
+
+
+class Elections2021BannerListPage(
+    SubpageMixin, MetadataPageMixin, RoutablePageMixin, Page
+):
+    ### FIELDS
+
+    subtitle = models.CharField(max_length=100, blank=True, verbose_name="podtitulek")
+    banners = StreamField(
+        [("banners", BannerBlock())], verbose_name="objednávání plachet", blank=True
+    )
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [
+        FieldPanel("subtitle"),
+        FieldPanel("banners"),
+    ]
+
+    promote_panels = [
+        MultiFieldPanel(
+            [
+                FieldPanel("slug"),
+                FieldPanel("seo_title"),
+                FieldPanel("search_description"),
+                ImageChooserPanel("search_image"),
+                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+            ],
+            gettext_lazy("Common page configuration"),
+        ),
+        CommentPanel(),
+    ]
+
+    settings_panels = []
+
+    ### RELATIONS
+
+    parent_page_types = ["elections2021.Elections2021HomePage"]
+    subpage_types = []
+
+    ### OTHERS
+
+    class Meta:
+        verbose_name = "Plachty"
+
+    def serve(self, request, *a, **kw):
+        if request.method == "POST":
+            form = BannerForm(request.POST)
+            form.has_been_saved = False
+
+            if form.is_valid():
+                order = form.save()
+                form.has_been_saved = True
+        else:
+            form = BannerForm()
+            form.has_been_saved = False
+
+        request.banner_form = form
+        return super().serve(request, *a, **kw)
diff --git a/elections2021/templates/elections2021/_banner_block.html b/elections2021/templates/elections2021/_banner_block.html
new file mode 100644
index 0000000000000000000000000000000000000000..a554476e7709ab5045e678b243fe752cde5f8742
--- /dev/null
+++ b/elections2021/templates/elections2021/_banner_block.html
@@ -0,0 +1,16 @@
+{% load static wagtailcore_tags wagtailimages_tags elections2021_extras %}
+<h3 class="pb-2 font-bold text-lg flex flex-col justify-end" style="min-height: 3.5rem">
+  <p class="my-1 w-full">
+    {% if block.value.candidate1 and block.value.candidate2 %}
+      {{ block.value.candidate1 }} + {{ block.value.candidate2 }}
+    {% elif block.value.candidate1 %}
+      {{ block.value.candidate1 }}
+    {% elif block.value.candidate2 %}
+      {{ block.value.candidate2 }}
+    {% endif %}
+  </p>
+  <p class="my-1">{{ block.value.tagline }}</p>
+</h3>
+<div class="card bg-white text-black card--hoveractive">
+  {% image block.value.preview fill-800x412 %}
+</div>
diff --git a/elections2021/templates/elections2021/banner_list.html b/elections2021/templates/elections2021/banner_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..f57a2704e392fe61e7a9489a9489ca88763de1a3
--- /dev/null
+++ b/elections2021/templates/elections2021/banner_list.html
@@ -0,0 +1,12 @@
+{% load wagtailcore_tags wagtailimages_tags %}
+<div class="grid grid-cols-1 md:grid-cols-2">
+  {% for block in page.banners %}
+  {% if block.value.code != request.GET.code %}
+  <div class="col p-4 mb-8">
+    <a href="?code={{block.value.code|urlencode}}" class="block">
+      {% include_block block %}
+    </a>
+  </div>
+  {% endif %}
+  {% endfor %}
+</div>
diff --git a/elections2021/templates/elections2021/banner_order_form.html b/elections2021/templates/elections2021/banner_order_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..7df2ded705cc1067aca98c7a6032cbdb2c804d96
--- /dev/null
+++ b/elections2021/templates/elections2021/banner_order_form.html
@@ -0,0 +1,115 @@
+{% load wagtailimages_tags %}
+{% for block in page.banners %}
+{% if block.value.code == request.GET.code %}
+<form class="mb-16 text-white bg-black p-4" method="POST" action="">
+  {% csrf_token %}
+  <div class="grid grid-cols-1 sm:grid-cols-2 gap-8">
+    <div class="col">
+      <h2 class="head-alt-sm mb-4">Objednáváte</h2>
+      <h3 class="pb-3 font-bold text-lg">
+        <p class="my-1">
+          {% if block.value.candidate1 and block.value.candidate2 %}
+          {{ block.value.candidate1 }} + {{ block.value.candidate2 }}
+          {% elif block.value.candidate1 %}
+          {{ block.value.candidate1 }}
+          {% elif block.value.candidate2 %}
+          {{ block.value.candidate2 }}
+          {% endif %}
+        </p>
+        <p class="my-1">{{ block.value.tagline }}</p>
+      </h3>
+      <div>{% image block.value.preview fill-800x412 %}</div>
+    </div>
+    <div class="col">
+
+      <h2 class="head-alt-sm mb-4">Informace o dárci</h2>
+
+      <div class="grid grid-cols-4 gap-4">
+        <div class="form-field col-span-2 form-field-required">
+          <label class="form-field__label" for="name">Jméno</label>
+          <div class="form-field__wrapper form-field__wrapper--shadowed {% if request.banner_form.errors.name %}form-field--error{% endif %}">
+            <input type="text" class="text-input form-field__control text-black" id="name" name="name" value="{{request.banner_form.name.value|default_if_none:""}}" placeholder="Jan" />
+          </div>
+          {% for error in request.banner_form.errors.name %}
+          <div class="form-field__error">{{error}}</div>
+          {% endfor %}
+        </div>
+
+        <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.surname %}form-field--error{% endif %}">
+          <label class="form-field__label" for="surname">Příjmení</label>
+          <div class="form-field__wrapper form-field__wrapper--shadowed">
+            <input type="text" class="text-input form-field__control text-black" id="surname" name="surname" value="{{request.banner_form.surname.value|default_if_none:""}}" placeholder="Vlaštovka" />
+          </div>
+          {% for error in request.banner_form.errors.surname %}
+          <div class="form-field__error">{{error}}</div>
+          {% endfor %}
+        </div>
+
+        <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.place_of_birth %}form-field--error{% endif %}">
+          <label class="form-field__label" for="place_of_birth">Místo narození</label>
+          <div class="form-field__wrapper form-field__wrapper--shadowed">
+            <input type="text" class="text-input form-field__control text-black" id="place_of_birth" name="place_of_birth" value="{{request.banner_form.place_of_birth.value|default_if_none:""}}" placeholder="Sedlíšťka" />
+          </div>
+          {% for error in request.banner_form.errors.place_of_birth %}
+          <div class="form-field__error">{{error}}</div>
+          {% endfor %}
+        </div>
+
+        <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.date_of_birth %}form-field--error{% endif %}">
+          <label class="form-field__label" for="date_of_birth">Datum narození</label>
+          <div class="form-field__wrapper form-field__wrapper--shadowed">
+            <input type="date" class="text-input form-field__control text-black" id="date_of_birth" name="date_of_birth" value="{{request.banner_form.date_of_birth.value|default_if_none:""}}" placeholder="1.1.1990" />
+          </div>
+          {% for error in request.banner_form.errors.date_of_birth %}
+          <div class="form-field__error">{{error}}</div>
+          {% endfor %}
+        </div>
+      </div>
+
+      <input type="hidden" name="code" value="{{request.GET.code|urlencode}}">
+
+      <p class="my-5">
+        Pokud nám pomůžete v&nbsp;kampani vyvěšením venkovní reklamy,
+        musíme o&nbsp;tomto Vašem nefinančním daru informovat stát,
+        který vaše údaje uveřejní.
+      </p>
+
+      <h2 class="head-alt-sm my-5">Kontaktní údaje</h2>
+
+      <div class="grid grid-cols-4 gap-4">
+        <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.phone %}form-field--error{% endif %}">
+          <label class="form-field__label" for="phone">Telefonní číslo</label>
+          <div class="form-field__wrapper form-field__wrapper--shadowed">
+            <input type="tel" class="text-input form-field__control text-black" id="phone" name="phone" value="{{request.banner_form.phone.value|default_if_none:""}}" placeholder="" />
+          </div>
+          {% for error in request.banner_form.errors.phone %}
+          <div class="form-field__error">{{error}}</div>
+          {% endfor %}
+        </div>
+        <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.email %}form-field--error{% endif %}">
+          <label class="form-field__label" for="email">Emailová adresa</label>
+          <div class="form-field__wrapper form-field__wrapper--shadowed">
+            <input type="email" class="text-input form-field__control text-black" id="email" name="email" value="{{request.banner_form.email.value|default_if_none:""}}" placeholder="" />
+          </div>
+          {% for error in request.banner_form.errors.email %}
+          <div class="form-field__error">{{error}}</div>
+          {% endfor %}
+        </div>
+      </div>
+
+      <p class="my-5">
+        Kontaktní údaje využijí naši koordinátoři k tomu, aby se s vámi
+        domluvili na podrobnostech předání. Po skončení této volební kampaně
+        vaše kontaktní údaje vymažeme.
+      </p>
+
+      <div class="mt-5 text-center lg:text-right">
+        <button class="btn text-lg max-w-full">
+          <div class="btn__body bg-white text-black">Souhlasím a objednávám</div>
+        </button>
+      </div>
+    </div>
+  </div>
+</form>
+{% endif %}
+{% endfor %}
diff --git a/elections2021/templates/elections2021/elections2021_banner_list_page.html b/elections2021/templates/elections2021/elections2021_banner_list_page.html
new file mode 100644
index 0000000000000000000000000000000000000000..af9f491a4e7e4d84827a63e4d7a8ed6b91f31690
--- /dev/null
+++ b/elections2021/templates/elections2021/elections2021_banner_list_page.html
@@ -0,0 +1,31 @@
+{% extends "elections2021/base.html" %}
+{% load static wagtailcore_tags wagtailimages_tags %}
+
+{% block content_header %}
+  <article class="relative bg-lemon md:bg-split-color px-4 md:pl-8 md:pr-0 2xl:px-8 hero py-0 w-full ">
+    <div class="2xl:container w-auto bg-lemon md:pl-20 pr-0 grid lg:grid-rows-1 h-40 sm:h-56 md:h-64 lg:grid-cols-7 items-center 2xl:mx-auto">
+      <div class="lg:row-span-1 lg:col-span-4 order-1 md:pr-20">
+        <h1 class="head-alt-md sm:head-alt-lg pt-1 max-w-xl">{{ page.title }}</h1>
+        <h2 class="head-alt-sm sm:head-alt-md pt-1 max-w-xl">{{ page.subtitle }}</h2>
+      </div>
+      <div class="text-center hidden lg:block lg:row-span-2 lg:col-span-3 order-2 h-full 2xl:right-0 2xl:text-right">
+        <i class="h-64 py-12 inline-block ico--bookmark banner__icon"></i>
+      </div>
+    </div>
+  </article>
+{% endblock %}
+
+{% block content %}
+<div class="container container--default pt-8 pb-8 px-0 md:px-1">
+  {% if request.banner_form.has_been_saved %}
+  <div class="w-xl px-4 mt-8 mb-16">
+    <h2 class="head-alt-md">Děkujeme!</h2>
+    <p class="head-alt-sm w-xl mt-1">Vaše objednávka byla uložena.</p>
+    <p class="text-xl w-xl mt-4">Krajský koordinátor se s vámi co nejdříve spojí a domluví s vámi detaily.</p>
+  </div>
+  {% else %}
+  {% include "elections2021/banner_order_form.html" %}
+  {% include "elections2021/banner_list.html" %}
+  {% endif %}
+</div>
+{% endblock %}