diff --git a/district/migrations/0118_districtarticlepage_shared_from.py b/district/migrations/0118_districtarticlepage_shared_from.py
new file mode 100644
index 0000000000000000000000000000000000000000..523602d268506a8b305499d6566a51ace4ce4304
--- /dev/null
+++ b/district/migrations/0118_districtarticlepage_shared_from.py
@@ -0,0 +1,25 @@
+# Generated by Django 4.1.8 on 2023-07-23 00:31
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("wagtailcore", "0083_workflowcontenttype"),
+        ("district", "0117_merge_20230711_1636"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="districtarticlepage",
+            name="shared_from",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.PROTECT,
+                related_name="+",
+                to="wagtailcore.page",
+            ),
+        ),
+    ]
diff --git a/district/migrations/0119_districtarticlepage_shared_tags_and_more.py b/district/migrations/0119_districtarticlepage_shared_tags_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..5eef00b988826115456151f77cfda60b1946c096
--- /dev/null
+++ b/district/migrations/0119_districtarticlepage_shared_tags_and_more.py
@@ -0,0 +1,51 @@
+# Generated by Django 4.1.8 on 2023-07-23 00:31
+
+import modelcluster.contrib.taggit
+import modelcluster.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("shared", "0003_initial"),
+        ("district", "0118_districtarticlepage_shared_from"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="districtarticlepage",
+            name="shared_tags",
+            field=modelcluster.contrib.taggit.ClusterTaggableManager(
+                blank=True,
+                help_text="A comma-separated list of tags.",
+                through="shared.SharedTaggedDistrictArticle",
+                to="shared.SharedTag",
+                verbose_name="Tagy pro sdílení mezi weby",
+            ),
+        ),
+        migrations.AddField(
+            model_name="districtarticlepage",
+            name="shared_type",
+            field=models.TextField(blank=True, null=True),
+        ),
+        migrations.AddField(
+            model_name="districtarticlespage",
+            name="shared_tags",
+            field=modelcluster.fields.ParentalManyToManyField(
+                blank=True,
+                help_text="Pro výběr jednoho tagu klikněte na tag a uložte nebo publikujte stránku. Pro výběr více tagů využijte podržte Ctrl a vyberte příslušné tagy.",
+                to="shared.sharedtag",
+                verbose_name="Výběr tagů pro články sdílené mezi sítěmi",
+            ),
+        ),
+        migrations.AddField(
+            model_name="districthomepage",
+            name="shared_tags",
+            field=modelcluster.fields.ParentalManyToManyField(
+                blank=True,
+                help_text="Pro výběr jednoho tagu klikněte na tag a uložte nebo publikujte stránku. Pro výběr více tagů využijte podržte Ctrl a vyberte příslušné tagy.",
+                to="shared.sharedtag",
+                verbose_name="Výběr tagů pro články sdílené mezi sítěmi",
+            ),
+        ),
+    ]
diff --git a/elections2021/migrations/0054_elections2021articlepage_shared_from_and_more.py b/elections2021/migrations/0054_elections2021articlepage_shared_from_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..29c1b6b10a019dd1ece2b7df44938147a6572103
--- /dev/null
+++ b/elections2021/migrations/0054_elections2021articlepage_shared_from_and_more.py
@@ -0,0 +1,30 @@
+# Generated by Django 4.1.8 on 2023-07-23 00:31
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("wagtailcore", "0083_workflowcontenttype"),
+        ("elections2021", "0053_alter_elections2021articletag_content_object"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="elections2021articlepage",
+            name="shared_from",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.PROTECT,
+                related_name="+",
+                to="wagtailcore.page",
+            ),
+        ),
+        migrations.AddField(
+            model_name="elections2021articlepage",
+            name="shared_type",
+            field=models.TextField(blank=True, null=True),
+        ),
+    ]
diff --git a/main/migrations/0058_mainarticlepage_shared_from.py b/main/migrations/0058_mainarticlepage_shared_from.py
new file mode 100644
index 0000000000000000000000000000000000000000..2f8deb2e8af7dfa1f7310fad8ada375a78bb1dfa
--- /dev/null
+++ b/main/migrations/0058_mainarticlepage_shared_from.py
@@ -0,0 +1,25 @@
+# Generated by Django 4.1.8 on 2023-07-23 00:31
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("wagtailcore", "0083_workflowcontenttype"),
+        ("main", "0057_remove_mainpersonpage_instagram_access_and_more"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="mainarticlepage",
+            name="shared_from",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.PROTECT,
+                related_name="+",
+                to="wagtailcore.page",
+            ),
+        ),
+    ]
diff --git a/main/migrations/0059_mainarticlepage_shared_tags_and_more.py b/main/migrations/0059_mainarticlepage_shared_tags_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..1f282a46961b8ec5a156efba42c8743268300b1c
--- /dev/null
+++ b/main/migrations/0059_mainarticlepage_shared_tags_and_more.py
@@ -0,0 +1,51 @@
+# Generated by Django 4.1.8 on 2023-07-23 00:31
+
+import modelcluster.contrib.taggit
+import modelcluster.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("shared", "0003_initial"),
+        ("main", "0058_mainarticlepage_shared_from"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="mainarticlepage",
+            name="shared_tags",
+            field=modelcluster.contrib.taggit.ClusterTaggableManager(
+                blank=True,
+                help_text="A comma-separated list of tags.",
+                through="shared.SharedTaggedMainArticle",
+                to="shared.SharedTag",
+                verbose_name="Tagy pro sdílení mezi weby",
+            ),
+        ),
+        migrations.AddField(
+            model_name="mainarticlepage",
+            name="shared_type",
+            field=models.TextField(blank=True, null=True),
+        ),
+        migrations.AddField(
+            model_name="mainarticlespage",
+            name="shared_tags",
+            field=modelcluster.fields.ParentalManyToManyField(
+                blank=True,
+                help_text="Pro výběr jednoho tagu klikněte na tag a uložte nebo publikujte stránku. Pro výběr více tagů využijte podržte Ctrl a vyberte příslušné tagy.",
+                to="shared.sharedtag",
+                verbose_name="Výběr tagů pro články sdílené mezi sítěmi",
+            ),
+        ),
+        migrations.AddField(
+            model_name="mainhomepage",
+            name="shared_tags",
+            field=modelcluster.fields.ParentalManyToManyField(
+                blank=True,
+                help_text="Pro výběr jednoho tagu klikněte na tag a uložte nebo publikujte stránku. Pro výběr více tagů využijte podržte Ctrl a vyberte příslušné tagy.",
+                to="shared.sharedtag",
+                verbose_name="Výběr tagů pro články sdílené mezi sítěmi",
+            ),
+        ),
+    ]
diff --git a/shared/migrations/0003_initial.py b/shared/migrations/0003_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..3417771fa4d4537cf20da1f74062c64673e929fa
--- /dev/null
+++ b/shared/migrations/0003_initial.py
@@ -0,0 +1,149 @@
+# Generated by Django 4.1.8 on 2023-07-23 00:31
+
+import django.db.models.deletion
+import modelcluster.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    initial = True
+
+    dependencies = [
+        ("uniweb", "0046_merge_20230711_1636"),
+        ("district", "0118_districtarticlepage_shared_from"),
+        ("main", "0058_mainarticlepage_shared_from"),
+        ("shared", "0002_delete_person"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="SharedTag",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "name",
+                    models.CharField(max_length=100, unique=True, verbose_name="name"),
+                ),
+                (
+                    "slug",
+                    models.SlugField(
+                        allow_unicode=True,
+                        max_length=100,
+                        unique=True,
+                        verbose_name="slug",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "sdílený tag",
+                "verbose_name_plural": "sdílené tagy",
+            },
+        ),
+        migrations.CreateModel(
+            name="SharedTaggedUniwebArticle",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "content_object",
+                    modelcluster.fields.ParentalKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="shared_uniweb_articles",
+                        to="uniweb.uniwebarticlepage",
+                    ),
+                ),
+                (
+                    "tag",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="shared_uniweb_tags",
+                        to="shared.sharedtag",
+                    ),
+                ),
+            ],
+            options={
+                "abstract": False,
+            },
+        ),
+        migrations.CreateModel(
+            name="SharedTaggedMainArticle",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "content_object",
+                    modelcluster.fields.ParentalKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="shared_main_articles",
+                        to="main.mainarticlepage",
+                    ),
+                ),
+                (
+                    "tag",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="shared_main_tags",
+                        to="shared.sharedtag",
+                    ),
+                ),
+            ],
+            options={
+                "abstract": False,
+            },
+        ),
+        migrations.CreateModel(
+            name="SharedTaggedDistrictArticle",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "content_object",
+                    modelcluster.fields.ParentalKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="shared_district_articles",
+                        to="district.districtarticlepage",
+                    ),
+                ),
+                (
+                    "tag",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="shared_district_tags",
+                        to="shared.sharedtag",
+                    ),
+                ),
+            ],
+            options={
+                "abstract": False,
+            },
+        ),
+    ]
diff --git a/uniweb/migrations/0047_uniwebarticlepage_shared_from_and_more.py b/uniweb/migrations/0047_uniwebarticlepage_shared_from_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..93b7ab8323d6a299250ef9e54e403e1a71ffe3dd
--- /dev/null
+++ b/uniweb/migrations/0047_uniwebarticlepage_shared_from_and_more.py
@@ -0,0 +1,54 @@
+# Generated by Django 4.1.8 on 2023-07-23 00:31
+
+import django.db.models.deletion
+import modelcluster.contrib.taggit
+import modelcluster.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("shared", "0003_initial"),
+        ("wagtailcore", "0083_workflowcontenttype"),
+        ("uniweb", "0046_merge_20230711_1636"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="uniwebarticlepage",
+            name="shared_from",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.PROTECT,
+                related_name="+",
+                to="wagtailcore.page",
+            ),
+        ),
+        migrations.AddField(
+            model_name="uniwebarticlepage",
+            name="shared_tags",
+            field=modelcluster.contrib.taggit.ClusterTaggableManager(
+                blank=True,
+                help_text="A comma-separated list of tags.",
+                through="shared.SharedTaggedUniwebArticle",
+                to="shared.SharedTag",
+                verbose_name="Tagy pro sdílení mezi weby",
+            ),
+        ),
+        migrations.AddField(
+            model_name="uniwebarticlepage",
+            name="shared_type",
+            field=models.TextField(blank=True, null=True),
+        ),
+        migrations.AddField(
+            model_name="uniwebarticlesindexpage",
+            name="shared_tags",
+            field=modelcluster.fields.ParentalManyToManyField(
+                blank=True,
+                help_text="Pro výběr jednoho tagu klikněte na tag a uložte nebo publikujte stránku. Pro výběr více tagů využijte podržte Ctrl a vyberte příslušné tagy.",
+                to="shared.sharedtag",
+                verbose_name="Výběr tagů pro články sdílené mezi sítěmi",
+            ),
+        ),
+    ]