diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 90b14619ceafdebbc70b400876ca917083f914e0..f82b40dcf859a46070238b901a0d8535074a4ba9 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -39,7 +39,6 @@ import OpenSSL
 import socket
 import tempfile
 import shutil
-import operator
 import itertools
 
 from ganeti import ssh
@@ -559,15 +558,7 @@ class _QueryBase:
     @return: List of L{objects.QueryFieldDefinition}
 
     """
-    if fields is None:
-      # Client requests all fields, sort by name
-      fdefs = sorted(query.GetAllFields(cls.FIELDS.values()),
-                     key=operator.attrgetter("name"))
-    else:
-      # Keep order as requested by client
-      fdefs = query.Query(cls.FIELDS, fields).GetFields()
-
-    return objects.QueryFieldsResponse(fields=fdefs).ToDict()
+    return query.QueryFields(cls.FIELDS, fields)
 
   def ExpandNames(self, lu):
     """Expand names for this query.
diff --git a/lib/query.py b/lib/query.py
index 814016979f717f6f148aba4f11bb6c3ded0bf331..56b603cc85233ab983220cd0e84ab9c501153ebc 100644
--- a/lib/query.py
+++ b/lib/query.py
@@ -235,6 +235,27 @@ def _PrepareFieldList(fields):
   return result
 
 
+def QueryFields(fielddefs, selected):
+  """Returns list of available fields.
+
+  @type fielddefs: dict
+  @param fielddefs: Field definitions
+  @type selected: list of strings
+  @param selected: List of selected fields
+  @return: List of L{objects.QueryFieldDefinition}
+
+  """
+  if selected is None:
+    # Client requests all fields, sort by name
+    fdefs = utils.NiceSort(GetAllFields(fielddefs.values()),
+                           key=operator.attrgetter("name"))
+  else:
+    # Keep order as requested by client
+    fdefs = Query(fielddefs, selected).GetFields()
+
+  return objects.QueryFieldsResponse(fields=fdefs).ToDict()
+
+
 def _MakeField(name, title, kind):
   """Wrapper for creating L{objects.QueryFieldDefinition} instances.
 
diff --git a/test/ganeti.query_unittest.py b/test/ganeti.query_unittest.py
index b154070f683204fbc019ad2521a88cfafa0e860c..4db0a99a44b4963f50f106d95391e464ffefa5e4 100755
--- a/test/ganeti.query_unittest.py
+++ b/test/ganeti.query_unittest.py
@@ -23,6 +23,7 @@
 
 import re
 import unittest
+import random
 
 from ganeti import constants
 from ganeti import utils
@@ -752,5 +753,31 @@ class TestInstanceQuery(unittest.TestCase):
                           "ADMIN_down"]))
 
 
+class TestQueryFields(unittest.TestCase):
+  def testAllFields(self):
+    for fielddefs in [query.NODE_FIELDS, query.INSTANCE_FIELDS]:
+      result = query.QueryFields(fielddefs, None)
+      self.assert_(isinstance(result, dict))
+      response = objects.QueryFieldsResponse.FromDict(result)
+      self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields],
+        [(fdef2.name, fdef2.title)
+         for (fdef2, _, _) in utils.NiceSort(fielddefs.values(),
+                                             key=lambda x: x[0].name)])
+
+  def testSomeFields(self):
+    rnd = random.Random(5357)
+
+    for _ in range(10):
+      for fielddefs in [query.NODE_FIELDS, query.INSTANCE_FIELDS]:
+        fields = [fdef
+                  for (fdef, _, _) in rnd.sample(fielddefs.values(),
+                                                 rnd.randint(5, 20))]
+        result = query.QueryFields(fielddefs, [fdef.name for fdef in fields])
+        self.assert_(isinstance(result, dict))
+        response = objects.QueryFieldsResponse.FromDict(result)
+        self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields],
+                         [(fdef2.name, fdef2.title) for fdef2 in fields])
+
+
 if __name__ == "__main__":
   testutils.GanetiTestProgram()