diff --git a/Ganeti/HTools/IAlloc.hs b/Ganeti/HTools/IAlloc.hs
index f6a27337089f88eb3b6f4fc353c135cfeef83736..241bbd8508c28eafc78dc683a9ffd8da2264912d 100644
--- a/Ganeti/HTools/IAlloc.hs
+++ b/Ganeti/HTools/IAlloc.hs
@@ -82,12 +82,12 @@ parseData body = do
   nlist <- fromObj "nodes" obj
   let ndata = fromJSObject nlist
   nobj <- (mapM (\(x,y) -> asJSObject y >>= parseNode x)) ndata
-  let (ktn, nl) = assignIndices Node.setIdx nobj
+  let (ktn, nl) = assignIndices nobj
   -- existing instance parsing
   ilist <- fromObj "instances" obj
   let idata = fromJSObject ilist
   iobj <- (mapM (\(x,y) -> asJSObject y >>= parseInstance ktn x)) idata
-  let (kti, il) = assignIndices Instance.setIdx iobj
+  let (kti, il) = assignIndices iobj
   optype <- fromObj "type" request
   rqtype <-
       case optype of
diff --git a/Ganeti/HTools/Instance.hs b/Ganeti/HTools/Instance.hs
index f7b9b42d43d4e4d623c2678077467d0b5be80796..8aecf72b4716bf8729a85fe3203ea2dd50f503dd 100644
--- a/Ganeti/HTools/Instance.hs
+++ b/Ganeti/HTools/Instance.hs
@@ -62,3 +62,7 @@ setIdx :: Instance  -- ^ the original instance
         -> Int      -- ^ new index
         -> Instance -- ^ the modified instance
 setIdx t i = t { idx = i }
+
+-- | Changes the name
+-- This is used only during the building of the data structures.
+setName t s = t {name = s}
diff --git a/Ganeti/HTools/Loader.hs b/Ganeti/HTools/Loader.hs
index 11f73b532bf8a3f7e944020b8c2af8d47db2f10c..4b9bc7b49bf12abd1d5bf5abeab5bb0e79795594 100644
--- a/Ganeti/HTools/Loader.hs
+++ b/Ganeti/HTools/Loader.hs
@@ -28,11 +28,11 @@ lookupNode ktn inst node =
       Nothing -> fail $ "Unknown node '" ++ node ++ "' for instance " ++ inst
       Just idx -> return idx
 
-assignIndices :: (a -> Int -> a)
-              -> [(String, a)]
+assignIndices :: (Element a) =>
+                 [(String, a)]
               -> (NameAssoc, [(Int, a)])
-assignIndices set_fn =
-    unzip . map (\ (idx, (k, v)) -> ((k, idx), (idx, set_fn v idx)))
+assignIndices =
+    unzip . map (\ (idx, (k, v)) -> ((k, idx), (idx, setIdx v idx)))
           . zip [0..]
 
 -- | For each instance, add its index to its primary and secondary nodes
diff --git a/Ganeti/HTools/Node.hs b/Ganeti/HTools/Node.hs
index 228107e5b8227107a86eb53427612a77cbd8e1d8..9f54f03707c6bf9e27b4731667dd9d99db23decf 100644
--- a/Ganeti/HTools/Node.hs
+++ b/Ganeti/HTools/Node.hs
@@ -14,6 +14,7 @@ module Ganeti.HTools.Node
     -- ** Finalization after data loading
     , buildPeers
     , setIdx
+    , setName
     , setOffline
     , setXmem
     , setFmem
@@ -102,6 +103,10 @@ create name_init mem_t_init mem_n_init mem_f_init
 setIdx :: Node -> Int -> Node
 setIdx t i = t {idx = i}
 
+-- | Changes the name
+-- This is used only during the building of the data structures.
+setName t s = t {name = s}
+
 -- | Sets the offline attribute
 setOffline :: Node -> Bool -> Node
 setOffline t val = t { offline = val }
diff --git a/Ganeti/HTools/Rapi.hs b/Ganeti/HTools/Rapi.hs
index 6f20e7bf4553967a1ae6d707f84c81e598fe624a..ac0ff44fad9addf2ccf011954ed1da97922d12aa 100644
--- a/Ganeti/HTools/Rapi.hs
+++ b/Ganeti/HTools/Rapi.hs
@@ -92,7 +92,7 @@ loadData master = do -- IO monad
   inst_body <- getUrl $ printf "%s/2/instances?bulk=1" url
   return $ do -- Result monad
     node_data <- node_body >>= getNodes
-    let (node_names, node_idx) = assignIndices Node.setIdx node_data
+    let (node_names, node_idx) = assignIndices node_data
     inst_data <- inst_body >>= getInstances node_names
-    let (inst_names, inst_idx) = assignIndices Instance.setIdx inst_data
+    let (inst_names, inst_idx) = assignIndices inst_data
     return (node_names, node_idx, inst_names, inst_idx)
diff --git a/Ganeti/HTools/Text.hs b/Ganeti/HTools/Text.hs
index 03ff5cf6b5e3d44f1acc7a5591ea6b8698a5bb33..7c85db3fe3402b0ce79e48f185f40a31997786f7 100644
--- a/Ganeti/HTools/Text.hs
+++ b/Ganeti/HTools/Text.hs
@@ -64,13 +64,14 @@ This function converts a text in tabular format as generated by
 supplied conversion function.
 
 -}
-loadTabular :: (Monad m) => String -> ([String] -> m (String, a))
-            -> (a -> Int -> a) -> m ([(String, Int)], [(Int, a)])
-loadTabular text_data convert_fn set_fn = do
+loadTabular :: (Monad m, Element a) =>
+               String -> ([String] -> m (String, a))
+            -> m ([(String, Int)], [(Int, a)])
+loadTabular text_data convert_fn = do
   let lines_data = lines text_data
       rows = map (sepSplit '|') lines_data
   kerows <- mapM convert_fn rows
-  return $ assignIndices set_fn kerows
+  return $ assignIndices kerows
 
 loadData :: String -- ^ Node data in string format
          -> String -- ^ Instance data in string format
@@ -81,7 +82,7 @@ loadData nfile ifile = do -- IO monad
   idata <- readFile ifile
   return $ do
     {- node file: name t_mem n_mem f_mem t_disk f_disk -}
-    (ktn, nl) <- loadTabular ndata loadNode Node.setIdx
+    (ktn, nl) <- loadTabular ndata loadNode
     {- instance file: name mem disk status pnode snode -}
-    (kti, il) <- loadTabular idata (loadInst ktn) Instance.setIdx
+    (kti, il) <- loadTabular idata (loadInst ktn)
     return (ktn, nl, kti, il)
diff --git a/Ganeti/HTools/Types.hs b/Ganeti/HTools/Types.hs
index 0a248028e0e791751f5a6d41a9abe8a00ecfcf27..8bae7c3d038c8e444f880a85ef743a427c1e2b7b 100644
--- a/Ganeti/HTools/Types.hs
+++ b/Ganeti/HTools/Types.hs
@@ -39,3 +39,24 @@ instance Monad Result where
     (>>=) (Ok x) fn = fn x
     return = Ok
     fail = Bad
+
+-- | A generic class for nodes and instances
+class Element a where
+    name    :: a -> String
+    idx     :: a -> Int
+    setName :: a -> String -> a
+    setIdx  :: a -> Int -> a
+
+-- Let's make nodes elements of the cluster
+instance Element Node.Node where
+    name = Node.name
+    idx = Node.idx
+    setName = Node.setName
+    setIdx = Node.setIdx
+
+-- And instances too
+instance Element Instance.Instance where
+    name = Instance.name
+    idx = Instance.idx
+    setName = Instance.setName
+    setIdx = Instance.setIdx