diff --git a/donate/migrations/0002_auto_20200601_2324.py b/donate/migrations/0002_auto_20200601_2324.py
new file mode 100644
index 0000000000000000000000000000000000000000..29c8bc99947a269a974dc6b0f6d98c9af7dacf51
--- /dev/null
+++ b/donate/migrations/0002_auto_20200601_2324.py
@@ -0,0 +1,63 @@
+# Generated by Django 3.0.6 on 2020-06-01 21:24
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("wagtailimages", "0022_uploadedimage"),
+        ("donate", "0001_initial"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="donatehomepage",
+            name="search_image",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                related_name="+",
+                to="wagtailimages.Image",
+                verbose_name="Search image",
+            ),
+        ),
+        migrations.AddField(
+            model_name="donateprojectindexpage",
+            name="search_image",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                related_name="+",
+                to="wagtailimages.Image",
+                verbose_name="Search image",
+            ),
+        ),
+        migrations.AddField(
+            model_name="donateregionindexpage",
+            name="search_image",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                related_name="+",
+                to="wagtailimages.Image",
+                verbose_name="Search image",
+            ),
+        ),
+        migrations.AddField(
+            model_name="donateregionpage",
+            name="search_image",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                related_name="+",
+                to="wagtailimages.Image",
+                verbose_name="Search image",
+            ),
+        ),
+    ]
diff --git a/donate/models.py b/donate/models.py
index ad5b4b22cada5606978cea8e37f2fa7cd5fb8a29..f8b874e4983f1d214ab5c25d9a315eeb60084744 100644
--- a/donate/models.py
+++ b/donate/models.py
@@ -10,6 +10,22 @@ from wagtail.core.fields import RichTextField, StreamField
 from wagtail.core.models import Page
 from wagtail.images.blocks import ImageChooserBlock
 from wagtail.images.edit_handlers import ImageChooserPanel
+from wagtailmetadata.models import MetadataPageMixin
+
+from tuning import help
+
+
+class SubpageMixin:
+    """Must be used in class definition before MetadataPageMixin!"""
+
+    @property
+    def root_page(self):
+        if not hasattr(self, "_root_page"):
+            self._root_page = self.get_parent().specific
+        return self._root_page
+
+    def get_meta_image(self):
+        return self.search_image or self.root_page.get_meta_image()
 
 
 def get_url(page, request, dest_page_type):
@@ -19,7 +35,7 @@ def get_url(page, request, dest_page_type):
         return "#"
 
 
-class DonateHomePage(Page):
+class DonateHomePage(Page, MetadataPageMixin):
     # lead section
     lead_title = models.CharField("hlavní nadpis", max_length=250, blank=True)
     lead_body = models.TextField("hlavní popis", blank=True)
@@ -75,12 +91,10 @@ class DonateHomePage(Page):
     promote_panels = [
         MultiFieldPanel(
             [
-                HelpPanel(
-                    "Název stránky na předchozím tabu slouží k rozlišení stránek "
-                    "v Majáku. V prohlížeči se zobrazí tento titulek."
-                ),
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
+                ImageChooserPanel("search_image"),
+                HelpPanel(help.build(help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -131,13 +145,15 @@ class DonateHomePage(Page):
         return context
 
 
-class DonateRegionIndexPage(Page):
+class DonateRegionIndexPage(Page, SubpageMixin, MetadataPageMixin):
     promote_panels = [
         MultiFieldPanel(
             [
                 FieldPanel("slug"),
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
+                ImageChooserPanel("search_image"),
+                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -154,19 +170,13 @@ class DonateRegionIndexPage(Page):
     class Meta:
         verbose_name = "Přehled krajů"
 
-    @property
-    def root_page(self):
-        if not hasattr(self, "_root_page"):
-            self._root_page = self.get_parent().specific
-        return self._root_page
-
     def get_context(self, request):
         context = super().get_context(request)
         context["regions"] = self.get_children().live().specific()
         return context
 
 
-class DonateRegionPage(Page):
+class DonateRegionPage(Page, SubpageMixin, MetadataPageMixin):
     perex = models.TextField("krátký popis do přehledu krajů")
     main_title = models.CharField("hlavní nadpis na stránce", max_length=250)
     body = RichTextField("obsah")
@@ -183,6 +193,14 @@ class DonateRegionPage(Page):
                 FieldPanel("slug"),
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
+                ImageChooserPanel("search_image"),
+                HelpPanel(
+                    help.build(
+                        "Pokud není zadán <strong>Titulek stránky</strong>, použije "
+                        "se <strong>Hlavní nadpis</strong> (tab obsah).",
+                        help.NO_SEARCH_IMAGE,
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -205,19 +223,24 @@ class DonateRegionPage(Page):
             self._root_page = self.get_ancestors().type(DonateHomePage).specific().get()
         return self._root_page
 
+    def get_meta_title(self):
+        return self.seo_title or self.main_title
+
     def get_context(self, request):
         context = super().get_context(request)
         context["other_regions"] = self.get_siblings(inclusive=False).live()
         return context
 
 
-class DonateProjectIndexPage(Page):
+class DonateProjectIndexPage(Page, SubpageMixin, MetadataPageMixin):
     promote_panels = [
         MultiFieldPanel(
             [
                 FieldPanel("slug"),
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
+                ImageChooserPanel("search_image"),
+                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -234,12 +257,6 @@ class DonateProjectIndexPage(Page):
     class Meta:
         verbose_name = "Přehled projektů"
 
-    @property
-    def root_page(self):
-        if not hasattr(self, "_root_page"):
-            self._root_page = self.get_parent().specific
-        return self._root_page
-
     def get_context(self, request):
         context = super().get_context(request)
         context["projects"] = (
@@ -248,7 +265,7 @@ class DonateProjectIndexPage(Page):
         return context
 
 
-class DonateProjectPage(Page):
+class DonateProjectPage(Page, SubpageMixin, MetadataPageMixin):
     date = models.DateField("běží od")
     perex = models.TextField("krátký popis")
     body = RichTextField("obsah")
@@ -265,6 +282,8 @@ class DonateProjectPage(Page):
         verbose_name="galerie fotek",
         blank=True,
     )
+    # we will use photo as search image
+    search_image = None
 
     content_panels = Page.content_panels + [
         MultiFieldPanel(
@@ -282,6 +301,14 @@ class DonateProjectPage(Page):
                 FieldPanel("slug"),
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
+                HelpPanel(
+                    help.build(
+                        "Pokud není zadán <strong>Titulek stránky</strong>, použije "
+                        "se „Podpoř projekt <strong>Název</strong>“ (tab obsah).",
+                        "Pokud není zadán <strong>Popis vyhledávání</strong>, použije "
+                        "se prvních 150 znaků <strong>Perexu</strong> (tab obsah).",
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -302,6 +329,23 @@ class DonateProjectPage(Page):
             self._root_page = self.get_ancestors().type(DonateHomePage).specific().get()
         return self._root_page
 
+    def get_meta_image(self):
+        return self.photo
+
+    def get_meta_title(self):
+        return self.seo_title or self.main_title
+
+    def get_meta_description(self):
+        if self.search_description:
+            return self.search_description
+        if len(self.perex) > 150:
+            return str(self.perex)[:150] + "..."
+        return self.perex
+
+    @property
+    def main_title(self):
+        return f"Podpoř projekt {self.title}"
+
     def get_context(self, request):
         context = super().get_context(request)
         context["other_projects"] = (
diff --git a/donate/templates/donate/base.html b/donate/templates/donate/base.html
index 6b9ed8e3b5cf9fa82e0e5ab22a81741090fd0b3c..fa89b4f9d720b02ffee70d62bcd47218ef44a9cb 100644
--- a/donate/templates/donate/base.html
+++ b/donate/templates/donate/base.html
@@ -1,4 +1,4 @@
-{% load static wagtailuserbar wagtailcore_tags wagtailimages_tags %}
+{% load static wagtailuserbar wagtailcore_tags wagtailimages_tags wagtailmetadata_tags %}
 <!doctype html>
 <html lang="cs">
 <head>
@@ -21,25 +21,10 @@
   <!-- Meta -->
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-  <meta name="description" content="{{ page.search_description }}">
-  <meta name="author" content="Daniel Hlavacek">
-  <title>{% firstof page.seo_title page.title %}</title>
-
-  <!-- OpenGraph info -->
-  <meta property="og:title" content="{% firstof page.seo_title page.title %}" />
-  <meta property="og:type" content="website" />
-  <meta property="og:locale" content="cs_CZ" />
-  <meta property="og:url" content="{{ page.full_url }}" />
-  {# TODO #}
-  <meta property="og:image" content="{% static "shared/img/og_image.jpg" %}" />
-  <meta property="og:description" content="{{ page.search_description }}" />
+  {% meta_tags %}
 
   <!-- Favicon -->
-  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-196.png" %}" sizes="196x196">
-  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-128.png" %}" sizes="128x128">
-  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-96.png" %}" sizes="96x96">
-  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-32.png" %}" sizes="32x32">
-  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-16.png" %}" sizes="16x16">
+  {% include "shared/favicon_snippet.html" %}
 
   <!-- Bootstrap CSS -->
   <link rel="stylesheet" href="{% static "shared/vendor/bootstrap-4.4.1/css/bootstrap.min.css" %}">
diff --git a/donate/templates/donate/donate_project_page.html b/donate/templates/donate/donate_project_page.html
index 12c22e0fa1882f9e9fe39e9dd1f04ca7238d953c..6584c54dea453cef39e61462c3afa67e301b941b 100644
--- a/donate/templates/donate/donate_project_page.html
+++ b/donate/templates/donate/donate_project_page.html
@@ -8,7 +8,7 @@
 
   <section class="section--alternate project__header">
     <div class="container">
-      <h1 class="lead heading">Podpoř projekt {{ page.title }}</h1>
+      <h1 class="lead heading">{{ page.main_title }}</h1>
 
       <div class="row align-items-center">
         <div class="col-12 col-md-6 mb-3 mb-md-0">