diff --git a/beat/web/dataformats/api.py b/beat/web/dataformats/api.py
index 3f84f4d4afc3548d5a0dca2833a76cf1e4f196f8..a1a8f8ed4ecde111dd6cfdf164ef37685dcf68b7 100644
--- a/beat/web/dataformats/api.py
+++ b/beat/web/dataformats/api.py
@@ -25,29 +25,24 @@
 #                                                                             #
 ###############################################################################
 
-from django.shortcuts import get_object_or_404
-from django.utils import six
-from django.core.exceptions import ValidationError
-
-from rest_framework.response import Response
-from rest_framework.exceptions import ParseError
-from rest_framework import serializers
 
 from .models import DataFormat
 from .serializers import DataFormatSerializer
 from .serializers import FullDataFormatSerializer
 from .serializers import DataFormatCreationSerializer
+from .serializers import DataFormatModSerializer
 
-from ..common.responses import BadRequestResponse, ForbiddenResponse
-from ..common.api import (CheckContributionNameView, ShareView, ListContributionView,
-                          ListCreateContributionView, DiffView, RetrieveUpdateDestroyContributionView)
-
-from ..common.utils import validate_restructuredtext, ensure_html
+from ..common.api import (
+    CheckContributionNameView,
+    ShareView,
+    ListContributionView,
+    ListCreateContributionView,
+    DiffView,
+    RetrieveUpdateDestroyContributionView,
+)
 
-import simplejson as json
 
-
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class CheckDataFormatNameView(CheckContributionNameView):
@@ -55,10 +50,11 @@ class CheckDataFormatNameView(CheckContributionNameView):
     This view sanitizes a data format name and
     checks whether it is already used.
     """
+
     model = DataFormat
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class ShareDataFormatView(ShareView):
@@ -66,166 +62,56 @@ class ShareDataFormatView(ShareView):
     This view allows to share a data format with
     other users and/or teams
     """
+
     model = DataFormat
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class ListDataFormatView(ListContributionView):
     """
     List all available data formats
     """
+
     model = DataFormat
     serializer_class = DataFormatSerializer
 
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
+
 
 class ListCreateDataFormatsView(ListCreateContributionView):
     """
     Read/Write end point that list the data formats available
     from a given author and allows the creation of new data formats
     """
+
     model = DataFormat
     serializer_class = DataFormatSerializer
     writing_serializer_class = DataFormatCreationSerializer
-    namespace = 'api_dataformats'
+    namespace = "api_dataformats"
+
 
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class RetrieveUpdateDestroyDataFormatsView(RetrieveUpdateDestroyContributionView):
     """
     Read/Write/Delete endpoint for a given data format
     """
+
     model = DataFormat
     serializer_class = FullDataFormatSerializer
+    writing_serializer_class = DataFormatModSerializer
 
-    def put(self, request, author_name, object_name, version=None):
-        if version is None:
-            raise serializers.ValidationError({'version': 'A version number must be provided'})
-
-        try:
-            data = request.data
-        except ParseError as e:
-            raise serializers.ValidationError({'data': str(e)})
-        else:
-            if not data:
-                raise serializers.ValidationError({'data': 'Empty'})
-
-        if 'short_description' in data:
-            if not(isinstance(data['short_description'], six.string_types)):
-                raise serializers.ValidationError({'short_description': 'Invalid short_description data'})
-            short_description = data['short_description']
-        else:
-            short_description = None
-
-        if 'description' in data:
-            if not(isinstance(data['description'], six.string_types)):
-                raise serializers.ValidationError({'description': 'Invalid description data'})
-            description = data['description']
-            try:
-                validate_restructuredtext(description)
-            except ValidationError as errors:
-                raise serializers.ValidationError({'description': [error for error in errors]})
-        else:
-            description = None
-
-        if 'declaration' in data:
-            if isinstance(data['declaration'], dict):
-                json_declaration = data['declaration']
-                declaration = json.dumps(json_declaration, indent=4)
-            elif isinstance(data['declaration'], six.string_types):
-                declaration = data['declaration']
-                try:
-                    json_declaration = json.loads(declaration)
-                except:
-                    raise serializers.ValidationError({'declaration': 'Invalid declaration data'})
-            else:
-                raise serializers.ValidationError({'declaration': 'Invalid declaration data'})
-
-            if '#description' in json_declaration:
-                if short_description is not None:
-                    raise serializers.ValidationError({'short_description': 'A short description is already provided in the data format declaration'})
-
-                short_description = json_declaration['#description']
-            elif short_description is not None:
-                json_declaration['#description'] = short_description
-                declaration = json.dumps(json_declaration, indent=4)
-        else:
-            declaration = None
-            json_declaration = None
-
-        if (short_description is not None) and (len(short_description) > DataFormat._meta.get_field('short_description').max_length):
-            raise serializers.ValidationError({'short_description': 'Short description too long'})
-
-
-        # Process the query string
-        if 'fields' in request.GET:
-            fields_to_return = request.GET['fields'].split(',')
-        else:
-            # Available fields (not returned by default):
-            #    - html_description
-            fields_to_return = []
-
-
-        # Retrieve the data format
-        dataformat = get_object_or_404(DataFormat,
-                                       author__username__iexact=author_name,
-                                       name__iexact=object_name,
-                                       version=version)
-
-        # Check that the data format can still be modified (if applicable, the documentation
-        # can always be modified)
-        if (declaration is not None) and not(dataformat.modifiable()):
-            return ForbiddenResponse("The data format isn't modifiable anymore (either shared with someone else, or needed by an attestation)")
-
-
-        # Modification of the documentation
-        if (short_description is not None) and (declaration is None):
-            tmp_declaration = dataformat.declaration
-            tmp_declaration['#description'] = short_description
-            dataformat.declaration = tmp_declaration
-
-        if description is not None:
-            dataformat.description = description
-
-
-        # Modification of the declaration
-        if declaration is not None:
-            dataformat.declaration = declaration
-
-
-        # Save the data format model
-        try:
-            dataformat.save()
-        except Exception as e:
-            return BadRequestResponse(str(e))
-
-
-        # Nothing to return?
-        if len(fields_to_return) == 0:
-            return Response(status=204)
-
-        result = {}
-
-        # Retrieve the description in HTML format
-        if 'html_description' in fields_to_return:
-            description = dataformat.description
-            if len(description) > 0:
-                result['html_description'] = ensure_html(description)
-            else:
-                result['html_description'] = ''
 
-        return Response(result)
-
-
-#----------------------------------------------------------
+# ----------------------------------------------------------
 
 
 class DiffDataFormatView(DiffView):
     """
     This view shows the differences between two data formats
     """
+
     model = DataFormat