diff --git a/htools/Ganeti/HTools/Program/Hcheck.hs b/htools/Ganeti/HTools/Program/Hcheck.hs
index 6ce561fbd1c63a20c3c32e3f849c54585fca552d..da39d1275442c15fe2e1060b89b8b955d2f37993 100644
--- a/htools/Ganeti/HTools/Program/Hcheck.hs
+++ b/htools/Ganeti/HTools/Program/Hcheck.hs
@@ -113,12 +113,24 @@ groupData = commonData ++ [("SCORE", "Group score")]
 
 -- | Data showed per cluster.
 clusterData :: [(String, String)]
-clusterData = commonData ++ [("NEED_REBALANCE", "Cluster is not healthy")]
+clusterData = commonData ++
+              [ ("NEED_REBALANCE", "Cluster is not healthy")
+              , ("CAN_REBALANCE", "Possible to run rebalance")
+              ]
+
 
 -- | Format a list of key, value as a shell fragment.
 printKeysHTC :: [(String, String)] -> IO ()
 printKeysHTC = printKeys htcPrefix
 
+-- | Prepare string from boolean value.
+printBool :: Bool    -- ^ Whether the result should be machine readable
+          -> Bool    -- ^ Value to be converted to string
+          -> String
+printBool True True = "1"
+printBool True False = "0"
+printBool False b = show b
+
 -- | Print all the statistics on a group level.
 printGroupStats :: Int -> Bool -> Phase -> Gdx -> [Int] -> Double -> IO ()
 printGroupStats _ True phase gidx stats score = do
@@ -140,26 +152,27 @@ printGroupStats verbose False phase gidx stats score = do
           (zip groupData printstats)
 
 -- | Print all the statistics on a cluster (global) level.
-printClusterStats :: Int -> Bool -> Phase -> [Int] -> IO (Bool)
-printClusterStats _ True phase stats = do
-  let needrebal = sum stats
-      printstats = map (printf "%d") $ stats ++ [needrebal]
-                 :: [String]
+printClusterStats :: Int -> Bool -> Phase -> [Int] -> Bool -> IO (Bool)
+printClusterStats _ True phase stats canrebal = do
+  let needrebal = sum stats > 0
+      printstats = map (printf "%d") stats ++
+                   map (printBool True) [needrebal, canrebal]
       printkeys = map (printf "%s_%s_%s"
                               (phasePrefix phase)
                               (levelPrefix ClusterLvl))
                       (map fst clusterData) :: [String]
   printKeysHTC (zip printkeys printstats)
-  return $ needrebal > 0
+  return needrebal
 
-printClusterStats verbose False phase stats = do
-  let needrebal = sum stats
-      printstats = map (printf "%d") stats :: [String]
+printClusterStats verbose False phase stats canrebal = do
+  let needrebal = sum stats > 0
+      printstats = map (printf "%d") stats ++
+                   map (printBool False) [needrebal, canrebal]
   unless (verbose == 0) $ do
       printf "\nCluster statistics %s\n" (phaseDescription phase) :: IO ()
       mapM_ (\(a,b) -> printf "    %s: %s\n" (snd a) b :: IO ())
-            (zip clusterData (printstats ++ [show (needrebal>0)]))
-  return $ needrebal > 0
+            (zip clusterData printstats)
+  return needrebal
 
 {- | Check group for N+1 hapiness, conflicts of primaries on nodes and
 instances residing on offline nodes.
@@ -233,7 +246,8 @@ main opts args = do
 
   groupsstats <- mapM (perGroupChecks verbose machineread Initial) splitcluster
   let clusterstats = map sum (transpose groupsstats) :: [Int]
-  needrebalance <- printClusterStats verbose machineread Initial clusterstats
+      canrebalance = length splitinstances == 0
+  needrebalance <- printClusterStats verbose machineread Initial clusterstats canrebalance
 
   when nosimulation $ do
     unless (verbose == 0 || machineread) $
@@ -256,6 +270,6 @@ main opts args = do
   newgroupstats <- mapM (perGroupChecks verbose machineread Rebalanced)
                      rebalancedcluster
   let newclusterstats = map sum (transpose newgroupstats) :: [Int]
-  _ <- printClusterStats verbose machineread Rebalanced newclusterstats
+  _ <- printClusterStats verbose machineread Rebalanced newclusterstats canrebalance
 
   printFinalHTC machineread