diff --git a/Ganeti/HTools/CLI.hs b/Ganeti/HTools/CLI.hs
index 972d4a2fa2adc50e4b84378d3690e51c1489b5c0..d625e2fa04142226fa668f58449ca75b325c679e 100644
--- a/Ganeti/HTools/CLI.hs
+++ b/Ganeti/HTools/CLI.hs
@@ -42,7 +42,7 @@ import System.IO
 import System.Info
 import System
 import Monad
-import Text.Printf (printf)
+import Text.Printf (printf, hPrintf)
 import qualified Data.Version
 
 import qualified Ganeti.HTools.Version as Version(version)
@@ -151,13 +151,13 @@ loadExternalData opts = do
       (case ldresult of
          Ok x -> return x
          Bad s -> do
-           printf "Error: failed to load data. Details:\n%s\n" s
+           hPrintf stderr "Error: failed to load data. Details:\n%s\n" s
            exitWith $ ExitFailure 1
       )
   let (fix_msgs, fixed_nl) = Loader.checkData loaded_nl il
 
   unless (null fix_msgs || silent opts) $ do
-         putStrLn "Warning: cluster has inconsistent data:"
-         putStrLn . unlines . map (printf "  - %s") $ fix_msgs
+         hPutStrLn stderr "Warning: cluster has inconsistent data:"
+         hPutStrLn stderr . unlines . map (printf "  - %s") $ fix_msgs
 
   return (fixed_nl, il, csf)
diff --git a/hail.hs b/hail.hs
index 4befe386dcdb2a71a754fb35fd72669ee170943d..d216a46e3977fe868f51a22dc9d95b7d325f3411 100644
--- a/hail.hs
+++ b/hail.hs
@@ -124,7 +124,7 @@ main = do
 
   request <- case (parseData input_data) of
                Bad err -> do
-                 putStrLn $ "Error: " ++ err
+                 hPutStrLn stderr $ "Error: " ++ err
                  exitWith $ ExitFailure 1
                Ok rq -> return rq
 
diff --git a/hbal.hs b/hbal.hs
index 7e5ab282d5dbbd4a06798c0371ffae0204a65cfc..15333462e4cddfdc6d6be2369c98f81f3fe91498 100644
--- a/hbal.hs
+++ b/hbal.hs
@@ -34,7 +34,7 @@ import System.IO
 import System.Console.GetOpt
 import qualified System
 
-import Text.Printf (printf)
+import Text.Printf (printf, hPrintf)
 
 import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Cluster as Cluster
@@ -224,8 +224,8 @@ main = do
       m_dsk = optMdsk opts
 
   when (length offline_wrong > 0) $ do
-         printf "Wrong node name(s) set as offline: %s\n"
-                (commaJoin offline_wrong)
+         hPrintf stderr "Wrong node name(s) set as offline: %s\n"
+                     (commaJoin offline_wrong)
          exitWith $ ExitFailure 1
 
   let nm = Container.map (\n -> if elem (Node.idx n) offline_indices
diff --git a/hspace.hs b/hspace.hs
index 6ad59ccbc45d8c9e0e0d5d89d4dc3c99d537b834..ae83c3515ea9c9cb0686937a15cee718ca38f780 100644
--- a/hspace.hs
+++ b/hspace.hs
@@ -33,7 +33,7 @@ import System.IO
 import System.Console.GetOpt
 import qualified System
 
-import Text.Printf (printf)
+import Text.Printf (printf, hPrintf)
 
 import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Cluster as Cluster
@@ -241,14 +241,15 @@ main = do
          hPutStrLn stderr "Error: this program doesn't take any arguments."
          exitWith $ ExitFailure 1
 
+  let verbose = optVerbose opts
+
+  (fixed_nl, il, csf) <- CLI.loadExternalData opts
+
   printf "Spec RAM: %d\n" (optIMem opts)
   printf "Spec disk: %d\n" (optIDsk opts)
   printf "Spec CPUs: %d\n" (optIVCPUs opts)
   printf "Spec nodes: %d\n" (optINodes opts)
 
-  let verbose = optVerbose opts
-
-  (fixed_nl, il, csf) <- CLI.loadExternalData opts
   let num_instances = length $ Container.elems il
 
   let offline_names = optOffline opts
@@ -263,12 +264,12 @@ main = do
       m_dsk = optMdsk opts
 
   when (length offline_wrong > 0) $ do
-         printf "Error: Wrong node name(s) set as offline: %s\n"
-                (commaJoin offline_wrong)
+         hPrintf stderr "Error: Wrong node name(s) set as offline: %s\n"
+                     (commaJoin offline_wrong)
          exitWith $ ExitFailure 1
 
   when (req_nodes /= 1 && req_nodes /= 2) $ do
-         printf "Error: Invalid required nodes (%d)\n" req_nodes
+         hPrintf stderr "Error: Invalid required nodes (%d)\n" req_nodes
          exitWith $ ExitFailure 1
 
   let nm = Container.map (\n -> if elem (Node.idx n) offline_indices