diff --git a/lib/confd/querylib.py b/lib/confd/querylib.py
index 46d25cb33ded82b8dddef3a1328155d7c1b9479c..04549b98b5a9b264ec53f6647bac09a268f336a1 100644
--- a/lib/confd/querylib.py
+++ b/lib/confd/querylib.py
@@ -139,34 +139,55 @@ class NodeRoleQuery(ConfdQuery):
 
 
 class InstanceIpToNodePrimaryIpQuery(ConfdQuery):
-  """A query for the location of an instance's ip.
+  """A query for the location of one or more instance's ips.
 
-  It returns the primary ip of the node hosting the instance having the
-  requested ip address, or an error if no such address is known.
+  Given a list of instance IPs, returns an ordered list with the same
+  number of elements as the input. Each element of the list is a tuple
+  containing the status (success or failure) and the content of the
+  query (IP of the primary node if successful, error constant if not).
+
+  If a string (instance's IP) is given instead of a list it will return
+  a single tuple, as opposed to a 1-element list containing that tuple.
 
   """
   def Exec(self, query):
     """InstanceIpToNodePrimaryIpQuery main execution.
 
     """
-    instance_ip = query
-    instance = self.reader.GetInstanceByIp(instance_ip)
-    if instance is None:
-      return QUERY_UNKNOWN_ENTRY_ERROR
+    if isinstance(query, list):
+      instances_list = query
+    else:
+      instances_list = [query]
+    pnodes_list = []
+
+    for instance_ip in instances_list:
+      instance = self.reader.GetInstanceByIp(instance_ip)
+      if not instance:
+        logging.debug("Invalid instance IP: %s" % instance)
+        pnodes_list.append(QUERY_UNKNOWN_ENTRY_ERROR)
+        continue
 
-    pnode = self.reader.GetInstancePrimaryNode(instance)
-    if pnode is None:
-      # this shouldn't happen
-      logging.error("Internal configuration inconsistent (instance-to-pnode)")
-      return QUERY_INTERNAL_ERROR
+      pnode = self.reader.GetInstancePrimaryNode(instance)
+      if not pnode:
+        logging.error("Instance '%s' doesn't have an associated primary"
+                      " node" % instance)
+        pnodes_list.append(QUERY_INTERNAL_ERROR)
+        continue
 
-    pnode_primary_ip = self.reader.GetNodePrimaryIp(pnode)
-    if pnode_primary_ip is None:
-      # this shouldn't happen
-      logging.error("Internal configuration inconsistent (node-to-primary-ip)")
-      return QUERY_INTERNAL_ERROR
+      pnode_primary_ip = self.reader.GetNodePrimaryIp(pnode)
+      if not pnode_primary_ip:
+        logging.error("Primary node '%s' doesn't have an associated"
+                      " primary IP" % pnode)
+        pnodes_list.append(QUERY_INTERNAL_ERROR)
+        continue
 
-    return constants.CONFD_REPL_STATUS_OK, pnode_primary_ip
+      pnodes_list.append((constants.CONFD_REPL_STATUS_OK, pnode_primary_ip))
+
+    # If input was a string, return a tuple instead of a 1-element list
+    if isinstance(query, basestring):
+      return pnodes_list[0]
+
+    return constants.CONFD_REPL_STATUS_OK, pnodes_list
 
 
 class NodesPipsQuery(ConfdQuery):
@@ -225,4 +246,3 @@ class InstancesIpsQuery(ConfdQuery):
     answer = self.reader.GetInstancesIps(link)
 
     return status, answer
-