diff --git a/Ganeti/HTools/Cluster.hs b/Ganeti/HTools/Cluster.hs
index 4bbed2eabe9d6e2b0f7b8633df42e996817668c0..73060a1f5a473c9614cdb4811a3c730b1171c615 100644
--- a/Ganeti/HTools/Cluster.hs
+++ b/Ganeti/HTools/Cluster.hs
@@ -746,9 +746,9 @@ stripSuffix suffix lst =
     and massages it into the correct format. -}
 loadData :: String -- ^ Node data in text format
          -> String -- ^ Instance data in text format
-         -> (Container.Container Node.Node,
-             Container.Container Instance.Instance,
-             String, NameList, NameList)
+         -> Result (Container.Container Node.Node,
+                    Container.Container Instance.Instance,
+                    String, NameList, NameList)
 loadData ndata idata =
     let
     {- node file: name t_mem n_mem f_mem t_disk f_disk -}
@@ -781,7 +781,7 @@ loadData ndata idata =
         stn = stripSuffix common_suffix xtn
         sti = stripSuffix common_suffix xti
     in
-      (nl3, il3, common_suffix, stn, sti)
+      Ok (nl3, il3, common_suffix, stn, sti)
 
 -- | Compute the amount of memory used by primary instances on a node.
 nodeImem :: Node.Node -> InstanceList -> Int
diff --git a/hbal.hs b/hbal.hs
index 425a6d6d32d0ef1a7b58f1c706389df5b7b41bb7..a69622a1255e347715058a7c670180aebe0df21c 100644
--- a/hbal.hs
+++ b/hbal.hs
@@ -186,7 +186,14 @@ main = do
             host -> (getNodes host >>= readData,
                      getInstances host >>= readData)
 
-  (loaded_nl, il, csf, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data
+  ldresult <- liftM2 Cluster.loadData node_data inst_data
+  (loaded_nl, il, csf, ktn, kti) <-
+      (case ldresult of
+         Ok x -> return x
+         Bad s -> do
+           printf "Error: failed to load data. Details:\n%s\n" s
+           exitWith $ ExitFailure 1
+      )
   let (fix_msgs, fixed_nl) = Cluster.checkData loaded_nl il ktn kti
 
   unless (null fix_msgs || verbose == 0) $ do
diff --git a/hn1.hs b/hn1.hs
index 133b4c96788ff32ad1fe576125b6f79d76963220..adef634d566ced4d8e7e1eb4e36f80753935d5c1 100644
--- a/hn1.hs
+++ b/hn1.hs
@@ -135,7 +135,7 @@ main = do
          exitWith $ ExitFailure 1
 
   when (optShowVer opts) $ do
-         printf $ CLI.showVersion "hn1"
+         putStr $ CLI.showVersion "hn1"
          exitWith ExitSuccess
 
   (env_node, env_inst) <- CLI.parseEnv ()
@@ -151,8 +151,14 @@ main = do
             host -> (getNodes host >>= readData,
                      getInstances host >>= readData)
 
-  (loaded_nl, il, csf, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data
-
+  ldresult <- liftM2 Cluster.loadData node_data inst_data
+  (loaded_nl, il, csf, ktn, kti) <-
+      (case ldresult of
+         Ok x -> return x
+         Bad s -> do
+           printf "Error: failed to load data. Details:\n%s\n" s
+           exitWith $ ExitFailure 1
+      )
   let (fix_msgs, nl) = Cluster.checkData loaded_nl il ktn kti
 
   unless (null fix_msgs) $ do
diff --git a/hscan.hs b/hscan.hs
index 228998768a4d90b7121e5d29941f16cece5fcd04..21c249ea08f5601f84935b7c7ab0aa53606df208 100644
--- a/hscan.hs
+++ b/hscan.hs
@@ -154,29 +154,26 @@ main = do
                 "Name" "Nodes" "Inst" "BNode" "BInst" "t_mem" "f_mem"
                 "t_disk" "f_disk" "Score"
 
-  mapM (\ name ->
+  mapM_ (\ name ->
             do
               printf "%-*s " nlen name
               hFlush stdout
               node_data <- getNodes name
               inst_data <- getInstances name
-              (case node_data of
-                 Bad err -> putStrLn err
-                 Ok ndata ->
-                     case inst_data of
-                       Bad err -> putStrLn err
-                       Ok idata ->
-                           do
-                             let  (nl, il, csf, ktn, kti) =
-                                      Cluster.loadData ndata idata
-                                  (_, fix_nl) = Cluster.checkData nl il ktn kti
-                             putStrLn $ printCluster fix_nl il ktn kti
-                             when (optShowNodes opts) $ do
-                                      putStr $ Cluster.printNodes ktn fix_nl
-                             let ndata = serializeNodes nl csf ktn
-                                 idata = serializeInstances il csf ktn kti
-                                 oname = odir </> (fixSlash name)
-                             writeFile (oname <.> "nodes") ndata
-                             writeFile (oname <.> "instances") idata)
+              let ldresult = join $
+                             liftM2 Cluster.loadData node_data inst_data
+              (case ldresult of
+                 Bad err -> printf "\nError: failed to load data. \
+                                   \Details:\n%s\n" err
+                 Ok x -> do
+                   let (nl, il, csf, ktn, kti) = x
+                       (_, fix_nl) = Cluster.checkData nl il ktn kti
+                   putStrLn $ printCluster fix_nl il ktn kti
+                   when (optShowNodes opts) $ do
+                           putStr $ Cluster.printNodes ktn fix_nl
+                   let ndata = serializeNodes nl csf ktn
+                       idata = serializeInstances il csf ktn kti
+                       oname = odir </> (fixSlash name)
+                   writeFile (oname <.> "nodes") ndata
+                   writeFile (oname <.> "instances") idata)
        ) clusters
-  exitWith ExitSuccess