diff --git a/backend/secfit/users/migrations/0001_initial.py b/backend/secfit/users/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..e95b30d4751e3f36605b7144eb216231b6fe5ca9
--- /dev/null
+++ b/backend/secfit/users/migrations/0001_initial.py
@@ -0,0 +1,211 @@
+# Generated by Django 3.1 on 2020-08-21 03:42
+
+from django.conf import settings
+import django.contrib.auth.models
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ("auth", "0012_alter_user_first_name_max_length"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="User",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("password", models.CharField(max_length=128, verbose_name="password")),
+                (
+                    "last_login",
+                    models.DateTimeField(
+                        blank=True, null=True, verbose_name="last login"
+                    ),
+                ),
+                (
+                    "is_superuser",
+                    models.BooleanField(
+                        default=False,
+                        help_text="Designates that this user has all permissions without explicitly assigning them.",
+                        verbose_name="superuser status",
+                    ),
+                ),
+                (
+                    "username",
+                    models.CharField(
+                        error_messages={
+                            "unique": "A user with that username already exists."
+                        },
+                        help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+                        max_length=150,
+                        unique=True,
+                        validators=[
+                            django.contrib.auth.validators.UnicodeUsernameValidator()
+                        ],
+                        verbose_name="username",
+                    ),
+                ),
+                (
+                    "first_name",
+                    models.CharField(
+                        blank=True, max_length=150, verbose_name="first name"
+                    ),
+                ),
+                (
+                    "last_name",
+                    models.CharField(
+                        blank=True, max_length=150, verbose_name="last name"
+                    ),
+                ),
+                (
+                    "email",
+                    models.EmailField(
+                        blank=True, max_length=254, verbose_name="email address"
+                    ),
+                ),
+                (
+                    "is_staff",
+                    models.BooleanField(
+                        default=False,
+                        help_text="Designates whether the user can log into this admin site.",
+                        verbose_name="staff status",
+                    ),
+                ),
+                (
+                    "is_active",
+                    models.BooleanField(
+                        default=True,
+                        help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
+                        verbose_name="active",
+                    ),
+                ),
+                (
+                    "date_joined",
+                    models.DateTimeField(
+                        default=django.utils.timezone.now, verbose_name="date joined"
+                    ),
+                ),
+                (
+                    "coach",
+                    models.ForeignKey(
+                        null=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="athletes",
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+                (
+                    "groups",
+                    models.ManyToManyField(
+                        blank=True,
+                        help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
+                        related_name="user_set",
+                        related_query_name="user",
+                        to="auth.Group",
+                        verbose_name="groups",
+                    ),
+                ),
+                (
+                    "user_permissions",
+                    models.ManyToManyField(
+                        blank=True,
+                        help_text="Specific permissions for this user.",
+                        related_name="user_set",
+                        related_query_name="user",
+                        to="auth.Permission",
+                        verbose_name="user permissions",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "user",
+                "verbose_name_plural": "users",
+                "abstract": False,
+            },
+            managers=[
+                ("objects", django.contrib.auth.models.UserManager()),
+            ],
+        ),
+        migrations.CreateModel(
+            name="Offer",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "offer_type",
+                    models.CharField(
+                        choices=[("co", "Coach"), ("at", "Athlete")],
+                        default="at",
+                        max_length=8,
+                    ),
+                ),
+                (
+                    "owner",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="sent_offers",
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+                (
+                    "recipient",
+                    models.OneToOneField(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="received_offers",
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+            ],
+        ),
+        migrations.CreateModel(
+            name="OfferResponse",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "response",
+                    models.CharField(
+                        blank=True,
+                        choices=[("a", "Accept"), ("d", "Decline")],
+                        max_length=8,
+                    ),
+                ),
+                (
+                    "offer",
+                    models.OneToOneField(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="response",
+                        to="users.offer",
+                    ),
+                ),
+            ],
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0002_auto_20200907_1200.py b/backend/secfit/users/migrations/0002_auto_20200907_1200.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1ffdfc85bbfa6746a249e02fb018710a3545c1a
--- /dev/null
+++ b/backend/secfit/users/migrations/0002_auto_20200907_1200.py
@@ -0,0 +1,30 @@
+# Generated by Django 3.1 on 2020-09-07 10:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("users", "0001_initial"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="offer",
+            name="stale",
+            field=models.BooleanField(default=False),
+        ),
+        migrations.AddField(
+            model_name="offer",
+            name="status",
+            field=models.CharField(
+                choices=[("a", "Accepted"), ("p", "Pending"), ("d", "Declined")],
+                default="p",
+                max_length=8,
+            ),
+        ),
+        migrations.DeleteModel(
+            name="OfferResponse",
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0003_auto_20200907_1954.py b/backend/secfit/users/migrations/0003_auto_20200907_1954.py
new file mode 100644
index 0000000000000000000000000000000000000000..c7f18c817057b573e3275f36a69f00e13676e5f3
--- /dev/null
+++ b/backend/secfit/users/migrations/0003_auto_20200907_1954.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.1 on 2020-09-07 17:54
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("users", "0002_auto_20200907_1200"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="offer",
+            name="recipient",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="received_offers",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0004_auto_20200907_2021.py b/backend/secfit/users/migrations/0004_auto_20200907_2021.py
new file mode 100644
index 0000000000000000000000000000000000000000..ff6be46f14e2bd0adc097f802b81ce758e4afcb1
--- /dev/null
+++ b/backend/secfit/users/migrations/0004_auto_20200907_2021.py
@@ -0,0 +1,110 @@
+# Generated by Django 3.1 on 2020-09-07 18:21
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("users", "0003_auto_20200907_1954"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="AthleteRequest",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "status",
+                    models.CharField(
+                        choices=[
+                            ("a", "Accepted"),
+                            ("p", "Pending"),
+                            ("d", "Declined"),
+                        ],
+                        default="p",
+                        max_length=8,
+                    ),
+                ),
+                ("stale", models.BooleanField(default=False)),
+                (
+                    "owner",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="sent_athlete_requests",
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+                (
+                    "recipient",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="received_athlete_requests",
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+            ],
+            options={
+                "abstract": False,
+            },
+        ),
+        migrations.CreateModel(
+            name="CoachRequest",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "status",
+                    models.CharField(
+                        choices=[
+                            ("a", "Accepted"),
+                            ("p", "Pending"),
+                            ("d", "Declined"),
+                        ],
+                        default="p",
+                        max_length=8,
+                    ),
+                ),
+                ("stale", models.BooleanField(default=False)),
+                (
+                    "owner",
+                    models.OneToOneField(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="sent_coach_request",
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+                (
+                    "recipient",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="received_coach_requests",
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+            ],
+            options={
+                "abstract": False,
+            },
+        ),
+        migrations.DeleteModel(
+            name="Offer",
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0005_auto_20200907_2039.py b/backend/secfit/users/migrations/0005_auto_20200907_2039.py
new file mode 100644
index 0000000000000000000000000000000000000000..269e723bda3ff1b5b2207d1f7471b0f698682033
--- /dev/null
+++ b/backend/secfit/users/migrations/0005_auto_20200907_2039.py
@@ -0,0 +1,51 @@
+# Generated by Django 3.1 on 2020-09-07 18:39
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("users", "0004_auto_20200907_2021"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="athleterequest",
+            name="owner",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="sent_athleterequests",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+        migrations.AlterField(
+            model_name="athleterequest",
+            name="recipient",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="received_athleterequests",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+        migrations.AlterField(
+            model_name="coachrequest",
+            name="owner",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="sent_coachrequests",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+        migrations.AlterField(
+            model_name="coachrequest",
+            name="recipient",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="received_coachrequests",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0006_auto_20200907_2054.py b/backend/secfit/users/migrations/0006_auto_20200907_2054.py
new file mode 100644
index 0000000000000000000000000000000000000000..ed2ff761a8072336a82493831b79d1b99edb2b34
--- /dev/null
+++ b/backend/secfit/users/migrations/0006_auto_20200907_2054.py
@@ -0,0 +1,30 @@
+# Generated by Django 3.1 on 2020-09-07 18:54
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("users", "0005_auto_20200907_2039"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="athleterequest",
+            name="timestamp",
+            field=models.DateTimeField(
+                auto_now_add=True, default=django.utils.timezone.now
+            ),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name="coachrequest",
+            name="timestamp",
+            field=models.DateTimeField(
+                auto_now_add=True, default=django.utils.timezone.now
+            ),
+            preserve_default=False,
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0007_auto_20200910_0222.py b/backend/secfit/users/migrations/0007_auto_20200910_0222.py
new file mode 100644
index 0000000000000000000000000000000000000000..48a081d1f9387a1eb0fcd66648ec53d0ec8c1410
--- /dev/null
+++ b/backend/secfit/users/migrations/0007_auto_20200910_0222.py
@@ -0,0 +1,131 @@
+# Generated by Django 3.1 on 2020-09-10 00:22
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import users.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("users", "0006_auto_20200907_2054"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="AthleteFile",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "file",
+                    models.FileField(upload_to=users.models.athlete_directory_path),
+                ),
+            ],
+        ),
+        migrations.CreateModel(
+            name="Offer",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "status",
+                    models.CharField(
+                        choices=[
+                            ("a", "Accepted"),
+                            ("p", "Pending"),
+                            ("d", "Declined"),
+                        ],
+                        default="p",
+                        max_length=8,
+                    ),
+                ),
+                (
+                    "offer_type",
+                    models.CharField(
+                        choices=[("a", "Athlete"), ("c", "Coach")],
+                        default="a",
+                        max_length=8,
+                    ),
+                ),
+                ("stale", models.BooleanField(default=False)),
+                ("timestamp", models.DateTimeField(auto_now_add=True)),
+            ],
+        ),
+        migrations.RemoveField(
+            model_name="coachrequest",
+            name="owner",
+        ),
+        migrations.RemoveField(
+            model_name="coachrequest",
+            name="recipient",
+        ),
+        migrations.AlterField(
+            model_name="user",
+            name="coach",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="athletes",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+        migrations.DeleteModel(
+            name="AthleteRequest",
+        ),
+        migrations.DeleteModel(
+            name="CoachRequest",
+        ),
+        migrations.AddField(
+            model_name="offer",
+            name="owner",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="sent_offers",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+        migrations.AddField(
+            model_name="offer",
+            name="recipient",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="received_offers",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+        migrations.AddField(
+            model_name="athletefile",
+            name="athlete",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="coach_files",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+        migrations.AddField(
+            model_name="athletefile",
+            name="owner",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="athlete_files",
+                to=settings.AUTH_USER_MODEL,
+            ),
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0008_auto_20201213_2228.py b/backend/secfit/users/migrations/0008_auto_20201213_2228.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2a2d3bd1f048227365bd679b1a253855cd4b776
--- /dev/null
+++ b/backend/secfit/users/migrations/0008_auto_20201213_2228.py
@@ -0,0 +1,21 @@
+# Generated by Django 3.1 on 2020-12-13 21:28
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('users', '0007_auto_20200910_0222'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='offer',
+            name='offer_type',
+        ),
+        migrations.RemoveField(
+            model_name='offer',
+            name='stale',
+        ),
+    ]
diff --git a/backend/secfit/users/migrations/0009_auto_20210204_1055.py b/backend/secfit/users/migrations/0009_auto_20210204_1055.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a62fda73c54937797cfb8e646fadeb199f25fd0
--- /dev/null
+++ b/backend/secfit/users/migrations/0009_auto_20210204_1055.py
@@ -0,0 +1,43 @@
+# Generated by Django 3.1 on 2021-02-04 10:55
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('users', '0008_auto_20201213_2228'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='user',
+            name='city',
+            field=models.TextField(blank=True, max_length=50),
+        ),
+        migrations.AddField(
+            model_name='user',
+            name='country',
+            field=models.TextField(blank=True, max_length=50),
+        ),
+        migrations.AddField(
+            model_name='user',
+            name='phone_number',
+            field=models.TextField(blank=True, max_length=50),
+        ),
+        migrations.AddField(
+            model_name='user',
+            name='street_address',
+            field=models.TextField(blank=True, max_length=50),
+        ),
+        migrations.AddField(
+            model_name='user',
+            name='favourite_exercise',
+            field=models.TextField(blank=True, max_length=50),
+        ),
+        migrations.AddField(
+            model_name='user',
+            name='main_gym',
+            field=models.TextField(blank=True, max_length=50),
+        ),
+    ]