diff --git a/app/apps/api/serializers.py b/app/apps/api/serializers.py
index 220b4642cad65332ddbcfe54e75cdc545788d109..8076d780b3ad5baaf96cd3999fac2297f4f9d52a 100644
--- a/app/apps/api/serializers.py
+++ b/app/apps/api/serializers.py
@@ -11,7 +11,8 @@ from easy_thumbnails.files import get_thumbnailer
 
 from api.fields import DisplayChoiceField
 from users.models import User
-from core.models import (Document,
+from core.models import (Project,
+                         Document,
                          DocumentPart,
                          Block,
                          Line,
@@ -58,6 +59,12 @@ class ScriptSerializer(serializers.ModelSerializer):
         fields = '__all__'
 
 
+class ProjectSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Project
+        fields = '__all__'
+
+
 class PartMoveSerializer(serializers.ModelSerializer):
     index = serializers.IntegerField()
 
@@ -112,11 +119,18 @@ class DocumentSerializer(serializers.ModelSerializer):
     valid_block_types = BlockTypeSerializer(many=True, read_only=True)
     valid_line_types = LineTypeSerializer(many=True, read_only=True)
     parts_count = serializers.SerializerMethodField()
+    project = serializers.SlugRelatedField(slug_field='slug',
+                                           queryset=Project.objects.all())
 
     class Meta:
         model = Document
-        fields = ('pk', 'name', 'transcriptions', 'main_script', 'read_direction',
-                  'valid_block_types', 'valid_line_types', 'parts_count')
+        fields = ('pk', 'name', 'project', 'transcriptions', 'main_script', 'read_direction',
+                  'valid_block_types', 'valid_line_types', 'parts_count',
+                  'created_at', 'updated_at')
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.fields['project'].queryset = Project.objects.for_user(self.context['user'])
 
     def get_parts_count(self, document):
         return document.parts.count()
diff --git a/app/apps/api/urls.py b/app/apps/api/urls.py
index 928ec985a8265e478e0bdf05e380b396641746cc..e2a8c20f3f14c9c52ac077566a338181cc81c839 100644
--- a/app/apps/api/urls.py
+++ b/app/apps/api/urls.py
@@ -2,7 +2,8 @@ from django.urls import include, path
 from rest_framework_nested import routers
 from rest_framework.authtoken import views
 
-from api.views import (DocumentViewSet,
+from api.views import (ProjectViewSet,
+                       DocumentViewSet,
                        UserViewSet,
                        PartViewSet,
                        DocumentTranscriptionViewSet,
@@ -16,6 +17,7 @@ from api.views import (DocumentViewSet,
 
 router = routers.DefaultRouter()
 router.register(r'scripts', ScriptViewSet)
+router.register(r'projects', ProjectViewSet)
 router.register(r'documents', DocumentViewSet)
 router.register(r'user', UserViewSet)
 router.register(r'types/block', BlockTypeViewSet)
diff --git a/app/apps/api/views.py b/app/apps/api/views.py
index f33ba76d4db9f3d9c3e0acd681d53083e812252e..1870d0e1e24c10c9e5d887dbff2b665bb95b1376 100644
--- a/app/apps/api/views.py
+++ b/app/apps/api/views.py
@@ -16,6 +16,7 @@ from rest_framework.pagination import PageNumberPagination
 from rest_framework.serializers import PrimaryKeyRelatedField
 
 from api.serializers import (UserOnboardingSerializer,
+                             ProjectSerializer,
                              DocumentSerializer,
                              PartDetailSerializer,
                              PartSerializer,
@@ -35,7 +36,8 @@ from api.serializers import (UserOnboardingSerializer,
                              TranscribeSerializer,
                              OcrModelSerializer)
 
-from core.models import (Document,
+from core.models import (Project,
+                         Document,
                          DocumentPart,
                          Block,
                          Line,
@@ -75,6 +77,12 @@ class ScriptViewSet(ReadOnlyModelViewSet):
     serializer_class = ScriptSerializer
 
 
+class ProjectViewSet(ModelViewSet):
+    queryset = Project.objects.all()
+    serializer_class = ProjectSerializer
+    paginate_by = 10
+
+
 class DocumentViewSet(ModelViewSet):
     queryset = Document.objects.all()
     serializer_class = DocumentSerializer
@@ -86,6 +94,11 @@ class DocumentViewSet(ModelViewSet):
             Prefetch('valid_line_types', queryset=LineType.objects.order_by('name')),
         )
 
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context['user'] = self.request.user
+        return context
+
     def form_error(self, msg):
         return Response({'status': 'error', 'error': msg}, status=400)
 
diff --git a/app/apps/core/migrations/0047_auto_20210510_1512.py b/app/apps/core/migrations/0047_auto_20210510_1512.py
new file mode 100644
index 0000000000000000000000000000000000000000..e0b7560b07481f384ba4f2565cbb48015ab1e706
--- /dev/null
+++ b/app/apps/core/migrations/0047_auto_20210510_1512.py
@@ -0,0 +1,36 @@
+# Generated by Django 2.2.20 on 2021-05-10 15:12
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0046_data_share_doc_to_proj'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='project',
+            options={'ordering': ('-updated_at',)},
+        ),
+        migrations.RemoveField(
+            model_name='document',
+            name='shared_with_groups',
+        ),
+        migrations.RemoveField(
+            model_name='document',
+            name='shared_with_users',
+        ),
+        migrations.AlterField(
+            model_name='document',
+            name='project',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='core.Project'),
+        ),
+        migrations.AlterField(
+            model_name='document',
+            name='workflow_state',
+            field=models.PositiveSmallIntegerField(choices=[(0, 'Draft'), (2, 'Published'), (3, 'Archived')], default=0),
+        ),
+    ]