A few comments: The issue occurs because in bin/addons/base/ir/ir_model.py, the self.loads collection doesn't contain everything it should. Here is the instrumentation of the code I'm using: @@ -723,9 +725,22 @@ module_in = ",".join(["%s"] * len(modules)) cr.execute('select id,name,model,res_id,module from ir_model_data where module IN (' + module_in + ') and noupdate=%s', modules + [False]) wkf_todo = [] +# print "*********** loads", self.loads + for item in self.loads: + if (item[0] == unicode('base') or item[0] == 'base'): + print "**** in loads:", item + for (id, name, model, res_id,module) in cr.fetchall(): if (module,name) not in self.loads: - self.unlink_mark[(model,res_id)] = id +# self.unlink_mark[(model,res_id)] = id +# print "module", module + if module != 'base': + #print "****", (module,name) + self.unlink_mark[(model,res_id)] = id + else: + self.unlink_mark[(model,res_id)] = id + print "not in loads: :(module,name)", (module,name) And then it will print (with kaboom installed): **** in loads: ('base', 'user_root') not in loads: :(module,name) (u'base', u'menu_administration_shortcut') not in loads: :(module,name) (u'base', u'menu_custom') not in loads: :(module,name) (u'base', u'next_id_4') not in loads: :(module,name) (u'base', u'menu_low_workflow') not in loads: :(module,name) (u'base', u'menu_custom_action') not in loads: :(module,name) (u'base', u'menu_config') not in loads: :(module,name) (u'base', u'menu_translation') not in loads: :(module,name) (u'base', u'menu_translation_app') not in loads: :(module,name) (u'base', u'menu_translation_export') not in loads: :(module,name) (u'base', u'menu_users') not in loads: :(module,name) (u'base', u'menu_security') not in loads: :(module,name) (u'base', u'menu_management') not in loads: :(module,name) (u'base', u'reporting_menu') ... Whereas, without the 'kaboom' module installed, there are dozens of entries in the self.loads collection instead: **** in loads: ('base', 'values_view_form_action') **** in loads: ('base', 'bw') **** in loads: ('base', 'JPY') **** in loads: ('base', 'ratePLN') **** in loads: ('base', 'CRC') **** in loads: ('base', u'access_res_widget') **** in loads: ('base', 'res_partner_event-wopartner-view_tree') **** in loads: ('base', 'action_view_base_module_upgrade_window') **** in loads: ('base', 'config_wizard_simple_view') **** in loads: ('base', 'action_res_users') **** in loads: ('base', 'view_translation_form') **** in loads: ('base', u'access_res_widget_user_group_user') **** in loads: ('base', 'ir_cron_act') **** in loads: ('base', 'vi') **** in loads: ('base', u'access_res_log_all') **** in loads: ('base', 'RON') **** in loads: ('base', 'sa') and nothing that is not in self.loads. I've still not been able to track why this self.loads is empty at update with kaboom installed. Other remark: if you flag the module kaboom as 'uninstalled' using SQL, your update seems able to restore the menus but this is no long term solution.