diff --git a/djangoldp/permissions.py b/djangoldp/permissions.py
index 00f75d11e97aa551367d123d963735c7cd70a310..47ec7ab76178ff6eca82bcd6dd6504b5a233ff10 100644
--- a/djangoldp/permissions.py
+++ b/djangoldp/permissions.py
@@ -33,6 +33,10 @@ class WACPermissions(permissions.DjangoObjectPermissions):
         else:
             return super().has_permission(request, view)
 
+    # This method should be overriden by other permission classes
+    def user_permissions(self, request, view, obj):
+        return []
+
 
 class ObjectFilter(filters.BaseFilterBackend):
     def filter_queryset(self, request, queryset, view):
@@ -97,4 +101,22 @@ class AnonymousReadOnly(WACPermissions):
                 if author == request.user:
                     return True
         else:
-            return super().has_object_permission(request, view, obj)
\ No newline at end of file
+            return super().has_object_permission(request, view, obj)
+
+    def user_permissions(self, request, view, obj):
+        if request.user.is_anonymous:
+            return self.anonymous_perms
+        else:
+            if hasattr(obj._meta, 'auto_author') and getattr(obj, obj._meta.auto_author) == request.user:
+                return self.author_perms
+            else:
+                return self.authenticated_perms
+
+    def filter_user_perms(self, request, obj, permissions):
+        if request.user.is_anonymous:
+            return [perm for perm in permissions if perm in self.anonymous_perms]
+        else:
+            if hasattr(obj._meta, 'auto_author') and getattr(obj, obj._meta.auto_author) == request.user:
+                return [perm for perm in permissions if perm in self.author_perms]
+            else:
+                return [perm for perm in permissions if perm in self.authenticated_perms]
\ No newline at end of file
diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 3a4438d41b52643974cf1587b289c189326a9293..9768a80309dc7feb7bf9aa3bc4c800a2291d009b 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -19,7 +19,6 @@ from rest_framework.utils.serializer_helpers import ReturnDict
 
 from djangoldp.fields import LDPUrlField, IdURLField
 from djangoldp.models import Model
-from djangoldp import permissions
 
 
 class LDListMixin:
@@ -198,20 +197,17 @@ class LDPSerializer(HyperlinkedModelSerializer):
 
     def to_representation(self, obj):
         data = super().to_representation(obj)
+        permissions = [{'mode': {'@type': 'view'}}, {'mode': {'@type': 'add'}}, {'mode': {'@type': 'change'}}, {'mode': {'@type': ''}}]
 
         if hasattr(obj._meta, 'rdf_type'):
             data['@type'] = obj._meta.rdf_type
+
         data['permissions'] = [{'mode': {'@type': name.split('_')[0]}} for name in
                                get_perms(self.context['request'].user, obj)]
 
-        if self.context['request'].user.is_anonymous:
-            data['permissions'] += permissions.AnonymousReadOnly.anonymous_perms
-        if hasattr(obj._meta, 'auto_author'):
-            author = getattr(obj, obj._meta.auto_author)
-            if author == self.context['request'].user:
-                data['permissions'] += permissions.AnonymousReadOnly.author_perms
-        else:
-            data['permissions'] += permissions.AnonymousReadOnly.authenticated_perms
+        for permission_class in obj._meta.permission_classes:
+            perms = permission_class().filter_user_perms(self.context['request'], obj, permissions)
+        data['permissions'] += perms
 
         if hasattr(obj._meta, 'rdf_context'):
             data['@context'] = obj._meta.rdf_context