diff --git a/beat/web/algorithms/api.py b/beat/web/algorithms/api.py
index feca27acc23a8f677602a2d82373b0f9b6817da3..e9b7c7723807f3a74800b827d5f45febaeee81b5 100644
--- a/beat/web/algorithms/api.py
+++ b/beat/web/algorithms/api.py
@@ -33,8 +33,10 @@ from .serializers import AlgorithmCreationSerializer
 from ..code.api import ShareCodeView, RetrieveUpdateDestroyCodeView
 from ..code.serializers import CodeDiffSerializer
 
-from ..common.api import (CheckContributionNameView, DiffView,
-                          ListContributionView, ListCreateContributionView)
+from ..common.api import (CheckContributionNameView, ListContributionView,
+    ListCreateContributionView)
+
+from ..code.api import DiffView
 
 
 #----------------------------------------------------------
diff --git a/beat/web/code/api.py b/beat/web/code/api.py
index 22ebaac24158c70f09a3f7b0f2b37e2f8950b464..1a0fdd037e3280be4df23274d117e0c84ce9a2e8 100644
--- a/beat/web/code/api.py
+++ b/beat/web/code/api.py
@@ -29,12 +29,16 @@ from django.utils import six
 from django.shortcuts import get_object_or_404
 from django.core.exceptions import ValidationError
 
+from rest_framework import generics
+from rest_framework import permissions
 from rest_framework.response import Response
 from rest_framework.exceptions import PermissionDenied, ParseError
 from rest_framework import serializers
 
+from ..common.responses import ForbiddenResponse
 from ..common.api import ShareView, RetrieveUpdateDestroyContributionView
 from ..common.utils import validate_restructuredtext, ensure_html
+from ..common.serializers import DiffSerializer
 
 from ..code.models import Code
 from .serializers import CodeSharingSerializer, CodeSerializer
@@ -52,6 +56,43 @@ class ShareCodeView(ShareView):
         obj.share(public=public, users=users, teams=teams)
 
 
+class DiffView(generics.RetrieveAPIView):
+    model = Code
+    permission_classes = [permissions.IsAuthenticated]
+    serializer_class = DiffSerializer
+
+    def get(self, request, author1, name1, version1, author2, name2, version2):
+        # Retrieve the objects
+        try:
+            object1 = self.model.objects.get(author__username__iexact=author1,
+                                               name__iexact=name1,
+                                               version=int(version1))
+        except:
+            return Response('%s/%s/%s' % (author1, name1, version1), status=404)
+
+        try:
+            object2 = self.model.objects.get(author__username__iexact=author2,
+                                               name__iexact=name2,
+                                               version=int(version2))
+        except:
+            return Response('%s/%s/%s' % (author2, name2, version2), status=404)
+
+
+        # Check that the user can access them
+        accessibility = object1.accessibility_for(request.user)
+        if not accessibility[1]:
+            return ForbiddenResponse(object1.fullname())
+
+        accessibility = object2.accessibility_for(request.user)
+        if not accessibility[1]:
+            return ForbiddenResponse(object2.fullname())
+
+        # Compute the diff
+        serializer = self.get_serializer({'object1': object1,
+                                          'object2': object2})
+        return Response(serializer.data)
+
+
 class RetrieveUpdateDestroyCodeView(RetrieveUpdateDestroyContributionView):
     model = Code
     serializer_class = CodeSerializer
diff --git a/beat/web/libraries/api.py b/beat/web/libraries/api.py
index e7e592a3a7f4543d5d97c2cc8bf9694063e6e111..2473d1c9a8ebd08d2b84643cfe9f1c92ef20ff4b 100644
--- a/beat/web/libraries/api.py
+++ b/beat/web/libraries/api.py
@@ -33,9 +33,10 @@ from .serializers import LibraryCreationSerializer
 from ..code.api import ShareCodeView, RetrieveUpdateDestroyCodeView
 from ..code.serializers import CodeDiffSerializer
 
-from ..common.api import (CheckContributionNameView, DiffView,
-                          ListContributionView, ListCreateContributionView)
+from ..common.api import (CheckContributionNameView, ListContributionView,
+    ListCreateContributionView)
 
+from ..code.api import DiffView
 
 #----------------------------------------------------------
 
diff --git a/beat/web/plotters/api.py b/beat/web/plotters/api.py
index 0838d40524c9ea3ef1eb4a85ed3202c9552b2a5a..a0960a9a4b234cd34989fe596b26ae612a7b19d2 100644
--- a/beat/web/plotters/api.py
+++ b/beat/web/plotters/api.py
@@ -34,8 +34,9 @@ from django.db.models import Q
 
 from ..code.api import ShareCodeView, RetrieveUpdateDestroyCodeView
 from ..code.serializers import CodeDiffSerializer
+from ..code.api import DiffView
 
-from ..common.api import (CheckContributionNameView, ShareView, DiffView,
+from ..common.api import (CheckContributionNameView, ShareView,
                           ListContributionView, ListCreateContributionView, RetrieveUpdateDestroyContributionView)
 from ..common.utils import validate_restructuredtext, ensure_html
 from ..common.responses import BadRequestResponse