diff --git a/lib/cmdlib/common.py b/lib/cmdlib/common.py
index 638abd7..33142ef 100644
--- a/lib/cmdlib/common.py
+++ b/lib/cmdlib/common.py
@@ -35,7 +35,6 @@
 import os
 import urllib2
 
-from ganeti import compat
 from ganeti import constants
 from ganeti import errors
 from ganeti import hypervisor
@@ -998,9 +997,13 @@
                  (name, _NodeEvacDest(use_nodes, group, node_names))
                  for (name, group, node_names) in moved))
 
-  return [map(compat.partial(_SetOpEarlyRelease, early_release),
-              map(opcodes.OpCode.LoadOpCode, ops))
-          for ops in jobs]
+  return [
+    [
+      _SetOpEarlyRelease(early_release, opcodes.OpCode.LoadOpCode(o))
+      for o in ops
+    ]
+    for ops in jobs
+  ]
 
 
 def _NodeEvacDest(use_nodes, group, node_names):
diff --git a/lib/cmdlib/instance_query.py b/lib/cmdlib/instance_query.py
index 5aec4c1..1a8f954 100644
--- a/lib/cmdlib/instance_query.py
+++ b/lib/cmdlib/instance_query.py
@@ -32,7 +32,6 @@
 
 import itertools
 
-from ganeti import compat
 from ganeti import constants
 from ganeti import locking
 from ganeti import utils
@@ -194,10 +193,10 @@
     dev_sstatus = self._ComputeBlockdevStatus(snode_uuid, instance, dev)
 
     if dev.children:
-      dev_children = map(compat.partial(self._ComputeDiskStatusInner,
-                                        instance, snode_uuid,
-                                        node_uuid2name_fn),
-                         dev.children)
+      dev_children = [
+        self._ComputeDiskStatusInner(instance, snode_uuid, node_uuid2name_fn, d)
+        for d in dev.children
+      ]
     else:
       dev_children = []
 
@@ -274,9 +273,8 @@
       node_uuid2name_fn = lambda uuid: nodes[uuid].name
 
       disk_objects = self.cfg.GetInstanceDisks(instance.uuid)
-      output_disks = map(compat.partial(self._ComputeDiskStatus, instance,
-                                        node_uuid2name_fn),
-                         disk_objects)
+      output_disks = [self._ComputeDiskStatus(instance, node_uuid2name_fn, d)
+                      for d in disk_objects]
 
       secondary_nodes = self.cfg.GetInstanceSecondaryNodes(instance.uuid)
       snodes_group_uuids = [nodes[snode_uuid].group
diff --git a/lib/jqueue/__init__.py b/lib/jqueue/__init__.py
index b4cedb4..9384f55 100644
--- a/lib/jqueue/__init__.py
+++ b/lib/jqueue/__init__.py
@@ -1399,8 +1399,8 @@
 
     if archived:
       archive_path = pathutils.JOB_QUEUE_ARCHIVE_DIR
-      result.extend(map(compat.partial(utils.PathJoin, archive_path),
-                        utils.ListVisibleFiles(archive_path)))
+      result.extend(utils.PathJoin(archive_path, job_file) for job_file in
+                        utils.ListVisibleFiles(archive_path))
 
     return result
 
diff --git a/lib/mcpu.py b/lib/mcpu.py
index ff8ef1f..bdcc6af 100644
--- a/lib/mcpu.py
+++ b/lib/mcpu.py
@@ -52,7 +52,6 @@
 from ganeti import cmdlib
 from ganeti import locking
 from ganeti import utils
-from ganeti import compat
 from ganeti import wconfd
 
 
@@ -232,9 +231,8 @@
   """
   if isinstance(result, cmdlib.ResultWithJobs):
     # Copy basic parameters (e.g. priority)
-    map(compat.partial(_SetBaseOpParams, op,
-                       "Submitted by %s" % op.OP_ID),
-        itertools.chain(*result.jobs))
+    for op2 in itertools.chain(*result.jobs):
+      _SetBaseOpParams(op, "Submitted by %s" % op.OP_ID, op2)
 
     # Submit jobs
     job_submission = submit_fn(result.jobs)
diff --git a/lib/qlang.py b/lib/qlang.py
index 9194cf5..e424abe 100644
--- a/lib/qlang.py
+++ b/lib/qlang.py
@@ -48,7 +48,6 @@
 from ganeti import constants
 from ganeti import errors
 from ganeti import utils
-from ganeti import compat
 
 
 OP_OR = constants.QLANG_OP_OR
@@ -323,8 +322,10 @@
 
     result = ParseFilter(filter_text)
   elif args:
-    result = [OP_OR] + map(compat.partial(_MakeFilterPart, namefield,
-                                          isnumeric=isnumeric), args)
+    result = [OP_OR] + [
+      _MakeFilterPart(namefield, arg, isnumeric=isnumeric)
+      for arg in args
+    ]
   else:
     result = None
 
diff --git a/lib/query.py b/lib/query.py
index 43d8fad..dfeccf5 100644
--- a/lib/query.py
+++ b/lib/query.py
@@ -2199,18 +2199,21 @@
     (_MakeField("snodes", "Secondary_Nodes", QFT_OTHER,
                 "Secondary nodes; usually this will just be one node"),
      IQ_NODES, 0,
-     lambda ctx, inst: map(compat.partial(_GetNodeName, ctx, None),
-                           inst.secondary_nodes)),
+     lambda ctx, inst: [
+       _GetNodeName(ctx, None, uuid) for uuid in inst.secondary_nodes
+     ]),
     (_MakeField("snodes.group", "SecondaryNodesGroups", QFT_OTHER,
                 "Node groups of secondary nodes"),
      IQ_NODES, 0,
-     lambda ctx, inst: map(compat.partial(_GetInstNodeGroupName, ctx, None),
-                           inst.secondary_nodes)),
+     lambda ctx, inst: [
+       _GetInstNodeGroupName(ctx, None, uuid) for uuid in inst.secondary_nodes
+     ]),
     (_MakeField("snodes.group.uuid", "SecondaryNodesGroupsUUID", QFT_OTHER,
                 "Node group UUIDs of secondary nodes"),
      IQ_NODES, 0,
-     lambda ctx, inst: map(compat.partial(_GetInstNodeGroup, ctx, None),
-                           inst.secondary_nodes)),
+     lambda ctx, inst: [
+       _GetInstNodeGroup(ctx, None, uuid) for uuid in inst.secondary_nodes
+     ]),
     (_MakeField("admin_state", "InstanceState", QFT_TEXT,
                 "Desired state of the instance"),
      IQ_CONFIG, 0, _GetItemAttr("admin_state")),
diff --git a/lib/rpc/node.py b/lib/rpc/node.py
index 3515519..e0f4659 100644
--- a/lib/rpc/node.py
+++ b/lib/rpc/node.py
@@ -519,8 +519,8 @@
 
     # encode the arguments for each node individually, pass them and the node
     # name to the prep_fn, and serialise its return value
-    encode_args_fn = lambda node: map(compat.partial(self._encoder, node),
-                                      zip(map(compat.snd, argdefs), args))
+    encode_args_fn = lambda node: [self._encoder(node, (argdef[1], val)) for
+                                      (argdef, val) in zip(argdefs, args)]
     pnbody = dict(
       (n,
        serializer.DumpJson(prep_fn(n, encode_args_fn(n)),
@@ -550,7 +550,7 @@
   """Converts a list of L{objects} to dictionaries.
 
   """
-  return map(compat.partial(_ObjectToDict, node), value)
+  return [_ObjectToDict(node, v) for v in value]
 
 
 def _PrepareFileUpload(getents_fn, node, filename):
diff --git a/qa/qa_rapi.py b/qa/qa_rapi.py
index a008247..9282587 100644
--- a/qa/qa_rapi.py
+++ b/qa/qa_rapi.py
@@ -33,7 +33,6 @@
 """
 
 import copy
-import functools
 import itertools
 import os.path
 import random
@@ -980,8 +979,7 @@
   instance_two = qa_config.AcquireInstance()
   instance_list = [instance_one, instance_two]
   try:
-    rapi_dicts = map(functools.partial(_GenInstanceAllocationDict, node),
-                     instance_list)
+    rapi_dicts = [_GenInstanceAllocationDict(node, i) for i in instance_list]
 
     job_id = _rapi_client.InstancesMultiAlloc(rapi_dicts)
 
