diff --git a/src/core/management/commands/hangar_creation.py b/src/core/management/commands/hangar_creation.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf5256c107ce85af2acc4ee7f2615a37dfeeaaae
--- /dev/null
+++ b/src/core/management/commands/hangar_creation.py
@@ -0,0 +1,63 @@
+import logging
+import subprocess
+
+from django.conf import settings
+from django.core.management.base import BaseCommand, CommandError
+from django.utils import timezone
+
+from core.models.rooms import Room
+
+
+def create_hangar(room: Room):
+    username = room.assembly.slug
+    cmd = ['ssh', settings.HANGAR_HOST, settings.HANGAR_CMD, username]
+
+    result = subprocess.run(cmd, capture_output=True, timeout=42, encoding='utf-8', stderr=subprocess.STDOUT)
+    if result.returncode == 0:
+        password = result.stdout
+        room.backend_link = settings.BACKEND_URL.format(username=username, password=password)
+        room.backend_status = Room.BackendStatus.ACTIVE
+
+        all_contacts = room.assembly.get_all_managing_contacts()
+        room.backend_data = {
+            'timestamp': timezone.now(),
+            'contacts': all_contacts,
+        }
+        room.save()
+
+    else:
+        room.backend_data = {
+            'timestamp': timezone.now(),
+            '_error': result.stdout,
+        }
+        room.backend_status = Room.BackendStatus.ERROR
+        room.save()
+
+        raise Exception('Backend creation failed.')
+
+
+class Command(BaseCommand):
+    def handle(self, *args, **options):
+        for x in ['URL', 'BACKEND_URL', 'HOST', 'CMD']:
+            if not hasattr(settings, 'HANGAR_' + x) or getattr(settings, 'HANGAR_' + x) in [None, '']:
+                raise CommandError(f'No HANGAR_{x} configured.')
+
+        if settings.HANGAR_BACKEND_URL is None or settings.HANGAR_BACKEND_URL == '':
+            raise CommandError('No HANGAR_BACKEND_URL configured.')
+
+        rooms = Room.objects.filter(room_type=Room.RoomType.HANGAR, backend_status=Room.BackendStatus.NEW)
+        for room in rooms:
+            room.backend_status = Room.BackendStatus.SETUP
+            room.save()
+
+            try:
+                create_hangar(room)
+
+            except Exception as err:
+                logging.error('Got error on creating hangar for %s: %s', room, err)
+                room.backend_status = Room.BackendStatus.ERROR
+                room.backend_data = {
+                    'timestamp': timezone.now(),
+                    '_exception': str(err),
+                }
+                room.save()
diff --git a/src/core/models/assemblies.py b/src/core/models/assemblies.py
index 9637928f10197af33d6ab110bee782372dc218c4..a7f4466bbc34955cb4a2f206a2b8d0dd3709b7cd 100644
--- a/src/core/models/assemblies.py
+++ b/src/core/models/assemblies.py
@@ -293,6 +293,12 @@ class Assembly(TaggedItemMixin, models.Model):
     def sorted_tags(self):
         return sorted(t['slug'] for t in self.tags)
 
+    def get_all_managing_contacts(self):
+        result = {}
+        for member in self.members.filter(role__in=AssemblyMember.MANAGEMENT_ROLES):
+            result[member.member.username] = member.member.get_verified_contacts()
+        return result
+
     def create_technical_user_if_necessary(self):
         if self.technical_user is not None:
             return self.technical_user