diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py
index 0f6d711a2d7b314a5104aa50b7a46fb6c7a5828b..02b96e28e0a74bdf14a294a237adc90b096cc209 100644
--- a/djangoldp/serializers.py
+++ b/djangoldp/serializers.py
@@ -14,7 +14,7 @@ class LDListMixin:
         # data = json.loads(data)
         try:
             data = data['ldp:contains']
-        except TypeError:
+        except (TypeError, KeyError):
             pass
         if isinstance(data, dict):
             data = [data]
@@ -187,9 +187,12 @@ class LDPSerializer(HyperlinkedModelSerializer):
 
             def to_internal_value(self, data):
                 model = self.Meta.model
-                return self.serializer_related_field(
+                instance = self.serializer_related_field(
                     view_name='{}-detail'.format(model._meta.object_name.lower()),
                     queryset=model.objects.all()).to_internal_value(data)
+                for key in data:
+                    setattr(instance, key, data[key])
+                return instance
 
             def get_value(self, dictionary):
                 return super().get_value(dictionary)
@@ -221,6 +224,7 @@ class LDPSerializer(HyperlinkedModelSerializer):
 
         for (field_name, data) in nested_fields:
             for item in data:
+                item.save()
                 getattr(obj, field_name).add(item)
 
         return obj
@@ -236,7 +240,12 @@ class LDPSerializer(HyperlinkedModelSerializer):
         instance.save()
 
         for (field_name, data) in nested_fields:
+            try:
+                getattr(instance, field_name).clear()
+            except AttributeError:
+                pass
             for item in data:
+                item.save()
                 getattr(instance, field_name).add(item)
 
         return instance
diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py
index 53f48e2118d884cd9f6471a641efa2773558e035..4375f9430c5bc7974f1ad784a1269327f1a06932 100644
--- a/djangoldp/tests/tests_save.py
+++ b/djangoldp/tests/tests_save.py
@@ -9,11 +9,12 @@ class Serializer(TestCase):
     def test_save_m2m(self):
         skill1 = Skill.objects.create(title="skill1")
         skill2 = Skill.objects.create(title="skill2")
+
         job = {"title": "job test",
                "skills": {
                    "ldp:contains": [
                        {"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)},
-                       {"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)},
+                       {"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk), "title": "skill2 UP"},
                    ]}
                }
 
@@ -27,6 +28,8 @@ class Serializer(TestCase):
 
         self.assertEquals(result.title, "job test")
         self.assertIs(result.skills.count(), 2)
+        self.assertEquals(result.skills.all()[0].title, "skill1")     # no change
+        self.assertEquals(result.skills.all()[1].title, "skill2 UP")  # title updated
 
     def test_save_without_nested_fields(self):
         skill1 = Skill.objects.create(title="skill1")
diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py
index df79b949b5a8664efe58f0d1e30fb87108ffafe1..1b84325cd6ec1c1184d7b6d74b0581c20d90a988 100644
--- a/djangoldp/tests/tests_update.py
+++ b/djangoldp/tests/tests_update.py
@@ -7,9 +7,11 @@ from djangoldp.tests.models import Skill, JobOffer
 class Serializer(TestCase):
 
     def test_update(self):
+        skill = Skill.objects.create(title="to drop")
         skill1 = Skill.objects.create(title="skill1")
         skill2 = Skill.objects.create(title="skill2")
         job1 = JobOffer.objects.create(title="job test")
+        job1.skills.add(skill)
 
         job = {"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk),
                "title": "job test updated",