diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index 07ed496000c491bfd4cf714ac00345d75d6269fb..f934235d99da38637cb7268446753be54af8a6b8 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -55,6 +55,7 @@ import simplejson
 import time
 import traceback
 import types
+from collections import defaultdict
 
 import psycopg2
 from lxml import etree
@@ -4166,6 +4167,7 @@ class BaseModel(object):
         """
         readonly = None
         self.check_field_access_rights(cr, user, 'write', vals.keys())
+        deleted_related = defaultdict(list)
         for field in vals.copy():
             fobj = None
             if field in self._columns:
@@ -4174,6 +4176,10 @@ class BaseModel(object):
                 fobj = self._inherit_fields[field][2]
             if not fobj:
                 continue
+            if fobj._type in ['one2many', 'many2many'] and vals[field]:
+                for wtuple in vals[field]:
+                    if isinstance(wtuple, (tuple, list)) and wtuple[0] == 2:
+                        deleted_related[fobj._obj].append(wtuple[1])
             groups = fobj.write
 
             if groups:
@@ -4380,7 +4386,8 @@ class BaseModel(object):
             for id in ids_to_update:
                 if id not in done[key]:
                     done[key][id] = True
-                    todo.append(id)
+                    if id not in deleted_related[object]:
+                        todo.append(id)
             self.pool.get(object)._store_set_values(cr, user, todo, fields_to_recompute, context)
 
         self._workflow_trigger(cr, user, ids, 'trg_write', context=context)