Index: db/models/fields/related.py
===================================================================
--- db/models/fields/related.py	(revision 12807)
+++ db/models/fields/related.py	(working copy)
@@ -631,8 +631,12 @@
             raise AttributeError("Cannot set values on a ManyToManyField which specifies an intermediary model. Use %s.%s's Manager instead." % (opts.app_label, opts.object_name))
 
         manager = self.__get__(instance)
-        manager.clear()
-        manager.add(*value)
+        new_pks = set([v.pk for v in value])
+        old_pks = set([v.pk for v in manager.all()])
+        tb_added = new_pks-old_pks
+        tb_removed = old_pks-new_pks
+        manager.remove(*tb_removed)
+        manager.add(*tb_added)
 
 
 class ReverseManyRelatedObjectsDescriptor(object):
@@ -683,8 +687,12 @@
             raise AttributeError("Cannot set values on a ManyToManyField which specifies an intermediary model.  Use %s.%s's Manager instead." % (opts.app_label, opts.object_name))
 
         manager = self.__get__(instance)
-        manager.clear()
-        manager.add(*value)
+        new_pks = set([v.pk for v in value])
+        old_pks = set([v.pk for v in manager.all()])
+        tb_added = new_pks-old_pks
+        tb_removed = old_pks-new_pks
+        manager.remove(*tb_removed)
+        manager.add(*tb_added)
 
 class ManyToOneRel(object):
     def __init__(self, to, field_name, related_name=None,
