diff --git a/Ganeti/HTools/IAlloc.hs b/Ganeti/HTools/IAlloc.hs
index 88b4a5c88488e92f2a23c05ecb316423b1b049c5..679ce161b101d22138771429f9e5b5a808e79140 100644
--- a/Ganeti/HTools/IAlloc.hs
+++ b/Ganeti/HTools/IAlloc.hs
@@ -81,7 +81,7 @@ parseNode n a = do
   offline <- fromObj "offline" a
   drained <- fromObj "drained" a
   node <- (if offline || drained
-           then return $ Node.create n 0 0 0 0 0 0 True
+           then return $ Node.create n 0 0 0 0 0 0 True defaultUUID
            else do
              mtotal <- fromObj "total_memory" a
              mnode  <- fromObj "reserved_memory" a
@@ -90,7 +90,7 @@ parseNode n a = do
              dfree  <- fromObj "free_disk"    a
              ctotal <- fromObj "total_cpus"   a
              return $ Node.create n mtotal mnode mfree
-                    dtotal dfree ctotal False)
+                    dtotal dfree ctotal False defaultUUID)
   return (n, node)
 
 -- | Top-level parser.
diff --git a/Ganeti/HTools/Luxi.hs b/Ganeti/HTools/Luxi.hs
index 7153481c924620bb1a8473ea4e127134569441d1..9cf66a1fa474a63e0160e062fff63f2145697c2a 100644
--- a/Ganeti/HTools/Luxi.hs
+++ b/Ganeti/HTools/Luxi.hs
@@ -37,7 +37,8 @@ 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, tryFromObj, asJSObject)
+import Ganeti.HTools.Utils (fromJVal, annotateResult, tryFromObj, asJSObject,
+                            defaultUUID)
 
 -- * Utility functions
 
@@ -123,7 +124,7 @@ parseNode (JSArray [ name, mtotal, mnode, mfree, dtotal, dfree
   xdrained <- convert drained
   xvm_capable <- convert vm_capable
   node <- (if xoffline || xdrained || not xvm_capable
-           then return $ Node.create xname 0 0 0 0 0 0 True
+           then return $ Node.create xname 0 0 0 0 0 0 True defaultUUID
            else do
              xmtotal  <- convert mtotal
              xmnode   <- convert mnode
@@ -132,7 +133,7 @@ parseNode (JSArray [ name, mtotal, mnode, mfree, dtotal, dfree
              xdfree   <- convert dfree
              xctotal  <- convert ctotal
              return $ Node.create xname xmtotal xmnode xmfree
-                    xdtotal xdfree xctotal False)
+                    xdtotal xdfree xctotal False defaultUUID)
   return (xname, node)
 
 parseNode v = fail ("Invalid node query result: " ++ show v)
diff --git a/Ganeti/HTools/Node.hs b/Ganeti/HTools/Node.hs
index 37deec55eee8476b78045343788766fe130303c1..be2a3dc8bf645519d621f8a042006e8b0f77f826 100644
--- a/Ganeti/HTools/Node.hs
+++ b/Ganeti/HTools/Node.hs
@@ -68,7 +68,7 @@ module Ganeti.HTools.Node
     , noSecondary
     ) where
 
-import Data.List
+import Data.List hiding (group)
 import qualified Data.Map as Map
 import qualified Data.Foldable as Foldable
 import Text.Printf (printf)
@@ -119,6 +119,7 @@ data Node = Node
     , utilPool :: T.DynUtil -- ^ Total utilisation capacity
     , utilLoad :: T.DynUtil -- ^ Sum of instance utilisation
     , pTags    :: TagMap    -- ^ Map of primary instance tags and their count
+    , group    :: String    -- ^ The node's group (as UUID)
     } deriving (Show, Eq)
 
 instance T.Element Node where
@@ -182,9 +183,9 @@ conflictingPrimaries (Node { pTags = t }) = Foldable.sum t - Map.size t
 -- The index and the peers maps are empty, and will be need to be
 -- update later via the 'setIdx' and 'buildPeers' functions.
 create :: String -> Double -> Int -> Int -> Double
-       -> Int -> Double -> Bool -> Node
+       -> Int -> Double -> Bool -> String -> Node
 create name_init mem_t_init mem_n_init mem_f_init
-       dsk_t_init dsk_f_init cpu_t_init offline_init =
+       dsk_t_init dsk_f_init cpu_t_init offline_init group_init =
     Node { name = name_init
          , alias = name_init
          , tMem = mem_t_init
@@ -213,6 +214,7 @@ create name_init mem_t_init mem_n_init mem_f_init
          , utilPool = T.baseUtil
          , utilLoad = T.zeroUtil
          , pTags = Map.empty
+         , group = group_init
          }
 
 -- | Conversion formula from mDsk\/tDsk to loDsk
@@ -483,6 +485,7 @@ showField t field =
       "ptags" -> intercalate "," . map (\(k, v) -> printf "%s=%d" k v) .
                  Map.toList $ pTags t
       "peermap" -> show $ peers t
+      "group.uuid" -> group t
       _ -> T.unknownField
     where
       T.DynUtil { T.cpuWeight = uC, T.memWeight = uM,
@@ -521,6 +524,7 @@ showHeader field =
       "nload" -> ("lNet", True)
       "ptags" -> ("PrimaryTags", False)
       "peermap" -> ("PeerMap", False)
+      "group.uuid" -> ("GroupUUID", False)
       _ -> (T.unknownField, False)
 
 -- | String converter for the node list functionality.
diff --git a/Ganeti/HTools/QC.hs b/Ganeti/HTools/QC.hs
index b7a030f1461cc01743e9d0f886b40c3f336aa2ca..5e7120ea09b504f020869f1424f7d6f8dcbbebcb 100644
--- a/Ganeti/HTools/QC.hs
+++ b/Ganeti/HTools/QC.hs
@@ -176,6 +176,7 @@ instance Arbitrary Node.Node where
       offl <- arbitrary
       let n = Node.create name (fromIntegral mem_t) mem_n mem_f
               (fromIntegral dsk_t) dsk_f (fromIntegral cpu_t) offl
+              Utils.defaultUUID
           n' = Node.buildPeers n Container.empty
       return n'
 
diff --git a/Ganeti/HTools/Rapi.hs b/Ganeti/HTools/Rapi.hs
index d0619204e0713451d3fee16597cfd374355018ad..3f4a754ea6fce3389284e3d005b7308621a3c31a 100644
--- a/Ganeti/HTools/Rapi.hs
+++ b/Ganeti/HTools/Rapi.hs
@@ -106,7 +106,7 @@ parseNode a = do
   offline <- extract "offline"
   drained <- extract "drained"
   node <- (if offline || drained
-           then return $ Node.create name 0 0 0 0 0 0 True
+           then return $ Node.create name 0 0 0 0 0 0 True defaultUUID
            else do
              mtotal  <- extract "mtotal"
              mnode   <- extract "mnode"
@@ -115,7 +115,7 @@ parseNode a = do
              dfree   <- extract "dfree"
              ctotal  <- extract "ctotal"
              return $ Node.create name mtotal mnode mfree
-                    dtotal dfree ctotal False)
+                    dtotal dfree ctotal False defaultUUID)
   return (name, node)
 
 -- | Loads the raw cluster data from an URL.
diff --git a/Ganeti/HTools/Simu.hs b/Ganeti/HTools/Simu.hs
index 6c01726ecc99a2045da26878836cee77af4b6072..d41f4a39bee7c38db4f4e5fdf2ad3e68a3ed8ac3 100644
--- a/Ganeti/HTools/Simu.hs
+++ b/Ganeti/HTools/Simu.hs
@@ -59,7 +59,7 @@ parseData ndata = do
                     let n = Node.create (printf "node%03d" idx)
                             (fromIntegral mem) 0 mem
                             (fromIntegral disk) disk
-                            (fromIntegral cpu) False
+                            (fromIntegral cpu) False defaultUUID
                     in (idx, Node.setIdx n idx)
                   ) [1..cnt]
   return (nodes, [], [])
diff --git a/Ganeti/HTools/Text.hs b/Ganeti/HTools/Text.hs
index c9aac174a8ef115efb201c8931dfcc8dd58675d5..5b8d955989956a0e1809c814eb82f5829c9fb5e4 100644
--- a/Ganeti/HTools/Text.hs
+++ b/Ganeti/HTools/Text.hs
@@ -95,7 +95,7 @@ loadNode :: (Monad m) => [String] -> m (String, Node.Node)
 loadNode [name, tm, nm, fm, td, fd, tc, fo] = do
   new_node <-
       if any (== "?") [tm,nm,fm,td,fd,tc] || fo == "Y" then
-          return $ Node.create name 0 0 0 0 0 0 True
+          return $ Node.create name 0 0 0 0 0 0 True defaultUUID
       else do
         vtm <- tryRead name tm
         vnm <- tryRead name nm
@@ -103,7 +103,7 @@ loadNode [name, tm, nm, fm, td, fd, tc, fo] = do
         vtd <- tryRead name td
         vfd <- tryRead name fd
         vtc <- tryRead name tc
-        return $ Node.create name vtm vnm vfm vtd vfd vtc False
+        return $ Node.create name vtm vnm vfm vtd vfd vtc False defaultUUID
   return (name, new_node)
 loadNode s = fail $ "Invalid/incomplete node data: '" ++ show s ++ "'"