diff --git a/odoo/models.py b/odoo/models.py
index 6b82a115f55c044b7436bf44144f056d0096ef04..fb20a4bfbd0f093d8e4f658eb8e9a56d3b808f49 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -4950,7 +4950,7 @@ class BaseModel(object):
             vals = [func(rec) for rec in self]
             if isinstance(vals[0], BaseModel):
                 # return the union of all recordsets in O(n)
-                ids = set(itertools.chain(*[rec._ids for rec in vals]))
+                ids = OrderedSet(itertools.chain(*[rec._ids for rec in vals]))
                 return vals[0].browse(ids)
             return vals
         else:
@@ -5117,7 +5117,7 @@ class BaseModel(object):
         """
         if not isinstance(other, BaseModel) or self._name != other._name:
             raise TypeError("Mixing apples and oranges: %s & %s" % (self, other))
-        return self.browse(set(self._ids) & set(other._ids))
+        return self.browse(OrderedSet(self._ids) & OrderedSet(other._ids))
 
     def __or__(self, other):
         """ Return the union of two recordsets.
@@ -5125,7 +5125,7 @@ class BaseModel(object):
         """
         if not isinstance(other, BaseModel) or self._name != other._name:
             raise TypeError("Mixing apples and oranges: %s | %s" % (self, other))
-        return self.browse(set(self._ids) | set(other._ids))
+        return self.browse(OrderedSet(self._ids) | OrderedSet(other._ids))
 
     def __eq__(self, other):
         """ Test whether two recordsets are equivalent (up to reordering). """
diff --git a/odoo/tools/misc.py b/odoo/tools/misc.py
index b69ad469e8c543ebb93dcd192acde0f494491ed6..ecc0193c10803ef1c1fb192abddafbf3ef0933d3 100644
--- a/odoo/tools/misc.py
+++ b/odoo/tools/misc.py
@@ -1091,6 +1091,12 @@ class OrderedSet(OrderedDict):
     def discard(self, elem):
         self.pop(elem, None)
 
+    def __or__(self, other):
+        return OrderedSet(self.keys() + list(other))
+
+    def __and__(self, other):
+        return OrderedSet(e for e in self.keys() if e in other)
+
 class LastOrderedSet(OrderedSet):
     """ A set collection that remembers the elements last insertion order. """
     def add(self, elem):