diff --git a/Ganeti/HTools/Container.hs b/Ganeti/HTools/Container.hs
index 0fb2c7f44d3f702f1d641031e1a9cfeb1412be02..c113193f38b18a1075afd6fa5d6b5af1166458ca 100644
--- a/Ganeti/HTools/Container.hs
+++ b/Ganeti/HTools/Container.hs
@@ -19,6 +19,7 @@ module Ganeti.HTools.Container
     , add
     , addTwo
     , remove
+    , IntMap.map
     -- * Conversion
     , elems
     , keys
diff --git a/hbal.hs b/hbal.hs
index 3d36700439206bfa92a67e24ff172acbfc96bc9e..40cedd54d02a75a79885c0df768477cd5a634cb6 100644
--- a/hbal.hs
+++ b/hbal.hs
@@ -17,6 +17,7 @@ import Text.Printf (printf)
 import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Cluster as Cluster
 import qualified Ganeti.HTools.Version as Version
+import qualified Ganeti.HTools.Node as Node
 import Ganeti.HTools.Rapi
 import Ganeti.HTools.Utils
 
@@ -31,6 +32,7 @@ data Options = Options
     , optMaster    :: String   -- ^ Collect data from RAPI
     , optVerbose   :: Int      -- ^ Verbosity level
     , optShowVer   :: Bool     -- ^ Just show the program version
+    , optOffline   :: [String] -- ^ Names of offline nodes
     } deriving Show
 
 -- | Default values for the command line options.
@@ -45,6 +47,7 @@ defaultOptions  = Options
  , optMaster    = ""
  , optVerbose   = 0
  , optShowVer   = False
+ , optOffline   = []
  }
 
 -- | Options list and functions
@@ -79,6 +82,9 @@ options =
     , Option ['V']     ["version"]
       (NoArg (\ opts -> opts { optShowVer = True}))
       "show the version of the program"
+    , Option ['O']     ["offline"]
+      (ReqArg (\ n opts -> opts { optOffline = n:optOffline opts }) "NODE")
+       " set node as offline"
     ]
 
 -- | Command line parser, using the 'options' structure.
@@ -109,7 +115,8 @@ iterateDepth :: Cluster.Table    -- ^ The starting table
 iterateDepth ini_tbl max_rounds ktn kti nmlen imlen cmd_strs oneline =
     let Cluster.Table ini_nl ini_il ini_cv ini_plc = ini_tbl
         all_inst = Container.elems ini_il
-        node_idx = Container.keys ini_nl
+        node_idx = map Node.idx . filter (not . Node.offline) $
+                   Container.elems ini_nl
         fin_tbl = Cluster.checkMove node_idx ini_tbl all_inst
         (Cluster.Table _ _ fin_cv fin_plc) = fin_tbl
         ini_plc_len = length ini_plc
@@ -152,7 +159,15 @@ main = do
             host -> (readData getNodes host,
                      readData getInstances host)
 
-  (nl, il, csf, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data
+  (loaded_nl, il, csf, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data
+
+  let offline_names = optOffline opts
+      offline_indices = fst . unzip .
+                        filter (\(_, n) -> elem n offline_names) $ ktn
+
+  let nl = Container.map (\n -> if elem (Node.idx n) offline_indices
+                                then Node.setOffline n True
+                                else n) loaded_nl
 
   unless oneline $ printf "Loaded %d nodes, %d instances\n"
              (Container.size nl)