diff --git a/htools/Ganeti/HTools/Node.hs b/htools/Ganeti/HTools/Node.hs
index cc723ad4351c5981541ae06eeac28ff70f5f027a..7b4e70e13e6e885e751603f07a1e0f2b927a7f36 100644
--- a/htools/Ganeti/HTools/Node.hs
+++ b/htools/Ganeti/HTools/Node.hs
@@ -327,9 +327,13 @@ removePri t inst =
 removeSec :: Node -> Instance.Instance -> Node
 removeSec t inst =
     let iname = Instance.idx inst
+        uses_disk = Instance.usesLocalStorage inst
+        cur_dsk = fDsk t
         pnode = Instance.pNode inst
         new_slist = delete iname (sList t)
-        new_dsk = fDsk t + Instance.dsk inst
+        new_dsk = if uses_disk
+                  then cur_dsk + Instance.dsk inst
+                  else cur_dsk
         old_peers = peers t
         old_peem = P.find pnode old_peers
         new_peem =  if Instance.autoBalance inst
@@ -368,8 +372,12 @@ addPriEx :: Bool               -- ^ Whether to override the N+1 and
                                -- or a failure mode
 addPriEx force t inst =
     let iname = Instance.idx inst
+        uses_disk = Instance.usesLocalStorage inst
+        cur_dsk = fDsk t
         new_mem = fMem t - Instance.mem inst
-        new_dsk = fDsk t - Instance.dsk inst
+        new_dsk = if uses_disk
+                  then cur_dsk - Instance.dsk inst
+                  else cur_dsk
         new_failn1 = new_mem <= rMem t
         new_ucpu = uCpu t + Instance.vcpus inst
         new_pcpu = fromIntegral new_ucpu / tCpu t
@@ -381,8 +389,8 @@ addPriEx force t inst =
         strict = not force
     in case () of
          _ | new_mem <= 0 -> T.OpFail T.FailMem
-           | new_dsk <= 0 -> T.OpFail T.FailDisk
-           | mDsk t > new_dp && strict -> T.OpFail T.FailDisk
+           | uses_disk && new_dsk <= 0 -> T.OpFail T.FailDisk
+           | uses_disk && mDsk t > new_dp && strict -> T.OpFail T.FailDisk
            | new_failn1 && not (failN1 t) && strict -> T.OpFail T.FailMem
            | l_cpu >= 0 && l_cpu < new_pcpu && strict -> T.OpFail T.FailCPU
            | rejectAddTags old_tags inst_tags -> T.OpFail T.FailTags
@@ -421,7 +429,8 @@ addSecEx force t inst pdx =
                                             T.dskWeight (Instance.util inst) }
         strict = not force
     in case () of
-         _ | new_dsk <= 0 -> T.OpFail T.FailDisk
+         _ | not (Instance.hasSecondary inst) -> T.OpFail T.FailDisk
+           | new_dsk <= 0 -> T.OpFail T.FailDisk
            | mDsk t > new_dp && strict -> T.OpFail T.FailDisk
            | secondary_needed_mem >= old_mem && strict -> T.OpFail T.FailMem
            | new_failn1 && not (failN1 t) && strict -> T.OpFail T.FailMem