diff --git a/backend/secfit/content/__init__.py b/backend/secfit/content/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/backend/secfit/content/admin.py b/backend/secfit/content/admin.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e5edc9a552e4208ab73b206d5b6759f7f351ef5
--- /dev/null
+++ b/backend/secfit/content/admin.py
@@ -0,0 +1,5 @@
+from django.contrib import admin
+from .models import Content
+
+# Register your models here.
+admin.site.register(Content)
\ No newline at end of file
diff --git a/backend/secfit/content/apps.py b/backend/secfit/content/apps.py
new file mode 100644
index 0000000000000000000000000000000000000000..3a9bd48ce4bcfd172912fb17ae3567623e142797
--- /dev/null
+++ b/backend/secfit/content/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ContentConfig(AppConfig):
+    name = 'content'
diff --git a/backend/secfit/content/migrations/0001_initial.py b/backend/secfit/content/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5d7bf17535eb8645ff55da7f465c020583e0c89
--- /dev/null
+++ b/backend/secfit/content/migrations/0001_initial.py
@@ -0,0 +1,29 @@
+# Generated by Django 3.1 on 2022-03-11 05:50
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('groups', '0004_delete_content'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Content',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('title', models.TextField(max_length=100)),
+                ('description', models.TextField()),
+                ('image', models.ImageField(blank=True, upload_to='images')),
+                ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ownedByGroup', to='groups.group')),
+                ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contentOwner', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]
diff --git a/backend/secfit/content/migrations/__init__.py b/backend/secfit/content/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/backend/secfit/content/models.py b/backend/secfit/content/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..e6c4b5c56cc94b37dee765940ba8b48f0c430781
--- /dev/null
+++ b/backend/secfit/content/models.py
@@ -0,0 +1,15 @@
+from django.db import models
+from groups.models import Group
+from django.contrib.auth import get_user_model
+
+# Create your models here.
+class Content(models.Model):
+    owner = models.ForeignKey(
+        get_user_model(), on_delete=models.CASCADE, related_name="contentOwner"
+    )
+    group = models.ForeignKey(
+        Group, on_delete=models.CASCADE, related_name="ownedByGroup"
+    )
+    title = models.TextField(max_length=100)
+    description = models.TextField()
+    image = models.ImageField(upload_to='images', blank=True)
\ No newline at end of file
diff --git a/backend/secfit/content/serializers.py b/backend/secfit/content/serializers.py
new file mode 100644
index 0000000000000000000000000000000000000000..083611e197d16b05b0c6dcae6c8212d0ddbcf863
--- /dev/null
+++ b/backend/secfit/content/serializers.py
@@ -0,0 +1,11 @@
+from rest_framework import serializers
+from .models import Content
+
+class ContentSerializer(serializers.ModelSerializer):
+    """Serializer for a group content instance
+
+    Serialized fields: id, member, group
+    """
+    class Meta:
+        model = Content
+        fields = ["id", "owner", "group", "title", "description", "image"]
\ No newline at end of file
diff --git a/backend/secfit/content/tests.py b/backend/secfit/content/tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6
--- /dev/null
+++ b/backend/secfit/content/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/backend/secfit/content/urls.py b/backend/secfit/content/urls.py
new file mode 100644
index 0000000000000000000000000000000000000000..b7a7e6febd6142fe7a9d643e0802adf64362661c
--- /dev/null
+++ b/backend/secfit/content/urls.py
@@ -0,0 +1,8 @@
+from django.urls import path
+from .views import ContentView, ContentDetail
+
+
+urlpatterns = [
+    path("api/content/", ContentView.as_view(), name="content-view"),
+    path("api/content/<int:pk>/", ContentDetail.as_view(), name="contentDetail-view"),
+]
\ No newline at end of file
diff --git a/backend/secfit/content/views.py b/backend/secfit/content/views.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ccbdf3d58a3096eb52140996157a3b498bd3462
--- /dev/null
+++ b/backend/secfit/content/views.py
@@ -0,0 +1,44 @@
+from rest_framework import generics, mixins
+from .models import Content
+from rest_framework import permissions
+from .serializers import ContentSerializer
+
+# Create your views here.
+class ContentView(
+    mixins.CreateModelMixin,
+    mixins.RetrieveModelMixin,
+    mixins.ListModelMixin,
+    generics.GenericAPIView,
+):
+    """
+    View getting and adding content to a group
+
+    HTTP methods: GET, POST
+    """
+    queryset = Content.objects.all()
+    serializer_class = ContentSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.list(request, *args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        return self.create(request, *args, **kwargs)
+
+class ContentDetail(
+    mixins.RetrieveModelMixin,
+    mixins.UpdateModelMixin,
+    generics.GenericAPIView,
+):
+    """
+    View getting and adding content to a group
+
+    HTTP methods: GET, POST
+    """
+    queryset = Content.objects.all()
+    serializer_class = ContentSerializer
+
+    def get(self, request, *args, **kwargs):
+        return self.retrieve(request, *args, **kwargs)
+
+    def put(self, request, *args, **kwargs):
+        return self.update(request, *args, **kwargs)
\ No newline at end of file
diff --git a/backend/secfit/requirements.txt b/backend/secfit/requirements.txt
index 9feb375bde1e8fb7befe6c102dd29beeee7c6940..88fa935213723454c324824ac92816923797c869 100644
Binary files a/backend/secfit/requirements.txt and b/backend/secfit/requirements.txt differ
diff --git a/backend/secfit/secfit/settings.py b/backend/secfit/secfit/settings.py
index 640c5634c68613aa7b24b11623b4d9253eaab98b..a572d28e797efa0784aa4619fdaad392831d3a95 100644
--- a/backend/secfit/secfit/settings.py
+++ b/backend/secfit/secfit/settings.py
@@ -62,6 +62,7 @@ INSTALLED_APPS = [
     "users.apps.UsersConfig",
     "comments.apps.CommentsConfig",
     "groups.apps.GroupsConfig",
+    "content.apps.ContentConfig",
     "corsheaders",
 ]
 
diff --git a/backend/secfit/secfit/urls.py b/backend/secfit/secfit/urls.py
index 227073f328dc068949929ef99e0b52112109eb5e..a92ac297a0a447dba79ba2166a32ebd2c343c244 100644
--- a/backend/secfit/secfit/urls.py
+++ b/backend/secfit/secfit/urls.py
@@ -23,6 +23,7 @@ urlpatterns = [
     path("", include("workouts.urls")),
     path("", include("meals.urls")),
     path("", include("groups.urls")),
+    path("", include("content.urls")),
 ]
 
 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
diff --git a/requirements.txt b/requirements.txt
index 9feb375bde1e8fb7befe6c102dd29beeee7c6940..3336c06f830c08f4048e40e65c3fd3dbfd5b6d8b 100644
Binary files a/requirements.txt and b/requirements.txt differ