Index: /trunk/src/VBox/NetworkServices/Dhcpd/Config.cpp
===================================================================
--- /trunk/src/VBox/NetworkServices/Dhcpd/Config.cpp	(revision 79818)
+++ /trunk/src/VBox/NetworkServices/Dhcpd/Config.cpp	(revision 79819)
@@ -830,4 +830,13 @@
         m_secMaxLeaseTime = 0;
 
+    /* Swap min and max if max is smaller: */
+    if (m_secMaxLeaseTime < m_secMinLeaseTime && m_secMinLeaseTime && m_secMaxLeaseTime)
+    {
+        LogRel(("Swapping min/max lease times: %u <-> %u\n", m_secMinLeaseTime, m_secMaxLeaseTime));
+        uint32_t uTmp = m_secMaxLeaseTime;
+        m_secMaxLeaseTime = m_secMinLeaseTime;
+        m_secMinLeaseTime = uTmp;
+    }
+
     /*
      * Parse children.
@@ -852,4 +861,33 @@
 {
     ConfigLevelBase::initFromXml(pElmOptions, fStrict, pConfig);
+
+    /*
+     * Resolve defaults here in the global config so we don't have to do this
+     * in Db::allocate() for every lease request.
+     */
+    if (m_secMaxLeaseTime == 0 && m_secDefaultLeaseTime == 0 && m_secMinLeaseTime == 0)
+    {
+        m_secMinLeaseTime     = 300;                /*  5 min */
+        m_secDefaultLeaseTime = 600;                /* 10 min */
+        m_secMaxLeaseTime     = 12 * RT_SEC_1HOUR;  /* 12 hours */
+    }
+    else
+    {
+        if (m_secDefaultLeaseTime == 0)
+        {
+            if (m_secMaxLeaseTime != 0)
+                m_secDefaultLeaseTime = RT_MIN(RT_MAX(m_secMinLeaseTime, 600), m_secMaxLeaseTime);
+            else
+            {
+                m_secDefaultLeaseTime = RT_MAX(m_secMinLeaseTime, 600);
+                m_secMaxLeaseTime = RT_MAX(m_secDefaultLeaseTime, 12 * RT_SEC_1HOUR);
+            }
+        }
+        if (m_secMaxLeaseTime == 0)
+            m_secMaxLeaseTime = RT_MAX(RT_MAX(m_secMinLeaseTime, m_secDefaultLeaseTime), 12 * RT_SEC_1HOUR);
+        if (m_secMinLeaseTime == 0)
+            m_secMinLeaseTime = RT_MIN(300, m_secDefaultLeaseTime);
+    }
+
 }
 
Index: /trunk/src/VBox/NetworkServices/Dhcpd/Config.h
===================================================================
--- /trunk/src/VBox/NetworkServices/Dhcpd/Config.h	(revision 79818)
+++ /trunk/src/VBox/NetworkServices/Dhcpd/Config.h	(revision 79819)
@@ -46,4 +46,5 @@
     /** DHCP options. */
     optmap_t        m_Options;
+protected:
     /** Minimum lease time, zero means try next level up. */
     uint32_t        m_secMinLeaseTime;
@@ -77,4 +78,11 @@
         return a_rItRet != m_Options.end();
     }
+
+    /** @name Accessors
+     * @{ */
+    uint32_t        getMinLeaseTime()     const RT_NOEXCEPT { return m_secMinLeaseTime; }
+    uint32_t        getDefaultLeaseTime() const RT_NOEXCEPT { return m_secDefaultLeaseTime; }
+    uint32_t        getMaxLeaseTime()     const RT_NOEXCEPT { return m_secMaxLeaseTime; }
+    /** @} */
 
 protected:
Index: /trunk/src/VBox/NetworkServices/Dhcpd/DHCPD.cpp
===================================================================
--- /trunk/src/VBox/NetworkServices/Dhcpd/DHCPD.cpp	(revision 79818)
+++ /trunk/src/VBox/NetworkServices/Dhcpd/DHCPD.cpp	(revision 79819)
@@ -245,5 +245,5 @@
     m_pConfig->getConfigsForClient(vecConfigs, req.clientId(), OptVendorClassId(req), OptUserClassId(req));
 
-    Binding *b = m_db.allocateBinding(req);
+    Binding *b = m_db.allocateBinding(req, vecConfigs);
     if (b == NULL)
         return NULL;
@@ -313,5 +313,5 @@
     m_pConfig->getConfigsForClient(vecConfigs, req.clientId(), OptVendorClassId(req), OptUserClassId(req));
 
-    Binding *b = m_db.allocateBinding(req);
+    Binding *b = m_db.allocateBinding(req, vecConfigs);
     if (b == NULL)
     {
Index: /trunk/src/VBox/NetworkServices/Dhcpd/Db.cpp
===================================================================
--- /trunk/src/VBox/NetworkServices/Dhcpd/Db.cpp	(revision 79818)
+++ /trunk/src/VBox/NetworkServices/Dhcpd/Db.cpp	(revision 79819)
@@ -649,6 +649,8 @@
  * @returns Pointer to the binding, NULL on failure.
  * @param   req                 The DHCP request being served.
- */
-Binding *Db::allocateBinding(const DhcpClientMessage &req)
+ * @param   rConfigVec          The configurations that applies to the client.
+ *                              Used for lease time calculation.
+ */
+Binding *Db::allocateBinding(const DhcpClientMessage &req, Config::ConfigVec const &rConfigVec)
 {
     const ClientId &id(req.clientId());
@@ -694,11 +696,45 @@
         Assert(b->id() == id);
 
-        /** @todo
-         * XXX: handle requests for specific lease time!
-         * XXX: old lease might not have expired yet?
-         * Make lease time configurable.
+        /*
+         * Figure out the lease time.
          */
-        // OptLeaseTime reqLeaseTime(req);
-        b->setLeaseTime(1200);
+        uint32_t secMin = 0;
+        uint32_t secDfl = 0;
+        uint32_t secMax = 0;
+        for (Config::ConfigVec::const_iterator it = rConfigVec.begin(); it != rConfigVec.end(); ++it)
+        {
+            ConfigLevelBase const *pConfig = *it;
+            if (secMin == 0)
+                secMin = pConfig->getMinLeaseTime();
+            if (secDfl == 0)
+                secDfl = pConfig->getDefaultLeaseTime();
+            if (secMax == 0)
+                secMax = pConfig->getMaxLeaseTime();
+        }
+        Assert(secMin); Assert(secMax); Assert(secDfl); /* global config always have non-defaults set */
+        if (secMin > secMax)
+            secMin = secMax;
+
+        OptLeaseTime reqLeaseTime(req);
+        if (!reqLeaseTime.present())
+        {
+            b->setLeaseTime(secDfl);
+            LogRel2(("Lease time %u secs (default)\n", b->leaseTime()));
+        }
+        else if (reqLeaseTime.value() < secMin)
+        {
+            b->setLeaseTime(secMin);
+            LogRel2(("Lease time %u secs (min)\n", b->leaseTime()));
+        }
+        else if (reqLeaseTime.value() > secMax)
+        {
+            b->setLeaseTime(secMax);
+            LogRel2(("Lease time %u secs (max)\n", b->leaseTime()));
+        }
+        else
+        {
+            b->setLeaseTime(reqLeaseTime.value());
+            LogRel2(("Lease time %u secs (requested)\n", b->leaseTime()));
+        }
     }
     return b;
Index: /trunk/src/VBox/NetworkServices/Dhcpd/Db.h
===================================================================
--- /trunk/src/VBox/NetworkServices/Dhcpd/Db.h	(revision 79818)
+++ /trunk/src/VBox/NetworkServices/Dhcpd/Db.h	(revision 79819)
@@ -182,5 +182,5 @@
     bool     addressBelongs(RTNETADDRIPV4 addr) const RT_NOEXCEPT { return m_pool.contains(addr); }
 
-    Binding *allocateBinding(const DhcpClientMessage &req);
+    Binding *allocateBinding(const DhcpClientMessage &req, Config::ConfigVec const &rConfigVec);
     bool     releaseBinding(const DhcpClientMessage &req) RT_NOEXCEPT;
 
