diff --git a/district/forms.py b/district/forms.py
index 0bdf97fa6f02f43fedd0f6de49d241073160d01e..ea6202fad0fcdd6f11b47bb027abd39c0982b4d7 100644
--- a/district/forms.py
+++ b/district/forms.py
@@ -65,7 +65,8 @@ class DistrictArticlesPageForm(SharedArticlesPageForm, JekyllImportForm):
             valid_tag_ids = list(DistrictArticleTag.objects.filter(
                 content_object__in=self.instance.get_children().specific()
             ).values_list('tag_id', flat=True).distinct().all())
-
-            valid_tag_ids += list(self.instance.shared_tags.all())
             
-            self.fields['displayed_tags'].queryset = DistrictArticleTag.objects.filter(id__in=valid_tag_ids).order_by("tag__name").distinct("tag__name")
\ No newline at end of file
+            valid_shared_tag_ids = self.instance.shared_tags.values_list('id', flat=True).distinct().all()
+
+            self.fields['displayed_tags'].queryset = DistrictArticleTag.objects.filter(id__in=valid_tag_ids).order_by("tag__name").distinct("tag__name")
+            self.fields['displayed_shared_tags'].queryset = SharedTag.objects.filter(id__in=valid_shared_tag_ids).order_by("name").distinct("name")
\ No newline at end of file
diff --git a/district/migrations/0271_districtarticlespage_displayed_shared_tags_and_more.py b/district/migrations/0271_districtarticlespage_displayed_shared_tags_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..c0deb8c081805512af5f87117317fe136fa97e9b
--- /dev/null
+++ b/district/migrations/0271_districtarticlespage_displayed_shared_tags_and_more.py
@@ -0,0 +1,25 @@
+# Generated by Django 5.0.7 on 2024-08-08 12:30
+
+import modelcluster.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0270_alter_districtarticlespage_show_tags'),
+        ('shared', '0010_alter_octopusperson_photo'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='districtarticlespage',
+            name='displayed_shared_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'),
+        ),
+        migrations.AlterField(
+            model_name='districtarticlespage',
+            name='displayed_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='district.districtarticletag', verbose_name='Z tohoto oblastního webu'),
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index 538471c620342aa62b9f065a6c8c776623d48815..9a8c7f404da9fb8d581bc4705d4889a9ed0d7a87 100644
--- a/district/models.py
+++ b/district/models.py
@@ -305,8 +305,15 @@ class DistrictArticlesPage(MainArticlesPageMixin):
 
     displayed_tags = ParentalManyToManyField(
         "district.DistrictArticleTag",
-        verbose_name="Zobrazené štítky",
-        help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 30.",
+        verbose_name="Z tohoto oblastního webu",
+        related_name="+",
+        blank=True,
+    )
+
+    displayed_shared_tags = ParentalManyToManyField(
+        "shared.SharedTag",
+        verbose_name="Sdílecí",
+        related_name="+",
         blank=True,
     )
 
diff --git a/elections/migrations/0054_electionsarticlespage_displayed_shared_tags_and_more.py b/elections/migrations/0054_electionsarticlespage_displayed_shared_tags_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..c99b04c4dd853a52e45e39f37719f4b079aac938
--- /dev/null
+++ b/elections/migrations/0054_electionsarticlespage_displayed_shared_tags_and_more.py
@@ -0,0 +1,25 @@
+# Generated by Django 5.0.7 on 2024-08-08 12:30
+
+import modelcluster.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('elections', '0053_alter_electionsarticlespage_show_tags'),
+        ('shared', '0010_alter_octopusperson_photo'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='electionsarticlespage',
+            name='displayed_shared_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'),
+        ),
+        migrations.AlterField(
+            model_name='electionsarticlespage',
+            name='displayed_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='elections.electionsarticletag', verbose_name='Z tohoto webu'),
+        ),
+    ]
diff --git a/elections/models.py b/elections/models.py
index 482694deb75228139584ff2803ec24d3cc2a6005..3ef27c1b31aede495403496879aea1a1f8fa15c1 100644
--- a/elections/models.py
+++ b/elections/models.py
@@ -132,8 +132,15 @@ class ElectionsArticlesPage(MainArticlesPageMixin):
 
     displayed_tags = ParentalManyToManyField(
         "elections.ElectionsArticleTag",
-        verbose_name="Zobrazené štítky",
-        help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 20.",
+        verbose_name="Z tohoto webu",
+        related_name="+",
+        blank=True,
+    )
+
+    displayed_shared_tags = ParentalManyToManyField(
+        "shared.SharedTag",
+        verbose_name="Sdílecí",
+        related_name="+",
         blank=True,
     )
 
diff --git a/main/migrations/0114_mainarticlespage_displayed_shared_tags_and_more.py b/main/migrations/0114_mainarticlespage_displayed_shared_tags_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..647dcb988c64f0b75510a6a6e404073215586f2b
--- /dev/null
+++ b/main/migrations/0114_mainarticlespage_displayed_shared_tags_and_more.py
@@ -0,0 +1,25 @@
+# Generated by Django 5.0.7 on 2024-08-08 12:30
+
+import modelcluster.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('main', '0113_alter_mainarticlespage_show_tags'),
+        ('shared', '0010_alter_octopusperson_photo'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='mainarticlespage',
+            name='displayed_shared_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'),
+        ),
+        migrations.AlterField(
+            model_name='mainarticlespage',
+            name='displayed_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='main.mainarticletag', verbose_name='Z tohoto webu'),
+        ),
+    ]
diff --git a/main/models.py b/main/models.py
index 1335ede922935f8920e11d8b9bd6e5509d244601..597debd401dfb4be013d6690ff04eb6762f20161 100644
--- a/main/models.py
+++ b/main/models.py
@@ -138,8 +138,15 @@ class MainArticlesPage(MainArticlesPageMixin):
 
     displayed_tags = ParentalManyToManyField(
         "main.MainArticleTag",
-        verbose_name="Zobrazené štítky",
-        help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 20.",
+        verbose_name="Z tohoto webu",
+        related_name="+",
+        blank=True,
+    )
+
+    displayed_shared_tags = ParentalManyToManyField(
+        "shared.SharedTag",
+        verbose_name="Sdílecí",
+        related_name="+",
         blank=True,
     )
 
diff --git a/shared/forms.py b/shared/forms.py
index 63e4f55b89318a4c2d03883616de287690b41fde..8540fac621007ff4ae3d6e339782d4da98594bdf 100644
--- a/shared/forms.py
+++ b/shared/forms.py
@@ -81,10 +81,20 @@ class ArticlesPageForm(ClusterForm):
     displayed_tags = TagModelChoiceField(
         queryset=None,
         required=False,
-        label="Zobrazené štítky",
-        help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 30.",
+        label="Z tohoto webu",
         widget=CheckboxSelectMultiple
     )
+    displayed_shared_tags = ModelMultipleChoiceField(
+        queryset=None,
+        required=False,
+        label="Sdílecí",
+        help_text=(
+            "Aby se zde zobrazily štítky, je nutné nejdříve vybrat "
+            "odebírané štítky v sekci níže a publikovat stránku."
+        ),
+        widget=CheckboxSelectMultiple
+    )
+
     shared_tags = ModelMultipleChoiceField(
         queryset=None, 
         required=False,
diff --git a/shared/models/main.py b/shared/models/main.py
index 0288541386a060dad671198861b6b22f976a7306..b0cf40b48c168bf24c6f6ede67df22ce35909243 100644
--- a/shared/models/main.py
+++ b/shared/models/main.py
@@ -655,6 +655,7 @@ class ArticlesMixin:
         Materializes article query as article type corresponding to the module from which
         this function is run. Put query from append_all_shared_articles_query as results parameter.
         """
+
         # To prevent circular deps, we get class models during runtime
         page_type = self.determine_page_type()
 
@@ -929,6 +930,8 @@ class ArticlesMixin:
 
 
 class SharedTag(TagBase):
+    is_shared = True
+
     class Meta:
         verbose_name = "sdílený tag"
         verbose_name_plural = "sdílené tagy"
@@ -1270,6 +1273,11 @@ class MainArticlesPageMixin(
     def displayed_tags(self):
         # NOTE: Must be defined in mixed-in models
         raise NotImplementedError
+    
+    @property
+    def displayed_shared_tags(self):
+        # NOTE: Must be defined in mixed-in models
+        raise NotImplementedError
 
     last_import_log = models.TextField(
         "Výstup z posledního importu", null=True, blank=True
@@ -1306,7 +1314,16 @@ class MainArticlesPageMixin(
     content_panels = Page.content_panels + [
         FieldPanel("perex"),
         FieldPanel("show_tags"),
-        FieldPanel("displayed_tags"),
+        MultiFieldPanel(
+            [
+                HelpPanel(
+                    "Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 30."
+                ),
+                FieldPanel("displayed_tags"),
+                FieldPanel("displayed_shared_tags"),
+            ],
+            heading="Zobrazené štítky"
+        ),
         FieldPanel("shared_tags"),
     ]
     promote_panels = make_promote_panels()
@@ -1338,16 +1355,25 @@ class MainArticlesPageMixin(
     def get_base_shared_articles_query(self, filter: models.Q):
         return self.materialize_shared_articles_query(
             self.append_all_shared_articles_query(
-                self.root_page.article_page_model.objects.filter(filter)
-                .live()
-                .child_of(self)
-                .all()
-            ).order_by("-union_timestamp")
+                (
+                    self.root_page.article_page_model.objects.filter(filter)
+                    .live()
+                    .child_of(self)
+                    .all()
+                ),
+                custom_article_query=lambda query: query.filter(filter)
+            ).order_by("-union_timestamp"),
         )
 
     def get_search_filters(self, request):
         filter = models.Q()
 
+        if "shared_tag_id" in request.GET:
+            shared_tag = self.get_shared_filtered_tag(request)
+
+            if shared_tag is not None:
+                filter = filter & models.Q(shared_tags__id=shared_tag.id)
+
         if "tag_id" in request.GET:
             tag = self.get_filtered_tag(request)
 
@@ -1359,6 +1385,15 @@ class MainArticlesPageMixin(
 
         return filter
 
+    def get_shared_filtered_tag(self, request) -> SharedTag | None:
+        if "shared_tag_id" in request.GET:
+            try:
+                return SharedTag.objects.filter(id=int(request.GET["shared_tag_id"])).first()
+            except Exception:
+                pass
+
+        return None
+
     def get_filtered_tag(self, request) -> Tag | None:
         if "tag_id" in request.GET:
             try:
@@ -1380,6 +1415,11 @@ class MainArticlesPageMixin(
 
             if filtered_tag is not None:
                 ctx["filtered_tag"] = filtered_tag
+            
+            shared_filtered_tag = self.get_shared_filtered_tag(request)
+
+            if shared_filtered_tag is not None:
+                ctx["filtered_tag"] = shared_filtered_tag
 
             search_query = self.get_search_query(request)
 
@@ -1401,13 +1441,14 @@ class MainArticlesPageMixin(
             ctx["article_count"] = len(articles)
 
             displayed_tags = self.displayed_tags.order_by("tag__name").all()
+            displayed_shared_tags = self.displayed_shared_tags.order_by("name").all()
 
-            if len(displayed_tags) != 0:
+            if len(displayed_tags) != 0 or len(displayed_shared_tags) != 0:
                 tags = [
                     tag.tag
                     for tag
                     in displayed_tags
-                ]
+                ] + list(displayed_shared_tags)
             else:
                 tags = []
                 tag_count = {}
diff --git a/shared/templates/styleguide2/includes/atoms/tags/tag.html b/shared/templates/styleguide2/includes/atoms/tags/tag.html
index 050743612299ee4ba013d58b977cc17791765eb9..b9d7831a428e1ad6ab08dc1a1bc03c825436b76a 100644
--- a/shared/templates/styleguide2/includes/atoms/tags/tag.html
+++ b/shared/templates/styleguide2/includes/atoms/tags/tag.html
@@ -1,6 +1,6 @@
 {% if tags_are_selectable %}
   <a
-    href="?tag_id={{ id }}"
+    href="?{% if tag_is_shared %}shared_{% endif %}tag_id={{ id }}"
 {% else %}
   <span
 {% endif %}
diff --git a/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html b/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html
index da7172cdc1674652a4b6ecc432c0eff3062d4dee..2afa6085f9ec1ea8775dbb128047025754341596 100644
--- a/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html
+++ b/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html
@@ -18,12 +18,18 @@
     </div>
 
     <a href="{{ article.url }}" class="mb-2 underline-offset-4">
-      <h2 class="font-alt text-4xl">{{ article.title }}</h2>
+      <h2 class="font-alt text-4xl">
+        {{ article.title }}
+      </h2>
     </a>
 
-    {% if article.tags %}
+    {% if article.shared_from and article.shared_tags %}
       <div class="mb-6">
-        {% include 'styleguide2/includes/molecules/tags/inline_tags.html' with tags=article.get_tags tags_are_selectable=True %}
+        {% include 'styleguide2/includes/molecules/tags/inline_tags.html' with tags=article.shared_tags.all tags_are_selectable=True tag_is_shared=True %}
+      </div>
+    {% elif article.tags %}
+      <div class="mb-6">
+        {% include 'styleguide2/includes/molecules/tags/inline_tags.html' with tags=article.tags.all tags_are_selectable=True tag_is_shared=False %}
       </div>
     {% endif %}
 
diff --git a/shared/templates/styleguide2/includes/molecules/tags/tags.html b/shared/templates/styleguide2/includes/molecules/tags/tags.html
index 96d952c1d7a277b6f52be32e5b2f1836ee6172f1..5aa69a06161ff0ddd00ca35553222a98c2fa6f5e 100644
--- a/shared/templates/styleguide2/includes/molecules/tags/tags.html
+++ b/shared/templates/styleguide2/includes/molecules/tags/tags.html
@@ -12,7 +12,7 @@
   "
 >
   {% for tag in tags %}
-    {% include 'styleguide2/includes/atoms/tags/tag.html' with text=tag.name id=tag.id color_classes=tag_color_classes%}
+    {% include 'styleguide2/includes/atoms/tags/tag.html' with tag_is_shared=tag.is_shared text=tag.name id=tag.id color_classes=tag_color_classes %}
   {% endfor %}
 
   {% if extra_tag and extra_tag not in tags %}
@@ -22,7 +22,7 @@
 
 {% if filtered_tag %}
   <a
-    href="?tag_id="
+    href="?"
     class="
       {% if reset_classes %}
         {{ reset_classes }}
diff --git a/shared/templatetags/shared_filters.py b/shared/templatetags/shared_filters.py
index 2f06f9ad6a92564d9e3e51757ad0d935f2f7f84f..a8bb00aa3495549f37e9beac81cb80a633b2b0cc 100644
--- a/shared/templatetags/shared_filters.py
+++ b/shared/templatetags/shared_filters.py
@@ -8,4 +8,4 @@ register = template.Library()
 @register.filter
 def markdown(value):
     """Prekonvertuje vstupni text na markdown, necekane"""
-    return mark_safe(md.markdown(value))
+    return mark_safe(md.markdown(value))
\ No newline at end of file
diff --git a/uniweb/migrations/0109_uniwebarticlesindexpage_displayed_shared_tags_and_more.py b/uniweb/migrations/0109_uniwebarticlesindexpage_displayed_shared_tags_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..290f6dc78c708f5a3af98ff9b9360624048b7917
--- /dev/null
+++ b/uniweb/migrations/0109_uniwebarticlesindexpage_displayed_shared_tags_and_more.py
@@ -0,0 +1,25 @@
+# Generated by Django 5.0.7 on 2024-08-08 12:30
+
+import modelcluster.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('shared', '0010_alter_octopusperson_photo'),
+        ('uniweb', '0108_alter_uniwebarticlesindexpage_show_tags'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='uniwebarticlesindexpage',
+            name='displayed_shared_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'),
+        ),
+        migrations.AlterField(
+            model_name='uniwebarticlesindexpage',
+            name='displayed_tags',
+            field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='uniweb.uniwebarticletag', verbose_name='Z tohoto webu'),
+        ),
+    ]
diff --git a/uniweb/models.py b/uniweb/models.py
index a676d4b47055cd390b27f63836398d157c2b370c..0f519d7046a45a8e1800f43ec194b0c877a9fede 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -340,8 +340,15 @@ class UniwebArticlesIndexPage(MainArticlesPageMixin):
 
     displayed_tags = ParentalManyToManyField(
         "uniweb.UniwebArticleTag",
-        verbose_name="Zobrazené štítky",
-        help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 20.",
+        verbose_name="Z tohoto webu",
+        related_name="+",
+        blank=True,
+    )
+
+    displayed_shared_tags = ParentalManyToManyField(
+        "shared.SharedTag",
+        verbose_name="Sdílecí",
+        related_name="+",
         blank=True,
     )