diff --git a/djangoldp_tzcld/management/commands/assign_community_members_to_public_circles.py b/djangoldp_tzcld/management/commands/assign_community_members_to_public_circles.py
new file mode 100644
index 0000000000000000000000000000000000000000..afde8eefa96be0e208febb077a328ac7033defe9
--- /dev/null
+++ b/djangoldp_tzcld/management/commands/assign_community_members_to_public_circles.py
@@ -0,0 +1,26 @@
+from django.core.management.base import BaseCommand
+from djangoldp_community.models import Community
+from djangoldp_circle.models import Circle
+from django.conf import settings
+
+class Command(BaseCommand):
+    help = 'Assign all the members/admins to the public circles of the communities they are part of'
+
+    def handle(self, *args, **options):
+        communities = Community.objects.all()
+
+        for community in communities:
+            community_members = community.members.user_set
+            community_admins = community.admins.user_set
+            community_public_circles = Circle.objects.filter(community=community, public=True)
+
+            for member in community_members.all():
+                for circle in community_public_circles:
+                    circle.members.user_set.add(member)
+
+            for admin in community_admins.all():
+                for circle in community_public_circles:
+                    circle.members.user_set.add(admin)
+                    circle.admins.user_set.add(admin)
+
+            self.stdout.write(self.style.SUCCESS(f'Community {community.id}: Assigned {community_members.count()} members and {community_admins.count()} admins to {community_public_circles.count()} public circles'))
diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py
index c38e1d1fac5bd464f47403f83e9ef364a4055d3a..2ac2dee2ab3f628cc2645d3cfeafd082693dc4b7 100644
--- a/djangoldp_tzcld/models.py
+++ b/djangoldp_tzcld/models.py
@@ -1,13 +1,16 @@
 from django.conf import settings
 from django.contrib.auth import get_user_model
 from django.db import models
-from django.db.models.signals import post_save
+from django.db.models.signals import post_save, m2m_changed
 from django.dispatch import receiver
 from django.utils.translation import gettext_lazy as _
 
 from djangoldp.models import Model
 from djangoldp_conversation.models import Conversation, Message
 from djangoldp_community.models import Community, CommunityMember
+from djangoldp_account.models import LDPUser as User
+from djangoldp_circle.models import Circle
+from django.contrib.auth.models import Group
 from djangoldp.permissions import LDPBasePermission, AnonymousReadOnly, ReadOnly, ReadAndCreate, ACLPermissions, OwnerPermissions, InheritPermissions
 from djangoldp_tzcld.permissions import RegionalReferentPermissions
 
@@ -456,7 +459,7 @@ class TzcldTerritoryProjectTeamMember(Model):
         community_path = 'community_identity.community'
 
 #############################
-# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Député-e 
+# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Député-e
 #############################
 class TzcldTerritoryPoliticalLandscapeDeputy(Model):
     deputy = models.CharField(max_length=254, blank=True, null=True, default='')
@@ -481,7 +484,7 @@ class TzcldTerritoryPoliticalLandscapeDeputy(Model):
         inherit_permissions = ['community_identity']
 
 #############################
-# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Sénateur-ice  
+# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Sénateur-ice
 #############################
 class TzcldTerritoryPoliticalLandscapeSenator(Model):
     senator = models.CharField(max_length=254, blank=True, null=True, default='')
@@ -506,7 +509,7 @@ class TzcldTerritoryPoliticalLandscapeSenator(Model):
         inherit_permissions = ['community_identity']
 
 #############################
-# Page Etat d'avancement => Carte d’identité du territoire => Participation aux formations TZCLD 
+# Page Etat d'avancement => Carte d’identité du territoire => Participation aux formations TZCLD
 #############################
 class TzcldTerritoryTraining(Model):
     training_course = models.ForeignKey(TzcldTerritoriesTrainingCourse, on_delete=models.DO_NOTHING,related_name='territory_training_course', blank=True, null=True)
@@ -838,7 +841,6 @@ class TzcldCommunityFollowedPointPart(Model):
     class Meta(Model.Meta):
         verbose_name = _('TZCLD Territory Followed Point Part')
         verbose_name_plural = _("TZCLD Territories Followed Point Parts")
-        
         container_path = "tzcld-followed-point-parts/"
         serializer_fields = ['@id', 'name', 'title', 'order', 'followed_part_points']
         ordering = ['order']
@@ -1042,4 +1044,68 @@ def create_followed_point_answers(sender, instance, created, **kwargs):
             followed_point_answer = TzcldCommunityFollowedPointAnswer.objects.create(
                 community=community,
                 followed_point=instance
-            )
\ No newline at end of file
+            )
+
+# Assign all the community members to the circle when a public circle is created
+@receiver(post_save, sender=Circle)
+def assign_community_members_to_circle(sender, instance, created, **kwargs):
+    if not created or not instance.public or not instance.community:
+        return
+
+    # Get all the users for its community
+    community_members = instance.community.members.user_set
+    community_admins = instance.community.admins.user_set
+
+    # Get all the users for this circle
+    circle_members = instance.members.user_set
+    circle_admins = instance.admins.user_set
+
+    for community_member in community_members.all():
+        if community_member not in circle_members.all():
+            circle_members.add(community_member)
+
+    for community_admin in community_admins.all():
+        if community_admin not in circle_members.all():
+            circle_members.add(community_admin)
+
+        if community_admin not in circle_admins.all():
+            circle_admins.add(community_admin)
+
+# If a community is added to a user, add the user to the public circles of the community
+# If a community is removed from a user, remove the user from the public circles of the community
+@receiver(m2m_changed, sender=User.groups.through)
+def assign_user_to_community_public_circles(sender, instance, action, pk_set, **kwargs):
+    if not isinstance(instance, User):
+        return
+
+    if action == 'pre_add':
+        for pk in pk_set:
+            group = Group.objects.get(id=pk)
+
+            community = Community.objects.filter(members=group).first()
+            if community:
+                community_public_circles = community.circles.filter(public=True)
+                for circle in community_public_circles:
+                    circle.members.user_set.add(instance)
+
+            community = Community.objects.filter(admins=group).first()
+            if community:
+                community_public_circles = community.circles.filter(public=True)
+                for circle in community_public_circles:
+                    circle.admins.user_set.add(instance)
+
+    if action == 'pre_remove':
+        for pk in pk_set:
+            group = Group.objects.get(id=pk)
+
+            community = Community.objects.filter(members=group).first()
+            if community:
+                community_public_circles = community.circles.filter(public=True)
+                for circle in community_public_circles:
+                    circle.members.user_set.remove(instance)
+
+            community = Community.objects.filter(admins=group).first()
+            if community:
+                community_public_circles = community.circles.filter(public=True)
+                for circle in community_public_circles:
+                    circle.admins.user_set.remove(instance)