diff --git a/bigbluebutton/django/migrations/0001_initial.py b/bigbluebutton/django/migrations/0001_initial.py
index 575c6a245f18ec6ce48c2d155189eaffe7287781..08a51c74af9b049eb65ef6a24d1e2c396cea31d0 100644
--- a/bigbluebutton/django/migrations/0001_initial.py
+++ b/bigbluebutton/django/migrations/0001_initial.py
@@ -1,8 +1,9 @@
-# Generated by Django 3.0.6 on 2020-05-26 16:59
+# Generated by Django 3.0.7 on 2020-10-06 07:43
 
 from django.conf import settings
 import django.contrib.sites.managers
 import django.contrib.sites.models
+import django.core.validators
 from django.db import migrations, models
 import django.db.models.deletion
 import django.db.models.manager
@@ -14,135 +15,74 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
+        ('sites', '0002_alter_domain_unique'),
         migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ("sites", "0002_alter_domain_unique"),
     ]
 
     operations = [
         migrations.CreateModel(
-            name="BigBlueButton",
+            name='BigBlueButtonGroup',
             fields=[
-                (
-                    "id",
-                    models.AutoField(
-                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
-                    ),
-                ),
-                ("name", models.CharField(max_length=60, verbose_name="Server name")),
-                ("url", models.URLField(verbose_name="API base URL")),
-                ("salt", models.CharField(max_length=60, verbose_name="API shared secret")),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=60, verbose_name='Group name')),
+                ('site', models.ForeignKey(default=django.contrib.sites.models.SiteManager.get_current, on_delete=django.db.models.deletion.CASCADE, to='sites.Site')),
+            ],
+            options={
+                'permissions': [('add_servers', 'Can add servers to this group'), ('add_apitokens', 'Can add API tokens valid for this group'), ('add_meetings', 'Can add meetings on servers in this group')],
+            },
+            managers=[
+                ('objects', django.db.models.manager.Manager()),
+                ('on_site', django.contrib.sites.managers.CurrentSiteManager()),
             ],
         ),
         migrations.CreateModel(
-            name="BigBlueButtonGroup",
+            name='Meeting',
             fields=[
-                (
-                    "id",
-                    models.AutoField(
-                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
-                    ),
-                ),
-                ("name", models.CharField(max_length=60, verbose_name="Group name")),
-                (
-                    "site",
-                    models.ForeignKey(
-                        default=django.contrib.sites.models.SiteManager.get_current,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to="sites.Site",
-                    ),
-                ),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=60, verbose_name='Meeting name')),
+                ('welcome_message', models.TextField(blank=True, verbose_name='Welcome message')),
+                ('moderator_message', models.TextField(blank=True, verbose_name='Welcome message for moderators')),
+                ('conference_pin', models.CharField(blank=True, help_text='PIN for phone dial-in (if available)', max_length=10, null=True, unique=True, validators=[django.core.validators.RegexValidator('[0-9]*', 'The PIN must be numerical')], verbose_name='Conference PIN')),
+                ('record', models.BooleanField(default=False, verbose_name='Record media and events')),
+                ('auto_start_recording', models.BooleanField(default=False, verbose_name='Auto-start recording on first join')),
+                ('allow_start_stop_recording', models.BooleanField(default=True, help_text='Allows users to manually start and stop recording. If recording is set to auto-start, this forces the whole meeting to be recorded. If auto-start is disabled, this causes the recording to be discarded.', verbose_name='Allow starting and stopping recording')),
+                ('webcams_only_for_moderator', models.BooleanField(default=False, help_text='Webcam streams of participants are only visible for moderators, not for other participants.', verbose_name='Webcams only for moderators')),
+                ('mute_on_start', models.BooleanField(default=False, help_text='Participants are muted when they join the meeting', verbose_name='Mute on start')),
+                ('allow_mods_to_unmute_users', models.BooleanField(default=False, help_text='Allow moderators to unmute other users (this is a privacy risk)', verbose_name='Allow moderators to unmute')),
+                ('enable_cam', models.BooleanField(default=True, verbose_name='Allow sharing webcam')),
+                ('enable_mic', models.BooleanField(default=True, verbose_name='Allow sharing microphone')),
+                ('enable_private_chat', models.BooleanField(default=True, verbose_name='Allow private chat')),
+                ('enable_public_chat', models.BooleanField(default=True, verbose_name='Allow public chat')),
+                ('enable_note', models.BooleanField(default=True, verbose_name='Allow editing shared notes')),
+                ('max_participants', models.PositiveSmallIntegerField(null=True, verbose_name='Maximum number of participants')),
+                ('duration', models.PositiveIntegerField(null=True, verbose_name='Maximum duration (in minutes)')),
+                ('guid', models.UUIDField(default=uuid.uuid1, editable=False)),
+                ('api_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='meetings', to='bigbluebutton.BigBlueButtonGroup')),
             ],
-            managers=[
-                ("objects", django.db.models.manager.Manager()),
-                ("on_site", django.contrib.sites.managers.CurrentSiteManager()),
-            ],
-        ),
-        migrations.AddField(
-            model_name="bigbluebutton",
-            name="group",
-            field=models.ForeignKey(
-                on_delete=django.db.models.deletion.CASCADE,
-                related_name="apis",
-                to="bigbluebutton.BigBlueButtonGroup",
-            ),
+            options={
+                'permissions': [('join_as_attendee', 'Can join this meeting with viewer role'), ('join_as_moderator', 'Can join this meeting with moderator role'), ('grant_attendee', 'Can grant attendee privileges to others'), ('grant_moderator', 'Can grant moderator privileges to others'), ('enforce_conference_pin', 'Can enforce a static conference PIN'), ('add_urls', 'Can add new URLs for this meeting')],
+            },
         ),
         migrations.CreateModel(
-            name="Meeting",
+            name='BigBlueButton',
             fields=[
-                (
-                    "id",
-                    models.AutoField(
-                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
-                    ),
-                ),
-                ("name", models.CharField(max_length=60, verbose_name="Meeting name")),
-                ("welcome_message", models.TextField(blank=True, verbose_name="Welcome message")),
-                (
-                    "moderator_message",
-                    models.TextField(blank=True, verbose_name="Welcome message for moderators"),
-                ),
-                (
-                    "max_participants",
-                    models.PositiveSmallIntegerField(
-                        default=0, verbose_name="Maximum number of participants"
-                    ),
-                ),
-                ("guid", models.UUIDField(default=uuid.uuid1, editable=False)),
-                (
-                    "api_group",
-                    models.ForeignKey(
-                        on_delete=django.db.models.deletion.CASCADE,
-                        related_name="meetings",
-                        to="bigbluebutton.BigBlueButtonGroup",
-                    ),
-                ),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=60, verbose_name='Server name')),
+                ('url', models.URLField(verbose_name='API base URL')),
+                ('salt', models.CharField(max_length=60, verbose_name='API shared secret')),
+                ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='apis', to='bigbluebutton.BigBlueButtonGroup')),
             ],
         ),
         migrations.CreateModel(
-            name="APIToken",
+            name='APIToken',
             fields=[
-                (
-                    "id",
-                    models.AutoField(
-                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
-                    ),
-                ),
-                (
-                    "name",
-                    models.CharField(max_length=60, unique=True, verbose_name="Descriptive name"),
-                ),
-                ("salt", models.CharField(max_length=60, unique=True, verbose_name="API salt")),
-                (
-                    "scope",
-                    models.CharField(
-                        choices=[
-                            ("token", "Data associated to this token"),
-                            ("user", "Data associated to the owning user"),
-                            ("global", "All data"),
-                        ],
-                        default="token",
-                        max_length=15,
-                        verbose_name="Privilege scope",
-                    ),
-                ),
-                ("guid", models.UUIDField(default=uuid.uuid1, editable=False)),
-                (
-                    "server_group",
-                    models.ForeignKey(
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to="bigbluebutton.BigBlueButtonGroup"
-                    ),
-                ),
-                (
-                    "user",
-                    models.ForeignKey(
-                        blank=True,
-                        null=True,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to=settings.AUTH_USER_MODEL,
-                        verbose_name="User owning this token",
-                    ),
-                ),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=60, unique=True, verbose_name='Descriptive name')),
+                ('salt', models.CharField(max_length=60, unique=True, verbose_name='API salt')),
+                ('scope', models.CharField(choices=[('token', 'Data associated to this token'), ('user', 'Data associated to the owning user'), ('global', 'All data')], default='token', max_length=15, verbose_name='Privilege scope')),
+                ('guid', models.UUIDField(default=uuid.uuid1, editable=False)),
+                ('server_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bigbluebutton.BigBlueButtonGroup')),
+                ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User owning this token')),
             ],
         ),
     ]