diff --git a/src/Cluster.hs b/src/Cluster.hs
index c45f9b93cca7c32ff92297b80f37815ec9bc0e11..1ba22c55dd040598911e684c1ff6853f7d8f704d 100644
--- a/src/Cluster.hs
+++ b/src/Cluster.hs
@@ -394,29 +394,43 @@ checkMove :: Table            -- ^ The current solution
           -> [Instance.Instance] -- ^ List of instances still to move
           -> Table            -- ^ The new solution
 checkMove ini_tbl victims =
-  let target = head victims
-      opdx = Instance.pnode target
-      osdx = Instance.snode target
-      vtail = tail victims
-      have_tail = (length vtail) > 0
-      Table ini_nl _ _ _ = ini_tbl
-      nodes = filter (\node -> let idx = Node.idx node
-                               in idx /= opdx && idx /= osdx)
-              $ Container.elems ini_nl
-      aft_failover = checkSingleStep ini_tbl target ini_tbl Failover
-      next_tbl =
-          foldl'
-          (\ accu_p new_node ->
-               let
-                   new_idx = Node.idx new_node
-                   pmoves = [ReplacePrimary new_idx,
-                             ReplaceSecondary new_idx]
-               in
-                 foldl' (checkSingleStep ini_tbl target) accu_p pmoves
-          ) aft_failover nodes
-  in if have_tail then checkMove next_tbl vtail
-     else next_tbl
-
+    let Table ini_nl _ _ ini_plc = ini_tbl
+        best_tbl =
+            foldl -- iterate over all instances, computing the best move
+            (\ step_tbl target ->
+                 let
+                     opdx = Instance.pnode target
+                     osdx = Instance.snode target
+                     nodes = filter (\node -> let idx = Node.idx node
+                                              in idx /= opdx && idx /= osdx)
+                             $ Container.elems ini_nl
+                     aft_failover = checkSingleStep ini_tbl
+                                    target ini_tbl Failover
+                     next_tbl = -- iterate over the possible nodes for
+                                -- this instance
+                         foldl'
+                         (\ accu_p new_node ->
+                              let
+                                  new_idx = Node.idx new_node
+                                  pmoves = [ReplacePrimary new_idx,
+                                            ReplaceSecondary new_idx]
+                              in
+                                foldl' -- while doing both possible moves
+                                (checkSingleStep ini_tbl target) accu_p pmoves
+                         ) aft_failover nodes
+                 in
+                   compareTables step_tbl next_tbl
+            ) ini_tbl victims
+    in let
+        Table _ _ _ best_plc = best_tbl
+        (target, _, _) = head best_plc
+        vtail = filter (\inst -> Instance.idx inst /= target) victims
+       in
+         if length best_plc == length ini_plc then -- no advancement
+             ini_tbl
+         else
+             if null vtail then best_tbl
+             else checkMove best_tbl vtail
 
 
 {- | Auxiliary function for solution computation.