diff --git a/odoo/addons/base/ir/ir_model.py b/odoo/addons/base/ir/ir_model.py
index 21e00cae6a086bdde7ba36db5349993cb8d04caf..b57c8de4fd09889bd16a541911b1a560c1c740c8 100644
--- a/odoo/addons/base/ir/ir_model.py
+++ b/odoo/addons/base/ir/ir_model.py
@@ -165,7 +165,7 @@ class IrModel(models.Model):
 
     @api.model
     def _instanciate(self, model_data):
-        """ Instanciate a model class for the custom model given by parameters ``model_data``. """
+        """ Return a class for the custom model given by parameters ``model_data``. """
         class CustomModel(models.Model):
             _name = encode(model_data['model'])
             _description = model_data['name']
@@ -174,7 +174,7 @@ class IrModel(models.Model):
             _transient = bool(model_data['transient'])
             __doc__ = model_data['info']
 
-        CustomModel._build_model(self.pool, self._cr)
+        return CustomModel
 
 
 class IrModelFields(models.Model):
diff --git a/odoo/modules/registry.py b/odoo/modules/registry.py
index 9be7fa15ae91171a602c11ddc977328c6491176c..946682c241e03ba745a563c468d774202025793e 100644
--- a/odoo/modules/registry.py
+++ b/odoo/modules/registry.py
@@ -276,7 +276,8 @@ class Registry(Mapping):
         ir_model = env['ir.model']
         cr.execute('SELECT * FROM ir_model WHERE state=%s', ('manual',))
         for model_data in cr.dictfetchall():
-            ir_model._instanciate(model_data)
+            model_class = ir_model._instanciate(model_data)
+            model_class._build_model(self, cr)
 
         # prepare the setup on all models
         models = env.values()