diff --git a/lib/mcpu.py b/lib/mcpu.py
index 9f3eacbc4e70d68d1ee827c5efd77785a087d5db..31576e01e04941e3f3fdce0d7ffdde0e580634d2 100644
--- a/lib/mcpu.py
+++ b/lib/mcpu.py
@@ -71,60 +71,40 @@ def _CalculateLockAttemptTimeouts():
   return result
 
 
-class _LockAttemptTimeoutStrategy(object):
+class LockAttemptTimeoutStrategy(object):
   """Class with lock acquire timeout strategy.
 
   """
   __slots__ = [
-    "_attempt",
+    "_timeouts",
     "_random_fn",
-    "_start_time",
     "_time_fn",
-    "_running_timeout",
     ]
 
   _TIMEOUT_PER_ATTEMPT = _CalculateLockAttemptTimeouts()
 
-  def __init__(self, attempt=0, _time_fn=time.time, _random_fn=random.random):
+  def __init__(self, _time_fn=time.time, _random_fn=random.random):
     """Initializes this class.
 
-    @type attempt: int
-    @param attempt: Current attempt number
     @param _time_fn: Time function for unittests
     @param _random_fn: Random number generator for unittests
 
     """
     object.__init__(self)
 
-    if attempt < 0:
-      raise ValueError("Attempt must be zero or positive")
-
-    self._attempt = attempt
+    self._timeouts = iter(self._TIMEOUT_PER_ATTEMPT)
     self._time_fn = _time_fn
     self._random_fn = _random_fn
 
-    try:
-      timeout = self._TIMEOUT_PER_ATTEMPT[attempt]
-    except IndexError:
-      # No more timeouts, do blocking acquire
-      timeout = None
-
-    self._running_timeout = locking.RunningTimeout(timeout, False,
-                                                   _time_fn=_time_fn)
-
   def NextAttempt(self):
-    """Returns the strategy for the next attempt.
+    """Returns the timeout for the next attempt.
 
     """
-    return _LockAttemptTimeoutStrategy(attempt=self._attempt + 1,
-                                       _time_fn=self._time_fn,
-                                       _random_fn=self._random_fn)
-
-  def CalcRemainingTimeout(self):
-    """Returns the remaining timeout.
-
-    """
-    timeout = self._running_timeout.Remaining()
+    try:
+      timeout = self._timeouts.next()
+    except StopIteration:
+      # No more timeouts, do blocking acquire
+      timeout = None
 
     if timeout is not None:
       # Add a small variation (-/+ 5%) to timeout. This helps in situations
diff --git a/test/ganeti.mcpu_unittest.py b/test/ganeti.mcpu_unittest.py
index 80d4088f30f6147145016133e613b0dc1498df07..bdfd3a2755f09adec3ac4c4f202d8fff7ad87ce8 100755
--- a/test/ganeti.mcpu_unittest.py
+++ b/test/ganeti.mcpu_unittest.py
@@ -31,32 +31,27 @@ import testutils
 
 class TestLockAttemptTimeoutStrategy(unittest.TestCase):
   def testConstants(self):
-    tpa = mcpu._LockAttemptTimeoutStrategy._TIMEOUT_PER_ATTEMPT
+    tpa = mcpu.LockAttemptTimeoutStrategy._TIMEOUT_PER_ATTEMPT
     self.assert_(len(tpa) > 10)
     self.assert_(sum(tpa) >= 150.0)
 
   def testSimple(self):
-    strat = mcpu._LockAttemptTimeoutStrategy(_random_fn=lambda: 0.5,
-                                             _time_fn=lambda: 0.0)
-
-    self.assertEqual(strat._attempt, 0)
+    strat = mcpu.LockAttemptTimeoutStrategy(_random_fn=lambda: 0.5,
+                                            _time_fn=lambda: 0.0)
 
     prev = None
-    for i in range(len(mcpu._LockAttemptTimeoutStrategy._TIMEOUT_PER_ATTEMPT)):
-      timeout = strat.CalcRemainingTimeout()
+    for i in range(len(strat._TIMEOUT_PER_ATTEMPT)):
+      timeout = strat.NextAttempt()
       self.assert_(timeout is not None)
 
       self.assert_(timeout <= 10.0)
       self.assert_(timeout >= 0.0)
       self.assert_(prev is None or timeout >= prev)
 
-      strat = strat.NextAttempt()
-      self.assertEqual(strat._attempt, i + 1)
-
       prev = timeout
 
     for _ in range(10):
-      self.assert_(strat.CalcRemainingTimeout() is None)
+      self.assert_(strat.NextAttempt() is None)
 
 
 if __name__ == "__main__":