diff --git a/lib/config.py b/lib/config.py
index d2b9c5633b124defaca9f6d665b7297f63c7ca3e..c84c1f112c5d89fd49ddd7b2ef74b95ea1338de2 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -376,12 +376,11 @@ class ConfigWriter:
     net_uuid = self._UnlockedLookupNetwork(net)
     nobj = self._UnlockedGetNetwork(net_uuid)
     pool = network.AddressPool(nobj)
-    gen_free = pool.GenerateFree()
 
     def gen_one():
       try:
-        ip = gen_free()
-      except StopIteration:
+        ip = pool.GenerateFree()
+      except errors.AddressPoolError:
         raise errors.ReservationError("Cannot generate IP. Network is full")
       return (constants.RESERVE_ACTION, ip, net_uuid)
 
diff --git a/lib/network.py b/lib/network.py
index 31037b99117f378cd6c230fe6e5551abe9889f93..a0197053da8f40e1b765c119b53c1ef46c6cebc9 100644
--- a/lib/network.py
+++ b/lib/network.py
@@ -173,12 +173,14 @@ class AddressPool(object):
     return address
 
   def GenerateFree(self):
-    """A generator for free addresses."""
-    def _iter_free():
-      for idx in self.all_reservations.search("0", 64):
-        yield str(self.network[idx])
-    # pylint: disable=E1101
-    return _iter_free().next
+    """Returns the first free address of the network if any or
+       raises an error if it is full.
+
+    """
+    if self.IsFull():
+      raise errors.AddressPoolError("%s is full" % self.network)
+    idx = self.all_reservations.search("0", 1)
+    return str(self.network[idx])
 
   def GetExternalReservations(self):
     """Returns a list of all externally reserved addresses"""