diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py
index 4a7d35d6d6e1f00b228c979d71202a66dd584ff1..4b0b8e53d6affe2636787a87d7b3f2dc6b98fe3d 100644
--- a/addons/marketing_campaign/marketing_campaign.py
+++ b/addons/marketing_campaign/marketing_campaign.py
@@ -180,7 +180,7 @@ Normal - the campaign runs normally and automatically sends all emails and repor
     def _get_partner_for(self, campaign, record):
         partner_field = campaign.partner_field_id.name
         if partner_field:
-            return getattr(record, partner_field)
+            return record[partner_field]
         elif campaign.object_id.model == 'res.partner':
             return record
         return None
diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py
index 5c4b639b6a466fbfdb6e1d565c0684304dbd42c4..4fab346e17650a4f8e7874c2bfcc33eb986f8108 100644
--- a/openerp/addons/base/ir/ir_model.py
+++ b/openerp/addons/base/ir/ir_model.py
@@ -1091,30 +1091,8 @@ class ir_model_data(osv.osv):
         return res_id
 
     def ir_set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=None, xml_id=False):
-        if isinstance(models[0], (list, tuple)):
-            model,res_id = models[0]
-        else:
-            res_id=None
-            model = models[0]
-
-        if res_id:
-            where = ' and res_id=%s' % (res_id,)
-        else:
-            where = ' and (res_id is null)'
-
-        if key2:
-            where += ' and key2=\'%s\'' % (key2,)
-        else:
-            where += ' and (key2 is null)'
-
-        cr.execute('select * from ir_values where model=%s and key=%s and name=%s'+where,(model, key, name))
-        res = cr.fetchone()
         ir_values_obj = openerp.registry(cr.dbname)['ir.values']
-        if not res:
-            ir_values_obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta)
-        elif xml_id:
-            cr.execute('UPDATE ir_values set value=%s WHERE model=%s and key=%s and name=%s'+where,(value, model, key, name))
-            ir_values_obj.invalidate_cache(cr, uid, ['value'])
+        ir_values_obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta)
         return True
 
     def _module_data_uninstall(self, cr, uid, modules_to_remove, context=None):
diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py
index c6cdd4f6233296e9a2e2b1c14f8074cc165ce791..1b2b4c97329c9aced15af5c5c124bb72c5f6471e 100644
--- a/openerp/addons/base/ir/ir_values.py
+++ b/openerp/addons/base/ir/ir_values.py
@@ -18,12 +18,12 @@
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
-import pickle
 
 from openerp import tools
 from openerp.osv import osv, fields
 from openerp.exceptions import AccessError, MissingError
 from openerp.tools.translate import _
+from openerp.tools import pickle
 
 EXCLUDED_FIELDS = set((
     'report_sxw_content', 'report_rml_content', 'report_sxw', 'report_rml',
diff --git a/openerp/models.py b/openerp/models.py
index 0e2a56ce335de143a305a8c579c6ff44c3ad5381..0ec370e88ee7f41c93582d438c067d009ca58c5f 100644
--- a/openerp/models.py
+++ b/openerp/models.py
@@ -44,7 +44,6 @@ import functools
 import itertools
 import logging
 import operator
-import pickle
 import pytz
 import re
 import time
@@ -68,7 +67,7 @@ from .osv.query import Query
 from .tools import frozendict, lazy_property, ormcache
 from .tools.config import config
 from .tools.func import frame_codeinfo
-from .tools.misc import CountingStream, DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
+from .tools.misc import CountingStream, DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT, pickle
 from .tools.safe_eval import safe_eval as eval
 from .tools.translate import _
 
diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py
index 560ed3f656a4490af129a1b1efec03642ac417ef..f7ae2e9d89fd93721e133318f6fd45aeb044dc55 100644
--- a/openerp/tools/convert.py
+++ b/openerp/tools/convert.py
@@ -23,7 +23,6 @@ import cStringIO
 import csv
 import logging
 import os.path
-import pickle
 import re
 import sys
 import time
@@ -44,7 +43,7 @@ import misc
 from config import config
 # List of etree._Element subclasses that we choose to ignore when parsing XML.
 from misc import SKIPPED_ELEMENT_TYPES
-from misc import unquote
+from misc import pickle, unquote
 from openerp import SUPERUSER_ID
 from translate import _
 from yaml_import import convert_yaml_import
diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py
index cf245ffbbf7c6d0edbe6f0468b03fb65403a7c50..dc7b4c5507555b38eb067c38e90a691a08f6c279 100644
--- a/openerp/tools/misc.py
+++ b/openerp/tools/misc.py
@@ -26,6 +26,7 @@ Miscellaneous tools used by OpenERP.
 """
 
 from functools import wraps
+import cPickle
 import cProfile
 from contextlib import contextmanager
 import subprocess
@@ -37,6 +38,7 @@ import threading
 import time
 import werkzeug.utils
 import zipfile
+from cStringIO import StringIO
 from collections import defaultdict, Mapping, OrderedDict
 from datetime import datetime
 from itertools import islice, izip, groupby
@@ -1059,7 +1061,6 @@ def stripped_sys_argv(*strip_args):
 
     return [x for i, x in enumerate(args) if not strip(args, i)]
 
-
 class ConstantMapping(Mapping):
     """
     An immutable mapping returning the provided value for every single key.
@@ -1166,3 +1167,21 @@ if parse_version(getattr(werkzeug, '__version__', '0.0')) < parse_version('0.9.0
 else:
     def html_escape(text):
         return werkzeug.utils.escape(text)
+
+class Pickle(object):
+    @classmethod
+    def load(cls, stream):
+        unpickler = cPickle.Unpickler(stream)
+        # pickle builtins: str/unicode, int/long, float, bool, tuple, list, dict, None
+        unpickler.find_global = None
+        return unpickler.load()
+
+    @classmethod
+    def loads(cls, text):
+        return cls.load(StringIO(text))
+
+    dumps = cPickle.dumps
+    dump = cPickle.dump
+
+pickle = Pickle
+