diff --git a/htools/Ganeti/HTools/Loader.hs b/htools/Ganeti/HTools/Loader.hs
index 446cc1044fcfd1dc18c5af477aa090c07119a5d0..5a5da6542a38a33236e3c39e1e82ad28044c148b 100644
--- a/htools/Ganeti/HTools/Loader.hs
+++ b/htools/Ganeti/HTools/Loader.hs
@@ -55,6 +55,7 @@ import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Instance as Instance
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Group as Group
+import qualified Ganeti.HTools.Cluster as Cluster
 
 import Ganeti.HTools.Types
 import Ganeti.HTools.Utils
@@ -246,6 +247,13 @@ updateMovable selinsts exinsts inst =
     then Instance.setMovable inst False
     else inst
 
+-- | Disables moves for instances with a split group.
+disableSplitMoves :: Node.List -> Instance.Instance -> Instance.Instance
+disableSplitMoves nl inst =
+  if not . isOk . Cluster.instanceGroup nl $ inst
+    then Instance.setMovable inst False
+    else inst
+
 -- | Compute the longest common suffix of a list of strings that
 -- starts with a dot.
 longestDomain :: [String] -> String
@@ -302,8 +310,9 @@ mergeData um extags selinsts exinsts cdata@(ClusterData gl nl il2 tags _) =
       nl3 = Container.map (setNodePolicy gl .
                            computeAlias common_suffix .
                            (`Node.buildPeers` il4)) nl2
+      il5 = Container.map (disableSplitMoves nl3) il4
   in if' (null lkp_unknown)
-         (Ok cdata { cdNodes = nl3, cdInstances = il4 })
+         (Ok cdata { cdNodes = nl3, cdInstances = il5 })
          (Bad $ "Unknown instance(s): " ++ show(map lrContent lkp_unknown))
 
 -- | Checks the cluster data for consistency.
diff --git a/htools/Ganeti/HTools/Program/Hbal.hs b/htools/Ganeti/HTools/Program/Hbal.hs
index 7f542a5c96163c799c154f5db968d512b40f4e1d..3a361628b8581544a5357290104fcad5a995d051 100644
--- a/htools/Ganeti/HTools/Program/Hbal.hs
+++ b/htools/Ganeti/HTools/Program/Hbal.hs
@@ -301,11 +301,10 @@ checkCluster verbose nl il = do
 
   -- hbal doesn't currently handle split clusters
   let split_insts = Cluster.findSplitInstances nl il
-  unless (null split_insts) $ do
+  unless (null split_insts || verbose <= 1) $ do
     hPutStrLn stderr "Found instances belonging to multiple node groups:"
     mapM_ (\i -> hPutStrLn stderr $ "  " ++ Instance.name i) split_insts
-    hPutStrLn stderr "Aborting."
-    exitWith $ ExitFailure 1
+    hPutStrLn stderr "These instances will not be moved."
 
   printf "Loaded %d nodes, %d instances\n"
              (Container.size nl)