diff --git a/apimail/api/serializers/__init__.py b/apimail/api/serializers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..391f37d44581d74b3b352422f1299bffdc05869e
--- /dev/null
+++ b/apimail/api/serializers/__init__.py
@@ -0,0 +1,18 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from .account import EmailAccountSerializer, EmailAccountAccessSerializer
+
+from .attachment import AttachmentFileSerializer
+
+from .event import EventSerializer
+
+from .tag import UserTagSerializer
+
+from .composed_message import (
+    ComposedMessageAPIResponseSerializer,
+    ComposedMessageSerializer,
+)
+
+from .stored_message import StoredMessageSerializer
diff --git a/apimail/api/serializers/account.py b/apimail/api/serializers/account.py
new file mode 100644
index 0000000000000000000000000000000000000000..00afcb6f07a776bb5fd2420e0b19809d2e772019
--- /dev/null
+++ b/apimail/api/serializers/account.py
@@ -0,0 +1,23 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from rest_framework import serializers
+
+from ...models import EmailAccount, EmailAccountAccess
+
+
+class EmailAccountSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = EmailAccount
+        fields = ['pk', 'name', 'email', 'description']
+
+
+class EmailAccountAccessSerializer(serializers.ModelSerializer):
+    """For request.user, return list of email account accesses."""
+    account = EmailAccountSerializer()
+    rights = serializers.CharField(source='get_rights_display')
+
+    class Meta:
+        model = EmailAccountAccess
+        fields = ['account', 'rights', 'date_from', 'date_until']
diff --git a/apimail/api/serializers/attachment.py b/apimail/api/serializers/attachment.py
new file mode 100644
index 0000000000000000000000000000000000000000..ece11c5a34ba00bc9bc5c7277ab7353ac3b398e1
--- /dev/null
+++ b/apimail/api/serializers/attachment.py
@@ -0,0 +1,15 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from rest_framework import serializers
+
+from ...models import AttachmentFile
+
+
+class AttachmentFileSerializer(serializers.ModelSerializer):
+    link = serializers.CharField(source='get_absolute_url', read_only=True)
+
+    class Meta:
+        model = AttachmentFile
+        fields = ['uuid', 'data', 'file', 'link']
diff --git a/apimail/api/serializers.py b/apimail/api/serializers/composed_message.py
similarity index 63%
rename from apimail/api/serializers.py
rename to apimail/api/serializers/composed_message.py
index 2bdfd86930940d087ea76c114cd26dd264dde244..705b4621932473ee0692668e81962fe7517ecf47 100644
--- a/apimail/api/serializers.py
+++ b/apimail/api/serializers/composed_message.py
@@ -2,41 +2,17 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.urls import reverse
 from rest_framework import serializers
 from rest_framework.exceptions import NotFound
 
-from ..models import (
-    AttachmentFile,
-    EmailAccount, EmailAccountAccess,
+from ...models import (
     ComposedMessage, ComposedMessageAPIResponse,
-    Event,
-    StoredMessage,
-    UserTag)
-
-
-class EmailAccountSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = EmailAccount
-        fields = ['pk', 'name', 'email', 'description']
-
-
-class EmailAccountAccessSerializer(serializers.ModelSerializer):
-    """For request.user, return list of email account accesses."""
-    account = EmailAccountSerializer()
-    rights = serializers.CharField(source='get_rights_display')
-
-    class Meta:
-        model = EmailAccountAccess
-        fields = ['account', 'rights', 'date_from', 'date_until']
-
-
-class AttachmentFileSerializer(serializers.ModelSerializer):
-    link = serializers.CharField(source='get_absolute_url', read_only=True)
-
-    class Meta:
-        model = AttachmentFile
-        fields = ['uuid', 'data', 'file', 'link']
+    AttachmentFile,
+)
+from ..serializers import (
+    ComposedMessageAPIResponseSerializer,
+    AttachmentFileSerializer
+)
 
 
 class ComposedMessageAPIResponseSerializer(serializers.ModelSerializer):
@@ -110,39 +86,3 @@ class ComposedMessageSerializer(serializers.ModelSerializer):
                         'The attachment file with uuid %s was not found. '
                         'Your message was saved as a draft (not sent).' % att_uuid))
         return cm
-
-
-class EventSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = Event
-        fields = ['uuid', 'data',]
-
-
-class UserTagSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = UserTag
-        fields = ['pk', 'user', 'label', 'unicode_symbol', 'variant']
-
-    def get_queryset(self):
-        user = self.context['request'].user
-        return UserTag.objects.filter(user=user)
-
-
-class StoredMessageSerializer(serializers.ModelSerializer):
-    attachment_files = AttachmentFileSerializer(many=True)
-    event_set = EventSerializer(many=True)
-    read = serializers.SerializerMethodField()
-    tags = serializers.SerializerMethodField()
-
-    def get_read(self, obj):
-        return self.context['request'].user in obj.read_by.all()
-
-    def get_tags(self, obj):
-        return UserTagSerializer(
-            obj.tags.filter(user=self.context['request'].user),
-            many=True
-        ).data
-
-    class Meta:
-        model = StoredMessage
-        fields = ['uuid', 'data', 'datetimestamp', 'attachment_files', 'event_set', 'read', 'tags']
diff --git a/apimail/api/serializers/event.py b/apimail/api/serializers/event.py
new file mode 100644
index 0000000000000000000000000000000000000000..0423a287c6a47e650a5e972d92fbced1d51258b9
--- /dev/null
+++ b/apimail/api/serializers/event.py
@@ -0,0 +1,13 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from rest_framework import serializers
+
+from ...models import Event
+
+
+class EventSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Event
+        fields = ['uuid', 'data',]
diff --git a/apimail/api/serializers/stored_message.py b/apimail/api/serializers/stored_message.py
new file mode 100644
index 0000000000000000000000000000000000000000..830c191c38fa255c2e89f605d2562d62e52f9c2d
--- /dev/null
+++ b/apimail/api/serializers/stored_message.py
@@ -0,0 +1,28 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from rest_framework import serializers
+
+from ...models import StoredMessage
+from ..serializers import EventSerializer, AttachmentFileSerializer, UserTagSerializer
+
+
+class StoredMessageSerializer(serializers.ModelSerializer):
+    attachment_files = AttachmentFileSerializer(many=True)
+    event_set = EventSerializer(many=True)
+    read = serializers.SerializerMethodField()
+    tags = serializers.SerializerMethodField()
+
+    def get_read(self, obj):
+        return self.context['request'].user in obj.read_by.all()
+
+    def get_tags(self, obj):
+        return UserTagSerializer(
+            obj.tags.filter(user=self.context['request'].user),
+            many=True
+        ).data
+
+    class Meta:
+        model = StoredMessage
+        fields = ['uuid', 'data', 'datetimestamp', 'attachment_files', 'event_set', 'read', 'tags']
diff --git a/apimail/api/serializers/tag.py b/apimail/api/serializers/tag.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef29f390ae0aa515b81c5befca7d94bde400a0a5
--- /dev/null
+++ b/apimail/api/serializers/tag.py
@@ -0,0 +1,17 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from rest_framework import serializers
+
+from ...models import UserTag
+
+
+class UserTagSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = UserTag
+        fields = ['pk', 'user', 'label', 'unicode_symbol', 'variant']
+
+    def get_queryset(self):
+        user = self.context['request'].user
+        return UserTag.objects.filter(user=user)