diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 4c10658e71f56134dec64573ffc442321ae216e6..da80e8aede70597e0e5e6ef5faf0a58fd267f0ed 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -54,6 +54,8 @@ from ganeti import compat
 from ganeti import masterd
 from ganeti import netutils
 from ganeti import ht
+from ganeti import query
+from ganeti import qlang
 
 import ganeti.masterd.instance # pylint: disable-msg=W0611
 
@@ -486,6 +488,83 @@ class Tasklet:
     raise NotImplementedError
 
 
+class _QueryBase:
+  """Base for query utility classes.
+
+  """
+  #: Attribute holding field definitions
+  FIELDS = None
+
+  def __init__(self, names, fields, use_locking):
+    """Initializes this class.
+
+    """
+    self.names = names
+    self.use_locking = use_locking
+
+    self.query = query.Query(self.FIELDS, fields)
+    self.requested_data = self.query.RequestedData()
+
+  @classmethod
+  def FieldsQuery(cls, fields):
+    """Returns list of available fields.
+
+    @return: List of L{objects.QueryFieldDefinition}
+
+    """
+    if fields is None:
+      # Client requests all fields
+      fdefs = query.GetAllFields(cls.FIELDS.values())
+    else:
+      fdefs = query.Query(cls.FIELDS, fields).GetFields()
+
+    return {
+      "fields": [fdef.ToDict() for fdef in fdefs],
+      }
+
+  def ExpandNames(self, lu):
+    """Expand names for this query.
+
+    See L{LogicalUnit.ExpandNames}.
+
+    """
+    raise NotImplementedError()
+
+  def DeclareLocks(self, level):
+    """Declare locks for this query.
+
+    See L{LogicalUnit.DeclareLocks}.
+
+    """
+    raise NotImplementedError()
+
+  def _GetQueryData(self, lu):
+    """Collects all data for this query.
+
+    @return: Query data object
+
+    """
+    raise NotImplementedError()
+
+  def NewStyleQuery(self, lu):
+    """Collect data and execute query.
+
+    """
+    data = self._GetQueryData(lu)
+
+    return {
+      "data": self.query.Query(data),
+      "fields": [fdef.ToDict()
+                 for fdef in self.query.GetFields()],
+      }
+
+  def OldStyleQuery(self, lu):
+    """Collect data and execute query.
+
+    """
+    return self.query.OldStyleQuery(self._GetQueryData(lu))
+
+
 def _GetWantedNodes(lu, nodes):
   """Returns list of checked and expanded node names.