diff --git a/Ganeti/HTools/Luxi.hs b/Ganeti/HTools/Luxi.hs
index f60cce09a047dc714fb03381ff4e2efe3bf8d1e6..a547405979ca411db4e93585de5f563e0cdfa0db 100644
--- a/Ganeti/HTools/Luxi.hs
+++ b/Ganeti/HTools/Luxi.hs
@@ -38,7 +38,7 @@ import Ganeti.HTools.Loader
 import Ganeti.HTools.Types
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Instance as Instance
-import Ganeti.HTools.Utils (fromJVal, annotateResult)
+import Ganeti.HTools.Utils (fromJVal, annotateResult, tryFromObj, asJSObject)
 
 -- * Utility functions
 
@@ -75,6 +75,10 @@ queryInstancesMsg =
         use_locking = JSBool False
     in JSArray [nnames, fields, use_locking]
 
+-- | The input data for cluster query
+queryClusterInfoMsg :: JSValue
+queryClusterInfoMsg = JSArray []
+
 -- | Wraper over callMethod doing node query.
 queryNodes :: L.Client -> IO (Result JSValue)
 queryNodes = L.callMethod L.QueryNodes queryNodesMsg
@@ -83,6 +87,9 @@ queryNodes = L.callMethod L.QueryNodes queryNodesMsg
 queryInstances :: L.Client -> IO (Result JSValue)
 queryInstances = L.callMethod L.QueryInstances queryInstancesMsg
 
+queryClusterInfo :: L.Client -> IO (Result JSValue)
+queryClusterInfo = L.callMethod L.QueryClusterInfo queryClusterInfoMsg
+
 -- | Parse a instance list in JSON format.
 getInstances :: NameAssoc
              -> JSValue
@@ -140,6 +147,13 @@ parseNode (JSArray [ name, mtotal, mnode, mfree, dtotal, dfree
 
 parseNode v = fail ("Invalid node query result: " ++ show v)
 
+getClusterTags :: JSValue -> Result [String]
+getClusterTags v = do
+  let errmsg = "Parsing cluster info"
+  obj <- annotateResult errmsg $ asJSObject v
+  tags <- tryFromObj errmsg (fromJSObject obj) "tag"
+  return tags
+
 -- * Main loader functionality
 
 -- | Builds the cluster data from an URL.
@@ -152,10 +166,12 @@ loadData master =
        (\s -> do
           nodes <- queryNodes s
           instances <- queryInstances s
+          cinfo <- queryClusterInfo s
           return $ do -- Result monad
             node_data <- nodes >>= getNodes
             let (node_names, node_idx) = assignIndices node_data
             inst_data <- instances >>= getInstances node_names
             let (_, inst_idx) = assignIndices inst_data
-            return (node_idx, inst_idx, [])
+            ctags <- cinfo >>= getClusterTags
+            return (node_idx, inst_idx, ctags)
        )
diff --git a/Ganeti/Luxi.hs b/Ganeti/Luxi.hs
index 707341281bf8a4991655d4571f476ca3de8fa20d..0468a4df1b501762610845dbdddd37a214e70719 100644
--- a/Ganeti/Luxi.hs
+++ b/Ganeti/Luxi.hs
@@ -63,6 +63,7 @@ withTimeout secs descr action = do
 data LuxiOp = QueryInstances
             | QueryNodes
             | QueryJobs
+            | QueryClusterInfo
             | SubmitManyJobs
 
 -- | The serialisation of LuxiOps into strings in messages.
@@ -70,6 +71,7 @@ strOfOp :: LuxiOp -> String
 strOfOp QueryNodes = "QueryNodes"
 strOfOp QueryInstances = "QueryInstances"
 strOfOp QueryJobs = "QueryJobs"
+strOfOp QueryClusterInfo = "QueryClusterInfo"
 strOfOp SubmitManyJobs = "SubmitManyJobs"
 
 -- | The end-of-message separator.