diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index c337cf0a811f674ab982e80088d83f85057729d5..7438316794a37e3b7cc9edc9647356c6f26f8039 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -595,7 +595,7 @@ def _BuildInstanceHookEnvByObject(lu, instance, override=None):
     'disks': [(disk.size, disk.mode) for disk in instance.disks],
     'bep': bep,
     'hvp': hvp,
-    'hypervisor': instance.hypervisor,
+    'hypervisor_name': instance.hypervisor,
   }
   if override:
     args.update(override)
diff --git a/lib/opcodes.py b/lib/opcodes.py
index 4de40ba4ef210c60752b452ba9fd9473e15464da..e7d34a8bd6bb47a681b369977f829177ce3e13c1 100644
--- a/lib/opcodes.py
+++ b/lib/opcodes.py
@@ -144,14 +144,9 @@ class OpCode(BaseOpCode):
       raise ValueError("Invalid data to LoadOpcode, missing OP_ID")
     op_id = data["OP_ID"]
     op_class = None
-    for item in globals().values():
-      if (isinstance(item, type) and
-          issubclass(item, cls) and
-          hasattr(item, "OP_ID") and
-          getattr(item, "OP_ID") == op_id):
-        op_class = item
-        break
-    if op_class is None:
+    if op_id in OP_MAPPING:
+      op_class = OP_MAPPING[op_id]
+    else:
       raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" %
                        op_id)
     op = op_class()
@@ -604,3 +599,7 @@ class OpTestAllocator(OpCode):
     "mem_size", "disks", "disk_template",
     "os", "tags", "nics", "vcpus", "hypervisor",
     ]
+
+OP_MAPPING = dict([(v.OP_ID, v) for v in globals().values()
+                   if (isinstance(v, type) and issubclass(v, OpCode) and
+                       hasattr(v, "OP_ID"))])