diff --git a/bigbluebutton/django/migrations/0001_initial.py b/bigbluebutton/django/migrations/0001_initial.py
index 08a51c74af9b049eb65ef6a24d1e2c396cea31d0..102537a1ee80a4e3ad27044835a4b66ddbdc2492 100644
--- a/bigbluebutton/django/migrations/0001_initial.py
+++ b/bigbluebutton/django/migrations/0001_initial.py
@@ -1,9 +1,8 @@
-# Generated by Django 3.0.7 on 2020-10-06 07:43
+# Generated by Django 3.1.2 on 2020-10-07 11:14
 
 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
@@ -21,18 +20,12 @@ class Migration(migrations.Migration):
 
     operations = [
         migrations.CreateModel(
-            name='BigBlueButtonGroup',
+            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='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()),
+                ('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')),
             ],
         ),
         migrations.CreateModel(
@@ -42,36 +35,27 @@ class Migration(migrations.Migration):
                 ('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)')),
+                ('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')),
+                ('api', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='meetings', to='django.bigbluebutton')),
             ],
-            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='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')),
-                ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='apis', to='bigbluebutton.BigBlueButtonGroup')),
+                ('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')),
             ],
+            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='django.bigbluebuttongroup'),
         ),
         migrations.CreateModel(
             name='APIToken',
@@ -81,7 +65,7 @@ class Migration(migrations.Migration):
                 ('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')),
+                ('server_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django.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')),
             ],
         ),
diff --git a/poetry.lock b/poetry.lock
index 0f5b9641f61422ed9d70cd8d04bbc13ce111cf61..df3de9d9f89e4a8f4f992ac2841653ec1794abfc 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -955,11 +955,11 @@ test = ["pytest"]
 
 [[package]]
 category = "main"
-description = "Non-validating SQL parser"
+description = "A non-validating SQL parser."
 name = "sqlparse"
 optional = true
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-version = "0.3.1"
+python-versions = ">=3.5"
+version = "0.4.0"
 
 [[package]]
 category = "dev"
@@ -1612,8 +1612,8 @@ sphinxcontrib-serializinghtml = [
     {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"},
 ]
 sqlparse = [
-    {file = "sqlparse-0.3.1-py2.py3-none-any.whl", hash = "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e"},
-    {file = "sqlparse-0.3.1.tar.gz", hash = "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548"},
+    {file = "sqlparse-0.4.0-py3-none-any.whl", hash = "sha256:0523026398aea9c8b5f7a4a6d5c0829c285b4fbd960c17b5967a369342e21e01"},
+    {file = "sqlparse-0.4.0.tar.gz", hash = "sha256:d59e473424ae7470778fa4dd0dd7bb666ff324f0a6106c29deb5946ea5367f04"},
 ]
 stevedore = [
     {file = "stevedore-3.2.2-py3-none-any.whl", hash = "sha256:5e1ab03eaae06ef6ce23859402de785f08d97780ed774948ef16c4652c41bc62"},
diff --git a/pyproject.toml b/pyproject.toml
index 7072b6720fb2e86ae07c2b57a25f3fcfcf521cbc..cc1bc7988656985f8f73fd546e6c0cc655a52271 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "bigbluebutton2"
-version = "0.1a1"
+version = "0.1a2"
 description = "Sophisticated Python client library for BigBlueButtonâ„¢ with Django integration"
 authors = ["Dominik George <dominik.george@teckids.org>", "Tom Teichler <tom.teichler@teckids.org"]
 license = "MIT"