]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3477] Finished unit tests
authorFrancis Dupont <fdupont@isc.org>
Tue, 9 Jul 2024 18:43:12 +0000 (20:43 +0200)
committerFrancis Dupont <fdupont@isc.org>
Thu, 1 Aug 2024 07:23:54 +0000 (09:23 +0200)
src/bin/d2/d2_process.cc
src/bin/d2/tests/d2_http_command_unittest.cc
src/bin/dhcp4/ctrl_dhcp4_srv.cc
src/bin/dhcp4/tests/Makefile.am
src/bin/dhcp4/tests/get_config_unittest.cc
src/bin/dhcp4/tests/http_control_socket_unittest.cc [new file with mode: 0644]
src/bin/dhcp6/ctrl_dhcp6_srv.cc
src/bin/dhcp6/tests/Makefile.am
src/bin/dhcp6/tests/get_config_unittest.cc
src/bin/dhcp6/tests/http_control_socket_unittest.cc [new file with mode: 0644]

index 9e3128887ae90cbaa961b3b60714e05edf77414b..19a23eaeaa8a0579f9f5721c4f4f30eecfaa07b8 100644 (file)
@@ -75,9 +75,13 @@ D2Process::D2Process(const char* name, const asiolink::IOServicePtr& io_service)
 
 void
 D2Process::init() {
+    using namespace isc::config;
     // CommandMgrs use IO service to run asynchronous socket operations.
-    isc::config::CommandMgr::instance().setIOService(getIOService());
-    isc::config::HttpCommandMgr::instance().setIOService(getIOService());
+    CommandMgr::instance().setIOService(getIOService());
+    HttpCommandMgr::instance().setIOService(getIOService());
+
+    // Set the HTTP authentication default realm.
+    HttpCommandConfig::DefaultAuthenticationRealm = "kea-dhcp-ddns-server";
 };
 
 void
index f2dfe68b8a36c326bcdc0fdc2bd682c441175671..d822cdf5f4d8d72578e730e7e0f8ca7613a92071 100644 (file)
@@ -32,7 +32,6 @@ using namespace isc::asiolink;
 using namespace isc::config;
 using namespace isc::d2;
 using namespace isc::data;
-//using namespace isc::dhcp::test;
 using namespace isc::http;
 using namespace isc::process;
 namespace ph = std::placeholders;
@@ -40,15 +39,6 @@ namespace ph = std::placeholders;
 namespace isc {
 namespace d2 {
 
-/// @brief IP address to which HTTP service is bound.
-const std::string SERVER_ADDRESS = "127.0.0.1";
-
-/// @brief Port number to which HTTP service is bound.
-const unsigned short SERVER_PORT = 18125;
-
-/// @brief Test timeout (ms).
-const long TEST_TIMEOUT = 10000;
-
 // "Naked" D2 controller, exposes internal methods.
 class NakedD2Controller;
 typedef boost::shared_ptr<NakedD2Controller> NakedD2ControllerPtr;
@@ -82,6 +72,15 @@ private:
 
 namespace {
 
+/// @brief IP address to which HTTP service is bound.
+const std::string SERVER_ADDRESS = "127.0.0.1";
+
+/// @brief Port number to which HTTP service is bound.
+const unsigned short SERVER_PORT = 18125;
+
+/// @brief Test timeout (ms).
+const long TEST_TIMEOUT = 10000;
+
 /// @brief Fixture class intended for testing HTTP control channel in D2.
 class HttpCtrlChannelD2Test : public ::testing::Test {
 public:
@@ -225,6 +224,65 @@ public:
         return (ss.str());
     }
 
+    /// @brief Create an HttpResponse from a response string.
+    ///
+    /// @param response_str a string containing the whole HTTP
+    /// response received.
+    ///
+    /// @return An HttpResponse constructed from by parsing the
+    /// response string.
+    HttpResponsePtr parseResponse(const std::string response_str) {
+        HttpResponsePtr hr(new HttpResponse());
+        HttpResponseParser parser(*hr);
+        parser.initModel();
+        parser.postBuffer(&response_str[0], response_str.size());
+        parser.poll();
+        if (!parser.httpParseOk()) {
+            isc_throw(Unexpected, "response_str: '" << response_str
+                      << "' failed to parse: " << parser.getErrorMessage());
+        }
+
+        return (hr);
+    }
+
+    /// @brief Conducts a command/response exchange via HttpCommandSocket.
+    ///
+    /// This method connects to the given server over the given address/port.
+    /// If successful, it then sends the given command and retrieves the
+    /// server's response.  Note that it polls the server's I/O service
+    /// where needed to cause the server to process IO events on
+    /// the control channel sockets
+    ///
+    /// @param command the command text to execute in JSON form.
+    /// @param response variable into which the received response should be
+    ///        placed.
+    void sendHttpCommand(const string& command, string& response) {
+        response = "";
+       IOServicePtr io_service = getIOService();
+       ASSERT_TRUE(io_service);
+        boost::scoped_ptr<TestHttpClient> client;
+        client.reset(new TestHttpClient(io_service, SERVER_ADDRESS,
+                                        SERVER_PORT));
+        ASSERT_TRUE(client);
+
+        // Send the command. This will trigger server's handler which
+        // receives data over the HTTP socket. The server will start
+        // sending response to the client.
+        ASSERT_NO_THROW(client->startRequest(buildPostStr(command)));
+        runIOService();
+        ASSERT_TRUE(client->receiveDone());
+
+        // Read the response generated by the server.
+        HttpResponsePtr hr;
+        ASSERT_NO_THROW(hr = parseResponse(client->getResponse()));
+        response = hr->getBody();
+
+        // Now close client.
+        client->close();
+
+        ASSERT_NO_THROW(io_service->poll());
+    }
+
     /// @brief Parse list answer.
     ///
     /// Clone of parseAnswer but taking the answer as a list and
@@ -284,63 +342,6 @@ public:
         return (msg->get(CONTROL_TEXT));
     }
 
-    /// @brief Create an HttpResponse from a response string.
-    ///
-    /// @param response_str a string containing the whole HTTP
-    /// response received.
-    ///
-    /// @return An HttpResponse constructed from by parsing the
-    /// response string.
-    HttpResponsePtr parseResponse(const std::string response_str) {
-        HttpResponsePtr hr(new HttpResponse());
-        HttpResponseParser parser(*hr);
-        parser.initModel();
-        parser.postBuffer(&response_str[0], response_str.size());
-        parser.poll();
-        if (!parser.httpParseOk()) {
-            isc_throw(Unexpected, "response_str: '" << response_str
-                      << "' failed to parse: " << parser.getErrorMessage());
-        }
-
-        return (hr);
-    }
-
-    /// @brief Conducts a command/response exchange via HttpCommandSocket.
-    ///
-    /// This method connects to the given server over the given address/port.
-    /// If successful, it then sends the given command and retrieves the
-    /// server's response.  Note that it polls the server's I/O service
-    /// where needed to cause the server to process IO events on
-    /// the control channel sockets
-    ///
-    /// @param command the command text to execute in JSON form
-    /// @param response variable into which the received response should be
-    ///        placed.
-    void sendHttpCommand(const string& command, string& response) {
-        response = "";
-        boost::scoped_ptr<TestHttpClient> client;
-        client.reset(new TestHttpClient(getIOService(), SERVER_ADDRESS,
-                                        SERVER_PORT));
-        ASSERT_TRUE(client);
-
-        // Send the command. This will trigger server's handler which
-        // receives data over the HTTP socket. The server will start
-        // sending response to the client.
-        ASSERT_NO_THROW(client->startRequest(buildPostStr(command)));
-        runIOService();
-        ASSERT_TRUE(client->receiveDone());
-
-        // Read the response generated by the server.
-        HttpResponsePtr hr;
-        ASSERT_NO_THROW(hr = parseResponse(client->getResponse()));
-        response = hr->getBody();
-
-        // Now close client.
-        client->close();
-
-        ASSERT_NO_THROW(getIOService()->poll());
-    }
-
     /// @brief Checks response for list-commands.
     ///
     /// This method checks if the list-commands response is generally sane
index 8090ce58dd48f69531a4b5b9a4489487669ccd69..3a42ea42530311d9e6b46d43f1301d8f4488f2ec 100644 (file)
@@ -1085,6 +1085,9 @@ ControlledDhcpv4Srv::ControlledDhcpv4Srv(uint16_t server_port /*= DHCP4_SERVER_P
     CommandMgr::instance().setIOService(getIOService());
     HttpCommandMgr::instance().setIOService(getIOService());
 
+    // Set the HTTP authentication default realm.
+    HttpCommandConfig::DefaultAuthenticationRealm = "kea-dhcpv4-server";
+
     // DatabaseConnection uses IO service to run asynchronous timers.
     DatabaseConnection::setIOService(getIOService());
 
index 1a2c00eb26bfca2c984c901ef33c7af5cd9678ee..dd32f55f6bf01fa6ee3e1f671ae16f6eef8f4bb9 100644 (file)
@@ -81,6 +81,7 @@ dhcp4_unittests_SOURCES += dhcp4_srv_unittest.cc
 dhcp4_unittests_SOURCES += dhcp4_test_utils.cc dhcp4_test_utils.h
 dhcp4_unittests_SOURCES += direct_client_unittest.cc
 dhcp4_unittests_SOURCES += ctrl_dhcp4_srv_unittest.cc
+dhcp4_unittests_SOURCES += http_control_socket_unittest.cc
 dhcp4_unittests_SOURCES += classify_unittest.cc
 dhcp4_unittests_SOURCES += config_backend_unittest.cc
 dhcp4_unittests_SOURCES += config_parser_unittest.cc
index 6eb05fc787b561a63a96d4f143c77dff25702fe1..ea94dad6182fe2b07a559d1ab9a595197edc105b 100644 (file)
 #include <testutils/user_context_utils.h>
 #include <dhcp/testutils/iface_mgr_test_config.h>
 #include <dhcpsrv/cfgmgr.h>
-#include <dhcpsrv/parsers/simple_parser4.h>
-#include <dhcp4/dhcp4_srv.h>
-#include <dhcp4/ctrl_dhcp4_srv.h>
-#include <dhcp4/json_config_parser.h>
-#include <dhcp4/tests/dhcp4_test_utils.h>
-#include <dhcp4/tests/get_config_unittest.h>
+#include <dhcpsrv/parsers/simple_parser6.h>
+#include <dhcp6/dhcp6_srv.h>
+#include <dhcp6/ctrl_dhcp6_srv.h>
+#include <dhcp6/json_config_parser.h>
+#include <dhcp6/tests/dhcp6_test_utils.h>
+#include <dhcp6/tests/get_config_unittest.h>
 #include <testutils/gtest_utils.h>
 
 #include <boost/algorithm/string.hpp>
@@ -42,20 +42,20 @@ namespace {
 /// Copy get_config_unittest.cc.skel into get_config_unittest.cc
 ///
 /// For the extracted configurations define the EXTRACT_CONFIG and
-/// recompile this file. Run dhcp4_unittests on Dhcp4ParserTest
+/// recompile this file. Run dhcp6_unittests on Dhcp6ParserTest
 /// redirecting the standard error to a temporary file, e.g. by
 /// @code
-///    ./dhcp4_unittests --gtest_filter="Dhcp4Parser*" > /dev/null 2> x
+///    ./dhcp6_unittests --gtest_filter="Dhcp6Parser*" > /dev/null 2> x
 /// @endcode
 ///
 /// Update EXTRACTED_CONFIGS with the file content
 ///
 /// When configurations have been extracted the corresponding unparsed
 /// configurations must be generated. To do that define GENERATE_ACTION
-/// and recompile this file. Run dhcp4_unittests on Dhcp4GetConfigTest
+/// and recompile this file. Run dhcp6_unittests on Dhcp6GetConfigTest
 /// redirecting the standard error to a temporary file, e.g. by
 /// @code
-///    ./dhcp4_unittests --gtest_filter="Dhcp4GetConfig*" > /dev/null 2> u
+///    ./dhcp6_unittests --gtest_filter="Dhcp6GetConfig*" > /dev/null 2> u
 /// @endcode
 ///
 /// Update UNPARSED_CONFIGS with the file content, recompile this file
@@ -75,9 +75,10 @@ const char* EXTRACTED_CONFIGS[] = {
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
     // CONFIGURATION 1
@@ -86,482 +87,409 @@ const char* EXTRACTED_CONFIGS[] = {
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 2
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 3
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
+"        \"max-preferred-lifetime\": 4000,\n"
 "        \"max-valid-lifetime\": 5000,\n"
+"        \"min-preferred-lifetime\": 2000,\n"
 "        \"min-valid-lifetime\": 3000,\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 4
+    // CONFIGURATION 2
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1024,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 100,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.101 - 192.0.3.150\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.4.101 - 192.0.4.150\"\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.4.0/24\"\n"
+"                \"subnet\": \"2001:db8:3::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 34,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.5.101 - 192.0.5.150\"\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.5.0/24\"\n"
+"                \"subnet\": \"2001:db8:4::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 5
+    // CONFIGURATION 3
 "{\n"
-"        \"boot-file-name\": \"bar\",\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"next-server\": \"1.2.3.4\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"server-hostname\": \"foo\",\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 6
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
+"            },\n"
 "            {\n"
-"                \"boot-file-name\": \"bar\",\n"
-"                \"id\": 1,\n"
-"                \"next-server\": \"1.2.3.4\",\n"
+"                \"id\": 2,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"server-hostname\": \"foo\",\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 7
-"{\n"
-"        \"boot-file-name\": \"nofile\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"next-server\": \"192.0.0.1\",\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"server-hostname\": \"nohost\",\n"
-"        \"subnet4\": [\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
+"            },\n"
 "            {\n"
-"                \"boot-file-name\": \"bootfile.efi\",\n"
-"                \"id\": 1,\n"
-"                \"next-server\": \"1.2.3.4\",\n"
+"                \"id\": 3,\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet\": \"2001:db8:3::/64\"\n"
+"            },\n"
+"            {\n"
+"                \"id\": 4,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"server-hostname\": \"some-name.example.org\",\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:4::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 8
+    // CONFIGURATION 4
 "{\n"
-"        \"echo-client-id\": false,\n"
+"        \"compatibility\": {\n"
+"            \"lenient-option-parsing\": true\n"
+"        },\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 9
+    // CONFIGURATION 5
 "{\n"
-"        \"echo-client-id\": true,\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"max-preferred-lifetime\": 4000,\n"
+"        \"max-valid-lifetime\": 5000,\n"
+"        \"min-preferred-lifetime\": 2000,\n"
+"        \"min-valid-lifetime\": 3000,\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 4,\n"
+"                \"max-valid-lifetime\": 5,\n"
+"                \"min-preferred-lifetime\": 2,\n"
+"                \"min-valid-lifetime\": 3,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"preferred-lifetime\": 3,\n"
+"                \"rebind-timer\": 2,\n"
+"                \"renew-timer\": 1,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"valid-lifetime\": 4\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 10
+    // CONFIGURATION 6
 "{\n"
-"        \"compatibility\": {\n"
-"            \"exclude-first-last-24\": true,\n"
-"            \"ignore-dhcp-server-identifier\": true,\n"
-"            \"ignore-rai-link-selection\": true,\n"
-"            \"lenient-option-parsing\": true\n"
-"        },\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
+"                \"interface\": \"eth0\",\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 11
+    // CONFIGURATION 7
 "{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"match-client-id\": true,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            },\n"
-"            {\n"
-"                \"id\": 2,\n"
-"                \"match-client-id\": false,\n"
+"                \"interface-id\": \"foobar\",\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.1 - 192.0.3.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 12
+    // CONFIGURATION 8
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"match-client-id\": false,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/96\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"pool\": \"2001:db8:1:0:abcd::/112\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 2,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.1 - 192.0.3.100\"\n"
+"                        \"pool\": \"2001:db8:2::1 - 2001:db8:2::ff\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"pool\": \"2001:db8:2::300 - 2001:db8:2::3ff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 13
+    // CONFIGURATION 9
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"authoritative\": true,\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            },\n"
-"            {\n"
-"                \"authoritative\": false,\n"
-"                \"id\": 2,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.3.1 - 192.0.3.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 14
+    // CONFIGURATION 10
 "{\n"
-"        \"authoritative\": true,\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"authoritative\": false,\n"
 "                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            },\n"
-"            {\n"
-"                \"id\": 2,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.1 - 192.0.3.100\"\n"
+"                        \"delegated-len\": 128,\n"
+"                        \"prefix\": \"2001:db8:1::\",\n"
+"                        \"prefix-len\": 64\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
+"        ]\n"
 "    }\n",
-    // CONFIGURATION 15
+    // CONFIGURATION 11
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"max-valid-lifetime\": 5000,\n"
-"        \"min-valid-lifetime\": 3000,\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 5,\n"
-"                \"min-valid-lifetime\": 3,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"excluded-prefix\": \"3000:0:0:0:1000::\",\n"
+"                        \"excluded-prefix-len\": 72,\n"
+"                        \"prefix\": \"3000::\",\n"
+"                        \"prefix-len\": 48\n"
 "                    }\n"
 "                ],\n"
-"                \"rebind-timer\": 2,\n"
-"                \"renew-timer\": 1,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"valid-lifetime\": 4\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
+"        ]\n"
 "    }\n",
-    // CONFIGURATION 16
+    // CONFIGURATION 12
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
+"                    {\n"
+"                        \"delegated-len\": 80,\n"
+"                        \"prefix\": \"2001:db8:1:01::\",\n"
+"                        \"prefix-len\": 72\n"
+"                    },\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.0/28\"\n"
+"                        \"delegated-len\": 88,\n"
+"                        \"prefix\": \"2001:db8:1:02::\",\n"
+"                        \"prefix-len\": 72\n"
 "                    },\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.200-192.0.2.255\"\n"
+"                        \"delegated-len\": 96,\n"
+"                        \"prefix\": \"3000:1:03::\",\n"
+"                        \"prefix-len\": 72\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            },\n"
-"            {\n"
-"                \"id\": 2,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.0/25\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"pool\": \"192.0.3.128/25\"\n"
+"                        \"pool\": \"2001:db8:1:04::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/40\",\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
+"        ]\n"
 "    }\n",
-    // CONFIGURATION 17
+    // CONFIGURATION 13
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.128/28\"\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8:1::\",\n"
+"                        \"prefix-len\": 64\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
+"        ]\n"
 "    }\n",
-    // CONFIGURATION 18
+    // CONFIGURATION 14
 "{\n"
 "        \"option-def\": [\n"
 "            {\n"
 "                \"code\": 100,\n"
 "                \"name\": \"foo\",\n"
 "                \"space\": \"isc\",\n"
-"                \"type\": \"ipv4-address\"\n"
+"                \"type\": \"ipv6-address\"\n"
 "            }\n"
 "        ]\n"
 "    }\n",
-    // CONFIGURATION 19
+    // CONFIGURATION 15
 "{\n"
 "        \"option-def\": [\n"
 "            {\n"
@@ -573,7 +501,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ]\n"
 "    }\n",
-    // CONFIGURATION 20
+    // CONFIGURATION 16
 "{\n"
 "        \"option-def\": [\n"
 "            {\n"
@@ -590,7 +518,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ]\n"
 "    }\n",
-    // CONFIGURATION 21
+    // CONFIGURATION 17
 "{\n"
 "        \"option-def\": [\n"
 "            {\n"
@@ -602,7 +530,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ]\n"
 "    }\n",
-    // CONFIGURATION 22
+    // CONFIGURATION 18
 "{\n"
 "        \"option-def\": [\n"
 "            {\n"
@@ -614,29 +542,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ]\n"
 "    }\n",
-    // CONFIGURATION 23
-"{\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"code\": 109,\n"
-"                \"name\": \"foo\",\n"
-"                \"space\": \"dhcp4\",\n"
-"                \"type\": \"string\"\n"
-"            }\n"
-"        ]\n"
-"    }\n",
-    // CONFIGURATION 24
-"{\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"code\": 170,\n"
-"                \"name\": \"unassigned-option-170\",\n"
-"                \"space\": \"dhcp4\",\n"
-"                \"type\": \"string\"\n"
-"            }\n"
-"        ]\n"
-"    }\n",
-    // CONFIGURATION 25
+    // CONFIGURATION 19
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -646,63 +552,63 @@ const char* EXTRACTED_CONFIGS[] = {
 "            {\n"
 "                \"csv-format\": false,\n"
 "                \"data\": \"ABCDEF0105\",\n"
-"                \"name\": \"dhcp-message\"\n"
+"                \"name\": \"subscriber-id\"\n"
 "            },\n"
 "            {\n"
-"                \"csv-format\": false,\n"
 "                \"data\": \"01\",\n"
-"                \"name\": \"default-ip-ttl\"\n"
+"                \"name\": \"preference\"\n"
 "            }\n"
 "        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 26
+    // CONFIGURATION 20
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"option-data\": [\n"
 "                    {\n"
 "                        \"csv-format\": false,\n"
 "                        \"data\": \"ABCDEF0105\",\n"
-"                        \"name\": \"dhcp-message\"\n"
+"                        \"name\": \"subscriber-id\"\n"
 "                    },\n"
 "                    {\n"
-"                        \"csv-format\": false,\n"
 "                        \"data\": \"01\",\n"
-"                        \"name\": \"default-ip-ttl\"\n"
+"                        \"name\": \"preference\"\n"
 "                    }\n"
 "                ],\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 27
+    // CONFIGURATION 21
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -712,7 +618,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            {\n"
 "                \"csv-format\": false,\n"
 "                \"data\": \"ABCDEF0105\",\n"
-"                \"name\": \"dhcp-message\"\n"
+"                \"name\": \"subscriber-id\"\n"
 "            },\n"
 "            {\n"
 "                \"data\": \"1234\",\n"
@@ -722,28 +628,29 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"option-def\": [\n"
 "            {\n"
-"                \"code\": 56,\n"
+"                \"code\": 38,\n"
 "                \"name\": \"foo\",\n"
 "                \"space\": \"isc\",\n"
 "                \"type\": \"uint32\"\n"
 "            }\n"
 "        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 28
+    // CONFIGURATION 22
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -763,23 +670,24 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"option-def\": [\n"
 "            {\n"
-"                \"code\": 1,\n"
+"                \"code\": 110,\n"
 "                \"name\": \"foo\",\n"
 "                \"space\": \"isc\",\n"
 "                \"type\": \"uint32\"\n"
 "            },\n"
 "            {\n"
-"                \"code\": 2,\n"
+"                \"code\": 111,\n"
 "                \"name\": \"foo2\",\n"
 "                \"space\": \"isc\",\n"
 "                \"type\": \"ipv4-address\"\n"
 "            }\n"
 "        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 29
+    // CONFIGURATION 23
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -803,316 +711,152 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"option-def\": [\n"
 "            {\n"
-"                \"code\": 222,\n"
+"                \"code\": 100,\n"
 "                \"encapsulate\": \"isc\",\n"
 "                \"name\": \"base-option\",\n"
-"                \"space\": \"dhcp4\",\n"
+"                \"space\": \"dhcp6\",\n"
 "                \"type\": \"uint8\"\n"
 "            },\n"
 "            {\n"
-"                \"code\": 1,\n"
+"                \"code\": 110,\n"
 "                \"name\": \"foo\",\n"
 "                \"space\": \"isc\",\n"
 "                \"type\": \"uint32\"\n"
 "            },\n"
 "            {\n"
-"                \"code\": 2,\n"
+"                \"code\": 111,\n"
 "                \"name\": \"foo2\",\n"
 "                \"space\": \"isc\",\n"
 "                \"type\": \"ipv4-address\"\n"
 "            }\n"
 "        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 3000\n"
-"    }\n",
-    // CONFIGURATION 30
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"AB\",\n"
-"                \"name\": \"dhcp-message\"\n"
-"            }\n"
-"        ],\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"option-data\": [\n"
-"                    {\n"
-"                        \"csv-format\": false,\n"
-"                        \"data\": \"ABCDEF0105\",\n"
-"                        \"name\": \"dhcp-message\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"csv-format\": false,\n"
-"                        \"data\": \"01\",\n"
-"                        \"name\": \"default-ip-ttl\"\n"
-"                    }\n"
-"                ],\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 31
+    // CONFIGURATION 24
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"option-data\": [\n"
 "                    {\n"
 "                        \"csv-format\": false,\n"
 "                        \"data\": \"0102030405060708090A\",\n"
-"                        \"name\": \"dhcp-message\"\n"
+"                        \"name\": \"subscriber-id\"\n"
 "                    }\n"
 "                ],\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 2,\n"
 "                \"option-data\": [\n"
 "                    {\n"
 "                        \"csv-format\": false,\n"
-"                        \"data\": \"FF\",\n"
-"                        \"name\": \"default-ip-ttl\"\n"
+"                        \"data\": \"FFFEFDFCFB\",\n"
+"                        \"name\": \"user-class\"\n"
 "                    }\n"
 "                ],\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.101 - 192.0.3.150\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 32
+    // CONFIGURATION 25
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
+"                        \"delegated-len\": 64,\n"
 "                        \"option-data\": [\n"
 "                            {\n"
 "                                \"csv-format\": false,\n"
-"                                \"data\": \"ABCDEF0105\",\n"
-"                                \"name\": \"dhcp-message\"\n"
-"                            },\n"
+"                                \"data\": \"112233445566\",\n"
+"                                \"name\": \"subscriber-id\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"prefix\": \"3000::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
+"                    {\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"option-data\": [\n"
 "                            {\n"
 "                                \"csv-format\": false,\n"
-"                                \"data\": \"01\",\n"
-"                                \"name\": \"default-ip-ttl\"\n"
+"                                \"data\": \"aabbccddee\",\n"
+"                                \"name\": \"user-class\"\n"
 "                            }\n"
 "                        ],\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"prefix\": \"3001::\",\n"
+"                        \"prefix-len\": 48\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 33
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [\n"
 "                            {\n"
 "                                \"csv-format\": false,\n"
-"                                \"data\": \"ABCDEF0105\",\n"
-"                                \"name\": \"dhcp-message\"\n"
+"                                \"data\": \"0102030405060708090A\",\n"
+"                                \"name\": \"subscriber-id\"\n"
 "                            }\n"
 "                        ],\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::10 - 2001:db8:1::100\"\n"
 "                    },\n"
 "                    {\n"
 "                        \"option-data\": [\n"
 "                            {\n"
 "                                \"csv-format\": false,\n"
-"                                \"data\": \"01\",\n"
-"                                \"name\": \"default-ip-ttl\"\n"
+"                                \"data\": \"FFFEFDFCFB\",\n"
+"                                \"name\": \"user-class\"\n"
 "                            }\n"
 "                        ],\n"
-"                        \"pool\": \"192.0.2.200 - 192.0.2.250\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 34
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"data\": \"true, 10.0.0.3, 127.0.0.1\",\n"
-"                \"name\": \"slp-directory-agent\"\n"
-"            },\n"
-"            {\n"
-"                \"data\": \"false, \",\n"
-"                \"name\": \"slp-service-scope\"\n"
-"            }\n"
-"        ],\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::300 - 2001:db8:1::400\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 35
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"data\": \"1234\",\n"
-"                \"name\": \"foo\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            },\n"
-"            {\n"
-"                \"data\": \"192.168.2.1\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            }\n"
-"        ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"code\": 1,\n"
-"                \"name\": \"foo\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"uint32\"\n"
-"            },\n"
-"            {\n"
-"                \"code\": 2,\n"
-"                \"name\": \"foo2\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"ipv4-address\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 36
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"csv-format\": false,\n"
-"                \"name\": \"vendor-encapsulated-options\"\n"
-"            },\n"
-"            {\n"
-"                \"data\": \"1234\",\n"
-"                \"name\": \"foo\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            },\n"
-"            {\n"
-"                \"code\": 2,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"192.168.2.1\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            }\n"
-"        ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"code\": 1,\n"
-"                \"name\": \"foo\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"uint32\"\n"
-"            },\n"
-"            {\n"
-"                \"code\": 2,\n"
-"                \"name\": \"foo2\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"ipv4-address\"\n"
-"            }\n"
-"        ],\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 3000\n"
-"    }\n",
-    // CONFIGURATION 37
+    // CONFIGURATION 26
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1134,22 +878,23 @@ const char* EXTRACTED_CONFIGS[] = {
 "                \"space\": \"vendor-1234\"\n"
 "            }\n"
 "        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.10\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 38
+    // CONFIGURATION 27
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1171,310 +916,342 @@ const char* EXTRACTED_CONFIGS[] = {
 "                \"type\": \"string\"\n"
 "            }\n"
 "        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 39
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"eth0\", \"eth1\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 40
+    // CONFIGURATION 28
 "{\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"eth0\", \"*\", \"eth1\" ],\n"
+"            \"interfaces\": [ \"eth0\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 41
+    // CONFIGURATION 29
 "{\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": true,\n"
-"            \"max-queue-size\": 2048,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"192.168.2.2\",\n"
-"            \"sender-port\": 778,\n"
-"            \"server-ip\": \"192.168.2.1\",\n"
-"            \"server-port\": 777\n"
-"        },\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ \"eth0\", \"eth1\", \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 42
+    // CONFIGURATION 30
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"rebind-timer\": 2,\n"
 "                \"relay\": {\n"
-"                    \"ip-addresses\": [ \"192.0.2.123\" ]\n"
+"                    \"ip-addresses\": [ \"2001:db8:1::abcd\" ]\n"
 "                },\n"
-"                \"renew-timer\": 1,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"valid-lifetime\": 4\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 43
+    // CONFIGURATION 31
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"rebind-timer\": 2,\n"
 "                \"relay\": {\n"
-"                    \"ip-addresses\": [ \"192.0.3.123\", \"192.0.3.124\" ]\n"
+"                    \"ip-addresses\": [ \"2001:db9::abcd\", \"2001:db9::abce\" ]\n"
 "                },\n"
-"                \"renew-timer\": 1,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"valid-lifetime\": 4\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 44
+    // CONFIGURATION 32
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"client-class\": \"alpha\",\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"client-class\": \"beta\",\n"
 "                \"id\": 2,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.101 - 192.0.3.150\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"client-class\": \"gamma\",\n"
 "                \"id\": 3,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.4.101 - 192.0.4.150\"\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.4.0/24\"\n"
+"                \"subnet\": \"2001:db8:3::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 4,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.5.101 - 192.0.5.150\"\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.5.0/24\"\n"
+"                \"subnet\": \"2001:db8:4::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 45
+    // CONFIGURATION 33
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"client-class\": \"alpha\",\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    },\n"
 "                    {\n"
 "                        \"client-class\": \"beta\",\n"
-"                        \"pool\": \"192.0.3.101 - 192.0.3.150\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    },\n"
 "                    {\n"
 "                        \"client-class\": \"gamma\",\n"
-"                        \"pool\": \"192.0.4.101 - 192.0.4.150\"\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
 "                    },\n"
 "                    {\n"
-"                        \"pool\": \"192.0.5.101 - 192.0.5.150\"\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.0.0/16\"\n"
+"                \"subnet\": \"2001:db8:0::/40\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 46
+    // CONFIGURATION 34
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"id\": 123,\n"
+"                \"id\": 1,\n"
+"                \"pd-pools\": [\n"
+"                    {\n"
+"                        \"client-class\": \"alpha\",\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8:1::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
+"                    {\n"
+"                        \"client-class\": \"beta\",\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8:2::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
+"                    {\n"
+"                        \"client-class\": \"gamma\",\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8:3::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
+"                    {\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8:4::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet\": \"2001:db8::/64\"\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 35
+"{\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"sender-ip\": \"3001::2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"3001::1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
-"                \"reservations\": [ ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            },\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 36
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"id\": 234,\n"
+"                \"id\": 123,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.101 - 192.0.3.150\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"reservations\": [ ],\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
+"            },\n"
+"            {\n"
+"                \"id\": 234,\n"
+"                \"pools\": [ ],\n"
 "                \"reservations\": [\n"
 "                    {\n"
 "                        \"duid\": \"01:02:03:04:05:06:07:08:09:0A\",\n"
 "                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.3.112\",\n"
+"                        \"ip-addresses\": [ \"2001:db8:2::1234\" ],\n"
 "                        \"option-data\": [\n"
 "                            {\n"
-"                                \"data\": \"192.0.3.15\",\n"
-"                                \"name\": \"name-servers\"\n"
+"                                \"data\": \"2001:db8:2::1111\",\n"
+"                                \"name\": \"dns-servers\"\n"
 "                            },\n"
 "                            {\n"
-"                                \"data\": \"32\",\n"
-"                                \"name\": \"default-ip-ttl\"\n"
+"                                \"data\": \"11\",\n"
+"                                \"name\": \"preference\"\n"
 "                            }\n"
 "                        ]\n"
 "                    },\n"
 "                    {\n"
 "                        \"hostname\": \"\",\n"
 "                        \"hw-address\": \"01:02:03:04:05:06\",\n"
-"                        \"ip-address\": \"192.0.3.120\",\n"
+"                        \"ip-addresses\": [ \"2001:db8:2::abcd\" ],\n"
 "                        \"option-data\": [\n"
 "                            {\n"
-"                                \"data\": \"192.0.3.95\",\n"
-"                                \"name\": \"name-servers\"\n"
+"                                \"data\": \"2001:db8:2::abbc\",\n"
+"                                \"name\": \"dns-servers\"\n"
 "                            },\n"
 "                            {\n"
-"                                \"data\": \"11\",\n"
-"                                \"name\": \"default-ip-ttl\"\n"
+"                                \"data\": \"25\",\n"
+"                                \"name\": \"preference\"\n"
 "                            }\n"
 "                        ]\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 542,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.4.101 - 192.0.4.150\"\n"
-"                    }\n"
-"                ],\n"
+"                \"pools\": [ ],\n"
 "                \"reservations\": [\n"
 "                    {\n"
 "                        \"duid\": \"0A:09:08:07:06:05:04:03:02:01\",\n"
 "                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.4.101\",\n"
 "                        \"option-data\": [\n"
 "                            {\n"
-"                                \"data\": \"192.0.4.11\",\n"
-"                                \"name\": \"name-servers\"\n"
+"                                \"data\": \"2001:db8:3::3333\",\n"
+"                                \"name\": \"dns-servers\"\n"
 "                            },\n"
 "                            {\n"
-"                                \"data\": \"95\",\n"
-"                                \"name\": \"default-ip-ttl\"\n"
+"                                \"data\": \"33\",\n"
+"                                \"name\": \"preference\"\n"
 "                            }\n"
-"                        ]\n"
-"                    },\n"
-"                    {\n"
-"                        \"circuit-id\": \"060504030201\",\n"
-"                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.4.102\"\n"
+"                        ],\n"
+"                        \"prefixes\": [ \"2001:db8:3:2::/96\" ]\n"
 "                    },\n"
 "                    {\n"
-"                        \"client-id\": \"05:01:02:03:04:05:06\",\n"
 "                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.4.103\"\n"
+"                        \"hw-address\": \"06:05:04:03:02:01\",\n"
+"                        \"prefixes\": [ \"2001:db8:3:1::/96\" ]\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.4.0/24\"\n"
+"                \"subnet\": \"2001:db8:3::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 47
+    // CONFIGURATION 37
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1488,179 +1265,218 @@ const char* EXTRACTED_CONFIGS[] = {
 "                \"type\": \"uint32\"\n"
 "            }\n"
 "        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 234,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.3.101 - 192.0.3.150\"\n"
-"                    }\n"
-"                ],\n"
+"                \"pools\": [ ],\n"
 "                \"reservations\": [\n"
 "                    {\n"
 "                        \"duid\": \"01:02:03:04:05:06:07:08:09:0A\",\n"
-"                        \"ip-address\": \"192.0.3.112\",\n"
+"                        \"hostname\": \"\",\n"
+"                        \"ip-addresses\": [ \"2001:db8:2::1234\" ],\n"
 "                        \"option-data\": [\n"
 "                            {\n"
-"                                \"data\": \"123\",\n"
+"                                \"data\": \"11\",\n"
 "                                \"name\": \"foo\",\n"
 "                                \"space\": \"isc\"\n"
 "                            }\n"
 "                        ]\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 48
+    // CONFIGURATION 38
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"mac-sources\": [ \"rfc6939\", \"rfc4649\", \"rfc4580\" ],\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [ ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 39
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [ ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 40
 "{\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.1.0/24\"\n"
+"                        \"pool\": \"2001:db8:1::/64\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations-global\": false,\n"
 "                \"reservations-in-subnet\": true,\n"
 "                \"reservations-out-of-pool\": false,\n"
-"                \"subnet\": \"192.0.1.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/48\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 2,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.0/24\"\n"
+"                        \"pool\": \"2001:db8:2::/64\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations-global\": false,\n"
 "                \"reservations-in-subnet\": true,\n"
 "                \"reservations-out-of-pool\": true,\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/48\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 3,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.0/24\"\n"
+"                        \"pool\": \"2001:db8:3::/64\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations-global\": false,\n"
 "                \"reservations-in-subnet\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:3::/48\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 4,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.4.0/24\"\n"
+"                        \"pool\": \"2001:db8:4::/64\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations-global\": true,\n"
 "                \"reservations-in-subnet\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\"\n"
+"                \"subnet\": \"2001:db8:4::/48\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 5,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.5.0/24\"\n"
+"                        \"pool\": \"2001:db8:5::/64\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.5.0/24\"\n"
+"                \"subnet\": \"2001:db8:5::/48\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 6,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.6.0/24\"\n"
+"                        \"pool\": \"2001:db8:6::/64\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations-global\": true,\n"
 "                \"reservations-in-subnet\": true,\n"
 "                \"reservations-out-of-pool\": false,\n"
-"                \"subnet\": \"192.0.6.0/24\"\n"
+"                \"subnet\": \"2001:db8:6::/48\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 7,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.7.0/24\"\n"
+"                        \"pool\": \"2001:db8:7::/64\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations-global\": true,\n"
 "                \"reservations-in-subnet\": true,\n"
 "                \"reservations-out-of-pool\": true,\n"
-"                \"subnet\": \"192.0.7.0/24\"\n"
+"                \"subnet\": \"2001:db8:7::/48\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 49
+    // CONFIGURATION 41
 "{\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-out-of-pool\": true,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.0/24\"\n"
+"                        \"pool\": \"2001:db8:1::/64\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations-global\": false,\n"
 "                \"reservations-in-subnet\": true,\n"
 "                \"reservations-out-of-pool\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/48\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 2,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.0/24\"\n"
+"                        \"pool\": \"2001:db8:2::/64\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/48\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 50
+    // CONFIGURATION 42
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"subnet4\": [ ]\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"dns-servers\", \"remote-id\" ],\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [ ],\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 51
+    // CONFIGURATION 43
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"subnet4\": [ ]\n"
+"        \"subnet6\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 52
+    // CONFIGURATION 44
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"subnet6\": [ ]\n"
+"    }\n",
+    // CONFIGURATION 45
 "{\n"
 "        \"decline-probation-period\": 12345,\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"subnet4\": [ ]\n"
+"        \"subnet6\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 53
+    // CONFIGURATION 46
 "{\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 35,\n"
@@ -1674,306 +1490,222 @@ const char* EXTRACTED_CONFIGS[] = {
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"subnet4\": [ ]\n"
+"        \"subnet6\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 54
+    // CONFIGURATION 47
 "{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"client-classes\": [\n"
 "            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 55
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"                \"name\": \"one\"\n"
+"            },\n"
 "            {\n"
-"                \"4o6-subnet\": \"2001:db8::123/45\",\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"name\": \"two\"\n"
+"            },\n"
+"            {\n"
+"                \"name\": \"three\"\n"
 "            }\n"
 "        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 56
-"{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"ethX\",\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 57
+    // CONFIGURATION 48
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"ethX\",\n"
-"                \"4o6-subnet\": \"2001:db8::543/21\",\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8::/64\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8::/32\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 58
+    // CONFIGURATION 49
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface-id\": \"vlan123\",\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8::/64\",\n"
+"                        \"user-context\": { }\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8::/32\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 59
+    // CONFIGURATION 50
 "{\n"
-"        \"client-classes\": [\n"
-"            {\n"
-"                \"name\": \"one\"\n"
-"            },\n"
-"            {\n"
-"                \"name\": \"two\"\n"
-"            },\n"
-"            {\n"
-"                \"name\": \"three\"\n"
-"            }\n"
-"        ],\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8::/64\",\n"
+"                        \"user-context\": {\n"
+"                            \"lw4over6-bind-prefix-len\": 56,\n"
+"                            \"lw4over6-sharing-ratio\": 64,\n"
+"                            \"lw4over6-sysports-exclude\": true,\n"
+"                            \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n"
+"                        }\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8::/32\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 60
-"{\n"
-"        \"client-classes\": [\n"
-"            {\n"
-"                \"max-valid-lifetime\": 3000,\n"
-"                \"min-valid-lifetime\": 1000,\n"
-"                \"name\": \"one\",\n"
-"                \"valid-lifetime\": 2000\n"
-"            },\n"
-"            {\n"
-"                \"name\": \"two\"\n"
-"            }\n"
-"        ],\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ]\n"
-"    }\n",
-    // CONFIGURATION 61
-"{\n"
-"        \"client-classes\": [\n"
-"            {\n"
-"                \"max-valid-lifetime\": 3000,\n"
-"                \"min-valid-lifetime\": 1000,\n"
-"                \"name\": \"one\",\n"
-"                \"template-test\": \"''\",\n"
-"                \"valid-lifetime\": 2000\n"
-"            },\n"
-"            {\n"
-"                \"name\": \"two\",\n"
-"                \"template-test\": \"''\"\n"
-"            }\n"
-"        ],\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            }\n"
-"        ]\n"
-"    }\n",
-    // CONFIGURATION 62
+    // CONFIGURATION 51
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.0/28\"\n"
+"                        \"pool\": \"2001:db8:: - 2001:db8::ffff:ffff:ffff:ffff\",\n"
+"                        \"user-context\": {\n"
+"                            \"lw4over6-bind-prefix-len\": 56,\n"
+"                            \"lw4over6-sharing-ratio\": 64,\n"
+"                            \"lw4over6-sysports-exclude\": true,\n"
+"                            \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n"
+"                        }\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8::/32\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 63
+    // CONFIGURATION 52
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.0/28\",\n"
-"                        \"user-context\": { }\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8::\",\n"
+"                        \"prefix-len\": 56\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8::/32\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 64
+    // CONFIGURATION 53
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.0/28\",\n"
-"                        \"user-context\": {\n"
-"                            \"bool-param\": true,\n"
-"                            \"integer-param\": 42,\n"
-"                            \"string-param\": \"Sagittarius\"\n"
-"                        }\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8::\",\n"
+"                        \"prefix-len\": 56,\n"
+"                        \"user-context\": { }\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8::/32\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 65
+    // CONFIGURATION 54
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 1,\n"
-"                \"pools\": [\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.0 - 192.0.2.15\",\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"prefix\": \"2001:db8::\",\n"
+"                        \"prefix-len\": 56,\n"
 "                        \"user-context\": {\n"
-"                            \"bool-param\": true,\n"
-"                            \"integer-param\": 42,\n"
-"                            \"string-param\": \"Sagittarius\"\n"
+"                            \"lw4over6-bind-prefix-len\": 56,\n"
+"                            \"lw4over6-sharing-ratio\": 64,\n"
+"                            \"lw4over6-sysports-exclude\": true,\n"
+"                            \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n"
 "                        }\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8::/32\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 66
+    // CONFIGURATION 55
 "{\n"
 "        \"hosts-databases\": [\n"
 "            {\n"
@@ -1993,11 +1725,12 @@ const char* EXTRACTED_CONFIGS[] = {
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 67
+    // CONFIGURATION 56
 "{\n"
 "        \"client-classes\": [\n"
 "            {\n"
@@ -2020,7 +1753,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"control-sockets\": [\n"
 "            {\n"
-"                \"socket-name\": \"/tmp/kea4-ctrl-socket\",\n"
+"                \"socket-name\": \"/tmp/kea6-ctrl-socket\",\n"
 "                \"socket-type\": \"unix\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"Indirect comment\"\n"
@@ -2042,7 +1775,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "                        \"comment\": \"basic HTTP authentication\"\n"
 "                    }\n"
 "                },\n"
-"                \"socket-address\": \"::1\",\n"
+"                \"socket-address\": \"127.0.0.1\",\n"
 "                \"socket-port\": 8000,\n"
 "                \"socket-type\": \"http\",\n"
 "                \"user-context\": {\n"
@@ -2067,7 +1800,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            {\n"
 "                \"csv-format\": false,\n"
 "                \"data\": \"ABCDEF0105\",\n"
-"                \"name\": \"dhcp-message\",\n"
+"                \"name\": \"subscriber-id\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"Set option value\"\n"
 "                }\n"
@@ -2078,21 +1811,37 @@ const char* EXTRACTED_CONFIGS[] = {
 "                \"code\": 100,\n"
 "                \"name\": \"foo\",\n"
 "                \"space\": \"isc\",\n"
-"                \"type\": \"ipv4-address\",\n"
+"                \"type\": \"ipv6-address\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"An option definition\"\n"
 "                }\n"
 "            }\n"
 "        ],\n"
+"        \"server-id\": {\n"
+"            \"type\": \"LL\",\n"
+"            \"user-context\": {\n"
+"                \"comment\": \"DHCPv6 specific\"\n"
+"            }\n"
+"        },\n"
 "        \"shared-networks\": [\n"
 "            {\n"
 "                \"name\": \"foo\",\n"
-"                \"subnet4\": [\n"
+"                \"subnet6\": [\n"
 "                    {\n"
 "                        \"id\": 100,\n"
+"                        \"pd-pools\": [\n"
+"                            {\n"
+"                                \"delegated-len\": 64,\n"
+"                                \"prefix\": \"2001:db2::\",\n"
+"                                \"prefix-len\": 48,\n"
+"                                \"user-context\": {\n"
+"                                    \"comment\": \"A prefix pool\"\n"
+"                                }\n"
+"                            }\n"
+"                        ],\n"
 "                        \"pools\": [\n"
 "                            {\n"
-"                                \"pool\": \"192.0.1.1-192.0.1.10\",\n"
+"                                \"pool\": \"2001:db1::/64\",\n"
 "                                \"user-context\": {\n"
 "                                    \"comment\": \"A pool\"\n"
 "                                }\n"
@@ -2105,7 +1854,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "                                \"option-data\": [\n"
 "                                    {\n"
 "                                        \"data\": \"example.com\",\n"
-"                                        \"name\": \"domain-name\",\n"
+"                                        \"name\": \"domain-search\",\n"
 "                                        \"user-context\": {\n"
 "                                            \"comment\": \"An option in a reservation\"\n"
 "                                        }\n"
@@ -2116,7 +1865,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "                                }\n"
 "                            }\n"
 "                        ],\n"
-"                        \"subnet\": \"192.0.1.0/24\",\n"
+"                        \"subnet\": \"2001:db1::/48\",\n"
 "                        \"user-context\": {\n"
 "                            \"comment\": \"A subnet\"\n"
 "                        }\n"
@@ -2128,276 +1877,232 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ],\n"
 "        \"user-context\": {\n"
-"            \"comment\": \"A DHCPv4 server\"\n"
+"            \"comment\": \"A DHCPv6 server\"\n"
 "        }\n"
 "    }\n",
-    // CONFIGURATION 68
+    // CONFIGURATION 57
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations\": [\n"
 "            {\n"
 "                \"duid\": \"01:02:03:04:05:06:07:08:09:0A\",\n"
-"                \"hostname\": \"global1\",\n"
-"                \"ip-address\": \"192.0.200.1\",\n"
+"                \"hostname\": \"\",\n"
+"                \"ip-addresses\": [ \"2001:db8:2::1234\" ],\n"
 "                \"option-data\": [\n"
 "                    {\n"
-"                        \"data\": \"192.0.3.15\",\n"
-"                        \"name\": \"name-servers\"\n"
+"                        \"data\": \"2001:db8:2::1111\",\n"
+"                        \"name\": \"dns-servers\"\n"
 "                    },\n"
 "                    {\n"
-"                        \"data\": \"32\",\n"
-"                        \"name\": \"default-ip-ttl\"\n"
+"                        \"data\": \"11\",\n"
+"                        \"name\": \"preference\"\n"
 "                    }\n"
 "                ]\n"
 "            },\n"
 "            {\n"
-"                \"hostname\": \"global2\",\n"
+"                \"hostname\": \"\",\n"
 "                \"hw-address\": \"01:02:03:04:05:06\",\n"
+"                \"ip-addresses\": [ \"2001:db8:2::abcd\" ],\n"
 "                \"option-data\": [\n"
 "                    {\n"
-"                        \"data\": \"192.0.3.95\",\n"
-"                        \"name\": \"name-servers\"\n"
+"                        \"data\": \"2001:db8:2::abbc\",\n"
+"                        \"name\": \"dns-servers\"\n"
 "                    },\n"
 "                    {\n"
-"                        \"data\": \"11\",\n"
-"                        \"name\": \"default-ip-ttl\"\n"
+"                        \"data\": \"25\",\n"
+"                        \"name\": \"preference\"\n"
 "                    }\n"
 "                ]\n"
 "            }\n"
 "        ],\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
 "                \"id\": 123,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
 "                \"reservations\": [ ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
+"            },\n"
+"            {\n"
+"                \"id\": 234,\n"
+"                \"pools\": [ ],\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 542,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.4.101 - 192.0.4.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.4.0/24\"\n"
+"                \"pools\": [ ],\n"
+"                \"subnet\": \"2001:db8:3::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 69
+    // CONFIGURATION 58
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
-"        \"shared-networks\": [\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"statistic-default-sample-age\": 5,\n"
+"        \"statistic-default-sample-count\": 10,\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 59
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"subnet6\": [ ]\n"
+"    }\n",
+    // CONFIGURATION 60
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"multi-threading\": {\n"
+"            \"enable-multi-threading\": true,\n"
+"            \"packet-queue-size\": 1024,\n"
+"            \"thread-pool-size\": 48\n"
+"        },\n"
+"        \"subnet6\": [ ]\n"
+"    }\n",
+    // CONFIGURATION 61
+"{\n"
+"        \"client-classes\": [\n"
 "            {\n"
-"                \"calculate-tee-times\": true,\n"
-"                \"name\": \"foo\",\n"
-"                \"subnet4\": [\n"
-"                    {\n"
-"                        \"calculate-tee-times\": false,\n"
-"                        \"id\": 100,\n"
-"                        \"pools\": [\n"
-"                            {\n"
-"                                \"pool\": \"192.0.1.1-192.0.1.10\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"subnet\": \"192.0.1.0/24\",\n"
-"                        \"t1-percent\": 0.45,\n"
-"                        \"t2-percent\": 0.65\n"
-"                    },\n"
+"                \"max-preferred-lifetime\": 6000,\n"
+"                \"max-valid-lifetime\": 3000,\n"
+"                \"min-preferred-lifetime\": 4000,\n"
+"                \"min-valid-lifetime\": 1000,\n"
+"                \"name\": \"one\",\n"
+"                \"preferred-lifetime\": 5000,\n"
+"                \"valid-lifetime\": 2000\n"
+"            },\n"
+"            {\n"
+"                \"name\": \"two\"\n"
+"            }\n"
+"        ],\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"id\": 1,\n"
+"                \"pools\": [\n"
 "                    {\n"
-"                        \"id\": 200,\n"
-"                        \"pools\": [\n"
-"                            {\n"
-"                                \"pool\": \"192.0.2.1-192.0.2.10\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"subnet\": \"192.0.2.0/24\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"t1-percent\": 0.4,\n"
-"                \"t2-percent\": 0.75\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
+"            }\n"
+"        ]\n"
+"    }\n",
+    // CONFIGURATION 62
+"{\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"max-preferred-lifetime\": 6000,\n"
+"                \"max-valid-lifetime\": 3000,\n"
+"                \"min-preferred-lifetime\": 4000,\n"
+"                \"min-valid-lifetime\": 1000,\n"
+"                \"name\": \"one\",\n"
+"                \"preferred-lifetime\": 5000,\n"
+"                \"template-test\": \"''\",\n"
+"                \"valid-lifetime\": 2000\n"
+"            },\n"
+"            {\n"
+"                \"name\": \"two\",\n"
+"                \"template-test\": \"''\"\n"
 "            }\n"
 "        ],\n"
-"        \"subnet4\": [\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"id\": 300,\n"
+"                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.0 - 192.0.3.15\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
+"        ]\n"
 "    }\n",
-    // CONFIGURATION 70
+    // CONFIGURATION 63
 "{\n"
+"        \"ddns-conflict-resolution-mode\": \"no-check-with-dhcid\",\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
+"                \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "                \"id\": 1,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"store-extended-info\": true,\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
 "            },\n"
 "            {\n"
+"                \"ddns-conflict-resolution-mode\": \"check-exists-with-dhcid\",\n"
 "                \"id\": 2,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.3.1 - 192.0.3.100\"\n"
+"                        \"pool\": \"2001:db8:2::1 - 2001:db8:2::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 71
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"store-extended-info\": true,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            },\n"
-"            {\n"
-"                \"id\": 2,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.3.1 - 192.0.3.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
-"            }\n"
-"        ],\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 72
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"statistic-default-sample-age\": 5,\n"
-"        \"statistic-default-sample-count\": 10,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 73
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"subnet4\": [ ]\n"
-"    }\n",
-    // CONFIGURATION 74
-"{\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 1024,\n"
-"            \"thread-pool-size\": 48\n"
-"        },\n"
-"        \"subnet4\": [ ]\n"
-"    }\n",
-    // CONFIGURATION 75
-"{\n"
-"        \"ddns-conflict-resolution-mode\": \"no-check-with-dhcid\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"                \"id\": 1,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.2.0/24\"\n"
-"            },\n"
-"            {\n"
-"                \"ddns-conflict-resolution-mode\": \"check-exists-with-dhcid\",\n"
-"                \"id\": 2,\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"pool\": \"192.0.3.1 - 192.0.3.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"subnet\": \"192.0.3.0/24\"\n"
+"                \"subnet\": \"2001:db8:2::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"ddns-conflict-resolution-mode\": \"no-check-without-dhcid\",\n"
 "                \"id\": 3,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.4.1 - 192.0.4.100\"\n"
+"                        \"pool\": \"2001:db8:3::1 - 2001:db8:3::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.4.0/24\"\n"
+"                \"subnet\": \"2001:db8:3::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"ddns-conflict-resolution-mode\": \"no-check-with-dhcid\",\n"
 "                \"id\": 4,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.5.1 - 192.0.5.100\"\n"
+"                        \"pool\": \"2001:db8:4::1 - 2001:db8:4::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.5.0/24\"\n"
+"                \"subnet\": \"2001:db8:4::/64\"\n"
 "            },\n"
 "            {\n"
 "                \"id\": 5,\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"pool\": \"192.0.6.1 - 192.0.6.100\"\n"
+"                        \"pool\": \"2001:db8:5::1 - 2001:db8:5::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"subnet\": \"192.0.6.0/24\"\n"
+"                \"subnet\": \"2001:db8:5::/64\"\n"
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
@@ -2409,9 +2114,7 @@ const char* UNPARSED_CONFIGS[] = {
     // CONFIGURATION 0
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -2434,11 +2137,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -2448,7 +2150,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -2459,17 +2161,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -2479,24 +2183,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
     // CONFIGURATION 1
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -2519,11 +2227,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -2533,7 +2240,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -2544,17 +2251,24 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
+"        \"max-preferred-lifetime\": 4000,\n"
+"        \"max-valid-lifetime\": 5000,\n"
+"        \"min-preferred-lifetime\": 2000,\n"
+"        \"min-valid-lifetime\": 3000,\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -2563,52 +2277,60 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
+"                \"max-preferred-lifetime\": 4000,\n"
+"                \"max-valid-lifetime\": 5000,\n"
+"                \"min-preferred-lifetime\": 2000,\n"
+"                \"min-valid-lifetime\": 3000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
+"                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
     // CONFIGURATION 2
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -2631,11 +2353,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -2645,7 +2366,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -2656,16 +2377,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -2675,145 +2399,132 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:3::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 3
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"max-valid-lifetime\": 5000,\n"
-"        \"min-valid-lifetime\": 3000,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 5000,\n"
-"                \"min-valid-lifetime\": 3000,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 34,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:4::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 100,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1024,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -2821,22 +2532,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 4
+    // CONFIGURATION 3
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -2859,11 +2568,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -2873,7 +2581,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -2884,17 +2592,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -2904,30 +2614,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.101-192.0.4.150\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -2935,27 +2654,30 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 34,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 2,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.5.101-192.0.5.150\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -2963,27 +2685,30 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.5.0/24\",\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 100,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 3,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -2991,27 +2716,30 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:3::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1024,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 4,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -3019,22 +2747,23 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:4::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 5
+    // CONFIGURATION 4
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"bar\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"compatibility\": {\n"
+"            \"lenient-option-parsing\": true\n"
+"        },\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3057,11 +2786,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3071,7 +2799,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -3082,17 +2810,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"1.2.3.4\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3102,30 +2832,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"foo\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -3133,22 +2872,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 6
+    // CONFIGURATION 5
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3171,11 +2908,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3185,7 +2921,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -3196,17 +2932,23 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
+"        \"max-preferred-lifetime\": 4000,\n"
+"        \"max-valid-lifetime\": 5000,\n"
+"        \"min-preferred-lifetime\": 2000,\n"
+"        \"min-valid-lifetime\": 3000,\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3216,56 +2958,60 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"boot-file-name\": \"bar\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"next-server\": \"1.2.3.4\",\n"
+"                \"max-preferred-lifetime\": 4,\n"
+"                \"max-valid-lifetime\": 5,\n"
+"                \"min-preferred-lifetime\": 2,\n"
+"                \"min-valid-lifetime\": 3,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
-"                \"rebind-timer\": 2000,\n"
+"                \"preferred-lifetime\": 3,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
-"                \"renew-timer\": 1000,\n"
+"                \"renew-timer\": 1,\n"
 "                \"reservations\": [ ],\n"
-"                \"server-hostname\": \"foo\",\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 7
+    // CONFIGURATION 6
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"nofile\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3288,11 +3034,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3302,7 +3047,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -3313,17 +3058,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"192.0.0.1\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3333,56 +3080,61 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"nohost\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"boot-file-name\": \"bootfile.efi\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"interface\": \"eth0\",\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
-"                \"next-server\": \"1.2.3.4\",\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
-"                \"server-hostname\": \"some-name.example.org\",\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 8
+    // CONFIGURATION 7
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3405,11 +3157,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": false,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3419,28 +3170,30 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3450,30 +3203,40 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"interface-id\": \"foobar\",\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -3481,22 +3244,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 9
+    // CONFIGURATION 8
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3519,11 +3280,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3533,7 +3293,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -3544,17 +3304,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3564,30 +3326,78 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/96\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1:0:abcd::/112\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 2,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:2::1-2001:db8:2::ff\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:2::300/120\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -3595,28 +3405,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 10
+    // CONFIGURATION 9
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"compatibility\": {\n"
-"            \"exclude-first-last-24\": true,\n"
-"            \"ignore-dhcp-server-identifier\": true,\n"
-"            \"ignore-rai-link-selection\": true,\n"
-"            \"lenient-option-parsing\": true\n"
-"        },\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3639,11 +3441,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3653,7 +3454,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -3664,17 +3465,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3684,30 +3487,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -3715,22 +3527,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 11
+    // CONFIGURATION 10
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3753,11 +3563,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3767,7 +3576,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -3778,17 +3587,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3798,60 +3609,41 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"match-client-id\": true,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
-"                \"match-client-id\": false,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
+"                        \"delegated-len\": 128,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.1-192.0.3.100\"\n"
+"                        \"prefix\": \"2001:db8:1::\",\n"
+"                        \"prefix-len\": 64\n"
 "                    }\n"
 "                ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -3859,22 +3651,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 12
+    // CONFIGURATION 11
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -3897,11 +3687,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -3911,7 +3700,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -3922,17 +3711,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -3942,59 +3733,43 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"match-client-id\": false,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"excluded-prefix\": \"3000::1000:0:0:0\",\n"
+"                        \"excluded-prefix-len\": 72,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.1-192.0.3.100\"\n"
+"                        \"prefix\": \"3000::\",\n"
+"                        \"prefix-len\": 48\n"
 "                    }\n"
 "                ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -4002,22 +3777,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 13
+    // CONFIGURATION 12
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4040,11 +3813,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4054,7 +3826,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -4065,17 +3837,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -4085,60 +3859,58 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"authoritative\": true,\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
+"                    {\n"
+"                        \"delegated-len\": 80,\n"
+"                        \"option-data\": [ ],\n"
+"                        \"prefix\": \"2001:db8:1:1::\",\n"
+"                        \"prefix-len\": 72\n"
+"                    },\n"
+"                    {\n"
+"                        \"delegated-len\": 88,\n"
+"                        \"option-data\": [ ],\n"
+"                        \"prefix\": \"2001:db8:1:2::\",\n"
+"                        \"prefix-len\": 72\n"
+"                    },\n"
 "                    {\n"
+"                        \"delegated-len\": 96,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"prefix\": \"3000:1:3::\",\n"
+"                        \"prefix-len\": 72\n"
 "                    }\n"
 "                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"authoritative\": false,\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.1-192.0.3.100\"\n"
+"                        \"pool\": \"2001:db8:1:4::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -4146,22 +3918,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/40\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 14
+    // CONFIGURATION 13
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": true,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4184,11 +3954,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4198,7 +3967,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -4209,17 +3978,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -4229,59 +4000,41 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"authoritative\": false,\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
+"                        \"delegated-len\": 64,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.1-192.0.3.100\"\n"
+"                        \"prefix\": \"2001:db8:1::\",\n"
+"                        \"prefix-len\": 64\n"
 "                    }\n"
 "                ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -4289,22 +4042,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 15
+    // CONFIGURATION 14
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4327,11 +4078,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4341,31 +4091,38 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
-"        \"max-valid-lifetime\": 5000,\n"
-"        \"min-valid-lifetime\": 3000,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
+"        \"option-def\": [\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 100,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"ipv6-address\"\n"
+"            }\n"
+"        ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -4374,53 +4131,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 5,\n"
-"                \"min-valid-lifetime\": 3,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 16
+    // CONFIGURATION 15
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4443,11 +4175,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4457,29 +4188,38 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
+"        \"option-def\": [\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 100,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo\",\n"
+"                \"record-types\": \"uint16, ipv4-address, ipv6-address, string\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"record\"\n"
+"            }\n"
+"        ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -4488,89 +4228,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.0/28\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.200-192.0.2.255\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.0/25\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.128/25\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 17
+    // CONFIGURATION 16
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4593,11 +4272,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4607,29 +4285,47 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
+"        \"option-def\": [\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 100,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"uint32\"\n"
+"            },\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 101,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo-2\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"ipv4-address\"\n"
+"            }\n"
+"        ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -4638,53 +4334,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.128/28\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 18
+    // CONFIGURATION 17
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4707,11 +4378,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4721,7 +4391,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -4732,26 +4402,27 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [\n"
 "            {\n"
-"                \"array\": false,\n"
+"                \"array\": true,\n"
 "                \"code\": 100,\n"
 "                \"encapsulate\": \"\",\n"
 "                \"name\": \"foo\",\n"
 "                \"record-types\": \"\",\n"
 "                \"space\": \"isc\",\n"
-"                \"type\": \"ipv4-address\"\n"
+"                \"type\": \"uint32\"\n"
 "            }\n"
 "        ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -4760,24 +4431,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 19
+    // CONFIGURATION 18
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4800,11 +4475,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4814,7 +4488,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -4825,26 +4499,27 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [\n"
 "            {\n"
 "                \"array\": false,\n"
 "                \"code\": 100,\n"
-"                \"encapsulate\": \"\",\n"
+"                \"encapsulate\": \"sub-opts-space\",\n"
 "                \"name\": \"foo\",\n"
-"                \"record-types\": \"uint16, ipv4-address, ipv6-address, string\",\n"
+"                \"record-types\": \"\",\n"
 "                \"space\": \"isc\",\n"
-"                \"type\": \"record\"\n"
+"                \"type\": \"uint32\"\n"
 "            }\n"
 "        ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -4853,24 +4528,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 20
+    // CONFIGURATION 19
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4893,11 +4572,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -4907,46 +4585,50 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ ],\n"
+"            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [\n"
+"        \"option-data\": [\n"
 "            {\n"
-"                \"array\": false,\n"
-"                \"code\": 100,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"uint32\"\n"
+"                \"always-send\": false,\n"
+"                \"code\": 38,\n"
+"                \"csv-format\": false,\n"
+"                \"data\": \"ABCDEF0105\",\n"
+"                \"name\": \"subscriber-id\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"dhcp6\"\n"
 "            },\n"
 "            {\n"
-"                \"array\": false,\n"
-"                \"code\": 101,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo-2\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"ipv4-address\"\n"
+"                \"always-send\": false,\n"
+"                \"code\": 7,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"01\",\n"
+"                \"name\": \"preference\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"dhcp6\"\n"
 "            }\n"
 "        ],\n"
+"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -4955,24 +4637,60 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 21
+    // CONFIGURATION 20
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -4995,11 +4713,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5009,37 +4726,31 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ ],\n"
+"            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"array\": true,\n"
-"                \"code\": 100,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"uint32\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -5048,24 +4759,79 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"always-send\": false,\n"
+"                        \"code\": 38,\n"
+"                        \"csv-format\": false,\n"
+"                        \"data\": \"ABCDEF0105\",\n"
+"                        \"name\": \"subscriber-id\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp6\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"always-send\": false,\n"
+"                        \"code\": 7,\n"
+"                        \"csv-format\": true,\n"
+"                        \"data\": \"01\",\n"
+"                        \"name\": \"preference\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp6\"\n"
+"                    }\n"
+"                ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 22
+    // CONFIGURATION 21
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -5088,11 +4854,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5102,30 +4867,48 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ ],\n"
+"            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"code\": 38,\n"
+"                \"csv-format\": false,\n"
+"                \"data\": \"ABCDEF0105\",\n"
+"                \"name\": \"subscriber-id\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"dhcp6\"\n"
+"            },\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"code\": 38,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"1234\",\n"
+"                \"name\": \"foo\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"isc\"\n"
+"            }\n"
+"        ],\n"
 "        \"option-def\": [\n"
 "            {\n"
 "                \"array\": false,\n"
-"                \"code\": 100,\n"
-"                \"encapsulate\": \"sub-opts-space\",\n"
+"                \"code\": 38,\n"
+"                \"encapsulate\": \"\",\n"
 "                \"name\": \"foo\",\n"
 "                \"record-types\": \"\",\n"
 "                \"space\": \"isc\",\n"
@@ -5133,6 +4916,11 @@ const char* UNPARSED_CONFIGS[] = {
 "            }\n"
 "        ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -5141,117 +4929,60 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
-"    }\n",
-    // CONFIGURATION 23
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"array\": false,\n"
-"                \"code\": 109,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"dhcp4\",\n"
-"                \"type\": \"string\"\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 24
+    // CONFIGURATION 22
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -5274,11 +5005,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5288,37 +5018,69 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ ],\n"
+"            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"code\": 110,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"1234\",\n"
+"                \"name\": \"foo\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"isc\"\n"
+"            },\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"code\": 111,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"192.168.2.1\",\n"
+"                \"name\": \"foo2\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"isc\"\n"
+"            }\n"
+"        ],\n"
 "        \"option-def\": [\n"
 "            {\n"
 "                \"array\": false,\n"
-"                \"code\": 170,\n"
+"                \"code\": 110,\n"
 "                \"encapsulate\": \"\",\n"
-"                \"name\": \"unassigned-option-170\",\n"
+"                \"name\": \"foo\",\n"
 "                \"record-types\": \"\",\n"
-"                \"space\": \"dhcp4\",\n"
-"                \"type\": \"string\"\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"uint32\"\n"
+"            },\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 111,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo2\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"ipv4-address\"\n"
 "            }\n"
 "        ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -5327,24 +5089,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 25
+    // CONFIGURATION 23
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -5367,11 +5133,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5381,7 +5146,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -5392,36 +5157,75 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [\n"
 "            {\n"
 "                \"always-send\": false,\n"
-"                \"code\": 56,\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"ABCDEF0105\",\n"
-"                \"name\": \"dhcp-message\",\n"
+"                \"code\": 100,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"11\",\n"
+"                \"name\": \"base-option\",\n"
 "                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
+"                \"space\": \"dhcp6\"\n"
 "            },\n"
 "            {\n"
 "                \"always-send\": false,\n"
-"                \"code\": 23,\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"01\",\n"
-"                \"name\": \"default-ip-ttl\",\n"
+"                \"code\": 110,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"1234\",\n"
+"                \"name\": \"foo\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"isc\"\n"
+"            },\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"code\": 111,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"192.168.2.1\",\n"
+"                \"name\": \"foo2\",\n"
 "                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
+"                \"space\": \"isc\"\n"
+"            }\n"
+"        ],\n"
+"        \"option-def\": [\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 100,\n"
+"                \"encapsulate\": \"isc\",\n"
+"                \"name\": \"base-option\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"dhcp6\",\n"
+"                \"type\": \"uint8\"\n"
+"            },\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 110,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"uint32\"\n"
+"            },\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 111,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo2\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"ipv4-address\"\n"
 "            }\n"
 "        ],\n"
-"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -5431,30 +5235,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -5462,22 +5275,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 26
+    // CONFIGURATION 24
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -5500,11 +5311,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5514,7 +5324,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -5525,17 +5335,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -5545,49 +5357,90 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [\n"
 "                    {\n"
 "                        \"always-send\": false,\n"
-"                        \"code\": 56,\n"
+"                        \"code\": 38,\n"
 "                        \"csv-format\": false,\n"
-"                        \"data\": \"ABCDEF0105\",\n"
-"                        \"name\": \"dhcp-message\",\n"
+"                        \"data\": \"0102030405060708090A\",\n"
+"                        \"name\": \"subscriber-id\",\n"
 "                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
-"                    },\n"
+"                        \"space\": \"dhcp6\"\n"
+"                    }\n"
+"                ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 2,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [\n"
 "                    {\n"
 "                        \"always-send\": false,\n"
-"                        \"code\": 23,\n"
+"                        \"code\": 15,\n"
 "                        \"csv-format\": false,\n"
-"                        \"data\": \"01\",\n"
-"                        \"name\": \"default-ip-ttl\",\n"
+"                        \"data\": \"FFFEFDFCFB\",\n"
+"                        \"name\": \"user-class\",\n"
 "                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
+"                        \"space\": \"dhcp6\"\n"
 "                    }\n"
 "                ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -5595,22 +5448,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 27
+    // CONFIGURATION 25
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -5633,11 +5484,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5647,7 +5497,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -5658,46 +5508,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 56,\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"ABCDEF0105\",\n"
-"                \"name\": \"dhcp-message\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 56,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"1234\",\n"
-"                \"name\": \"foo\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"isc\"\n"
-"            }\n"
-"        ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 56,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"uint32\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -5707,53 +5530,117 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 38,\n"
+"                                \"csv-format\": false,\n"
+"                                \"data\": \"112233445566\",\n"
+"                                \"name\": \"subscriber-id\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"prefix\": \"3000::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
+"                    {\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 15,\n"
+"                                \"csv-format\": false,\n"
+"                                \"data\": \"AABBCCDDEE\",\n"
+"                                \"name\": \"user-class\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"prefix\": \"3001::\",\n"
+"                        \"prefix-len\": 48\n"
 "                    }\n"
 "                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 38,\n"
+"                                \"csv-format\": false,\n"
+"                                \"data\": \"0102030405060708090A\",\n"
+"                                \"name\": \"subscriber-id\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pool\": \"2001:db8:1::10-2001:db8:1::100\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 15,\n"
+"                                \"csv-format\": false,\n"
+"                                \"data\": \"FFFEFDFCFB\",\n"
+"                                \"name\": \"user-class\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pool\": \"2001:db8:1::300-2001:db8:1::400\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 28
+    // CONFIGURATION 26
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -5776,11 +5663,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5790,7 +5676,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -5801,55 +5687,36 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [\n"
 "            {\n"
 "                \"always-send\": false,\n"
-"                \"code\": 1,\n"
-"                \"csv-format\": true,\n"
+"                \"code\": 100,\n"
+"                \"csv-format\": false,\n"
 "                \"data\": \"1234\",\n"
-"                \"name\": \"foo\",\n"
 "                \"never-send\": false,\n"
-"                \"space\": \"isc\"\n"
+"                \"space\": \"vendor-1234\"\n"
 "            },\n"
 "            {\n"
 "                \"always-send\": false,\n"
-"                \"code\": 2,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"192.168.2.1\",\n"
-"                \"name\": \"foo2\",\n"
+"                \"code\": 100,\n"
+"                \"csv-format\": false,\n"
+"                \"data\": \"ABCDEF0105\",\n"
 "                \"never-send\": false,\n"
-"                \"space\": \"isc\"\n"
-"            }\n"
-"        ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 1,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"uint32\"\n"
-"            },\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 2,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"ipv4-address\"\n"
+"                \"space\": \"vendor-4491\"\n"
 "            }\n"
 "        ],\n"
+"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -5859,24 +5726,60 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 29
+    // CONFIGURATION 27
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -5899,11 +5802,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -5913,7 +5815,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -5924,73 +5826,39 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [\n"
 "            {\n"
 "                \"always-send\": false,\n"
-"                \"code\": 222,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"11\",\n"
-"                \"name\": \"base-option\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 1,\n"
+"                \"code\": 100,\n"
 "                \"csv-format\": true,\n"
-"                \"data\": \"1234\",\n"
+"                \"data\": \"this is a string vendor-opt\",\n"
 "                \"name\": \"foo\",\n"
 "                \"never-send\": false,\n"
-"                \"space\": \"isc\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 2,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"192.168.2.1\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"isc\"\n"
+"                \"space\": \"vendor-4491\"\n"
 "            }\n"
 "        ],\n"
 "        \"option-def\": [\n"
 "            {\n"
 "                \"array\": false,\n"
-"                \"code\": 222,\n"
-"                \"encapsulate\": \"isc\",\n"
-"                \"name\": \"base-option\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"dhcp4\",\n"
-"                \"type\": \"uint8\"\n"
-"            },\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 1,\n"
+"                \"code\": 100,\n"
 "                \"encapsulate\": \"\",\n"
 "                \"name\": \"foo\",\n"
 "                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"uint32\"\n"
-"            },\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 2,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"ipv4-address\"\n"
+"                \"space\": \"vendor-4491\",\n"
+"                \"type\": \"string\"\n"
 "            }\n"
 "        ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6000,30 +5868,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 3000,\n"
-"                \"min-valid-lifetime\": 3000,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -6031,22 +5908,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 3000\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 3000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 30
+    // CONFIGURATION 28
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -6069,11 +5944,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -6083,38 +5957,30 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ \"eth0\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 56,\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"AB\",\n"
-"                \"name\": \"dhcp-message\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6124,72 +5990,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [\n"
-"                    {\n"
-"                        \"always-send\": false,\n"
-"                        \"code\": 56,\n"
-"                        \"csv-format\": false,\n"
-"                        \"data\": \"ABCDEF0105\",\n"
-"                        \"name\": \"dhcp-message\",\n"
-"                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"always-send\": false,\n"
-"                        \"code\": 23,\n"
-"                        \"csv-format\": false,\n"
-"                        \"data\": \"01\",\n"
-"                        \"name\": \"default-ip-ttl\",\n"
-"                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
-"                    }\n"
-"                ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 31
+    // CONFIGURATION 29
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -6212,11 +6034,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -6226,28 +6047,30 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ \"*\", \"eth0\", \"eth1\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6257,101 +6080,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [\n"
-"                    {\n"
-"                        \"always-send\": false,\n"
-"                        \"code\": 56,\n"
-"                        \"csv-format\": false,\n"
-"                        \"data\": \"0102030405060708090A\",\n"
-"                        \"name\": \"dhcp-message\",\n"
-"                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
-"                    }\n"
-"                ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [\n"
-"                    {\n"
-"                        \"always-send\": false,\n"
-"                        \"code\": 23,\n"
-"                        \"csv-format\": false,\n"
-"                        \"data\": \"FF\",\n"
-"                        \"name\": \"default-ip-ttl\",\n"
-"                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
-"                    }\n"
-"                ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 32
+    // CONFIGURATION 30
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -6374,11 +6124,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -6388,7 +6137,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -6399,17 +6148,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6419,72 +6170,60 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"option-data\": [\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 56,\n"
-"                                \"csv-format\": false,\n"
-"                                \"data\": \"ABCDEF0105\",\n"
-"                                \"name\": \"dhcp-message\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            },\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 23,\n"
-"                                \"csv-format\": false,\n"
-"                                \"data\": \"01\",\n"
-"                                \"name\": \"default-ip-ttl\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
+"                    \"ip-addresses\": [ \"2001:db8:1::abcd\" ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 33
+    // CONFIGURATION 31
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -6507,11 +6246,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -6521,7 +6259,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -6532,17 +6270,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6552,77 +6292,60 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
-"                        \"option-data\": [\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 56,\n"
-"                                \"csv-format\": false,\n"
-"                                \"data\": \"ABCDEF0105\",\n"
-"                                \"name\": \"dhcp-message\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"option-data\": [\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 23,\n"
-"                                \"csv-format\": false,\n"
-"                                \"data\": \"01\",\n"
-"                                \"name\": \"default-ip-ttl\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"pool\": \"192.0.2.200-192.0.2.250\"\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
+"                    \"ip-addresses\": [ \"2001:db9::abcd\", \"2001:db9::abce\" ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 34
+    // CONFIGURATION 32
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -6645,11 +6368,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -6659,7 +6381,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -6670,36 +6392,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 78,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"true, 10.0.0.3, 127.0.0.1\",\n"
-"                \"name\": \"slp-directory-agent\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 79,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"false, \",\n"
-"                \"name\": \"slp-service-scope\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6709,30 +6414,135 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"client-class\": \"alpha\",\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"client-class\": \"beta\",\n"
+"                \"id\": 2,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"client-class\": \"gamma\",\n"
+"                \"id\": 3,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:3::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 4,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -6740,22 +6550,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:4::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 35
+    // CONFIGURATION 33
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -6778,11 +6586,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -6792,7 +6599,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -6803,55 +6610,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 1,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"1234\",\n"
-"                \"name\": \"foo\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 2,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"192.168.2.1\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            }\n"
-"        ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 1,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"uint32\"\n"
-"            },\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 2,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"ipv4-address\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6861,24 +6632,75 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"client-class\": \"alpha\",\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"client-class\": \"beta\",\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"client-class\": \"gamma\",\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8::/40\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 36
+    // CONFIGURATION 34
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -6901,11 +6723,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -6915,7 +6736,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -6926,64 +6747,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 43,\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"\",\n"
-"                \"name\": \"vendor-encapsulated-options\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 1,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"1234\",\n"
-"                \"name\": \"foo\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 2,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"192.168.2.1\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"vendor-encapsulated-options-space\"\n"
-"            }\n"
-"        ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 1,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"uint32\"\n"
-"            },\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 2,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo2\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"vendor-encapsulated-options-space\",\n"
-"                \"type\": \"ipv4-address\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -6993,30 +6769,62 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 3000,\n"
-"                \"min-valid-lifetime\": 3000,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
+"                    {\n"
+"                        \"client-class\": \"alpha\",\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"option-data\": [ ],\n"
+"                        \"prefix\": \"2001:db8:1::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
 "                    {\n"
+"                        \"client-class\": \"beta\",\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"option-data\": [ ],\n"
+"                        \"prefix\": \"2001:db8:2::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
+"                    {\n"
+"                        \"client-class\": \"gamma\",\n"
+"                        \"delegated-len\": 64,\n"
+"                        \"option-data\": [ ],\n"
+"                        \"prefix\": \"2001:db8:3::\",\n"
+"                        \"prefix-len\": 48\n"
+"                    },\n"
+"                    {\n"
+"                        \"delegated-len\": 64,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"prefix\": \"2001:db8:4::\",\n"
+"                        \"prefix-len\": 48\n"
 "                    }\n"
 "                ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -7024,22 +6832,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 3000\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 3000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 37
+    // CONFIGURATION 35
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -7050,23 +6856,22 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"ddns-update-on-renew\": false,\n"
 "        \"decline-probation-period\": 86400,\n"
 "        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
+"            \"enable-updates\": true,\n"
+"            \"max-queue-size\": 2048,\n"
 "            \"ncr-format\": \"JSON\",\n"
 "            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
+"            \"sender-ip\": \"3001::2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"3001::1\",\n"
+"            \"server-port\": 777\n"
 "        },\n"
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -7076,7 +6881,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -7087,34 +6892,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 100,\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"1234\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"vendor-1234\"\n"
-"            },\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 100,\n"
-"                \"csv-format\": false,\n"
-"                \"data\": \"ABCDEF0105\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"vendor-4491\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -7124,30 +6914,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.10\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -7155,22 +6954,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 38
+    // CONFIGURATION 36
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -7193,11 +6990,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -7207,7 +7003,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -7218,37 +7014,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [\n"
-"            {\n"
-"                \"always-send\": false,\n"
-"                \"code\": 100,\n"
-"                \"csv-format\": true,\n"
-"                \"data\": \"this is a string vendor-opt\",\n"
-"                \"name\": \"foo\",\n"
-"                \"never-send\": false,\n"
-"                \"space\": \"vendor-4491\"\n"
-"            }\n"
-"        ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 100,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"vendor-4491\",\n"
-"                \"type\": \"string\"\n"
-"            }\n"
-"        ],\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -7258,30 +7036,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 123,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -7289,22 +7076,163 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 234,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [\n"
+"                    {\n"
+"                        \"client-classes\": [ ],\n"
+"                        \"hostname\": \"\",\n"
+"                        \"hw-address\": \"01:02:03:04:05:06\",\n"
+"                        \"ip-addresses\": [ \"2001:db8:2::abcd\" ],\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 23,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"2001:db8:2::abbc\",\n"
+"                                \"name\": \"dns-servers\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            },\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 7,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"25\",\n"
+"                                \"name\": \"preference\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"prefixes\": [ ]\n"
+"                    },\n"
+"                    {\n"
+"                        \"client-classes\": [ ],\n"
+"                        \"duid\": \"01:02:03:04:05:06:07:08:09:0a\",\n"
+"                        \"hostname\": \"\",\n"
+"                        \"ip-addresses\": [ \"2001:db8:2::1234\" ],\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 23,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"2001:db8:2::1111\",\n"
+"                                \"name\": \"dns-servers\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            },\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 7,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"11\",\n"
+"                                \"name\": \"preference\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"prefixes\": [ ]\n"
+"                    }\n"
+"                ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 542,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [\n"
+"                    {\n"
+"                        \"client-classes\": [ ],\n"
+"                        \"hostname\": \"\",\n"
+"                        \"hw-address\": \"06:05:04:03:02:01\",\n"
+"                        \"ip-addresses\": [ ],\n"
+"                        \"option-data\": [ ],\n"
+"                        \"prefixes\": [ \"2001:db8:3:1::/96\" ]\n"
+"                    },\n"
+"                    {\n"
+"                        \"client-classes\": [ ],\n"
+"                        \"duid\": \"0a:09:08:07:06:05:04:03:02:01\",\n"
+"                        \"hostname\": \"\",\n"
+"                        \"ip-addresses\": [ ],\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 23,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"2001:db8:3::3333\",\n"
+"                                \"name\": \"dns-servers\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            },\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 7,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"33\",\n"
+"                                \"name\": \"preference\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"prefixes\": [ \"2001:db8:3:2::/96\" ]\n"
+"                    }\n"
+"                ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:3::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 39
+    // CONFIGURATION 37
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -7327,11 +7255,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -7341,28 +7268,40 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"eth0\", \"eth1\" ],\n"
+"            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
+"        \"option-def\": [\n"
+"            {\n"
+"                \"array\": false,\n"
+"                \"code\": 100,\n"
+"                \"encapsulate\": \"\",\n"
+"                \"name\": \"foo\",\n"
+"                \"record-types\": \"\",\n"
+"                \"space\": \"isc\",\n"
+"                \"type\": \"uint32\"\n"
+"            }\n"
+"        ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -7372,24 +7311,74 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 234,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [\n"
+"                    {\n"
+"                        \"client-classes\": [ ],\n"
+"                        \"duid\": \"01:02:03:04:05:06:07:08:09:0a\",\n"
+"                        \"hostname\": \"\",\n"
+"                        \"ip-addresses\": [ \"2001:db8:2::1234\" ],\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"code\": 100,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"11\",\n"
+"                                \"name\": \"foo\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"isc\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"prefixes\": [ ]\n"
+"                    }\n"
+"                ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 40
+    // CONFIGURATION 38
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -7412,11 +7401,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -7426,28 +7414,30 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\", \"eth0\", \"eth1\" ],\n"
+"            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -7457,24 +7447,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 41
+    // CONFIGURATION 39
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -7485,23 +7479,22 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"ddns-update-on-renew\": false,\n"
 "        \"decline-probation-period\": 86400,\n"
 "        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": true,\n"
-"            \"max-queue-size\": 2048,\n"
+"            \"enable-updates\": false,\n"
+"            \"max-queue-size\": 1024,\n"
 "            \"ncr-format\": \"JSON\",\n"
 "            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"192.168.2.2\",\n"
-"            \"sender-port\": 778,\n"
-"            \"server-ip\": \"192.168.2.1\",\n"
-"            \"server-port\": 777\n"
+"            \"sender-ip\": \"0.0.0.0\",\n"
+"            \"sender-port\": 0,\n"
+"            \"server-ip\": \"127.0.0.1\",\n"
+"            \"server-port\": 53001\n"
 "        },\n"
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -7511,7 +7504,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -7522,17 +7515,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -7542,53 +7537,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 42
+    // CONFIGURATION 40
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -7611,11 +7581,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -7625,28 +7594,30 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -7656,1015 +7627,42 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4,\n"
-"                \"min-valid-lifetime\": 4,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::/64\"\n"
 "                    }\n"
 "                ],\n"
-"                \"rebind-timer\": 2,\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
-"                    \"ip-addresses\": [ \"192.0.2.123\" ]\n"
-"                },\n"
-"                \"renew-timer\": 1,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 43
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4,\n"
-"                \"min-valid-lifetime\": 4,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ \"192.0.3.123\", \"192.0.3.124\" ]\n"
-"                },\n"
-"                \"renew-timer\": 1,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 44
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"client-class\": \"alpha\",\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"client-class\": \"beta\",\n"
-"                \"id\": 2,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"client-class\": \"gamma\",\n"
-"                \"id\": 3,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.101-192.0.4.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 4,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.5.101-192.0.5.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.5.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 45
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"client-class\": \"alpha\",\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"client-class\": \"beta\",\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"client-class\": \"gamma\",\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.101-192.0.4.150\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.5.101-192.0.5.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.0.0/16\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 46
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 123,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 234,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [\n"
-"                    {\n"
-"                        \"boot-file-name\": \"\",\n"
-"                        \"client-classes\": [ ],\n"
-"                        \"hostname\": \"\",\n"
-"                        \"hw-address\": \"01:02:03:04:05:06\",\n"
-"                        \"ip-address\": \"192.0.3.120\",\n"
-"                        \"next-server\": \"0.0.0.0\",\n"
-"                        \"option-data\": [\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 5,\n"
-"                                \"csv-format\": true,\n"
-"                                \"data\": \"192.0.3.95\",\n"
-"                                \"name\": \"name-servers\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            },\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 23,\n"
-"                                \"csv-format\": true,\n"
-"                                \"data\": \"11\",\n"
-"                                \"name\": \"default-ip-ttl\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"server-hostname\": \"\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"boot-file-name\": \"\",\n"
-"                        \"client-classes\": [ ],\n"
-"                        \"duid\": \"01:02:03:04:05:06:07:08:09:0a\",\n"
-"                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.3.112\",\n"
-"                        \"next-server\": \"0.0.0.0\",\n"
-"                        \"option-data\": [\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 5,\n"
-"                                \"csv-format\": true,\n"
-"                                \"data\": \"192.0.3.15\",\n"
-"                                \"name\": \"name-servers\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            },\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 23,\n"
-"                                \"csv-format\": true,\n"
-"                                \"data\": \"32\",\n"
-"                                \"name\": \"default-ip-ttl\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"server-hostname\": \"\"\n"
-"                    }\n"
-"                ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 542,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.101-192.0.4.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [\n"
-"                    {\n"
-"                        \"boot-file-name\": \"\",\n"
-"                        \"client-classes\": [ ],\n"
-"                        \"client-id\": \"05010203040506\",\n"
-"                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.4.103\",\n"
-"                        \"next-server\": \"0.0.0.0\",\n"
-"                        \"option-data\": [ ],\n"
-"                        \"server-hostname\": \"\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"boot-file-name\": \"\",\n"
-"                        \"circuit-id\": \"060504030201\",\n"
-"                        \"client-classes\": [ ],\n"
-"                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.4.102\",\n"
-"                        \"next-server\": \"0.0.0.0\",\n"
-"                        \"option-data\": [ ],\n"
-"                        \"server-hostname\": \"\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"boot-file-name\": \"\",\n"
-"                        \"client-classes\": [ ],\n"
-"                        \"duid\": \"0a:09:08:07:06:05:04:03:02:01\",\n"
-"                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.4.101\",\n"
-"                        \"next-server\": \"0.0.0.0\",\n"
-"                        \"option-data\": [\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 5,\n"
-"                                \"csv-format\": true,\n"
-"                                \"data\": \"192.0.4.11\",\n"
-"                                \"name\": \"name-servers\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            },\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 23,\n"
-"                                \"csv-format\": true,\n"
-"                                \"data\": \"95\",\n"
-"                                \"name\": \"default-ip-ttl\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"dhcp4\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"server-hostname\": \"\"\n"
-"                    }\n"
-"                ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 47
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [\n"
-"            {\n"
-"                \"array\": false,\n"
-"                \"code\": 100,\n"
-"                \"encapsulate\": \"\",\n"
-"                \"name\": \"foo\",\n"
-"                \"record-types\": \"\",\n"
-"                \"space\": \"isc\",\n"
-"                \"type\": \"uint32\"\n"
-"            }\n"
-"        ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 234,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [\n"
-"                    {\n"
-"                        \"boot-file-name\": \"\",\n"
-"                        \"client-classes\": [ ],\n"
-"                        \"duid\": \"01:02:03:04:05:06:07:08:09:0a\",\n"
-"                        \"hostname\": \"\",\n"
-"                        \"ip-address\": \"192.0.3.112\",\n"
-"                        \"next-server\": \"0.0.0.0\",\n"
-"                        \"option-data\": [\n"
-"                            {\n"
-"                                \"always-send\": false,\n"
-"                                \"code\": 100,\n"
-"                                \"csv-format\": true,\n"
-"                                \"data\": \"123\",\n"
-"                                \"name\": \"foo\",\n"
-"                                \"never-send\": false,\n"
-"                                \"space\": \"isc\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"server-hostname\": \"\"\n"
-"                    }\n"
-"                ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 48
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.1.0/24\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
+"                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
@@ -8672,146 +7670,97 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"reservations-in-subnet\": true,\n"
 "                \"reservations-out-of-pool\": false,\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.1.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/48\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 2,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.0/24\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"reservations-global\": false,\n"
-"                \"reservations-in-subnet\": true,\n"
-"                \"reservations-out-of-pool\": true,\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 3,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.0/24\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"reservations-global\": false,\n"
-"                \"reservations-in-subnet\": false,\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 4,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.0/24\"\n"
+"                        \"pool\": \"2001:db8:2::/64\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
-"                \"reservations-global\": true,\n"
-"                \"reservations-in-subnet\": false,\n"
+"                \"reservations-global\": false,\n"
+"                \"reservations-in-subnet\": true,\n"
+"                \"reservations-out-of-pool\": true,\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\",\n"
+"                \"subnet\": \"2001:db8:2::/48\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 5,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 3,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.5.0/24\"\n"
+"                        \"pool\": \"2001:db8:3::/64\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
+"                \"reservations-global\": false,\n"
+"                \"reservations-in-subnet\": false,\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.5.0/24\",\n"
+"                \"subnet\": \"2001:db8:3::/48\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 6,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 4,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.6.0/24\"\n"
+"                        \"pool\": \"2001:db8:4::/64\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -8819,284 +7768,121 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"reservations-global\": true,\n"
-"                \"reservations-in-subnet\": true,\n"
-"                \"reservations-out-of-pool\": false,\n"
+"                \"reservations-in-subnet\": false,\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.6.0/24\",\n"
+"                \"subnet\": \"2001:db8:4::/48\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 7,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 5,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.7.0/24\"\n"
+"                        \"pool\": \"2001:db8:5::/64\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
-"                \"reservations-global\": true,\n"
-"                \"reservations-in-subnet\": true,\n"
-"                \"reservations-out-of-pool\": true,\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.7.0/24\",\n"
+"                \"subnet\": \"2001:db8:5::/48\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 49
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": true,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 6,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.0/24\"\n"
+"                        \"pool\": \"2001:db8:6::/64\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
-"                \"reservations-global\": false,\n"
+"                \"reservations-global\": true,\n"
 "                \"reservations-in-subnet\": true,\n"
 "                \"reservations-out-of-pool\": false,\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:6::/48\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 7,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.0/24\"\n"
+"                        \"pool\": \"2001:db8:7::/64\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
+"                \"reservations-global\": true,\n"
+"                \"reservations-in-subnet\": true,\n"
+"                \"reservations-out-of-pool\": true,\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:7::/48\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 50
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
-"    }\n",
-    // CONFIGURATION 51
+    // CONFIGURATION 41
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9119,94 +7905,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
-"    }\n",
-    // CONFIGURATION 52
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 12345,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -9216,53 +7918,127 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
+"            \"interfaces\": [ ],\n"
 "            \"re-detect\": false\n"
 "        },\n"
 "        \"ip-reservations-unique\": true,\n"
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
+"        \"reservations-out-of-pool\": true,\n"
 "        \"sanity-checks\": {\n"
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/64\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"reservations-global\": false,\n"
+"                \"reservations-in-subnet\": true,\n"
+"                \"reservations-out-of-pool\": false,\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/48\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 2,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:2::/64\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:2::/48\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 53
+    // CONFIGURATION 42
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9285,21 +8061,20 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 35,\n"
-"            \"hold-reclaimed-time\": 1800,\n"
-"            \"max-reclaim-leases\": 50,\n"
-"            \"max-reclaim-time\": 100,\n"
-"            \"reclaim-timer-wait-time\": 20,\n"
-"            \"unwarned-reclaim-cycles\": 10\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -9310,16 +8085,20 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"23\", \"37\", \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -9328,24 +8107,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 54
+    // CONFIGURATION 43
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9368,11 +8151,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -9382,7 +8164,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -9393,18 +8175,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -9413,53 +8194,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 55
+    // CONFIGURATION 44
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9482,11 +8238,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -9496,7 +8251,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -9507,18 +8262,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -9527,53 +8281,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"2001:db8::123/45\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 56
+    // CONFIGURATION 45
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9582,7 +8311,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"ddns-replace-client-name\": \"never\",\n"
 "        \"ddns-send-updates\": true,\n"
 "        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
+"        \"decline-probation-period\": 12345,\n"
 "        \"dhcp-ddns\": {\n"
 "            \"enable-updates\": false,\n"
 "            \"max-queue-size\": 1024,\n"
@@ -9596,11 +8325,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -9610,7 +8338,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -9621,18 +8349,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -9641,53 +8368,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"ethX\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 57
+    // CONFIGURATION 46
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9710,21 +8412,20 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
+"            \"flush-reclaimed-timer-wait-time\": 35,\n"
+"            \"hold-reclaimed-time\": 1800,\n"
+"            \"max-reclaim-leases\": 50,\n"
+"            \"max-reclaim-time\": 100,\n"
+"            \"reclaim-timer-wait-time\": 20,\n"
+"            \"unwarned-reclaim-cycles\": 10\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -9735,18 +8436,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -9755,53 +8455,42 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"ethX\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"2001:db8::543/21\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 58
+    // CONFIGURATION 47
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"name\": \"one\",\n"
+"                \"option-data\": [ ]\n"
+"            },\n"
+"            {\n"
+"                \"name\": \"two\",\n"
+"                \"option-data\": [ ]\n"
+"            },\n"
+"            {\n"
+"                \"name\": \"three\",\n"
+"                \"option-data\": [ ]\n"
+"            }\n"
+"        ],\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9824,11 +8513,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -9838,7 +8526,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -9849,17 +8537,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -9869,30 +8559,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"vlan123\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -9900,48 +8599,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 59
+    // CONFIGURATION 48
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"client-classes\": [\n"
-"            {\n"
-"                \"boot-file-name\": \"\",\n"
-"                \"name\": \"one\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\"\n"
-"            },\n"
-"            {\n"
-"                \"boot-file-name\": \"\",\n"
-"                \"name\": \"two\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\"\n"
-"            },\n"
-"            {\n"
-"                \"boot-file-name\": \"\",\n"
-"                \"name\": \"three\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\"\n"
-"            }\n"
-"        ],\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -9964,11 +8635,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -9978,7 +8648,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -9989,17 +8659,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -10009,30 +8681,39 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8::/64\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -10040,43 +8721,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/32\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 60
+    // CONFIGURATION 49
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"client-classes\": [\n"
-"            {\n"
-"                \"boot-file-name\": \"\",\n"
-"                \"max-valid-lifetime\": 3000,\n"
-"                \"min-valid-lifetime\": 1000,\n"
-"                \"name\": \"one\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\",\n"
-"                \"valid-lifetime\": 2000\n"
-"            },\n"
-"            {\n"
-"                \"boot-file-name\": \"\",\n"
-"                \"name\": \"two\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\"\n"
-"            }\n"
-"        ],\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -10099,11 +8757,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10113,7 +8770,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -10124,16 +8781,20 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -10142,74 +8803,61 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 7200,\n"
-"                \"min-valid-lifetime\": 7200,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8::/64\",\n"
+"                        \"user-context\": { }\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
+"                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/32\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 7200\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 61
+    // CONFIGURATION 50
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"client-classes\": [\n"
-"            {\n"
-"                \"boot-file-name\": \"\",\n"
-"                \"max-valid-lifetime\": 3000,\n"
-"                \"min-valid-lifetime\": 1000,\n"
-"                \"name\": \"one\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\",\n"
-"                \"template-test\": \"''\",\n"
-"                \"valid-lifetime\": 2000\n"
-"            },\n"
-"            {\n"
-"                \"boot-file-name\": \"\",\n"
-"                \"name\": \"two\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\",\n"
-"                \"template-test\": \"''\"\n"
-"            }\n"
-"        ],\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -10232,11 +8880,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10246,7 +8893,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -10257,16 +8904,20 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -10275,51 +8926,66 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 7200,\n"
-"                \"min-valid-lifetime\": 7200,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8::/64\",\n"
+"                        \"user-context\": {\n"
+"                            \"lw4over6-bind-prefix-len\": 56,\n"
+"                            \"lw4over6-sharing-ratio\": 64,\n"
+"                            \"lw4over6-sysports-exclude\": true,\n"
+"                            \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n"
+"                        }\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
+"                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/32\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 7200\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 7200\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 62
+    // CONFIGURATION 51
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -10342,11 +9008,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10356,7 +9021,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -10367,17 +9032,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -10387,30 +9054,45 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.0/28\"\n"
+"                        \"pool\": \"2001:db8::/64\",\n"
+"                        \"user-context\": {\n"
+"                            \"lw4over6-bind-prefix-len\": 56,\n"
+"                            \"lw4over6-sharing-ratio\": 64,\n"
+"                            \"lw4over6-sysports-exclude\": true,\n"
+"                            \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n"
+"                        }\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -10418,22 +9100,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/32\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 63
+    // CONFIGURATION 52
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -10456,11 +9136,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10470,7 +9149,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -10481,17 +9160,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -10501,31 +9182,41 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
+"                        \"delegated-len\": 64,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.0/28\",\n"
-"                        \"user-context\": { }\n"
+"                        \"prefix\": \"2001:db8::\",\n"
+"                        \"prefix-len\": 56\n"
 "                    }\n"
 "                ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -10533,22 +9224,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/32\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 64
+    // CONFIGURATION 53
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -10571,11 +9260,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10585,7 +9273,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -10596,17 +9284,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -10616,35 +9306,42 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
+"                        \"delegated-len\": 64,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.0/28\",\n"
-"                        \"user-context\": {\n"
-"                            \"bool-param\": true,\n"
-"                            \"integer-param\": 42,\n"
-"                            \"string-param\": \"Sagittarius\"\n"
-"                        }\n"
+"                        \"prefix\": \"2001:db8::\",\n"
+"                        \"prefix-len\": 56,\n"
+"                        \"user-context\": { }\n"
 "                    }\n"
 "                ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -10652,22 +9349,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/32\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 65
+    // CONFIGURATION 54
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -10690,11 +9385,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10704,7 +9398,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -10715,17 +9409,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -10735,35 +9431,47 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 1,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [\n"
 "                    {\n"
+"                        \"delegated-len\": 64,\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.0/28\",\n"
+"                        \"prefix\": \"2001:db8::\",\n"
+"                        \"prefix-len\": 56,\n"
 "                        \"user-context\": {\n"
-"                            \"bool-param\": true,\n"
-"                            \"integer-param\": 42,\n"
-"                            \"string-param\": \"Sagittarius\"\n"
+"                            \"lw4over6-bind-prefix-len\": 56,\n"
+"                            \"lw4over6-sharing-ratio\": 64,\n"
+"                            \"lw4over6-sysports-exclude\": true,\n"
+"                            \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n"
 "                        }\n"
 "                    }\n"
 "                ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -10771,22 +9479,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8::/32\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 66
+    // CONFIGURATION 55
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -10809,11 +9515,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10823,7 +9528,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"hosts-databases\": [\n"
@@ -10848,17 +9553,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -10868,52 +9575,44 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 67
+    // CONFIGURATION 56
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"client-classes\": [\n"
 "            {\n"
-"                \"boot-file-name\": \"\",\n"
 "                \"name\": \"all\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
 "                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\",\n"
 "                \"test\": \"'' == ''\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"match all\"\n"
 "                }\n"
 "            },\n"
 "            {\n"
-"                \"boot-file-name\": \"\",\n"
 "                \"name\": \"none\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
-"                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\"\n"
+"                \"option-data\": [ ]\n"
 "            },\n"
 "            {\n"
-"                \"boot-file-name\": \"\",\n"
 "                \"name\": \"both\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
 "                \"option-data\": [ ],\n"
-"                \"option-def\": [ ],\n"
-"                \"server-hostname\": \"\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"a comment\",\n"
 "                    \"version\": 1\n"
@@ -10922,7 +9621,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        ],\n"
 "        \"control-sockets\": [\n"
 "            {\n"
-"                \"socket-name\": \"/tmp/kea4-ctrl-socket\",\n"
+"                \"socket-name\": \"/tmp/kea6-ctrl-socket\",\n"
 "                \"socket-type\": \"unix\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"Indirect comment\"\n"
@@ -10946,7 +9645,7 @@ const char* UNPARSED_CONFIGS[] = {
 "                        \"comment\": \"basic HTTP authentication\"\n"
 "                    }\n"
 "                },\n"
-"                \"socket-address\": \"::1\",\n"
+"                \"socket-address\": \"127.0.0.1\",\n"
 "                \"socket-port\": 8000,\n"
 "                \"socket-type\": \"http\",\n"
 "                \"user-context\": {\n"
@@ -10979,11 +9678,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -10993,7 +9691,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -11007,22 +9705,21 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [\n"
 "            {\n"
 "                \"always-send\": false,\n"
-"                \"code\": 56,\n"
+"                \"code\": 38,\n"
 "                \"csv-format\": false,\n"
 "                \"data\": \"ABCDEF0105\",\n"
-"                \"name\": \"dhcp-message\",\n"
+"                \"name\": \"subscriber-id\",\n"
 "                \"never-send\": false,\n"
-"                \"space\": \"dhcp4\",\n"
+"                \"space\": \"dhcp6\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"Set option value\"\n"
 "                }\n"
@@ -11036,13 +9733,15 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"name\": \"foo\",\n"
 "                \"record-types\": \"\",\n"
 "                \"space\": \"isc\",\n"
-"                \"type\": \"ipv4-address\",\n"
+"                \"type\": \"ipv6-address\",\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"An option definition\"\n"
 "                }\n"
 "            }\n"
 "        ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -11051,35 +9750,56 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LL\",\n"
+"            \"user-context\": {\n"
+"                \"comment\": \"DHCPv6 specific\"\n"
+"            }\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [\n"
 "            {\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"max-valid-lifetime\": 7200,\n"
 "                \"min-valid-lifetime\": 7200,\n"
 "                \"name\": \"foo\",\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"rapid-commit\": false,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet4\": [\n"
+"                \"subnet6\": [\n"
 "                    {\n"
-"                        \"4o6-interface\": \"\",\n"
-"                        \"4o6-interface-id\": \"\",\n"
-"                        \"4o6-subnet\": \"\",\n"
 "                        \"allocator\": \"iterative\",\n"
-"                        \"calculate-tee-times\": false,\n"
+"                        \"calculate-tee-times\": true,\n"
 "                        \"id\": 100,\n"
 "                        \"max-valid-lifetime\": 7200,\n"
 "                        \"min-valid-lifetime\": 7200,\n"
 "                        \"option-data\": [ ],\n"
+"                        \"pd-allocator\": \"iterative\",\n"
+"                        \"pd-pools\": [\n"
+"                            {\n"
+"                                \"delegated-len\": 64,\n"
+"                                \"option-data\": [ ],\n"
+"                                \"prefix\": \"2001:db2::\",\n"
+"                                \"prefix-len\": 48,\n"
+"                                \"user-context\": {\n"
+"                                    \"comment\": \"A prefix pool\"\n"
+"                                }\n"
+"                            }\n"
+"                        ],\n"
 "                        \"pools\": [\n"
 "                            {\n"
 "                                \"option-data\": [ ],\n"
-"                                \"pool\": \"192.0.1.1-192.0.1.10\",\n"
+"                                \"pool\": \"2001:db1::/64\",\n"
 "                                \"user-context\": {\n"
 "                                    \"comment\": \"A pool\"\n"
 "                                }\n"
@@ -11090,35 +9810,34 @@ const char* UNPARSED_CONFIGS[] = {
 "                        },\n"
 "                        \"reservations\": [\n"
 "                            {\n"
-"                                \"boot-file-name\": \"\",\n"
 "                                \"client-classes\": [ ],\n"
 "                                \"hostname\": \"foo.example.com\",\n"
 "                                \"hw-address\": \"aa:bb:cc:dd:ee:ff\",\n"
-"                                \"next-server\": \"0.0.0.0\",\n"
+"                                \"ip-addresses\": [ ],\n"
 "                                \"option-data\": [\n"
 "                                    {\n"
 "                                        \"always-send\": false,\n"
-"                                        \"code\": 15,\n"
+"                                        \"code\": 24,\n"
 "                                        \"csv-format\": true,\n"
 "                                        \"data\": \"example.com\",\n"
-"                                        \"name\": \"domain-name\",\n"
+"                                        \"name\": \"domain-search\",\n"
 "                                        \"never-send\": false,\n"
-"                                        \"space\": \"dhcp4\",\n"
+"                                        \"space\": \"dhcp6\",\n"
 "                                        \"user-context\": {\n"
 "                                            \"comment\": \"An option in a reservation\"\n"
 "                                        }\n"
 "                                    }\n"
 "                                ],\n"
-"                                \"server-hostname\": \"\",\n"
+"                                \"prefixes\": [ ],\n"
 "                                \"user-context\": {\n"
 "                                    \"comment\": \"A host reservation\"\n"
 "                                }\n"
 "                            }\n"
 "                        ],\n"
 "                        \"store-extended-info\": false,\n"
-"                        \"subnet\": \"192.0.1.0/24\",\n"
+"                        \"subnet\": \"2001:db1::/48\",\n"
 "                        \"t1-percent\": 0.5,\n"
-"                        \"t2-percent\": 0.875,\n"
+"                        \"t2-percent\": 0.8,\n"
 "                        \"user-context\": {\n"
 "                            \"comment\": \"A subnet\"\n"
 "                        },\n"
@@ -11126,31 +9845,28 @@ const char* UNPARSED_CONFIGS[] = {
 "                    }\n"
 "                ],\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"user-context\": {\n"
 "                    \"comment\": \"A shared network\"\n"
 "                },\n"
 "                \"valid-lifetime\": 7200\n"
 "            }\n"
 "        ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"user-context\": {\n"
-"            \"comment\": \"A DHCPv4 server\"\n"
+"            \"comment\": \"A DHCPv6 server\"\n"
 "        },\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 68
+    // CONFIGURATION 57
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -11173,11 +9889,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -11187,7 +9902,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -11198,340 +9913,190 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations\": [\n"
 "            {\n"
-"                \"boot-file-name\": \"\",\n"
 "                \"client-classes\": [ ],\n"
-"                \"hostname\": \"global2\",\n"
+"                \"hostname\": \"\",\n"
 "                \"hw-address\": \"01:02:03:04:05:06\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
+"                \"ip-addresses\": [ \"2001:db8:2::abcd\" ],\n"
 "                \"option-data\": [\n"
 "                    {\n"
 "                        \"always-send\": false,\n"
-"                        \"code\": 5,\n"
+"                        \"code\": 23,\n"
 "                        \"csv-format\": true,\n"
-"                        \"data\": \"192.0.3.95\",\n"
-"                        \"name\": \"name-servers\",\n"
+"                        \"data\": \"2001:db8:2::abbc\",\n"
+"                        \"name\": \"dns-servers\",\n"
 "                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
+"                        \"space\": \"dhcp6\"\n"
 "                    },\n"
 "                    {\n"
 "                        \"always-send\": false,\n"
-"                        \"code\": 23,\n"
+"                        \"code\": 7,\n"
 "                        \"csv-format\": true,\n"
-"                        \"data\": \"11\",\n"
-"                        \"name\": \"default-ip-ttl\",\n"
+"                        \"data\": \"25\",\n"
+"                        \"name\": \"preference\",\n"
 "                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
+"                        \"space\": \"dhcp6\"\n"
 "                    }\n"
 "                ],\n"
-"                \"server-hostname\": \"\"\n"
+"                \"prefixes\": [ ]\n"
 "            },\n"
 "            {\n"
-"                \"boot-file-name\": \"\",\n"
 "                \"client-classes\": [ ],\n"
 "                \"duid\": \"01:02:03:04:05:06:07:08:09:0a\",\n"
-"                \"hostname\": \"global1\",\n"
-"                \"ip-address\": \"192.0.200.1\",\n"
-"                \"next-server\": \"0.0.0.0\",\n"
+"                \"hostname\": \"\",\n"
+"                \"ip-addresses\": [ \"2001:db8:2::1234\" ],\n"
 "                \"option-data\": [\n"
 "                    {\n"
 "                        \"always-send\": false,\n"
-"                        \"code\": 5,\n"
-"                        \"csv-format\": true,\n"
-"                        \"data\": \"192.0.3.15\",\n"
-"                        \"name\": \"name-servers\",\n"
-"                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
-"                    },\n"
-"                    {\n"
-"                        \"always-send\": false,\n"
 "                        \"code\": 23,\n"
 "                        \"csv-format\": true,\n"
-"                        \"data\": \"32\",\n"
-"                        \"name\": \"default-ip-ttl\",\n"
-"                        \"never-send\": false,\n"
-"                        \"space\": \"dhcp4\"\n"
-"                    }\n"
-"                ],\n"
-"                \"server-hostname\": \"\"\n"
-"            }\n"
-"        ],\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 123,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 542,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.101-192.0.4.150\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
-"        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 69
-"{\n"
-"        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
-"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
-"        \"ddns-generated-prefix\": \"myhost\",\n"
-"        \"ddns-override-client-update\": false,\n"
-"        \"ddns-override-no-update\": false,\n"
-"        \"ddns-qualifying-suffix\": \"\",\n"
-"        \"ddns-replace-client-name\": \"never\",\n"
-"        \"ddns-send-updates\": true,\n"
-"        \"ddns-update-on-renew\": false,\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 64,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
-"        \"hostname-char-replacement\": \"\",\n"
-"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"ip-reservations-unique\": true,\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"match-client-id\": true,\n"
-"        \"multi-threading\": {\n"
-"            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
-"        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"parked-packet-limit\": 256,\n"
-"        \"reservations-global\": false,\n"
-"        \"reservations-in-subnet\": true,\n"
-"        \"reservations-lookup-first\": false,\n"
-"        \"reservations-out-of-pool\": false,\n"
-"        \"sanity-checks\": {\n"
-"            \"extended-info-checks\": \"fix\",\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-hostname\": \"\",\n"
-"        \"server-tag\": \"\",\n"
-"        \"shared-networks\": [\n"
-"            {\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": true,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"name\": \"foo\",\n"
-"                \"option-data\": [ ],\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet4\": [\n"
-"                    {\n"
-"                        \"4o6-interface\": \"\",\n"
-"                        \"4o6-interface-id\": \"\",\n"
-"                        \"4o6-subnet\": \"\",\n"
-"                        \"allocator\": \"iterative\",\n"
-"                        \"calculate-tee-times\": false,\n"
-"                        \"id\": 100,\n"
-"                        \"max-valid-lifetime\": 4000,\n"
-"                        \"min-valid-lifetime\": 4000,\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pools\": [\n"
-"                            {\n"
-"                                \"option-data\": [ ],\n"
-"                                \"pool\": \"192.0.1.1-192.0.1.10\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"relay\": {\n"
-"                            \"ip-addresses\": [ ]\n"
-"                        },\n"
-"                        \"reservations\": [ ],\n"
-"                        \"store-extended-info\": false,\n"
-"                        \"subnet\": \"192.0.1.0/24\",\n"
-"                        \"t1-percent\": 0.45,\n"
-"                        \"t2-percent\": 0.65,\n"
-"                        \"valid-lifetime\": 4000\n"
-"                    },\n"
-"                    {\n"
-"                        \"4o6-interface\": \"\",\n"
-"                        \"4o6-interface-id\": \"\",\n"
-"                        \"4o6-subnet\": \"\",\n"
-"                        \"allocator\": \"iterative\",\n"
-"                        \"calculate-tee-times\": true,\n"
-"                        \"id\": 200,\n"
-"                        \"max-valid-lifetime\": 4000,\n"
-"                        \"min-valid-lifetime\": 4000,\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pools\": [\n"
-"                            {\n"
-"                                \"option-data\": [ ],\n"
-"                                \"pool\": \"192.0.2.1-192.0.2.10\"\n"
-"                            }\n"
-"                        ],\n"
-"                        \"relay\": {\n"
-"                            \"ip-addresses\": [ ]\n"
-"                        },\n"
-"                        \"reservations\": [ ],\n"
-"                        \"store-extended-info\": false,\n"
-"                        \"subnet\": \"192.0.2.0/24\",\n"
-"                        \"t1-percent\": 0.4,\n"
-"                        \"t2-percent\": 0.75,\n"
-"                        \"valid-lifetime\": 4000\n"
+"                        \"data\": \"2001:db8:2::1111\",\n"
+"                        \"name\": \"dns-servers\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp6\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"always-send\": false,\n"
+"                        \"code\": 7,\n"
+"                        \"csv-format\": true,\n"
+"                        \"data\": \"11\",\n"
+"                        \"name\": \"preference\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp6\"\n"
 "                    }\n"
 "                ],\n"
-"                \"t1-percent\": 0.4,\n"
-"                \"t2-percent\": 0.75,\n"
-"                \"valid-lifetime\": 4000\n"
+"                \"prefixes\": [ ]\n"
 "            }\n"
 "        ],\n"
-"        \"stash-agent-options\": false,\n"
+"        \"reservations-global\": false,\n"
+"        \"reservations-in-subnet\": true,\n"
+"        \"reservations-lookup-first\": false,\n"
+"        \"reservations-out-of-pool\": false,\n"
+"        \"sanity-checks\": {\n"
+"            \"extended-info-checks\": \"fix\",\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 300,\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 123,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
 "                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.0/28\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 234,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            },\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 542,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [ ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
 "                },\n"
+"                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:3::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 70
+    // CONFIGURATION 58
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -11554,11 +10119,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -11568,7 +10132,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -11579,17 +10143,19 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -11599,81 +10165,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 0,\n"
-"        \"statistic-default-sample-count\": 20,\n"
+"        \"statistic-default-sample-age\": 5,\n"
+"        \"statistic-default-sample-count\": 10,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": true,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.1-192.0.3.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 71
+    // CONFIGURATION 59
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -11696,11 +10209,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -11710,7 +10222,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -11721,18 +10233,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -11741,81 +10252,28 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
-"        \"store-extended-info\": true,\n"
-"        \"subnet4\": [\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            },\n"
-"            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
-"                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
-"                \"id\": 2,\n"
-"                \"max-valid-lifetime\": 4000,\n"
-"                \"min-valid-lifetime\": 4000,\n"
-"                \"option-data\": [ ],\n"
-"                \"pools\": [\n"
-"                    {\n"
-"                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.1-192.0.3.100\"\n"
-"                    }\n"
-"                ],\n"
-"                \"rebind-timer\": 2000,\n"
-"                \"relay\": {\n"
-"                    \"ip-addresses\": [ ]\n"
-"                },\n"
-"                \"renew-timer\": 1000,\n"
-"                \"reservations\": [ ],\n"
-"                \"store-extended-info\": true,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
-"                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
-"                \"valid-lifetime\": 4000\n"
-"            }\n"
-"        ],\n"
+"        \"store-extended-info\": false,\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 72
+    // CONFIGURATION 60
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -11838,11 +10296,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -11852,7 +10309,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -11863,18 +10320,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 64,\n"
-"            \"thread-pool-size\": 0\n"
+"            \"packet-queue-size\": 1024,\n"
+"            \"thread-pool-size\": 48\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -11883,24 +10339,44 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
-"        \"statistic-default-sample-age\": 5,\n"
-"        \"statistic-default-sample-count\": 10,\n"
+"        \"statistic-default-sample-age\": 0,\n"
+"        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [ ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
-"        \"valid-lifetime\": 4000\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 73
+    // CONFIGURATION 61
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"max-preferred-lifetime\": 6000,\n"
+"                \"max-valid-lifetime\": 3000,\n"
+"                \"min-preferred-lifetime\": 4000,\n"
+"                \"min-valid-lifetime\": 1000,\n"
+"                \"name\": \"one\",\n"
+"                \"option-data\": [ ],\n"
+"                \"preferred-lifetime\": 5000,\n"
+"                \"valid-lifetime\": 2000\n"
+"            },\n"
+"            {\n"
+"                \"name\": \"two\",\n"
+"                \"option-data\": [ ]\n"
+"            }\n"
+"        ],\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -11923,11 +10399,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -11937,7 +10412,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -11948,16 +10423,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -11966,24 +10442,73 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-valid-lifetime\": 7200,\n"
+"                \"min-valid-lifetime\": 7200,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
+"                    }\n"
+"                ],\n"
+"                \"rapid-commit\": false,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 7200\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 74
+    // CONFIGURATION 62
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"max-preferred-lifetime\": 6000,\n"
+"                \"max-valid-lifetime\": 3000,\n"
+"                \"min-preferred-lifetime\": 4000,\n"
+"                \"min-valid-lifetime\": 1000,\n"
+"                \"name\": \"one\",\n"
+"                \"option-data\": [ ],\n"
+"                \"preferred-lifetime\": 5000,\n"
+"                \"template-test\": \"''\",\n"
+"                \"valid-lifetime\": 2000\n"
+"            },\n"
+"            {\n"
+"                \"name\": \"two\",\n"
+"                \"option-data\": [ ],\n"
+"                \"template-test\": \"''\"\n"
+"            }\n"
+"        ],\n"
 "        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -12006,11 +10531,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -12020,7 +10544,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -12031,16 +10555,17 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
-"            \"packet-queue-size\": 1024,\n"
-"            \"thread-pool-size\": 48\n"
+"            \"packet-queue-size\": 64,\n"
+"            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
 "        \"reservations-lookup-first\": false,\n"
@@ -12049,24 +10574,55 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"max-valid-lifetime\": 7200,\n"
+"                \"min-valid-lifetime\": 7200,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
+"                    }\n"
+"                ],\n"
+"                \"rapid-commit\": false,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 7200\n"
+"            }\n"
+"        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 75
+    // CONFIGURATION 63
 "{\n"
 "        \"allocator\": \"iterative\",\n"
-"        \"authoritative\": false,\n"
-"        \"boot-file-name\": \"\",\n"
-"        \"calculate-tee-times\": false,\n"
+"        \"calculate-tee-times\": true,\n"
 "        \"ddns-conflict-resolution-mode\": \"no-check-with-dhcid\",\n"
 "        \"ddns-generated-prefix\": \"myhost\",\n"
 "        \"ddns-override-client-update\": false,\n"
@@ -12089,11 +10645,10 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"dhcp-queue-control\": {\n"
 "            \"capacity\": 64,\n"
 "            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring4\"\n"
+"            \"queue-type\": \"kea-ring6\"\n"
 "        },\n"
 "        \"dhcp4o6-port\": 0,\n"
 "        \"early-global-reservations-lookup\": false,\n"
-"        \"echo-client-id\": true,\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 25,\n"
 "            \"hold-reclaimed-time\": 3600,\n"
@@ -12103,7 +10658,7 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"unwarned-reclaim-cycles\": 5\n"
 "        },\n"
 "        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
 "        \"hostname-char-replacement\": \"\",\n"
 "        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
 "        \"interfaces-config\": {\n"
@@ -12114,17 +10669,18 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"lease-database\": {\n"
 "            \"type\": \"memfile\"\n"
 "        },\n"
-"        \"match-client-id\": true,\n"
+"        \"mac-sources\": [ \"any\" ],\n"
 "        \"multi-threading\": {\n"
 "            \"enable-multi-threading\": true,\n"
 "            \"packet-queue-size\": 64,\n"
 "            \"thread-pool-size\": 0\n"
 "        },\n"
-"        \"next-server\": \"0.0.0.0\",\n"
 "        \"option-data\": [ ],\n"
 "        \"option-def\": [ ],\n"
 "        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
 "        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
 "        \"renew-timer\": 1000,\n"
 "        \"reservations-global\": false,\n"
 "        \"reservations-in-subnet\": true,\n"
@@ -12134,31 +10690,37 @@ const char* UNPARSED_CONFIGS[] = {
 "            \"extended-info-checks\": \"fix\",\n"
 "            \"lease-checks\": \"warn\"\n"
 "        },\n"
-"        \"server-hostname\": \"\",\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
 "        \"server-tag\": \"\",\n"
 "        \"shared-networks\": [ ],\n"
-"        \"stash-agent-options\": false,\n"
 "        \"statistic-default-sample-age\": 0,\n"
 "        \"statistic-default-sample-count\": 20,\n"
 "        \"store-extended-info\": false,\n"
-"        \"subnet4\": [\n"
+"        \"subnet6\": [\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
 "                \"id\": 1,\n"
 "                \"max-valid-lifetime\": 4000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"2001:db8:1::1-2001:db8:1::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -12166,28 +10728,28 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"ddns-conflict-resolution-mode\": \"check-exists-with-dhcid\",\n"
 "                \"id\": 2,\n"
 "                \"max-valid-lifetime\": 4000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.1-192.0.3.100\"\n"
+"                        \"pool\": \"2001:db8:2::1-2001:db8:2::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -12195,28 +10757,28 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"ddns-conflict-resolution-mode\": \"no-check-without-dhcid\",\n"
 "                \"id\": 3,\n"
 "                \"max-valid-lifetime\": 4000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.1-192.0.4.100\"\n"
+"                        \"pool\": \"2001:db8:3::1-2001:db8:3::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -12224,28 +10786,28 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\",\n"
+"                \"subnet\": \"2001:db8:3::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"ddns-conflict-resolution-mode\": \"no-check-with-dhcid\",\n"
 "                \"id\": 4,\n"
 "                \"max-valid-lifetime\": 4000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.5.1-192.0.5.100\"\n"
+"                        \"pool\": \"2001:db8:4::1-2001:db8:4::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -12253,27 +10815,27 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.5.0/24\",\n"
+"                \"subnet\": \"2001:db8:4::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
-"                \"4o6-interface\": \"\",\n"
-"                \"4o6-interface-id\": \"\",\n"
-"                \"4o6-subnet\": \"\",\n"
 "                \"allocator\": \"iterative\",\n"
-"                \"calculate-tee-times\": false,\n"
+"                \"calculate-tee-times\": true,\n"
 "                \"id\": 5,\n"
 "                \"max-valid-lifetime\": 4000,\n"
 "                \"min-valid-lifetime\": 4000,\n"
 "                \"option-data\": [ ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.6.1-192.0.6.100\"\n"
+"                        \"pool\": \"2001:db8:5::1-2001:db8:5::ffff\"\n"
 "                    }\n"
 "                ],\n"
+"                \"rapid-commit\": false,\n"
 "                \"rebind-timer\": 2000,\n"
 "                \"relay\": {\n"
 "                    \"ip-addresses\": [ ]\n"
@@ -12281,14 +10843,14 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.6.0/24\",\n"
+"                \"subnet\": \"2001:db8:5::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
-"                \"t2-percent\": 0.875,\n"
+"                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            }\n"
 "        ],\n"
 "        \"t1-percent\": 0.5,\n"
-"        \"t2-percent\": 0.875,\n"
+"        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n"
 };
@@ -12321,7 +10883,7 @@ static_assert(max_config_counter == sizeof(UNPARSED_CONFIGS) / sizeof(char*),
 void
 outputFormatted(const std::string& config) {
     // pretty print it
-    ConstElementPtr json = parseDHCP4(config);
+    ConstElementPtr json = parseDHCP6(config);
     std::string prettier = prettyPrint(json, 4, 4);
     // get it as a line array
     std::list<std::string> lines;
@@ -12341,7 +10903,7 @@ outputFormatted(const std::string& config) {
     }
 }
 
-}  // namespace
+} // namespace
 
 namespace isc {
 namespace dhcp {
@@ -12378,20 +10940,20 @@ extractConfig(const std::string& config) {
 
 namespace {
 
-/// Test fixture class (code from Dhcp4ParserTest)
-class Dhcp4GetConfigTest : public ::testing::TestWithParam<size_t> {
+/// Test fixture class (code from Dhcp6ParserTest)
+class Dhcp6GetConfigTest : public ::testing::TestWithParam<size_t> {
 public:
-    Dhcp4GetConfigTest()
-    : rcode_(-1) {
-        // Open port 0 means to not do anything at all. We don't want to
+    Dhcp6GetConfigTest() : rcode_(-1), srv_(0) {
+        // srv_(0) means to not open any sockets. We don't want to
         // deal with sockets here, just check if configuration handling
         // is sane.
-        srv_.reset(new ControlledDhcpv4Srv(0));
-        // Create fresh context.
+
+        // Reset configuration for each test.
         resetConfiguration();
     }
 
-    ~Dhcp4GetConfigTest() {
+    ~Dhcp6GetConfigTest() {
+        // Reset configuration database after each test.
         resetConfiguration();
     };
 
@@ -12424,19 +10986,19 @@ public:
             return (false);
         }
 
-        // try DHCP4 parser
+        // try DHCP6 parser
         try {
-            json = parseDHCP4(config, true);
+            json = parseDHCP6(config, true);
         } catch (...) {
             ADD_FAILURE() << "parsing failed for " << operation
                           << " on\n" << prettyPrint(json) << "\n";
             return (false);
         }
 
-        // try DHCP4 configure
+        // try DHCP6 configure
         ConstElementPtr status;
         try {
-            status = configureDhcp4Server(*srv_, json);
+            status = configureDhcp6Server(srv_, json);
         } catch (const std::exception& ex) {
             ADD_FAILURE() << "configure for " << operation
                           << " failed with " << ex.what()
@@ -12478,23 +11040,26 @@ public:
     void resetConfiguration() {
         string config = "{"
             "\"interfaces-config\": { \"interfaces\": [ \"*\" ] },"
+            "\"preferred-lifetime\": 3000,"
+            "\"rebind-timer\": 2000, "
+            "\"renew-timer\": 1000, "
             "\"valid-lifetime\": 4000, "
-            "\"subnet4\": [ ], "
+            "\"subnet6\": [ ], "
             "\"dhcp-ddns\": { \"enable-updates\" : false }, "
             "\"option-def\": [ ], "
             "\"option-data\": [ ] }";
         EXPECT_TRUE(executeConfiguration(config, "reset configuration"));
         CfgMgr::instance().clear();
-        CfgMgr::instance().setFamily(AF_INET);
+        CfgMgr::instance().setFamily(AF_INET6);
     }
 
-    boost::scoped_ptr<ControlledDhcpv4Srv> srv_; ///< DHCP4 server under test
-    int rcode_;                         ///< Return code from element parsing
-    ConstElementPtr comment_;           ///< Reason for parse fail
+    int rcode_; ///< Return code (see @ref isc::config::parseAnswer)
+    ControlledDhcpv6Srv srv_; ///< Instance of the ControlledDhcp6Srv used during tests
+    ConstElementPtr comment_; ///< Comment (see @ref isc::config::parseAnswer)
 };
 
 /// Test a configuration
-TEST_P(Dhcp4GetConfigTest, run) {
+TEST_P(Dhcp6GetConfigTest, run) {
     // configurations have not been extracted yet
     if (max_config_counter == 0) {
         return;
@@ -12519,9 +11084,9 @@ TEST_P(Dhcp4GetConfigTest, run) {
     // unparse it
     ConstSrvConfigPtr extracted = CfgMgr::instance().getStagingCfg();
     ConstElementPtr unparsed;
-    ASSERT_NO_THROW(unparsed = extracted->toElement());
+    ASSERT_NO_THROW_LOG(unparsed = extracted->toElement());
     ConstElementPtr dhcp;
-    ASSERT_NO_THROW(dhcp = unparsed->get("Dhcp4"));
+    ASSERT_NO_THROW_LOG(dhcp = unparsed->get("Dhcp6"));
     ASSERT_TRUE(dhcp);
 
     // dump if wanted else check
@@ -12535,11 +11100,11 @@ TEST_P(Dhcp4GetConfigTest, run) {
         ASSERT_NO_THROW_LOG(outputFormatted(dhcp->str()));
     } else {
         expected = UNPARSED_CONFIGS[config_counter];
-        // get the expected config using the dhcpv4 syntax parser
+        // get the expected config using the dhcpv6 syntax parser
         ElementPtr jsond;
-        ASSERT_NO_THROW_LOG(jsond = parseDHCP4(expected, true));
-        ElementPtr jsonj;
+        ASSERT_NO_THROW_LOG(jsond = parseDHCP6(expected, true));
         // get the expected config using the generic JSON syntax parser
+        ElementPtr jsonj;
         ASSERT_NO_THROW_LOG(jsonj = parseJSON(expected));
         // the generic JSON parser does not handle comments
         EXPECT_TRUE(isEquivalent(jsond, moveComments(jsonj)));
@@ -12577,12 +11142,12 @@ public:
 
 /// Define the parameterized test loop.
 #ifdef INSTANTIATE_TEST_SUITE_P
-INSTANTIATE_TEST_SUITE_P(Dhcp4GetConfigTest, Dhcp4GetConfigTest,
+INSTANTIATE_TEST_SUITE_P(Dhcp6GetConfigTest, Dhcp6GetConfigTest,
                          ::testing::Range(static_cast<size_t>(0),
                                           max_config_counter),
                          IntToString());
 #else
-INSTANTIATE_TEST_CASE_P(Dhcp4GetConfigTest, Dhcp4GetConfigTest,
+INSTANTIATE_TEST_CASE_P(Dhcp6GetConfigTest, Dhcp6GetConfigTest,
                         ::testing::Range(static_cast<size_t>(0),
                                          max_config_counter),
                         IntToString());
diff --git a/src/bin/dhcp4/tests/http_control_socket_unittest.cc b/src/bin/dhcp4/tests/http_control_socket_unittest.cc
new file mode 100644 (file)
index 0000000..baa4ad8
--- /dev/null
@@ -0,0 +1,2228 @@
+// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <asiolink/interval_timer.h>
+#include <asiolink/io_service.h>
+#include <cc/command_interpreter.h>
+#include <config/command_mgr.h>
+#include <config/http_command_mgr.h>
+#include <config/timeouts.h>
+#include <dhcp/dhcp4.h>
+#include <dhcp/libdhcp++.h>
+#include <dhcp/testutils/iface_mgr_test_config.h>
+#include <dhcpsrv/cfgmgr.h>
+#include <dhcpsrv/host_mgr.h>
+#include <dhcpsrv/lease.h>
+#include <dhcpsrv/lease_mgr_factory.h>
+#include <dhcp4/ctrl_dhcp4_srv.h>
+#include <dhcp4/tests/dhcp4_test_utils.h>
+#include <hooks/hooks_manager.h>
+#include <http/response.h>
+#include <http/response_parser.h>
+#include <http/tests/test_http_client.h>
+#include <log/logger_support.h>
+#include <stats/stats_mgr.h>
+#include <util/chrono_time_utils.h>
+
+#include "marker_file.h"
+#include "test_libraries.h"
+
+#include <boost/scoped_ptr.hpp>
+#include <gtest/gtest.h>
+
+#include <atomic>
+#include <fstream>
+#include <iomanip>
+#include <sstream>
+#include <thread>
+
+#include <arpa/inet.h>
+#include <unistd.h>
+
+using namespace std;
+using namespace isc;
+using namespace isc::asiolink;
+using namespace isc::config;
+using namespace isc::data;
+using namespace isc::dhcp;
+using namespace isc::dhcp::test;
+using namespace isc::hooks;
+using namespace isc::http;
+using namespace isc::stats;
+using namespace isc::util;
+namespace ph = std::placeholders;
+
+namespace {
+
+/// @brief IP address to which HTTP service is bound.
+const std::string SERVER_ADDRESS = "127.0.0.1";
+
+/// @brief Port number to which HTTP service is bound.
+const unsigned short SERVER_PORT = 18124;
+
+/// @brief Test timeout (ms).
+const long TEST_TIMEOUT = 10000;
+
+class NakedControlledDhcpv4Srv: public ControlledDhcpv4Srv {
+    // "Naked" DHCPv4 server, exposes internal fields
+public:
+    NakedControlledDhcpv4Srv() : ControlledDhcpv4Srv(0) {
+        CfgMgr::instance().setFamily(AF_INET);
+    }
+
+    /// Expose internal methods for the sake of testing
+    using Dhcpv4Srv::receivePacket;
+    using Dhcpv4Srv::network_state_;
+};
+
+/// @brief Fixture class intended for testing HTTP control channel.
+class HttpCtrlChannelDhcpv4Test : public ::testing::Test {
+public:
+
+    /// @brief List of interfaces (defaults to "*").
+    std::string interfaces_;
+
+    /// @brief Pointer to the tested server object
+    boost::shared_ptr<NakedControlledDhcpv4Srv> server_;
+
+    /// @brief Default constructor
+    ///
+    /// Sets socket path to its default value.
+    HttpCtrlChannelDhcpv4Test() : interfaces_("\"*\"") {
+        reset();
+        IfaceMgr::instance().setTestMode(false);
+        IfaceMgr::instance().setDetectCallback(std::bind(&IfaceMgr::checkDetectIfaces,
+                                               IfaceMgr::instancePtr().get(), ph::_1));
+    }
+
+    /// @brief Destructor
+    ~HttpCtrlChannelDhcpv4Test() {
+        LeaseMgrFactory::destroy();
+        StatsMgr::instance().removeAll();
+
+        if (HttpCommandMgr::instance().getHttpListener()) {
+            HttpCommandMgr::instance().close();
+        }
+        CommandMgr::instance().deregisterAll();
+        HttpCommandMgr::instance().setConnectionTimeout(TIMEOUT_DHCP_SERVER_RECEIVE_COMMAND);
+
+        server_.reset();
+        reset();
+        IfaceMgr::instance().setTestMode(false);
+        IfaceMgr::instance().setDetectCallback(std::bind(&IfaceMgr::checkDetectIfaces,
+                                               IfaceMgr::instancePtr().get(), ph::_1));
+        IfaceMgr::instance().clearIfaces();
+        IfaceMgr::instance().closeSockets();
+        IfaceMgr::instance().detectIfaces();
+    }
+
+    /// @brief Returns pointer to the server's IO service.
+    ///
+    /// @return Pointer to the server's IO service or null pointer if the server
+    /// hasn't been created.
+    IOServicePtr getIOService() {
+        return (server_ ? server_->getIOService() : IOServicePtr());
+    }
+
+    /// @brief Callback function invoke upon test timeout.
+    ///
+    /// It stops the IO service and reports test timeout.
+    ///
+    /// @param fail_on_timeout Specifies if test failure should be reported.
+    void timeoutHandler(const bool fail_on_timeout) {
+        if (fail_on_timeout) {
+            ADD_FAILURE() << "Timeout occurred while running the test!";
+        }
+        getIOService()->stop();
+    }
+
+    /// @brief Runs IO service.
+    void runIOService() {
+        IOServicePtr io_service = getIOService();
+        ASSERT_TRUE(io_service);
+        IntervalTimer test_timer(io_service);
+        test_timer.setup(std::bind(&HttpCtrlChannelDhcpv4Test::timeoutHandler,
+                                   this, true),
+                         TEST_TIMEOUT, IntervalTimer::ONE_SHOT);
+        // Run until the client stops the service or an error occurs.
+        io_service->run();
+        test_timer.cancel();
+        if (io_service->stopped()) {
+            io_service->restart();
+        }
+        io_service->poll();
+    }
+
+    /// @brief Create a server with a HTTP command channel.
+    void createHttpChannelServer() {
+        // Just a simple config. The important part here is the socket
+        // location information.
+        std::string header =
+            "{"
+            "    \"interfaces-config\": {"
+            "        \"interfaces\": [";
+
+        std::string body = "]"
+            "    },"
+            "    \"expired-leases-processing\": {"
+            "         \"reclaim-timer-wait-time\": 60,"
+            "         \"hold-reclaimed-time\": 500,"
+            "         \"flush-reclaimed-timer-wait-time\": 60"
+            "    },"
+            "    \"rebind-timer\": 2000, "
+            "    \"renew-timer\": 1000, "
+            "    \"subnet4\": [ ],"
+            "    \"valid-lifetime\": 4000,"
+            "    \"control-socket\": {"
+            "        \"socket-type\": \"http\","
+            "        \"socket-address\": \"127.0.0.1\","
+            "        \"socket-port\": 18124"
+            "    },"
+            "    \"lease-database\": {"
+            "       \"type\": \"memfile\", \"persist\": false },"
+            "    \"loggers\": [ {"
+            "       \"name\": \"kea-dhcp4\","
+            "       \"severity\": \"INFO\","
+            "       \"debuglevel\": 0"
+            "       } ]"
+            "}";
+
+        std::string config_txt = header + interfaces_ + body;
+        ASSERT_NO_THROW(server_.reset(new NakedControlledDhcpv4Srv()));
+
+        ConstElementPtr config;
+        ASSERT_NO_THROW(config = parseDHCP4(config_txt));
+
+        // Parse the logger configuration explicitly into the staging config.
+        // Note this does not alter the current loggers, they remain in
+        // effect until we apply the logging config below.  If no logging
+        // is supplied logging will revert to default logging.
+        server_->configureLogger(config, CfgMgr::instance().getStagingCfg());
+
+        // Let's apply the new logging. We do it early, so we'll be able to print
+        // out what exactly is wrong with the new config in case of problems.
+        CfgMgr::instance().getStagingCfg()->applyLoggingCfg();
+
+        ConstElementPtr answer = server_->processConfig(config);
+
+        // Commit the configuration so any subsequent reconfigurations
+        // will only close the command channel if its configuration has
+        // changed.
+        CfgMgr::instance().commit();
+
+        ASSERT_TRUE(answer);
+
+        int status = 0;
+        ConstElementPtr txt = isc::config::parseAnswer(status, answer);
+        // This should succeed. If not, print the error message.
+        ASSERT_EQ(0, status) << txt->str();
+
+        // Now check that the socket was indeed open.
+        ASSERT_TRUE(HttpCommandMgr::instance().getHttpListener());
+    }
+
+    /// @brief Reset hooks data
+    ///
+    /// Resets the data for the hooks-related portion of the test by ensuring
+    /// that no libraries are loaded and that any marker files are deleted.
+    void reset() {
+        // Unload any previously-loaded libraries.
+        EXPECT_TRUE(HooksManager::unloadLibraries());
+
+        // Get rid of any marker files.
+        static_cast<void>(remove(LOAD_MARKER_FILE));
+        static_cast<void>(remove(UNLOAD_MARKER_FILE));
+
+        IfaceMgr::instance().deleteAllExternalSockets();
+        CfgMgr::instance().clear();
+    }
+
+    /// @brief Constructs a complete HTTP POST given a request body.
+    ///
+    /// @param request_body string containing the desired request body.
+    ///
+    /// @return string containing the constructed POST.
+    std::string buildPostStr(const std::string& request_body) {
+        // Create the command string.
+        std::stringstream ss;
+        ss << "POST /foo/bar HTTP/1.1\r\n"
+              "Content-Type: application/json\r\n"
+              "Content-Length: "
+              << request_body.size() << "\r\n\r\n"
+              << request_body;
+        return (ss.str());
+    }
+
+    /// @brief Create an HttpResponse from a response string.
+    ///
+    /// @param response_str a string containing the whole HTTP
+    /// response received.
+    ///
+    /// @return An HttpResponse constructed from by parsing the
+    /// response string.
+    HttpResponsePtr parseResponse(const std::string response_str) {
+        HttpResponsePtr hr(new HttpResponse());
+        HttpResponseParser parser(*hr);
+        parser.initModel();
+        parser.postBuffer(&response_str[0], response_str.size());
+        parser.poll();
+        if (!parser.httpParseOk()) {
+            isc_throw(Unexpected, "response_str: '" << response_str
+                      << "' failed to parse: " << parser.getErrorMessage());
+        }
+
+        return (hr);
+    }
+
+    /// @brief Conducts a command/response exchange via HttpCommandSocket
+    ///
+    /// This method connects to the given server over the given address/port.
+    /// If successful, it then sends the given command and retrieves the
+    /// server's response.  Note that it calls the server's receivePacket()
+    /// method where needed to cause the server to process IO events on
+    /// control channel the control channel sockets.
+    ///
+    /// @param command the command text to execute in JSON form.
+    /// @param response variable into which the received response should be
+    /// placed.
+    void sendHttpCommand(const std::string& command, std::string& response) {
+        response = "";
+        IOServicePtr io_service = getIOService();
+        ASSERT_TRUE(io_service);
+        boost::scoped_ptr<TestHttpClient> client;
+        client.reset(new TestHttpClient(io_service, SERVER_ADDRESS,
+                                        SERVER_PORT));
+        ASSERT_TRUE(client);
+
+        // Send the command. This will trigger server's handler which receives
+        // data over the unix domain socket. The server will start sending
+        // response to the client.
+        ASSERT_NO_THROW(client->startRequest(buildPostStr(command)));
+        runIOService();
+        ASSERT_TRUE(client->receiveDone());
+
+        // Read the response generated by the server.
+        HttpResponsePtr hr;
+        ASSERT_NO_THROW(hr = parseResponse(client->getResponse()));
+        response = hr->getBody();
+
+        // Now close client.
+        client->close();
+
+        ASSERT_NO_THROW(io_service->poll());
+    }
+
+    /// @brief Parse list answer.
+    ///
+    /// Clone of parseAnswer but taking the answer as a list and
+    /// decapulating it.
+    ///
+    /// @param rcode Return code.
+    /// @param msg_list The message to parse.
+    /// @return The optional argument in the message after decapsulation.
+    ConstElementPtr parseListAnswer(int &rcode,
+                                    const ConstElementPtr& msg_list) {
+        if (!msg_list) {
+            isc_throw(CtrlChannelError, "invalid answer: no answer specified");
+        }
+        if (msg_list->getType() != Element::list) {
+            isc_throw(CtrlChannelError, "invalid answer: expected toplevel "
+                      << "entry to be a list, got "
+                      << Element::typeToName(msg_list->getType())
+                      << " instead");
+        }
+        if (msg_list->size() != 1) {
+            isc_throw(CtrlChannelError, "invalid answer: expected toplevel "
+                      << "entry to be an one element list, got "
+                      << msg_list->size() << " long list instead");
+        }
+        ConstElementPtr msg = msg_list->get(0);
+        if (!msg) {
+            isc_throw(CtrlChannelError, "invalid answer: null element");
+        }
+        if (msg->getType() != Element::map) {
+            isc_throw(CtrlChannelError, "invalid answer: expected list of "
+                      << "one map, got list of one "
+                      << Element::typeToName(msg->getType())
+                      << " instead");
+        }
+        if (!msg->contains(CONTROL_RESULT)) {
+            isc_throw(CtrlChannelError, "invalid answer: does not contain "
+                      << "mandatory '" << CONTROL_RESULT << "'");
+        }
+
+        ConstElementPtr result = msg->get(CONTROL_RESULT);
+        if (result->getType() != Element::integer) {
+            isc_throw(CtrlChannelError, "invalid answer: expected '"
+                      << CONTROL_RESULT << "' to be an integer, got "
+                      << Element::typeToName(result->getType())
+                      << " instead");
+        }
+
+        rcode = result->intValue();
+
+        // If there are arguments, return them.
+        ConstElementPtr args = msg->get(CONTROL_ARGUMENTS);
+        if (args) {
+            return (args);
+        }
+
+        // There are no arguments, let's try to return just the text status.
+        return (msg->get(CONTROL_TEXT));
+    }
+
+    /// @brief Checks response for list-commands
+    ///
+    /// This method checks if the list-commands response is generally sane
+    /// and whether specified command is mentioned in the response.
+    ///
+    /// @param rsp response sent back by the server
+    /// @param command command expected to be on the list.
+    void checkListCommands(const ConstElementPtr& rsp, const std::string& command) {
+        ConstElementPtr params;
+        int status_code = -1;
+        EXPECT_NO_THROW(params = parseListAnswer(status_code, rsp));
+        EXPECT_EQ(CONTROL_RESULT_SUCCESS, status_code);
+        ASSERT_TRUE(params);
+        ASSERT_EQ(Element::list, params->getType());
+
+        int cnt = 0;
+        for (size_t i = 0; i < params->size(); ++i) {
+            string tmp = params->get(i)->stringValue();
+            if (tmp == command) {
+                // Command found, but that's not enough. Need to continue working
+                // through the list to see if there are no duplicates.
+                cnt++;
+            }
+        }
+
+        // Exactly one command on the list is expected.
+        EXPECT_EQ(1, cnt) << "Command " << command << " not found";
+    }
+
+    /// @brief Check if the answer for write-config command is correct
+    ///
+    /// @param response_txt response in text form (as read from the control socket)
+    /// @param exp_status expected status (0 success, 1 failure)
+    /// @param exp_txt for success cases this defines the expected filename,
+    ///                for failure cases this defines the expected error message
+    void checkConfigWrite(const std::string& response_txt, int exp_status,
+                          const std::string& exp_txt = "") {
+
+        ConstElementPtr rsp;
+        EXPECT_NO_THROW(rsp = Element::fromJSON(response_txt));
+        ASSERT_TRUE(rsp);
+
+        int status;
+        ConstElementPtr params = parseListAnswer(status, rsp);
+        EXPECT_EQ(exp_status, status);
+
+        if (exp_status == CONTROL_RESULT_SUCCESS) {
+            // Let's check couple things...
+
+            // The parameters must include filename
+            ASSERT_TRUE(params);
+            ASSERT_TRUE(params->get("filename"));
+            ASSERT_EQ(Element::string, params->get("filename")->getType());
+            EXPECT_EQ(exp_txt, params->get("filename")->stringValue());
+
+            // The parameters must include size. And the size
+            // must indicate some content.
+            ASSERT_TRUE(params->get("size"));
+            ASSERT_EQ(Element::integer, params->get("size")->getType());
+            int64_t size = params->get("size")->intValue();
+            EXPECT_LE(1, size);
+
+            // Now check if the file is really there and suitable for
+            // opening.
+            ifstream f(exp_txt, ios::binary | ios::ate);
+            ASSERT_TRUE(f.good());
+
+            // Now check that it is the correct size as reported.
+            EXPECT_EQ(size, static_cast<int64_t>(f.tellg()));
+
+            // Finally, check that it's really a JSON.
+            ElementPtr from_file = Element::fromJSONFile(exp_txt);
+            ASSERT_TRUE(from_file);
+        } else if (exp_status == CONTROL_RESULT_ERROR) {
+
+            // Let's check if the reason for failure was given.
+            ConstElementPtr text = rsp->get("text");
+            ASSERT_TRUE(text);
+            ASSERT_EQ(Element::string, text->getType());
+            EXPECT_EQ(exp_txt, text->stringValue());
+        } else {
+            ADD_FAILURE() << "Invalid expected status: " << exp_status;
+        }
+    }
+
+    /// @brief Handler for long command.
+    ///
+    /// It checks whether the received command is equal to the one specified
+    /// as an argument.
+    ///
+    /// @param expected_command String representing an expected command.
+    /// @param command_name Command name received by the handler.
+    /// @param arguments Command arguments received by the handler.
+    ///
+    /// @returns Success answer.
+    static ConstElementPtr
+    longCommandHandler(const std::string& expected_command,
+                       const std::string& command_name,
+                       const ConstElementPtr& arguments) {
+        // The handler is called with a command name and the structure holding
+        // command arguments. We have to rebuild the command from those
+        // two arguments so as it can be compared against expected_command.
+        ElementPtr entire_command = Element::createMap();
+        entire_command->set("command", Element::create(command_name));
+        entire_command->set("arguments", (arguments));
+
+        // The rebuilt command will have a different order of parameters so
+        // let's parse expected_command back to JSON to guarantee that
+        // both structures are built using the same order.
+        EXPECT_EQ(Element::fromJSON(expected_command)->str(),
+                  entire_command->str());
+        return (createAnswer(CONTROL_RESULT_SUCCESS, "long command received ok"));
+    }
+
+    /// @brief Command handler which generates long response
+    ///
+    /// This handler generates a large response (over 4kB). It includes
+    /// a list of randomly generated strings to make sure that the test
+    /// can catch out of order delivery.
+    static ConstElementPtr longResponseHandler(const std::string&,
+                                               const ConstElementPtr&) {
+        ElementPtr arguments = Element::createList();
+        for (unsigned i = 0; i < 800; ++i) { // was 80000 (400kB).
+            std::ostringstream s;
+            s << std::setw(5) << i;
+            arguments->add(Element::create(s.str()));
+        }
+        return (createAnswer(CONTROL_RESULT_SUCCESS, arguments));
+    }
+};
+
+// Tests that the server properly responds to invalid commands sent
+// via ControlChannel
+TEST_F(HttpCtrlChannelDhcpv4Test, controlChannelNegative) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"bogus\" }", response);
+    EXPECT_EQ("[ { \"result\": 2,"
+              " \"text\": \"'bogus' command not supported.\" } ]",
+              response);
+
+    sendHttpCommand("utter nonsense", response);
+    EXPECT_EQ("{ \"result\": 400, \"text\": \"Bad Request\" }", response);
+}
+
+// Tests that the server properly responds to shutdown command sent
+// via ControlChannel
+TEST_F(HttpCtrlChannelDhcpv4Test, controlChannelShutdown) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"shutdown\" }", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"Shutting down.\" } ]",
+              response);
+}
+
+// Tests that the server properly responds to statistics commands.  Note this
+// is really only intended to verify that the appropriate Statistics handler
+// is called based on the command.  It is not intended to be an exhaustive
+// test of Dhcpv4 statistics.
+TEST_F(HttpCtrlChannelDhcpv4Test, controlChannelStats) {
+    createHttpChannelServer();
+    std::string response;
+
+    // Check statistic-get
+    sendHttpCommand("{ \"command\" : \"statistic-get\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\" }}", response);
+    EXPECT_EQ("[ { \"arguments\": {  }, \"result\": 0 } ]", response);
+
+    // Check statistic-get-all
+    sendHttpCommand("{ \"command\" : \"statistic-get-all\", "
+                    "  \"arguments\": {}}", response);
+
+    std::set<std::string> initial_stats = {
+        "pkt4-received",
+        "pkt4-discover-received",
+        "pkt4-offer-received",
+        "pkt4-request-received",
+        "pkt4-ack-received",
+        "pkt4-nak-received",
+        "pkt4-release-received",
+        "pkt4-decline-received",
+        "pkt4-inform-received",
+        "pkt4-unknown-received",
+        "pkt4-sent",
+        "pkt4-offer-sent",
+        "pkt4-ack-sent",
+        "pkt4-nak-sent",
+        "pkt4-parse-failed",
+        "pkt4-receive-drop",
+        "v4-allocation-fail",
+        "v4-allocation-fail-shared-network",
+        "v4-allocation-fail-subnet",
+        "v4-allocation-fail-no-pools",
+        "v4-allocation-fail-classes",
+        "v4-reservation-conflicts",
+        "v4-lease-reuses",
+    };
+
+    // preparing the schema which check if all statistics are set to zero
+    std::ostringstream s;
+    s << "[ { \"arguments\": { ";
+    bool first = true;
+    for (auto const& st : initial_stats) {
+        if (!first) {
+            s << ", ";
+        } else {
+            first = false;
+        }
+        s << "\"" << st << "\": [ [ 0, \"";
+        s << isc::util::clockToText(StatsMgr::instance().getObservation(st)->getInteger().second);
+        s << "\" ] ]";
+    }
+    s << " }, \"result\": 0 } ]";
+
+    auto stats_get_all = s.str();
+
+    EXPECT_EQ(stats_get_all, response);
+
+    // Check statistic-reset
+    sendHttpCommand("{ \"command\" : \"statistic-reset\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\" }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-reset-all
+    sendHttpCommand("{ \"command\" : \"statistic-reset-all\", "
+                    "  \"arguments\": {}}", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"All statistics reset to neutral values.\" } ]",
+              response);
+
+    // Check statistic-remove
+    sendHttpCommand("{ \"command\" : \"statistic-remove\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\" }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-remove-all (deprecated).
+
+    // Check statistic-sample-age-set
+    sendHttpCommand("{ \"command\" : \"statistic-sample-age-set\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\", \"duration\": 1245 }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-sample-age-set-all
+    sendHttpCommand("{ \"command\" : \"statistic-sample-age-set-all\", "
+                    "  \"arguments\": {"
+                    "  \"duration\": 1245 }}", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"All statistics duration limit are set.\" } ]",
+              response);
+
+    // Check statistic-sample-count-set
+    sendHttpCommand("{ \"command\" : \"statistic-sample-count-set\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\", \"max-samples\": 100 }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-sample-count-set-all
+    sendHttpCommand("{ \"command\" : \"statistic-sample-count-set-all\", "
+                    "  \"arguments\": {"
+                    "  \"max-samples\": 100 }}", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"All statistics count limit are set.\" } ]",
+              response);
+}
+
+// Check that the "config-set" command will replace current configuration
+TEST_F(HttpCtrlChannelDhcpv4Test, configSet) {
+    createHttpChannelServer();
+
+    // Define strings to permutate the config arguments
+    // (Note the line feeds makes errors easy to find)
+    string set_config_txt = "{ \"command\": \"config-set\" \n";
+    string args_txt = " \"arguments\": { \n";
+    string dhcp4_cfg_txt =
+        "    \"Dhcp4\": { \n"
+        "        \"interfaces-config\": { \n"
+        "            \"interfaces\": [\"*\"] \n"
+        "        },   \n"
+        "        \"valid-lifetime\": 4000, \n"
+        "        \"renew-timer\": 1000, \n"
+        "        \"rebind-timer\": 2000, \n"
+        "        \"lease-database\": { \n"
+        "           \"type\": \"memfile\", \n"
+        "           \"persist\":false, \n"
+        "           \"lfc-interval\": 0  \n"
+        "        }, \n"
+        "        \"expired-leases-processing\": { \n"
+        "            \"reclaim-timer-wait-time\": 0, \n"
+        "            \"hold-reclaimed-time\": 0, \n"
+        "            \"flush-reclaimed-timer-wait-time\": 0 \n"
+        "        },"
+        "        \"subnet4\": [ \n";
+    string subnet1 =
+        "               {\"subnet\": \"192.2.0.0/24\", \"id\": 1, \n"
+        "                \"pools\": [{ \"pool\": \"192.2.0.1-192.2.0.50\" }]}\n";
+    string subnet2 =
+        "               {\"subnet\": \"192.2.1.0/24\", \"id\": 2, \n"
+        "                \"pools\": [{ \"pool\": \"192.2.1.1-192.2.1.50\" }]}\n";
+    string bad_subnet =
+        "               {\"comment\": \"192.2.2.0/24\", \"id\": 10, \n"
+        "                \"pools\": [{ \"pool\": \"192.2.2.1-192.2.2.50\" }]}\n";
+    string subnet_footer =
+        "          ] \n";
+    string option_def =
+        "    ,\"option-def\": [\n"
+        "    {\n"
+        "        \"name\": \"foo\",\n"
+        "        \"code\": 163,\n"
+        "        \"type\": \"uint32\",\n"
+        "        \"array\": false,\n"
+        "        \"record-types\": \"\",\n"
+        "        \"space\": \"dhcp4\",\n"
+        "        \"encapsulate\": \"\"\n"
+        "    }\n"
+        "]\n";
+    string option_data =
+        "    ,\"option-data\": [\n"
+        "    {\n"
+        "        \"name\": \"foo\",\n"
+        "        \"code\": 163,\n"
+        "        \"space\": \"dhcp4\",\n"
+        "        \"csv-format\": true,\n"
+        "        \"data\": \"12345\"\n"
+        "    }\n"
+        "]\n";
+    string control_socket =
+        "    ,\"control-socket\": { \n"
+        "       \"socket-type\": \"http\", \n"
+        "       \"socket-address\": \"127.0.0.1\", \n"
+        "       \"socket-port\": 18124 \n"
+        "    } \n";
+    string logger_txt =
+        "       ,\"loggers\": [ { \n"
+        "            \"name\": \"kea\", \n"
+        "            \"severity\": \"FATAL\", \n"
+        "            \"output-options\": [{ \n"
+        "                \"output\": \"/dev/null\", \n"
+        "                \"maxsize\": 0"
+        "            }] \n"
+        "        }] \n";
+
+    std::ostringstream os;
+
+    // Create a valid config with all the parts should parse
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp4_cfg_txt
+        << subnet1
+        << subnet_footer
+        << option_def
+        << option_data
+        << control_socket
+        << logger_txt
+        << "}\n"                      // close dhcp4
+        << "}}";
+
+    // Send the config-set command
+    std::string response;
+    sendHttpCommand(os.str(), response);
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"F6137301FF10D81585E041FD5FD8E91347ACADDE64F92ED03432FB100874DE02\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was indeed applied.
+    const Subnet4Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    OptionDefinitionPtr def =
+        LibDHCP::getRuntimeOptionDef(DHCP4_OPTION_SPACE, 163);
+    ASSERT_TRUE(def);
+
+    // Create a config with malformed subnet that should fail to parse.
+    os.str("");
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp4_cfg_txt
+        << bad_subnet
+        << subnet_footer
+        << control_socket
+        << "}\n"                      // close dhcp4
+        << "}}";
+
+    // Send the config-set command
+    sendHttpCommand(os.str(), response);
+
+    // Should fail with a syntax error
+    EXPECT_EQ("[ { \"result\": 1, "
+              "\"text\": \"subnet configuration failed: mandatory 'subnet' "
+              "parameter is missing for a subnet being configured "
+              "(<string>:20:17)\" } ]",
+              response);
+
+    // Check that the config was not lost
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    def = LibDHCP::getRuntimeOptionDef(DHCP4_OPTION_SPACE, 163);
+    ASSERT_TRUE(def);
+
+    // Create a valid config with two subnets and no command channel.
+    // It should succeed, client should still receive the response
+    os.str("");
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp4_cfg_txt
+        << subnet1
+        << ",\n"
+        << subnet2
+        << subnet_footer
+        << "}\n"                      // close dhcp4
+        << "}}";
+
+    // Verify the HTTP control channel socket exists.
+    EXPECT_TRUE(HttpCommandMgr::instance().getHttpListener());
+
+    // Send the config-set command.
+    sendHttpCommand(os.str(), response);
+
+    // Verify the HTTP control channel socket no longer exists.
+    ASSERT_NO_THROW(HttpCommandMgr::instance().garbageCollectListeners());
+    EXPECT_FALSE(HttpCommandMgr::instance().getHttpListener());
+
+    // With no command channel, should still receive the response.
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"04D35DF3CE1A558C6CCA9EA48B0F355C392CA9071B08E90E80A34F33C5939507\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was not lost
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(2, subnets->size());
+
+    // Clean up after the test.
+    CfgMgr::instance().clear();
+}
+
+// Tests if the server returns its configuration using config-get.
+// Note there are separate tests that verify if toElement() called by the
+// config-get handler are actually converting the configuration correctly.
+TEST_F(HttpCtrlChannelDhcpv4Test, configGet) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"config-get\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // Ok, now roughly check if the response seems legit.
+    ASSERT_TRUE(cfg);
+    ASSERT_EQ(Element::map, cfg->getType());
+    EXPECT_TRUE(cfg->get("Dhcp4"));
+    EXPECT_TRUE(cfg->get("Dhcp4")->get("loggers"));
+}
+
+// Tests if the server returns the hash of its configuration using
+// config-hash-get.
+TEST_F(HttpCtrlChannelDhcpv4Test, configHashGet) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"config-hash-get\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr args = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+    // the parseListAnswer is trying to be smart with ignoring hash.
+    // But this time we really want to see the hash, so we'll retrieve
+    // the arguments manually.
+    args = rsp->get(0)->get(CONTROL_ARGUMENTS);
+
+    // Ok, now roughly check if the response seems legit.
+    ASSERT_TRUE(args);
+    ASSERT_EQ(Element::map, args->getType());
+    ConstElementPtr hash = args->get("hash");
+    ASSERT_TRUE(hash);
+    ASSERT_EQ(Element::string, hash->getType());
+    // SHA-256 -> 64 hex digits.
+    EXPECT_EQ(64, hash->stringValue().size());
+}
+
+// Verify that the "config-test" command will do what we expect.
+TEST_F(HttpCtrlChannelDhcpv4Test, configTest) {
+    createHttpChannelServer();
+
+    // Define strings to permutate the config arguments
+    // (Note the line feeds makes errors easy to find)
+    string set_config_txt = "{ \"command\": \"config-set\" \n";
+    string config_test_txt = "{ \"command\": \"config-test\" \n";
+    string args_txt = " \"arguments\": { \n";
+    string dhcp4_cfg_txt =
+        "    \"Dhcp4\": { \n"
+        "        \"interfaces-config\": { \n"
+        "            \"interfaces\": [\"*\"] \n"
+        "        },   \n"
+        "        \"valid-lifetime\": 4000, \n"
+        "        \"renew-timer\": 1000, \n"
+        "        \"rebind-timer\": 2000, \n"
+        "        \"lease-database\": { \n"
+        "           \"type\": \"memfile\", \n"
+        "           \"persist\":false, \n"
+        "           \"lfc-interval\": 0  \n"
+        "        }, \n"
+        "        \"expired-leases-processing\": { \n"
+        "            \"reclaim-timer-wait-time\": 0, \n"
+        "            \"hold-reclaimed-time\": 0, \n"
+        "            \"flush-reclaimed-timer-wait-time\": 0 \n"
+        "        },"
+        "        \"subnet4\": [ \n";
+    string subnet1 =
+        "               {\"subnet\": \"192.2.0.0/24\", \"id\": 1, \n"
+        "                \"pools\": [{ \"pool\": \"192.2.0.1-192.2.0.50\" }]}\n";
+    string subnet2 =
+        "               {\"subnet\": \"192.2.1.0/24\", \"id\": 2, \n"
+        "                \"pools\": [{ \"pool\": \"192.2.1.1-192.2.1.50\" }]}\n";
+    string bad_subnet =
+        "               {\"comment\": \"192.2.2.0/24\", \"id\": 10, \n"
+        "                \"pools\": [{ \"pool\": \"192.2.2.1-192.2.2.50\" }]}\n";
+    string subnet_footer =
+        "          ] \n";
+    string control_socket =
+        "    ,\"control-socket\": { \n"
+        "       \"socket-type\": \"http\", \n"
+        "       \"socket-address\": \"127.0.0.1\", \n"
+        "       \"socket-port\": 18124 \n"
+        "    } \n";
+    string logger_txt =
+        "       ,\"loggers\": [ { \n"
+        "            \"name\": \"kea\", \n"
+        "            \"severity\": \"FATAL\", \n"
+        "            \"output-options\": [{ \n"
+        "                \"output\": \"/dev/null\", \n"
+        "                \"maxsize\": 0"
+        "            }] \n"
+        "        }] \n";
+
+    std::ostringstream os;
+
+    // Create a valid config with all the parts should parse
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp4_cfg_txt
+        << subnet1
+        << subnet_footer
+        << control_socket
+        << logger_txt
+        << "}\n"                      // close dhcp4
+        << "}}";
+
+    // Send the config-set command
+    std::string response;
+    sendHttpCommand(os.str(), response);
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"16940B601E652CAAC99B643AB6DF18D3FE6216DD22F535EE0676FB28A5ED40C9\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was indeed applied.
+    const Subnet4Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    // Create a config with malformed subnet that should fail to parse.
+    os.str("");
+    os << config_test_txt << ","
+        << args_txt
+        << dhcp4_cfg_txt
+        << bad_subnet
+        << subnet_footer
+        << control_socket
+        << "}\n"                      // close dhcp4
+        << "}}";
+
+    // Send the config-test command
+    sendHttpCommand(os.str(), response);
+
+    // Should fail with a syntax error
+    EXPECT_EQ("[ { \"result\": 1, "
+              "\"text\": \"subnet configuration failed: mandatory 'subnet' "
+              "parameter is missing for a subnet being configured "
+              "(<string>:20:17)\" } ]",
+              response);
+
+    // Check that the config was not lost
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    // Create a valid config with two subnets and no command channel.
+    os.str("");
+    os << config_test_txt << ","
+        << args_txt
+        << dhcp4_cfg_txt
+        << subnet1
+        << ",\n"
+        << subnet2
+        << subnet_footer
+        << "}\n"                      // close dhcp4
+        << "}}";
+
+    // Verify the HTTP control channel socket exists.
+    EXPECT_TRUE(HttpCommandMgr::instance().getHttpListener());
+
+    // Send the config-test command.
+    sendHttpCommand(os.str(), response);
+
+    // Verify the HTTP control channel socket still exists.
+    ASSERT_NO_THROW(HttpCommandMgr::instance().garbageCollectListeners());
+    EXPECT_TRUE(HttpCommandMgr::instance().getHttpListener());
+
+    // Verify the configuration was successful.
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"Configuration seems sane. "
+              "Control-socket, hook-libraries, and D2 configuration were "
+              "sanity checked, but not applied.\" } ]",
+              response);
+
+    // Check that the config was not applied.
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    // Clean up after the test.
+    CfgMgr::instance().clear();
+}
+// This test verifies that the DHCP server handles version-get commands
+TEST_F(HttpCtrlChannelDhcpv4Test, getVersion) {
+    createHttpChannelServer();
+
+    std::string response;
+
+    // Send the version-get command
+    sendHttpCommand("{ \"command\": \"version-get\" }", response);
+    EXPECT_TRUE(response.find("\"result\": 0") != string::npos);
+    EXPECT_TRUE(response.find("log4cplus") != string::npos);
+    EXPECT_FALSE(response.find("GTEST_VERSION") != string::npos);
+
+    // Send the build-report command
+    sendHttpCommand("{ \"command\": \"build-report\" }", response);
+    EXPECT_TRUE(response.find("\"result\": 0") != string::npos);
+    EXPECT_TRUE(response.find("GTEST_VERSION") != string::npos);
+}
+
+// This test verifies that the DHCP server handles server-tag-get command
+TEST_F(HttpCtrlChannelDhcpv4Test, serverTagGet) {
+    createHttpChannelServer();
+
+    std::string response;
+    std::string expected;
+
+    // Send the server-tag-get command
+    sendHttpCommand("{ \"command\": \"server-tag-get\" }", response);
+    expected = "[ { \"arguments\": { \"server-tag\": \"\" }, ";
+    expected += "\"result\": 0 } ]";
+    EXPECT_EQ(expected, response);
+
+    // Set a value to the server tag
+    CfgMgr::instance().getCurrentCfg()->setServerTag("foobar");
+
+    // Retry...
+    sendHttpCommand("{ \"command\": \"server-tag-get\" }", response);
+    expected = "[ { \"arguments\": { \"server-tag\": \"foobar\" }, ";
+    expected += "\"result\": 0 } ]";
+    EXPECT_EQ(expected, response);
+}
+
+// This test verifies that the DHCP server handles status-get commands
+TEST_F(HttpCtrlChannelDhcpv4Test, statusGet) {
+    createHttpChannelServer();
+
+    // start_ is initialized by init.
+    ASSERT_THROW(server_->init("/no/such/file"), BadValue);
+
+    std::string response_txt;
+
+    // Send the status-get command.
+    sendHttpCommand("{ \"command\": \"status-get\" }", response_txt);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_txt));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    EXPECT_EQ(2, response->size());
+    ConstElementPtr result = response->get("result");
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments = response->get("arguments");
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    // The returned pid should be the pid of our process.
+    auto found_pid = arguments->get("pid");
+    ASSERT_TRUE(found_pid);
+    EXPECT_EQ(static_cast<int64_t>(getpid()), found_pid->intValue());
+
+    // It is hard to check the actual uptime (and reload) as it is based
+    // on current time. Let's just make sure it is within a reasonable
+    // range.
+    auto found_uptime = arguments->get("uptime");
+    ASSERT_TRUE(found_uptime);
+    EXPECT_LE(found_uptime->intValue(), 5);
+    EXPECT_GE(found_uptime->intValue(), 0);
+
+    auto found_reload = arguments->get("reload");
+    ASSERT_TRUE(found_reload);
+    EXPECT_LE(found_reload->intValue(), 5);
+    EXPECT_GE(found_reload->intValue(), 0);
+
+    auto found_multi_threading = arguments->get("multi-threading-enabled");
+    ASSERT_TRUE(found_multi_threading);
+    EXPECT_TRUE(found_multi_threading->boolValue());
+
+    auto found_thread_count = arguments->get("thread-pool-size");
+    ASSERT_TRUE(found_thread_count);
+    // The default value varies between systems.
+    // Let's just make sure it's a positive value.
+    EXPECT_LE(0, found_thread_count->intValue());
+
+    auto found_queue_size = arguments->get("packet-queue-size");
+    ASSERT_TRUE(found_queue_size);
+    EXPECT_EQ(64, found_queue_size->intValue());
+
+    auto found_queue_stats = arguments->get("packet-queue-statistics");
+    ASSERT_TRUE(found_queue_stats);
+    EXPECT_FALSE(found_queue_stats->str().empty());
+
+    MultiThreadingMgr::instance().setMode(true);
+    MultiThreadingMgr::instance().setThreadPoolSize(4);
+    MultiThreadingMgr::instance().setPacketQueueSize(64);
+    sendHttpCommand("{ \"command\": \"status-get\" }", response_txt);
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_txt));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    EXPECT_EQ(2, response->size());
+    result = response->get("result");
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    arguments = response->get("arguments");
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    // The returned pid should be the pid of our process.
+    found_pid = arguments->get("pid");
+    ASSERT_TRUE(found_pid);
+    EXPECT_EQ(static_cast<int64_t>(getpid()), found_pid->intValue());
+
+    // It is hard to check the actual uptime (and reload) as it is based
+    // on current time. Let's just make sure it is within a reasonable
+    // range.
+    found_uptime = arguments->get("uptime");
+    ASSERT_TRUE(found_uptime);
+    EXPECT_LE(found_uptime->intValue(), 5);
+    EXPECT_GE(found_uptime->intValue(), 0);
+
+    found_reload = arguments->get("reload");
+    ASSERT_TRUE(found_reload);
+    EXPECT_LE(found_reload->intValue(), 5);
+    EXPECT_GE(found_reload->intValue(), 0);
+
+    found_multi_threading = arguments->get("multi-threading-enabled");
+    ASSERT_TRUE(found_multi_threading);
+    EXPECT_TRUE(found_multi_threading->boolValue());
+
+    found_thread_count = arguments->get("thread-pool-size");
+    ASSERT_TRUE(found_thread_count);
+    EXPECT_EQ(found_thread_count->intValue(), 4);
+
+    found_queue_size = arguments->get("packet-queue-size");
+    ASSERT_TRUE(found_queue_size);
+    EXPECT_EQ(found_queue_size->intValue(), 64);
+
+    found_queue_stats = arguments->get("packet-queue-statistics");
+    ASSERT_TRUE(found_queue_stats);
+    ASSERT_EQ(Element::list, found_queue_stats->getType());
+    EXPECT_EQ(3, found_queue_stats->size());
+}
+
+// Check that status is returned even if LeaseMgr and HostMgr are not created.
+TEST_F(HttpCtrlChannelDhcpv4Test, noManagers) {
+    // Send the status-get command.
+    createHttpChannelServer();
+    LeaseMgrFactory::destroy();
+    HostMgr::create();
+    string response_text;
+    sendHttpCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_text));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+}
+
+// Checks that socket status exists in status-get responses.
+TEST_F(HttpCtrlChannelDhcpv4Test, statusGetSockets) {
+    // Create dummy interfaces to test socket status.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+
+    // Send the status-get command.
+    createHttpChannelServer();
+    string response_text;
+    sendHttpCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_text));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("ready", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_FALSE(errors);
+}
+
+// Checks that socket status includes errors in status-get responses.
+TEST_F(HttpCtrlChannelDhcpv4Test, statusGetSocketsErrors) {
+    // Create dummy interfaces to test socket status and add custom down and no-address interfaces.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+    test_config.addIface("down_interface", 4);
+    test_config.setIfaceFlags("down_interface", FlagLoopback(false), FlagUp(false),
+                              FlagRunning(true), FlagInactive4(false),
+                              FlagInactive6(false));
+    test_config.addIface("no_address", 5);
+
+    // Send the status-get command.
+    createHttpChannelServer();
+    string response_text;
+    sendHttpCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_text));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("failed", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_TRUE(errors);
+    ASSERT_EQ(Element::list, errors->getType());
+    ASSERT_EQ(2, errors->size());
+
+    ConstElementPtr error(errors->get(0));
+    ASSERT_TRUE(error);
+    ASSERT_EQ(Element::string, error->getType());
+    ASSERT_EQ("the interface down_interface is down", error->stringValue());
+
+    error = errors->get(1);
+    ASSERT_TRUE(error);
+    ASSERT_EQ(Element::string, error->getType());
+    ASSERT_EQ("the interface no_address has no usable IPv4 addresses configured",
+              error->stringValue());
+}
+
+// This test verifies that the DHCP server handles config-backend-pull command
+TEST_F(HttpCtrlChannelDhcpv4Test, configBackendPull) {
+    createHttpChannelServer();
+
+    std::string response;
+    std::string expected;
+
+    // Send the config-backend-pull command. Note there is no configured backed.
+    sendHttpCommand("{ \"command\": \"config-backend-pull\" }", response);
+    expected = "[ { \"result\": 3, \"text\": \"No config backend.\" } ]";
+    EXPECT_EQ(expected, response);
+}
+
+// This test verifies that the DHCP server immediately reclaims expired
+// leases on leases-reclaim command
+TEST_F(HttpCtrlChannelDhcpv4Test, controlLeasesReclaim) {
+    createHttpChannelServer();
+
+    // Create expired leases. Leases are expired by 40 seconds ago
+    // (valid lifetime = 60, cltt = now - 100).
+    HWAddrPtr hwaddr0(new HWAddr(HWAddr::fromText("00:01:02:03:04:05")));
+    Lease4Ptr lease0(new Lease4(IOAddress("10.0.0.1"), hwaddr0,
+                                ClientIdPtr(), 60,
+                                time(NULL) - 100, SubnetID(1)));
+    HWAddrPtr hwaddr1(new HWAddr(HWAddr::fromText("01:02:03:04:05:06")));
+    Lease4Ptr lease1(new Lease4(IOAddress("10.0.0.2"), hwaddr1,
+                                ClientIdPtr(), 60,
+                                time(NULL) - 100, SubnetID(1)));
+
+    // Add leases to the database.
+    LeaseMgr& lease_mgr = LeaseMgrFactory::instance();
+    ASSERT_NO_THROW(lease_mgr.addLease(lease0));
+    ASSERT_NO_THROW(lease_mgr.addLease(lease1));
+
+    // Make sure they have been added.
+    ASSERT_TRUE(lease_mgr.getLease4(IOAddress("10.0.0.1")));
+    ASSERT_TRUE(lease_mgr.getLease4(IOAddress("10.0.0.2")));
+
+    // No arguments
+    std::string response;
+    sendHttpCommand("{ \"command\": \"leases-reclaim\" }", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": "
+              "\"Missing mandatory 'remove' parameter.\" } ]",
+              response);
+
+    // Bad argument name
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"reclaim\": true } }", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": "
+              "\"Missing mandatory 'remove' parameter.\" } ]",
+              response);
+
+    // Bad remove argument type
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"remove\": \"bogus\" } }", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": "
+              "\"'remove' parameter expected to be a boolean.\" } ]",
+              response);
+
+    // Send the command
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"remove\": false } }", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"Reclamation of expired leases is complete.\" } ]",
+              response);
+
+    // Leases should be reclaimed, but not removed
+    ASSERT_NO_THROW(lease0 = lease_mgr.getLease4(IOAddress("10.0.0.1")));
+    ASSERT_NO_THROW(lease1 = lease_mgr.getLease4(IOAddress("10.0.0.2")));
+    ASSERT_TRUE(lease0);
+    ASSERT_TRUE(lease1);
+    EXPECT_TRUE(lease0->stateExpiredReclaimed());
+    EXPECT_TRUE(lease1->stateExpiredReclaimed());
+}
+
+// This test verifies that the DHCP server immediately reclaims expired
+// leases on leases-reclaim command with remove = true
+TEST_F(HttpCtrlChannelDhcpv4Test, controlLeasesReclaimRemove) {
+    createHttpChannelServer();
+
+    // Create expired leases. Leases are expired by 40 seconds ago
+    // (valid lifetime = 60, cltt = now - 100).
+    HWAddrPtr hwaddr0(new HWAddr(HWAddr::fromText("00:01:02:03:04:05")));
+    Lease4Ptr lease0(new Lease4(IOAddress("10.0.0.1"), hwaddr0,
+                                ClientIdPtr(), 60,
+                                time(NULL) - 100, SubnetID(1)));
+    HWAddrPtr hwaddr1(new HWAddr(HWAddr::fromText("01:02:03:04:05:06")));
+    Lease4Ptr lease1(new Lease4(IOAddress("10.0.0.2"), hwaddr1,
+                                ClientIdPtr(), 60,
+                                time(NULL) - 100, SubnetID(1)));
+
+    // Add leases to the database.
+    LeaseMgr& lease_mgr = LeaseMgrFactory::instance();
+    ASSERT_NO_THROW(lease_mgr.addLease(lease0));
+    ASSERT_NO_THROW(lease_mgr.addLease(lease1));
+
+    // Make sure they have been added.
+    ASSERT_TRUE(lease_mgr.getLease4(IOAddress("10.0.0.1")));
+    ASSERT_TRUE(lease_mgr.getLease4(IOAddress("10.0.0.2")));
+
+    // Send the command
+    std::string response;
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"remove\": true } }", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"Reclamation of expired leases is complete.\" } ]",
+              response);
+
+    // Leases should have been removed.
+    ASSERT_NO_THROW(lease0 = lease_mgr.getLease4(IOAddress("10.0.0.1")));
+    ASSERT_NO_THROW(lease1 = lease_mgr.getLease4(IOAddress("10.0.0.2")));
+    ASSERT_FALSE(lease0);
+    ASSERT_FALSE(lease1);
+}
+
+// Tests that the server properly responds to shutdown command sent
+// via ControlChannel
+TEST_F(HttpCtrlChannelDhcpv4Test, listCommands) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"list-commands\" }", response);
+
+    ConstElementPtr rsp;
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+
+    // We expect the server to report at least the following commands:
+    checkListCommands(rsp, "build-report");
+    checkListCommands(rsp, "config-backend-pull");
+    checkListCommands(rsp, "config-get");
+    checkListCommands(rsp, "config-hash-get");
+    checkListCommands(rsp, "config-reload");
+    checkListCommands(rsp, "config-set");
+    checkListCommands(rsp, "config-test");
+    checkListCommands(rsp, "config-write");
+    checkListCommands(rsp, "list-commands");
+    checkListCommands(rsp, "leases-reclaim");
+    checkListCommands(rsp, "version-get");
+    checkListCommands(rsp, "server-tag-get");
+    checkListCommands(rsp, "shutdown");
+    checkListCommands(rsp, "statistic-get");
+    checkListCommands(rsp, "statistic-get-all");
+    checkListCommands(rsp, "statistic-remove");
+    checkListCommands(rsp, "statistic-remove-all");
+    checkListCommands(rsp, "statistic-reset");
+    checkListCommands(rsp, "statistic-reset-all");
+    checkListCommands(rsp, "statistic-sample-age-set");
+    checkListCommands(rsp, "statistic-sample-age-set-all");
+    checkListCommands(rsp, "statistic-sample-count-set");
+    checkListCommands(rsp, "statistic-sample-count-set-all");
+}
+
+// Tests if config-write can be called without any parameters.
+TEST_F(HttpCtrlChannelDhcpv4Test, configWriteNoFilename) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set by the command line -c parameter.
+    server_->setConfigFile("test1.json");
+
+    // If the filename is not explicitly specified, the name used
+    // in -c command line switch is used.
+    sendHttpCommand("{ \"command\": \"config-write\" }", response);
+
+    checkConfigWrite(response, CONTROL_RESULT_SUCCESS, "test1.json");
+    ::remove("test1.json");
+}
+
+// Tests if config-write can be called with a valid filename as parameter.
+TEST_F(HttpCtrlChannelDhcpv4Test, configWriteFilename) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"config-write\", "
+                    "\"arguments\": { \"filename\": \"test2.json\" } }",
+                    response);
+
+    checkConfigWrite(response, CONTROL_RESULT_SUCCESS, "test2.json");
+    ::remove("test2.json");
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is missing.
+TEST_F(HttpCtrlChannelDhcpv4Test, configReloadMissingFile) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test6.json");
+
+    // Tell the server to reload its configuration. It should attempt to load
+    // test6.json (and fail, because the file is not there).
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    // Verify the reload was rejected.
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"Config reload failed: "
+              "configuration error using file 'test6.json': "
+              "Unable to open file test6.json\" } ]",
+              response);
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is not a valid JSON.
+TEST_F(HttpCtrlChannelDhcpv4Test, configReloadBrokenFile) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test7.json");
+
+    // Although Kea is smart, its AI routines are not smart enough to handle
+    // this one... at least not yet.
+    ofstream f("test7.json", ios::trunc);
+    f << "gimme some addrs, bro!";
+    f.close();
+
+    // Now tell Kea to reload its config.
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    // Verify the reload will fail.
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"Config reload failed: "
+              "configuration error using file 'test7.json': "
+              "test7.json:1.1: Invalid character: g\" } ]",
+              response);
+
+    ::remove("test7.json");
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is loaded correctly.
+TEST_F(HttpCtrlChannelDhcpv4Test, configReloadValid) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test8.json");
+
+    // Ok, enough fooling around. Let's create a valid config.
+    const std::string cfg_txt =
+        "{ \"Dhcp4\": {"
+        "    \"interfaces-config\": {"
+        "        \"interfaces\": [ \"*\" ]"
+        "    },"
+        "    \"subnet4\": ["
+        "        { \"id\": 1, \"subnet\": \"192.0.2.0/24\" },"
+        "        { \"id\": 2, \"subnet\": \"192.0.3.0/24\" }"
+        "     ],"
+        "    \"valid-lifetime\": 4000,"
+        "    \"lease-database\": {"
+        "       \"type\": \"memfile\", \"persist\": false }"
+        "} }";
+    ofstream f("test8.json", ios::trunc);
+    f << cfg_txt;
+    f.close();
+
+    // This command should reload test8.json config.
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"5309678B9BC94F19D3A35D8BF7AC5E91B1C4FCAE86AE5B31FC85DE79DFFDCA2C\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was indeed applied.
+    const Subnet4Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(2, subnets->size());
+
+    ::remove("test8.json");
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is loaded correctly.
+TEST_F(HttpCtrlChannelDhcpv4Test, configReloadDetectInterfaces) {
+    interfaces_ = "\"eth0\"";
+    IfacePtr eth0 = IfaceMgrTestConfig::createIface("eth0", ETH0_INDEX,
+                                                    "11:22:33:44:55:66");
+    auto detectIfaces = [&](bool update_only) {
+        if (!update_only) {
+            eth0->addAddress(IOAddress("10.0.0.1"));
+            eth0->addAddress(IOAddress("fe80::3a60:77ff:fed5:cdef"));
+            eth0->addAddress(IOAddress("2001:db8:1::1"));
+            IfaceMgr::instance().addInterface(eth0);
+        }
+        return (false);
+    };
+    IfaceMgr::instance().setDetectCallback(detectIfaces);
+    IfaceMgr::instance().clearIfaces();
+    IfaceMgr::instance().closeSockets();
+    IfaceMgr::instance().detectIfaces();
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test8.json");
+
+    // Ok, enough fooling around. Let's create a valid config.
+    const std::string cfg_txt =
+        "{ \"Dhcp4\": {"
+        "    \"interfaces-config\": {"
+        "        \"interfaces\": [ \"eth1\" ]"
+        "    },"
+        "    \"subnet4\": ["
+        "        { \"id\": 1, \"subnet\": \"192.0.2.0/24\" },"
+        "        { \"id\": 2, \"subnet\": \"192.0.3.0/24\" }"
+        "     ],"
+        "    \"valid-lifetime\": 4000,"
+        "    \"lease-database\": {"
+        "       \"type\": \"memfile\", \"persist\": false }"
+        "} }";
+    ofstream f("test8.json", ios::trunc);
+    f << cfg_txt;
+    f.close();
+
+    IfacePtr eth1 = IfaceMgrTestConfig::createIface("eth1", ETH1_INDEX,
+                                                    "AA:BB:CC:DD:EE:FF");
+    auto detectUpdateIfaces = [&](bool update_only) {
+        if (!update_only) {
+            eth1->addAddress(IOAddress("192.0.2.3"));
+            eth1->addAddress(IOAddress("fe80::3a60:77ff:fed5:abcd"));
+            eth1->addAddress(IOAddress("3001:db8:100::1"));
+            IfaceMgr::instance().addInterface(eth1);
+        }
+        return (false);
+    };
+    IfaceMgr::instance().setDetectCallback(detectUpdateIfaces);
+
+    // This command should reload test8.json config.
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"53FF817F06103B24149E83F3A36993ADF641A478F11930A4670D36BACC8E1DE1\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was indeed applied.
+    const Subnet4Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
+    EXPECT_EQ(2, subnets->size());
+
+    ::remove("test8.json");
+}
+
+// This test verifies that disable DHCP service command performs sanity check on
+// parameters.
+TEST_F(HttpCtrlChannelDhcpv4Test, dhcpDisableBadParam) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"max-period\": -3"
+                    "    }"
+                    "}", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'max-period' must be positive "
+              "integer\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"foo\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: (empty string)\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"test\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: test\" } ]",
+              response);
+}
+
+// This test verifies if it is possible to disable DHCP service via command.
+TEST_F(HttpCtrlChannelDhcpv4Test, dhcpDisable) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"dhcp-disable\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::USER_COMMAND);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::USER_COMMAND);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"ha-partner\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::HA_REMOTE_COMMAND);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": 2002"
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::HA_REMOTE_COMMAND+2);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+// This test verifies if it is possible to disable DHCP service using
+// the origin-id.
+TEST_F(HttpCtrlChannelDhcpv4Test, dhcpDisableOriginId) {
+    createHttpChannelServer();
+    std::string response;
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": 2002,"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::HA_REMOTE_COMMAND+2);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+// This test verifies that it is possible to disable DHCP service for a short
+// period of time, after which the service is automatically enabled.
+TEST_F(HttpCtrlChannelDhcpv4Test, dhcpDisableTemporarily) {
+    createHttpChannelServer();
+    std::string response;
+
+    // Send a command to disable DHCP service for 3 seconds.
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"max-period\": 3"
+                    "    }"
+                    "}", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // The service should be disabled.
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+    // And the timer should be scheduled which counts the time to automatic
+    // enabling of the service.
+    EXPECT_TRUE(server_->network_state_->isDelayedEnableService());
+}
+
+// This test verifies that enable DHCP service command performs sanity check on
+// parameters.
+TEST_F(HttpCtrlChannelDhcpv4Test, dhcpEnableBadParam) {
+    createHttpChannelServer();
+    std::string response;
+    ConstElementPtr rsp;
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"foo\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: (empty string)\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"test\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: test\" } ]",
+              response);
+}
+
+// This test verifies if it is possible to enable DHCP service via command.
+TEST_F(HttpCtrlChannelDhcpv4Test, dhcpEnable) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"dhcp-enable\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->disableService(NetworkState::USER_COMMAND);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->disableService(NetworkState::HA_REMOTE_COMMAND);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"ha-partner\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->disableService(NetworkState::HA_REMOTE_COMMAND+1);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": 2001"
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+// This test verifies if it is possible to enable DHCP service using
+// the origin-id.
+TEST_F(HttpCtrlChannelDhcpv4Test, dhcpEnableOriginId) {
+    createHttpChannelServer();
+    std::string response;
+
+    ConstElementPtr rsp;
+
+    int status;
+
+    // Disable the service using two distinct origins.
+    server_->network_state_->disableService(NetworkState::HA_REMOTE_COMMAND+1);
+    server_->network_state_->disableService(NetworkState::USER_COMMAND);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    // Enable the service for the 'origin-id' of 2001. The 'origin' should
+    // be ignored.
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": 2001,"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // The service should still be disabled.
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    // Enable the service for the user command.
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": 1"
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // The service should be enabled.
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+/// Verify that concurrent connections over the HTTP control channel can be
+/// established.
+TEST_F(HttpCtrlChannelDhcpv4Test, concurrentConnections) {
+    EXPECT_NO_THROW(createHttpChannelServer());
+
+    const size_t NB = 5;
+    vector<IOServicePtr> io_services;
+    vector<TestHttpClientPtr> clients;
+
+    // Create clients.
+    for (size_t i = 0; i < NB; ++i) {
+        IOServicePtr io_service(new IOService());
+        io_services.push_back(io_service);
+        TestHttpClientPtr client(new TestHttpClient(io_service, SERVER_ADDRESS,
+                                                    SERVER_PORT));
+        clients.push_back(client);
+    }
+    ASSERT_EQ(NB, io_services.size());
+    ASSERT_EQ(NB, clients.size());
+
+    // Send requests and receive responses.
+    atomic<size_t> terminated;
+    terminated = 0;
+    vector<thread> threads;
+    const string command = "{ \"command\": \"list-commands\" }";
+    for (size_t i = 0; i < NB; ++i) {
+        threads.push_back(thread([&, i] () {
+            TestHttpClientPtr client = clients[i];
+            ASSERT_TRUE(client);
+            client->startRequest(buildPostStr(command));
+            IOServicePtr io_service = io_services[i];
+            ASSERT_TRUE(io_service);
+            io_service->run();
+            ASSERT_TRUE(client->receiveDone());
+            HttpResponsePtr hr;
+            ASSERT_NO_THROW(hr = parseResponse(client->getResponse()));
+            string response = hr->getBody();
+            EXPECT_TRUE(response.find("\"result\": 0") != std::string::npos);
+            client->close();
+            ++terminated;
+        }));
+    }
+    ASSERT_EQ(NB, threads.size());
+
+    // Run the service IO services with a timeout.
+    IntervalTimer test_timer(getIOService());
+    bool timeout = false;
+    test_timer.setup([&timeout] () { timeout = true; },
+                     TEST_TIMEOUT, IntervalTimer::ONE_SHOT);
+    while (!timeout && (terminated < NB)) {
+        getIOService()->poll();
+    }
+    test_timer.cancel();
+    EXPECT_FALSE(timeout);
+
+    // Cleanup clients.
+    for (IOServicePtr io_service : io_services) {
+        io_service->stopAndPoll();
+    }
+    for (auto th = threads.begin(); th != threads.end(); ++th) {
+        th->join();
+    }
+}
+
+// This test verifies that the server can receive and process a large command.
+TEST_F(HttpCtrlChannelDhcpv4Test, longCommand) {
+
+    ostringstream command;
+
+    // This is the desired size of the command sent to the server (100kB).
+    // The actual size sent will be slightly greater than that.
+    const size_t command_size = 1024 * 100; // was 1024 * 1000 (1MB).
+
+    while (command.tellp() < command_size) {
+
+        // We're sending command 'foo' with arguments being a list of
+        // strings. If this is the first transmission, send command name
+        // and open the arguments list. Also insert the first argument
+        // so as all subsequent arguments can be prefixed with a comma.
+        if (command.tellp() == 0) {
+            command << "{ \"command\": \"foo\", \"arguments\": [ \"begin\"";
+
+        } else {
+            // Generate a random number and insert it into the stream as
+            // 10 digits long string.
+            ostringstream arg;
+            arg << setw(10) << std::rand();
+            // Append the argument in the command.
+            command << ", \"" << arg.str() << "\"\n";
+
+            // If we have hit the limit of the command size, close braces to
+            // get appropriate JSON.
+            if (command.tellp() > command_size) {
+                command << "] }";
+            }
+        }
+    }
+
+    ASSERT_NO_THROW(
+        CommandMgr::instance().registerCommand("foo",
+            std::bind(&HttpCtrlChannelDhcpv4Test::longCommandHandler,
+                      command.str(), ph::_1, ph::_2));
+    );
+
+    createHttpChannelServer();
+
+    string response;
+    ASSERT_NO_THROW(sendHttpCommand(command.str(), response));
+
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"long command received ok\" } ]",
+              response);
+}
+
+// This test verifies that the server can send long response to the client.
+TEST_F(HttpCtrlChannelDhcpv4Test, longResponse) {
+    // We need to generate large response. The simplest way is to create
+    // a command and a handler which will generate some static response
+    // of a desired size.
+    ASSERT_NO_THROW(
+        CommandMgr::instance().registerCommand("foo",
+            std::bind(&HttpCtrlChannelDhcpv4Test::longResponseHandler,
+                      ph::_1, ph::_2));
+    );
+
+    createHttpChannelServer();
+
+    // The entire response should be received but anayway check it.
+    ConstElementPtr raw_response =
+        longResponseHandler("foo", ConstElementPtr());
+    ElementPtr json_response = Element::createList();
+    json_response->add(isc::data::copy(raw_response));
+    string reference_response = json_response->str();
+
+    string response;
+    string command = "{ \"command\": \"foo\", \"arguments\": { }  }";
+    ASSERT_NO_THROW(sendHttpCommand(command, response));
+
+    // Make sure we have received correct response.
+    EXPECT_EQ(reference_response, response);
+}
+
+// This test verifies that the server signals timeout if the transmission
+// takes too long, having received no data from the client.
+TEST_F(HttpCtrlChannelDhcpv4Test, connectionTimeoutNoData) {
+    // Set connection timeout to 2s to prevent long waiting time for the
+    // timeout during this test.
+    const unsigned short timeout = 2000;
+    HttpCommandMgr::instance().setConnectionTimeout(timeout);
+
+    createHttpChannelServer();
+
+    string response;
+    ASSERT_NO_THROW(sendHttpCommand("{ \"command\": ", response));
+
+    EXPECT_EQ("{ \"result\": 400, \"text\": \"Bad Request\" }", response);
+}
+
+} // End of anonymous namespace
index b581e411dd4380a290edd5c59ac5d6fdeeeca886..4e30a37e83f98c9060f7706f8d5b6fec2ffb84de 100644 (file)
@@ -1109,6 +1109,9 @@ ControlledDhcpv6Srv::ControlledDhcpv6Srv(uint16_t server_port /*= DHCP6_SERVER_P
     CommandMgr::instance().setIOService(getIOService());
     HttpCommandMgr::instance().setIOService(getIOService());
 
+    // Set the HTTP authentication default realm.
+    HttpCommandConfig::DefaultAuthenticationRealm = "kea-dhcpv6-server";
+
     // DatabaseConnection uses IO service to run asynchronous timers.
     DatabaseConnection::setIOService(getIOService());
 
index 12f4fc222598d172f0918966003a2c13f491be1f..d95cb45ad41c1bb1b8a0866c0d2ea9f053a3734a 100644 (file)
@@ -84,6 +84,7 @@ dhcp6_unittests_SOURCES += config_parser_unittest.cc
 dhcp6_unittests_SOURCES += config_backend_unittest.cc
 dhcp6_unittests_SOURCES += confirm_unittest.cc
 dhcp6_unittests_SOURCES += ctrl_dhcp6_srv_unittest.cc
+dhcp6_unittests_SOURCES += http_control_socket_unittest.cc
 dhcp6_unittests_SOURCES += d2_unittest.cc d2_unittest.h
 dhcp6_unittests_SOURCES += decline_unittest.cc
 dhcp6_unittests_SOURCES += dhcp6_client.cc dhcp6_client.h
index ea94dad6182fe2b07a559d1ab9a595197edc105b..efae081fd09664bd331f7909e17a93a999ec5be0 100644 (file)
@@ -9639,7 +9639,7 @@ const char* UNPARSED_CONFIGS[] = {
 "                        }\n"
 "                    ],\n"
 "                    \"directory\": \"\",\n"
-"                    \"realm\": \"\",\n"
+"                    \"realm\": \"kea-dhcpv6-server\",\n"
 "                    \"type\": \"basic\",\n"
 "                    \"user-context\": {\n"
 "                        \"comment\": \"basic HTTP authentication\"\n"
diff --git a/src/bin/dhcp6/tests/http_control_socket_unittest.cc b/src/bin/dhcp6/tests/http_control_socket_unittest.cc
new file mode 100644 (file)
index 0000000..fcd2b94
--- /dev/null
@@ -0,0 +1,2261 @@
+// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <asiolink/interval_timer.h>
+#include <asiolink/io_address.h>
+#include <cc/command_interpreter.h>
+#include <config/command_mgr.h>
+#include <config/http_command_mgr.h>
+#include <config/timeouts.h>
+#include <dhcp/libdhcp++.h>
+#include <dhcp/testutils/iface_mgr_test_config.h>
+#include <dhcpsrv/cfgmgr.h>
+#include <dhcpsrv/host_mgr.h>
+#include <dhcpsrv/lease.h>
+#include <dhcpsrv/lease_mgr_factory.h>
+#include <dhcp6/ctrl_dhcp6_srv.h>
+#include <dhcp6/tests/dhcp6_test_utils.h>
+#include <hooks/hooks_manager.h>
+#include <http/response.h>
+#include <http/response_parser.h>
+#include <http/tests/test_http_client.h>
+#include <log/logger_support.h>
+#include <stats/stats_mgr.h>
+#include <util/chrono_time_utils.h>
+
+#include "marker_file.h"
+#include "test_libraries.h"
+
+#include <boost/scoped_ptr.hpp>
+#include <gtest/gtest.h>
+
+#include <atomic>
+#include <fstream>
+#include <iomanip>
+#include <sstream>
+#include <thread>
+
+#include <sys/select.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <cstdlib>
+#include <unistd.h>
+
+using namespace std;
+using namespace isc;
+using namespace isc::asiolink;
+using namespace isc::config;
+using namespace isc::data;
+using namespace isc::dhcp;
+using namespace isc::dhcp::test;
+using namespace isc::hooks;
+using namespace isc::http;
+using namespace isc::stats;
+using namespace isc::util;
+namespace ph = std::placeholders;
+
+namespace {
+
+/// @brief IP address to which HTTP service is bound.
+const std::string SERVER_ADDRESS = "::1";
+
+/// @brief Port number to which HTTP service is bound.
+const unsigned short SERVER_PORT = 18126;
+
+/// @brief Test timeout (ms).
+const long TEST_TIMEOUT = 10000;
+
+class NakedControlledDhcpv6Srv: public ControlledDhcpv6Srv {
+    // "Naked" DHCPv6 server, exposes internal fields
+public:
+    NakedControlledDhcpv6Srv() : ControlledDhcpv6Srv(DHCP6_SERVER_PORT + 10000) {
+        CfgMgr::instance().setFamily(AF_INET6);
+    }
+
+    /// Expose internal methods for the sake of testing
+    using Dhcpv6Srv::receivePacket;
+    using Dhcpv6Srv::network_state_;
+};
+
+/// @brief Default control connection timeout.
+const size_t DEFAULT_CONNECTION_TIMEOUT = 10000;
+
+class HttpCtrlDhcpv6Test : public BaseServerTest {
+public:
+    HttpCtrlDhcpv6Test()
+        : BaseServerTest() {
+        reset();
+    }
+
+    virtual ~HttpCtrlDhcpv6Test() {
+        LeaseMgrFactory::destroy();
+        StatsMgr::instance().removeAll();
+        CommandMgr::instance().deregisterAll();
+        HttpCommandMgr::instance().setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
+
+        reset();
+    }
+
+    /// @brief Reset hooks data
+    ///
+    /// Resets the data for the hooks-related portion of the test by ensuring
+    /// that no libraries are loaded and that any marker files are deleted.
+    virtual void reset() {
+        // Unload any previously-loaded libraries.
+        EXPECT_TRUE(HooksManager::unloadLibraries());
+
+        // Get rid of any marker files.
+        static_cast<void>(remove(LOAD_MARKER_FILE));
+        static_cast<void>(remove(UNLOAD_MARKER_FILE));
+        IfaceMgr::instance().deleteAllExternalSockets();
+        CfgMgr::instance().clear();
+    }
+
+};
+
+class HttpCtrlChannelDhcpv6Test : public HttpCtrlDhcpv6Test {
+public:
+    /// @brief List of interfaces (defaults to "*").
+    std::string interfaces_;
+
+    /// @brief Pointer to the tested server object
+    boost::shared_ptr<NakedControlledDhcpv6Srv> server_;
+
+    /// @brief Default constructor
+    ///
+    /// Sets socket path to its default value.
+    HttpCtrlChannelDhcpv6Test() : interfaces_("\"*\"") {
+        reset();
+        IfaceMgr::instance().setTestMode(false);
+        IfaceMgr::instance().setDetectCallback(std::bind(&IfaceMgr::checkDetectIfaces,
+                                               IfaceMgr::instancePtr().get(), ph::_1));
+    }
+
+    /// @brief Destructor
+    ~HttpCtrlChannelDhcpv6Test() {
+        LeaseMgrFactory::destroy();
+        StatsMgr::instance().removeAll();
+
+        if (HttpCommandMgr::instance().getHttpListener()) {
+            HttpCommandMgr::instance().close();
+        }
+        CommandMgr::instance().deregisterAll();
+        CommandMgr::instance().setConnectionTimeout(TIMEOUT_DHCP_SERVER_RECEIVE_COMMAND);
+
+        server_.reset();
+        reset();
+        IfaceMgr::instance().setTestMode(false);
+        IfaceMgr::instance().setDetectCallback(std::bind(&IfaceMgr::checkDetectIfaces,
+                                               IfaceMgr::instancePtr().get(), ph::_1));
+        IfaceMgr::instance().clearIfaces();
+        IfaceMgr::instance().closeSockets();
+        IfaceMgr::instance().detectIfaces();
+    }
+
+    /// @brief Returns pointer to the server's IO service.
+    ///
+    /// @return Pointer to the server's IO service or null pointer if the server
+    /// hasn't been created.
+    IOServicePtr getIOService() {
+        return (server_ ? server_->getIOService() : IOServicePtr());
+    }
+
+    /// @brief Callback function invoke upon test timeout.
+    ///
+    /// It stops the IO service and reports test timeout.
+    ///
+    /// @param fail_on_timeout Specifies if test failure should be reported.
+    void timeoutHandler(const bool fail_on_timeout) {
+        if (fail_on_timeout) {
+            ADD_FAILURE() << "Timeout occurred while running the test!";
+        }
+        getIOService()->stop();
+    }
+
+    /// @brief Runs IO service.
+    void runIOService() {
+        IOServicePtr io_service = getIOService();
+        ASSERT_TRUE(io_service);
+        IntervalTimer test_timer(io_service);
+        test_timer.setup(std::bind(&HttpCtrlChannelDhcpv6Test::timeoutHandler,
+                                   this, true),
+                         TEST_TIMEOUT, IntervalTimer::ONE_SHOT);
+        // Run until the client stops the service or an error occurs.
+        io_service->run();
+        test_timer.cancel();
+        if (io_service->stopped()) {
+            io_service->restart();
+        }
+        io_service->poll();
+    }
+
+    /// @brief Create a server with a HTTP command channel.
+    void createHttpChannelServer() {
+        // Just a simple config. The important part here is the socket
+        // location information.
+        std::string header =
+            "{"
+            "    \"interfaces-config\": {"
+            "        \"interfaces\": [";
+
+        std::string body = "]"
+            "    },"
+            "    \"expired-leases-processing\": {"
+            "         \"reclaim-timer-wait-time\": 60,"
+            "         \"hold-reclaimed-time\": 500,"
+            "         \"flush-reclaimed-timer-wait-time\": 60"
+            "    },"
+            "    \"rebind-timer\": 2000, "
+            "    \"renew-timer\": 1000, "
+            "    \"subnet6\": [ ],"
+            "    \"valid-lifetime\": 4000,"
+            "    \"control-socket\": {"
+            "        \"socket-type\": \"http\","
+            "        \"socket-address\": \"::1\","
+            "        \"socket-port\": 18126"
+            "    },"
+            "    \"lease-database\": {"
+            "       \"type\": \"memfile\", \"persist\": false },"
+            "    \"loggers\": [ {"
+            "       \"name\": \"kea-dhcp6\","
+            "       \"severity\": \"INFO\","
+            "       \"debuglevel\": 0"
+            "       } ]"
+            "}";
+
+        std::string config_txt = header + interfaces_ + body;
+        ASSERT_NO_THROW(server_.reset(new NakedControlledDhcpv6Srv()));
+
+        ConstElementPtr config;
+        ASSERT_NO_THROW(config = parseDHCP6(config_txt));
+
+        // Parse the logger configuration explicitly into the staging config.
+        // Note this does not alter the current loggers, they remain in
+        // effect until we apply the logging config below.  If no logging
+        // is supplied logging will revert to default logging.
+        server_->configureLogger(config, CfgMgr::instance().getStagingCfg());
+
+        // Let's apply the new logging. We do it early, so we'll be able to print
+        // out what exactly is wrong with the new config in case of problems.
+        CfgMgr::instance().getStagingCfg()->applyLoggingCfg();
+
+        ConstElementPtr answer = server_->processConfig(config);
+
+        // Commit the configuration so any subsequent reconfigurations
+        // will only close the command channel if its configuration has
+        // changed.
+        CfgMgr::instance().commit();
+
+        ASSERT_TRUE(answer);
+
+        int status = 0;
+        ConstElementPtr txt = isc::config::parseAnswer(status, answer);
+        // This should succeed. If not, print the error message.
+        ASSERT_EQ(0, status) << txt->str();
+
+        // Now check that the socket was indeed open.
+        ASSERT_TRUE(HttpCommandMgr::instance().getHttpListener());
+    }
+
+    /// @brief Reset
+    void reset() override {
+        HttpCtrlDhcpv6Test::reset();
+    }
+
+    /// @brief Constructs a complete HTTP POST given a request body.
+    ///
+    /// @param request_body string containing the desired request body.
+    ///
+    /// @return string containing the constructed POST.
+    std::string buildPostStr(const std::string& request_body) {
+        // Create the command string.
+        std::stringstream ss;
+        ss << "POST /foo/bar HTTP/1.1\r\n"
+              "Content-Type: application/json\r\n"
+              "Content-Length: "
+              << request_body.size() << "\r\n\r\n"
+              << request_body;
+        return (ss.str());
+    }
+
+    /// @brief Create an HttpResponse from a response string.
+    ///
+    /// @param response_str a string containing the whole HTTP
+    /// response received.
+    ///
+    /// @return An HttpResponse constructed from by parsing the
+    /// response string.
+    HttpResponsePtr parseResponse(const std::string response_str) {
+        HttpResponsePtr hr(new HttpResponse());
+        HttpResponseParser parser(*hr);
+        parser.initModel();
+        parser.postBuffer(&response_str[0], response_str.size());
+        parser.poll();
+        if (!parser.httpParseOk()) {
+            isc_throw(Unexpected, "response_str: '" << response_str
+                      << "' failed to parse: " << parser.getErrorMessage());
+        }
+
+        return (hr);
+    }
+
+    /// @brief Conducts a command/response exchange via HttpCommandSocket
+    ///
+    /// This method connects to the given server over the given address/port.
+    /// If successful, it then sends the given command and retrieves the
+    /// server's response.  Note that it calls the server's receivePacket()
+    /// method where needed to cause the server to process IO events on
+    /// control channel the control channel sockets.
+    ///
+    /// @param command the command text to execute in JSON form.
+    /// @param response variable into which the received response should be
+    /// placed.
+    void sendHttpCommand(const std::string& command, std::string& response) {
+        response = "";
+        IOServicePtr io_service = getIOService();
+        ASSERT_TRUE(io_service);
+        boost::scoped_ptr<TestHttpClient> client;
+        client.reset(new TestHttpClient(io_service, SERVER_ADDRESS,
+                                        SERVER_PORT));
+        ASSERT_TRUE(client);
+
+        // Send the command. This will trigger server's handler which receives
+        // data over the unix domain socket. The server will start sending
+        // response to the client.
+        ASSERT_NO_THROW(client->startRequest(buildPostStr(command)));
+        runIOService();
+        ASSERT_TRUE(client->receiveDone());
+
+        // Read the response generated by the server.
+        HttpResponsePtr hr;
+        ASSERT_NO_THROW(hr = parseResponse(client->getResponse()));
+        response = hr->getBody();
+
+        // Now close client.
+        client->close();
+
+        ASSERT_NO_THROW(io_service->poll());
+    }
+
+    /// @brief Parse list answer.
+    ///
+    /// Clone of parseAnswer but taking the answer as a list and
+    /// decapulating it.
+    ///
+    /// @param rcode Return code.
+    /// @param msg_list The message to parse.
+    /// @return The optional argument in the message after decapsulation.
+    ConstElementPtr parseListAnswer(int &rcode,
+                                    const ConstElementPtr& msg_list) {
+        if (!msg_list) {
+            isc_throw(CtrlChannelError, "invalid answer: no answer specified");
+        }
+        if (msg_list->getType() != Element::list) {
+            isc_throw(CtrlChannelError, "invalid answer: expected toplevel "
+                      << "entry to be a list, got "
+                      << Element::typeToName(msg_list->getType())
+                      << " instead");
+        }
+        if (msg_list->size() != 1) {
+            isc_throw(CtrlChannelError, "invalid answer: expected toplevel "
+                      << "entry to be an one element list, got "
+                      << msg_list->size() << " long list instead");
+        }
+        ConstElementPtr msg = msg_list->get(0);
+        if (!msg) {
+            isc_throw(CtrlChannelError, "invalid answer: null element");
+        }
+        if (msg->getType() != Element::map) {
+            isc_throw(CtrlChannelError, "invalid answer: expected list of "
+                      << "one map, got list of one "
+                      << Element::typeToName(msg->getType())
+                      << " instead");
+        }
+        if (!msg->contains(CONTROL_RESULT)) {
+            isc_throw(CtrlChannelError, "invalid answer: does not contain "
+                      << "mandatory '" << CONTROL_RESULT << "'");
+        }
+
+        ConstElementPtr result = msg->get(CONTROL_RESULT);
+        if (result->getType() != Element::integer) {
+            isc_throw(CtrlChannelError, "invalid answer: expected '"
+                      << CONTROL_RESULT << "' to be an integer, got "
+                      << Element::typeToName(result->getType())
+                      << " instead");
+        }
+
+        rcode = result->intValue();
+
+        // If there are arguments, return them.
+        ConstElementPtr args = msg->get(CONTROL_ARGUMENTS);
+        if (args) {
+            return (args);
+        }
+
+        // There are no arguments, let's try to return just the text status.
+        return (msg->get(CONTROL_TEXT));
+    }
+
+    /// @brief Checks response for list-commands
+    ///
+    /// This method checks if the list-commands response is generally sane
+    /// and whether specified command is mentioned in the response.
+    ///
+    /// @param rsp response sent back by the server
+    /// @param command command expected to be on the list.
+    void checkListCommands(const ConstElementPtr& rsp, const std::string& command) {
+        ConstElementPtr params;
+        int status_code = -1;
+        EXPECT_NO_THROW(params = parseListAnswer(status_code, rsp));
+        EXPECT_EQ(CONTROL_RESULT_SUCCESS, status_code);
+        ASSERT_TRUE(params);
+        ASSERT_EQ(Element::list, params->getType());
+
+        int cnt = 0;
+        for (size_t i = 0; i < params->size(); ++i) {
+            string tmp = params->get(i)->stringValue();
+            if (tmp == command) {
+                // Command found, but that's not enough. Need to continue working
+                // through the list to see if there are no duplicates.
+                cnt++;
+            }
+        }
+
+        // Exactly one command on the list is expected.
+        EXPECT_EQ(1, cnt) << "Command " << command << " not found";
+    }
+
+    /// @brief Check if the answer for write-config command is correct
+    ///
+    /// @param response_txt response in text form (as read from the control socket)
+    /// @param exp_status expected status (0 success, 1 failure)
+    /// @param exp_txt for success cases this defines the expected filename,
+    ///                for failure cases this defines the expected error message
+    void checkConfigWrite(const std::string& response_txt, int exp_status,
+                          const std::string& exp_txt = "") {
+
+        ConstElementPtr rsp;
+        EXPECT_NO_THROW(rsp = Element::fromJSON(response_txt));
+        ASSERT_TRUE(rsp);
+
+        int status;
+        ConstElementPtr params = parseListAnswer(status, rsp);
+        EXPECT_EQ(exp_status, status);
+
+        if (exp_status == CONTROL_RESULT_SUCCESS) {
+            // Let's check couple things...
+
+            // The parameters must include filename
+            ASSERT_TRUE(params);
+            ASSERT_TRUE(params->get("filename"));
+            ASSERT_EQ(Element::string, params->get("filename")->getType());
+            EXPECT_EQ(exp_txt, params->get("filename")->stringValue());
+
+            // The parameters must include size. And the size
+            // must indicate some content.
+            ASSERT_TRUE(params->get("size"));
+            ASSERT_EQ(Element::integer, params->get("size")->getType());
+            int64_t size = params->get("size")->intValue();
+            EXPECT_LE(1, size);
+
+            // Now check if the file is really there and suitable for
+            // opening.
+            ifstream f(exp_txt, ios::binary | ios::ate);
+            ASSERT_TRUE(f.good());
+
+            // Now check that it is the correct size as reported.
+            EXPECT_EQ(size, static_cast<int64_t>(f.tellg()));
+
+            // Finally, check that it's really a JSON.
+            ElementPtr from_file = Element::fromJSONFile(exp_txt);
+            ASSERT_TRUE(from_file);
+        } else if (exp_status == CONTROL_RESULT_ERROR) {
+
+            // Let's check if the reason for failure was given.
+            ConstElementPtr text = rsp->get("text");
+            ASSERT_TRUE(text);
+            ASSERT_EQ(Element::string, text->getType());
+            EXPECT_EQ(exp_txt, text->stringValue());
+        } else {
+            ADD_FAILURE() << "Invalid expected status: " << exp_status;
+        }
+    }
+
+    /// @brief Handler for long command.
+    ///
+    /// It checks whether the received command is equal to the one specified
+    /// as an argument.
+    ///
+    /// @param expected_command String representing an expected command.
+    /// @param command_name Command name received by the handler.
+    /// @param arguments Command arguments received by the handler.
+    ///
+    /// @returns Success answer.
+    static ConstElementPtr
+    longCommandHandler(const std::string& expected_command,
+                       const std::string& command_name,
+                       const ConstElementPtr& arguments) {
+        // The handler is called with a command name and the structure holding
+        // command arguments. We have to rebuild the command from those
+        // two arguments so as it can be compared against expected_command.
+        ElementPtr entire_command = Element::createMap();
+        entire_command->set("command", Element::create(command_name));
+        entire_command->set("arguments", (arguments));
+
+        // The rebuilt command will have a different order of parameters so
+        // let's parse expected_command back to JSON to guarantee that
+        // both structures are built using the same order.
+        EXPECT_EQ(Element::fromJSON(expected_command)->str(),
+                  entire_command->str());
+        return (createAnswer(CONTROL_RESULT_SUCCESS, "long command received ok"));
+    }
+
+    /// @brief Command handler which generates long response
+    ///
+    /// This handler generates a large response (over 4kB). It includes
+    /// a list of randomly generated strings to make sure that the test
+    /// can catch out of order delivery.
+    static ConstElementPtr longResponseHandler(const std::string&,
+                                               const ConstElementPtr&) {
+        ElementPtr arguments = Element::createList();
+        for (unsigned i = 0; i < 800; ++i) { // was 80000 (400kB).
+            std::ostringstream s;
+            s << std::setw(5) << i;
+            arguments->add(Element::create(s.str()));
+        }
+        return (createAnswer(CONTROL_RESULT_SUCCESS, arguments));
+    }
+};
+
+// Tests that the server properly responds to invalid commands sent
+// via ControlChannel
+TEST_F(HttpCtrlChannelDhcpv6Test, controlChannelNegative) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"bogus\" }", response);
+    EXPECT_EQ("[ { \"result\": 2,"
+              " \"text\": \"'bogus' command not supported.\" } ]",
+              response);
+
+    sendHttpCommand("utter nonsense", response);
+    EXPECT_EQ("{ \"result\": 400, \"text\": \"Bad Request\" }", response);
+}
+
+// Tests that the server properly responds to shutdown command sent
+// via ControlChannel
+TEST_F(HttpCtrlChannelDhcpv6Test, controlChannelShutdown) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"shutdown\" }", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"Shutting down.\" } ]",response);
+}
+
+// Check that the "config-set" command will replace current configuration
+TEST_F(HttpCtrlChannelDhcpv6Test, configSet) {
+    createHttpChannelServer();
+
+    // Define strings to permutate the config arguments
+    // (Note the line feeds makes errors easy to find)
+    string set_config_txt = "{ \"command\": \"config-set\" \n";
+    string args_txt = " \"arguments\": { \n";
+    string dhcp6_cfg_txt =
+        "    \"Dhcp6\": { \n"
+        "        \"interfaces-config\": { \n"
+        "            \"interfaces\": [\"*\"] \n"
+        "        },   \n"
+        "        \"preferred-lifetime\": 3000, \n"
+        "        \"valid-lifetime\": 4000, \n"
+        "        \"renew-timer\": 1000, \n"
+        "        \"rebind-timer\": 2000, \n"
+        "        \"lease-database\": { \n"
+        "           \"type\": \"memfile\", \n"
+        "           \"persist\":false, \n"
+        "           \"lfc-interval\": 0  \n"
+        "        }, \n"
+        "        \"expired-leases-processing\": { \n"
+        "            \"reclaim-timer-wait-time\": 0, \n"
+        "            \"hold-reclaimed-time\": 0, \n"
+        "            \"flush-reclaimed-timer-wait-time\": 0 \n"
+        "        },"
+        "        \"subnet6\": [ \n";
+    string subnet1 =
+        "               {\"subnet\": \"3002::/64\", \"id\": 1, \n"
+        "                \"pools\": [{ \"pool\": \"3002::100-3002::200\" }]}\n";
+    string subnet2 =
+        "               {\"subnet\": \"3003::/64\", \"id\": 2, \n"
+        "                \"pools\": [{ \"pool\": \"3003::100-3003::200\" }]}\n";
+    string bad_subnet =
+        "               {\"comment\": \"3005::/64\", \"id\": 10, \n"
+        "                \"pools\": [{ \"pool\": \"3005::100-3005::200\" }]}\n";
+    string subnet_footer =
+        "          ] \n";
+    string option_def =
+        "    ,\"option-def\": [\n"
+        "    {\n"
+        "        \"name\": \"foo\",\n"
+        "        \"code\": 163,\n"
+        "        \"type\": \"uint32\",\n"
+        "        \"array\": false,\n"
+        "        \"record-types\": \"\",\n"
+        "        \"space\": \"dhcp6\",\n"
+        "        \"encapsulate\": \"\"\n"
+        "    }\n"
+        "]\n";
+    string option_data =
+        "    ,\"option-data\": [\n"
+        "    {\n"
+        "        \"name\": \"foo\",\n"
+        "        \"code\": 163,\n"
+        "        \"space\": \"dhcp6\",\n"
+        "        \"csv-format\": true,\n"
+        "        \"data\": \"12345\"\n"
+        "    }\n"
+        "]\n";
+    string control_socket =
+        "    ,\"control-socket\": { \n"
+        "       \"socket-type\": \"http\", \n"
+        "       \"socket-address\": \"::1\", \n"
+        "       \"socket-port\": 18126 \n"
+        "    } \n";
+    string logger_txt =
+        "       ,\"loggers\": [ { \n"
+        "            \"name\": \"kea\", \n"
+        "            \"severity\": \"FATAL\", \n"
+        "            \"output-options\": [{ \n"
+        "                \"output\": \"/dev/null\", \n"
+        "                \"maxsize\": 0"
+        "            }] \n"
+        "        }] \n";
+
+    std::ostringstream os;
+
+    // Create a valid config with all the parts should parse
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp6_cfg_txt
+        << subnet1
+        << subnet_footer
+        << option_def
+        << option_data
+        << control_socket
+        << logger_txt
+        << "}\n"                      // close dhcp6
+        << "}}";
+
+    // Send the config-set command
+    std::string response;
+    sendHttpCommand(os.str(), response);
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"BCE3D0CC68CBBB49C3F5967E3FFCB4E44E55CBFB53814761B12ADB5C7CD95C1F\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was indeed applied.
+    const Subnet6Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    OptionDefinitionPtr def =
+        LibDHCP::getRuntimeOptionDef(DHCP6_OPTION_SPACE, 163);
+    ASSERT_TRUE(def);
+
+    // Create a config with malformed subnet that should fail to parse.
+    os.str("");
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp6_cfg_txt
+        << bad_subnet
+        << subnet_footer
+        << control_socket
+        << "}\n"                      // close dhcp6
+        << "}}";
+
+    // Send the config-set command
+    sendHttpCommand(os.str(), response);
+
+    // Should fail with a syntax error
+    EXPECT_EQ("[ { \"result\": 1, "
+              "\"text\": \"subnet configuration failed: mandatory 'subnet' "
+              "parameter is missing for a subnet being configured "
+              "(<string>:21:17)\" } ]",
+              response);
+
+    // Check that the config was not lost
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    def = LibDHCP::getRuntimeOptionDef(DHCP6_OPTION_SPACE, 163);
+    ASSERT_TRUE(def);
+
+    // Create a valid config with two subnets and no command channel.
+    // It should succeed, client should still receive the response
+    os.str("");
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp6_cfg_txt
+        << subnet1
+        << ",\n"
+        << subnet2
+        << subnet_footer
+        << "}\n"                      // close dhcp6
+        << "}}";
+
+    // Verify the HTTP control channel socket exists.
+    EXPECT_TRUE(HttpCommandMgr::instance().getHttpListener());
+
+    // Send the config-set command.
+    sendHttpCommand(os.str(), response);
+
+    // Verify the HTTP control channel socket no longer exists.
+    ASSERT_NO_THROW(HttpCommandMgr::instance().garbageCollectListeners());
+    EXPECT_FALSE(HttpCommandMgr::instance().getHttpListener());
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"48035E8F9CC25FC1F6175B78CCC6B8A673CACBA9E956C0ED3079C478BF1F2D1A\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was not lost
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(2, subnets->size());
+
+    // Clean up after the test.
+    CfgMgr::instance().clear();
+}
+
+// Tests if the server returns its configuration using config-get.
+// Note there are separate tests that verify if toElement() called by the
+// config-get handler are actually converting the configuration correctly.
+TEST_F(HttpCtrlChannelDhcpv6Test, configGet) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"config-get\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // Ok, now roughly check if the response seems legit.
+    ASSERT_TRUE(cfg);
+    ASSERT_EQ(Element::map, cfg->getType());
+    EXPECT_TRUE(cfg->get("Dhcp6"));
+    EXPECT_TRUE(cfg->get("Dhcp6")->get("loggers"));
+}
+
+// Tests if the server returns the hash of its configuration using
+// config-hash-get.
+TEST_F(HttpCtrlChannelDhcpv6Test, configHashGet) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"config-hash-get\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr args = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+    // The parseListAnswer is trying to be smart with ignoring hash.
+    // But this time we really want to see the hash, so we'll retrieve
+    // the arguments manually.
+    args = rsp->get(0)->get(CONTROL_ARGUMENTS);
+
+    // Ok, now roughly check if the response seems legit.
+    ASSERT_TRUE(args);
+    ASSERT_EQ(Element::map, args->getType());
+    ConstElementPtr hash = args->get("hash");
+    ASSERT_TRUE(hash);
+    ASSERT_EQ(Element::string, hash->getType());
+    // SHA-256 -> 64 hex digits.
+    EXPECT_EQ(64, hash->stringValue().size());
+}
+
+// Verify that the "config-test" command will do what we expect.
+TEST_F(HttpCtrlChannelDhcpv6Test, configTest) {
+    createHttpChannelServer();
+
+    // Define strings to permutate the config arguments
+    // (Note the line feeds makes errors easy to find)
+    string set_config_txt = "{ \"command\": \"config-set\" \n";
+    string config_test_txt = "{ \"command\": \"config-test\" \n";
+    string args_txt = " \"arguments\": { \n";
+    string dhcp6_cfg_txt =
+        "    \"Dhcp6\": { \n"
+        "        \"interfaces-config\": { \n"
+        "            \"interfaces\": [\"*\"] \n"
+        "        },   \n"
+        "        \"preferred-lifetime\": 3000, \n"
+        "        \"valid-lifetime\": 4000, \n"
+        "        \"renew-timer\": 1000, \n"
+        "        \"rebind-timer\": 2000, \n"
+        "        \"lease-database\": { \n"
+        "           \"type\": \"memfile\", \n"
+        "           \"persist\":false, \n"
+        "           \"lfc-interval\": 0  \n"
+        "        }, \n"
+        "        \"expired-leases-processing\": { \n"
+        "            \"reclaim-timer-wait-time\": 0, \n"
+        "            \"hold-reclaimed-time\": 0, \n"
+        "            \"flush-reclaimed-timer-wait-time\": 0 \n"
+        "        },"
+        "        \"subnet6\": [ \n";
+    string subnet1 =
+        "               {\"subnet\": \"3002::/64\", \"id\": 1, \n"
+        "                \"pools\": [{ \"pool\": \"3002::100-3002::200\" }]}\n";
+    string subnet2 =
+        "               {\"subnet\": \"3003::/64\", \"id\": 2, \n"
+        "                \"pools\": [{ \"pool\": \"3003::100-3003::200\" }]}\n";
+    string bad_subnet =
+        "               {\"comment\": \"3005::/64\", \"id\": 10, \n"
+        "                \"pools\": [{ \"pool\": \"3005::100-3005::200\" }]}\n";
+    string subnet_footer =
+        "          ] \n";
+    string control_socket =
+        "    ,\"control-socket\": { \n"
+        "       \"socket-type\": \"http\", \n"
+        "       \"socket-address\": \"::1\", \n"
+        "       \"socket-port\": 18126 \n"
+        "    } \n";
+    string logger_txt =
+        "       ,\"loggers\": [ { \n"
+        "            \"name\": \"kea\", \n"
+        "            \"severity\": \"FATAL\", \n"
+        "            \"output-options\": [{ \n"
+        "                \"output\": \"/dev/null\", \n"
+        "                \"maxsize\": 0"
+        "            }] \n"
+        "        }] \n";
+
+    std::ostringstream os;
+
+    // Create a valid config with all the parts should parse
+    os << set_config_txt << ","
+        << args_txt
+        << dhcp6_cfg_txt
+        << subnet1
+        << subnet_footer
+        << control_socket
+        << logger_txt
+        << "}\n"                      // close dhcp6
+        << "}}";
+
+    // Send the config-set command
+    std::string response;
+    sendHttpCommand(os.str(), response);
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"DE129E7DD1C402721C83B74C5BBD7C330A0B705108A198CB868377031169BBC2\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was indeed applied.
+    const Subnet6Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    // Create a config with malformed subnet that should fail to parse.
+    os.str("");
+    os << config_test_txt << ","
+        << args_txt
+        << dhcp6_cfg_txt
+        << bad_subnet
+        << subnet_footer
+        << control_socket
+        << "}\n"                      // close dhcp6
+        << "}}";
+
+    // Send the config-test command
+    sendHttpCommand(os.str(), response);
+
+    // Should fail with a syntax error
+    EXPECT_EQ("[ { \"result\": 1, "
+              "\"text\": \"subnet configuration failed: mandatory 'subnet' "
+              "parameter is missing for a subnet being configured "
+              "(<string>:21:17)\" } ]",
+              response);
+
+    // Check that the config was not lost
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    // Create a valid config with two subnets and no command channel.
+    os.str("");
+    os << config_test_txt << ","
+        << args_txt
+        << dhcp6_cfg_txt
+        << subnet1
+        << ",\n"
+        << subnet2
+        << subnet_footer
+        << "}\n"                      // close dhcp6
+        << "}}";
+
+    // Verify the HTTP control channel socket exists.
+    EXPECT_TRUE(HttpCommandMgr::instance().getHttpListener());
+
+    // Send the config-test command.
+    sendHttpCommand(os.str(), response);
+
+    // Verify the HTTP control channel socket still exists.
+    ASSERT_NO_THROW(HttpCommandMgr::instance().garbageCollectListeners());
+    EXPECT_TRUE(HttpCommandMgr::instance().getHttpListener());
+
+    // Verify the configuration was successful.
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"Configuration seems sane. "
+              "Control-socket, hook-libraries, and D2 configuration were "
+              "sanity checked, but not applied.\" } ]",
+              response);
+
+    // Check that the config was not applied.
+    subnets = CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(1, subnets->size());
+
+    // Clean up after the test.
+    CfgMgr::instance().clear();
+}
+
+// This test verifies that the DHCP server handles version-get commands
+TEST_F(HttpCtrlChannelDhcpv6Test, getVersion) {
+    createHttpChannelServer();
+
+    std::string response;
+
+    // Send the version-get command
+    sendHttpCommand("{ \"command\": \"version-get\" }", response);
+    EXPECT_TRUE(response.find("\"result\": 0") != string::npos);
+    EXPECT_TRUE(response.find("log4cplus") != string::npos);
+    EXPECT_FALSE(response.find("GTEST_VERSION") != string::npos);
+
+    // Send the build-report command
+    sendHttpCommand("{ \"command\": \"build-report\" }", response);
+    EXPECT_TRUE(response.find("\"result\": 0") != string::npos);
+    EXPECT_TRUE(response.find("GTEST_VERSION") != string::npos);
+}
+
+// This test verifies that the DHCP server handles status-get commands
+TEST_F(HttpCtrlChannelDhcpv6Test, statusGet) {
+    createHttpChannelServer();
+
+    // start_ is initialized by init.
+    ASSERT_THROW(server_->init("/no/such/file"), BadValue);
+
+    std::string response_txt;
+
+    // Send the status-get command.
+    sendHttpCommand("{ \"command\": \"status-get\" }", response_txt);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_txt));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    EXPECT_EQ(2, response->size());
+    ConstElementPtr result = response->get("result");
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments = response->get("arguments");
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    // The returned pid should be the pid of our process.
+    auto found_pid = arguments->get("pid");
+    ASSERT_TRUE(found_pid);
+    EXPECT_EQ(static_cast<int64_t>(getpid()), found_pid->intValue());
+
+    // It is hard to check the actual uptime (and reload) as it is based
+    // on current time. Let's just make sure it is within a reasonable
+    // range.
+    auto found_uptime = arguments->get("uptime");
+    ASSERT_TRUE(found_uptime);
+    EXPECT_LE(found_uptime->intValue(), 5);
+    EXPECT_GE(found_uptime->intValue(), 0);
+
+    auto found_reload = arguments->get("reload");
+    ASSERT_TRUE(found_reload);
+    EXPECT_LE(found_reload->intValue(), 5);
+    EXPECT_GE(found_reload->intValue(), 0);
+
+    auto found_multi_threading = arguments->get("multi-threading-enabled");
+    ASSERT_TRUE(found_multi_threading);
+    EXPECT_TRUE(found_multi_threading->boolValue());
+
+    auto found_thread_count = arguments->get("thread-pool-size");
+    ASSERT_TRUE(found_thread_count);
+    // The default value varies between systems.
+    // Let's just make sure it's a positive value.
+    EXPECT_LE(0, found_thread_count->intValue());
+
+    auto found_queue_size = arguments->get("packet-queue-size");
+    ASSERT_TRUE(found_queue_size);
+    EXPECT_EQ(64, found_queue_size->intValue());
+
+    auto found_queue_stats = arguments->get("packet-queue-statistics");
+    ASSERT_TRUE(found_queue_stats);
+    EXPECT_FALSE(found_queue_stats->str().empty());
+
+    auto found_extended_info_tables = arguments->get("extended-info-tables");
+    ASSERT_TRUE(found_extended_info_tables);
+    EXPECT_FALSE(found_extended_info_tables->boolValue());
+
+    MultiThreadingMgr::instance().setMode(true);
+    MultiThreadingMgr::instance().setThreadPoolSize(4);
+    MultiThreadingMgr::instance().setPacketQueueSize(64);
+    sendHttpCommand("{ \"command\": \"status-get\" }", response_txt);
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_txt));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    EXPECT_EQ(2, response->size());
+    result = response->get("result");
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    arguments = response->get("arguments");
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    // The returned pid should be the pid of our process.
+    found_pid = arguments->get("pid");
+    ASSERT_TRUE(found_pid);
+    EXPECT_EQ(static_cast<int64_t>(getpid()), found_pid->intValue());
+
+    // It is hard to check the actual uptime (and reload) as it is based
+    // on current time. Let's just make sure it is within a reasonable
+    // range.
+    found_uptime = arguments->get("uptime");
+    ASSERT_TRUE(found_uptime);
+    EXPECT_LE(found_uptime->intValue(), 5);
+    EXPECT_GE(found_uptime->intValue(), 0);
+
+    found_reload = arguments->get("reload");
+    ASSERT_TRUE(found_reload);
+    EXPECT_LE(found_reload->intValue(), 5);
+    EXPECT_GE(found_reload->intValue(), 0);
+
+    found_multi_threading = arguments->get("multi-threading-enabled");
+    ASSERT_TRUE(found_multi_threading);
+    EXPECT_TRUE(found_multi_threading->boolValue());
+
+    found_thread_count = arguments->get("thread-pool-size");
+    ASSERT_TRUE(found_thread_count);
+    EXPECT_EQ(found_thread_count->intValue(), 4);
+
+    found_queue_size = arguments->get("packet-queue-size");
+    ASSERT_TRUE(found_queue_size);
+    EXPECT_EQ(found_queue_size->intValue(), 64);
+
+    found_queue_stats = arguments->get("packet-queue-statistics");
+    ASSERT_TRUE(found_queue_stats);
+    ASSERT_EQ(Element::list, found_queue_stats->getType());
+    EXPECT_EQ(3, found_queue_stats->size());
+}
+
+// Check that status is returned even if LeaseMgr and HostMgr are not created.
+TEST_F(HttpCtrlChannelDhcpv6Test, noManagers) {
+    // Send the status-get command.
+    createHttpChannelServer();
+    LeaseMgrFactory::destroy();
+    HostMgr::create();
+    string response_text;
+    sendHttpCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_text));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+}
+
+// Checks that socket status exists in status-get responses.
+TEST_F(HttpCtrlChannelDhcpv6Test, statusGetSockets) {
+    // Create dummy interfaces to test socket status.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+
+    // Send the status-get command.
+    createHttpChannelServer();
+    string response_text;
+    sendHttpCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_text));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("ready", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_FALSE(errors);
+}
+
+// Checks that socket status includes errors in status-get responses.
+TEST_F(HttpCtrlChannelDhcpv6Test, statusGetSocketsErrors) {
+    // Create dummy interfaces to test socket status and add a custom down interface.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+    test_config.addIface("down_interface", 4);
+    test_config.setIfaceFlags("down_interface", FlagLoopback(false), FlagUp(false),
+                              FlagRunning(true), FlagInactive4(false),
+                              FlagInactive6(false));
+
+    // Send the status-get command.
+    createHttpChannelServer();
+    string response_text;
+    sendHttpCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response_list;
+    ASSERT_NO_THROW(response_list = Element::fromJSON(response_text));
+    ASSERT_TRUE(response_list);
+    ASSERT_EQ(Element::list, response_list->getType());
+    EXPECT_EQ(1, response_list->size());
+    ConstElementPtr response = response_list->get(0);
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("failed", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_TRUE(errors);
+    ASSERT_EQ(Element::list, errors->getType());
+    ASSERT_EQ(1, errors->size());
+
+    ConstElementPtr error(errors->get(0));
+    ASSERT_TRUE(error);
+    ASSERT_EQ(Element::string, error->getType());
+    ASSERT_EQ("the interface down_interface is down", error->stringValue());
+}
+
+// This test verifies that the DHCP server handles server-tag-get command
+TEST_F(HttpCtrlChannelDhcpv6Test, serverTagGet) {
+    createHttpChannelServer();
+
+    std::string response;
+    std::string expected;
+
+    // Send the server-tag-get command
+    sendHttpCommand("{ \"command\": \"server-tag-get\" }", response);
+    expected = "[ { \"arguments\": { \"server-tag\": \"\" }, ";
+    expected += "\"result\": 0 } ]";
+    EXPECT_EQ(expected, response);
+
+    // Set a value to the server tag
+    CfgMgr::instance().getCurrentCfg()->setServerTag("foobar");
+
+    // Retry...
+    sendHttpCommand("{ \"command\": \"server-tag-get\" }", response);
+    expected = "[ { \"arguments\": { \"server-tag\": \"foobar\" }, ";
+    expected += "\"result\": 0 } ]";
+    EXPECT_EQ(expected, response);
+}
+
+// This test verifies that the DHCP server handles config-backend-pull command
+TEST_F(HttpCtrlChannelDhcpv6Test, configBackendPull) {
+    createHttpChannelServer();
+
+    std::string response;
+    std::string expected;
+
+    // Send the config-backend-pull command. Note there is no configured backed.
+    sendHttpCommand("{ \"command\": \"config-backend-pull\" }", response);
+    expected = "[ { \"result\": 3, \"text\": \"No config backend.\" } ]";
+    EXPECT_EQ(expected, response);
+}
+
+// This test verifies that the DHCP server immediately reclaims expired
+// leases on leases-reclaim command
+TEST_F(HttpCtrlChannelDhcpv6Test, controlLeasesReclaim) {
+    createHttpChannelServer();
+
+    // Create expired leases. Leases are expired by 40 seconds ago
+    // (valid lifetime = 60, cltt = now - 100).
+    DuidPtr duid0(new DUID(DUID::fromText("00:01:02:03:04:05:06").getDuid()));
+    Lease6Ptr lease0(new Lease6(Lease::TYPE_NA, IOAddress("3000::1"),
+                                duid0, 1, 50, 60, SubnetID(1)));
+    lease0->cltt_ = time(NULL) - 100;
+    DuidPtr duid1(new DUID(DUID::fromText("01:02:03:04:05:06:07").getDuid()));
+    Lease6Ptr lease1(new Lease6(Lease::TYPE_NA, IOAddress("3000::2"),
+                                duid1, 1, 50, 60, SubnetID(1)));
+    lease1->cltt_ = time(NULL) - 100;
+
+    // Add leases to the database.
+    LeaseMgr& lease_mgr = LeaseMgrFactory::instance();
+    ASSERT_NO_THROW(lease_mgr.addLease(lease0));
+    ASSERT_NO_THROW(lease_mgr.addLease(lease1));
+
+    // Make sure they have been added.
+    ASSERT_TRUE(lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::1")));
+    ASSERT_TRUE(lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::2")));
+
+    // No arguments
+    std::string response;
+    sendHttpCommand("{ \"command\": \"leases-reclaim\" }", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": "
+              "\"Missing mandatory 'remove' parameter.\" } ]",
+              response);
+
+    // Bad argument name
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"reclaim\": true } }", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": "
+              "\"Missing mandatory 'remove' parameter.\" } ]",
+              response);
+
+    // Bad remove argument type
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"remove\": \"bogus\" } }", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": "
+              "\"'remove' parameter expected to be a boolean.\" } ]",
+              response);
+
+    // Send the command
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"remove\": false } }", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"Reclamation of expired leases is complete.\" } ]",
+              response);
+
+    // Leases should be reclaimed, but not removed
+    ASSERT_NO_THROW(
+        lease0 = lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::1"))
+    );
+    ASSERT_NO_THROW(
+        lease1 = lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::2"))
+    );
+    ASSERT_TRUE(lease0);
+    ASSERT_TRUE(lease1);
+    EXPECT_TRUE(lease0->stateExpiredReclaimed());
+    EXPECT_TRUE(lease1->stateExpiredReclaimed());
+}
+
+// This test verifies that the DHCP server immediately reclaims expired
+// leases on leases-reclaim command with remove = true
+TEST_F(HttpCtrlChannelDhcpv6Test, controlLeasesReclaimRemove) {
+    createHttpChannelServer();
+
+    // Create expired leases. Leases are expired by 40 seconds ago
+    // (valid lifetime = 60, cltt = now - 100).
+    DuidPtr duid0(new DUID(DUID::fromText("00:01:02:03:04:05:06").getDuid()));
+    Lease6Ptr lease0(new Lease6(Lease::TYPE_NA, IOAddress("3000::1"),
+                                duid0, 1, 50, 60, SubnetID(1)));
+    lease0->cltt_ = time(NULL) - 100;
+    DuidPtr duid1(new DUID(DUID::fromText("01:02:03:04:05:06:07").getDuid()));
+    Lease6Ptr lease1(new Lease6(Lease::TYPE_NA, IOAddress("3000::2"),
+                                duid1, 1, 50, 60, SubnetID(1)));
+    lease1->cltt_ = time(NULL) - 100;
+
+    // Add leases to the database.
+    LeaseMgr& lease_mgr = LeaseMgrFactory::instance();
+    ASSERT_NO_THROW(lease_mgr.addLease(lease0));
+    ASSERT_NO_THROW(lease_mgr.addLease(lease1));
+
+    // Make sure they have been added.
+    ASSERT_TRUE(lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::1")));
+    ASSERT_TRUE(lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::2")));
+
+    // Send the command
+    std::string response;
+    sendHttpCommand("{ \"command\": \"leases-reclaim\", "
+                    "\"arguments\": { \"remove\": true } }", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"Reclamation of expired leases is complete.\" } ]",
+              response);
+
+    // Leases should have been removed.
+    ASSERT_NO_THROW(
+        lease0 = lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::1"))
+    );
+    ASSERT_NO_THROW(
+        lease1 = lease_mgr.getLease6(Lease::TYPE_NA, IOAddress("3000::2"))
+    );
+    ASSERT_FALSE(lease0);
+    ASSERT_FALSE(lease1);
+}
+
+// Tests that the server properly responds to statistics commands.  Note this
+// is really only intended to verify that the appropriate Statistics handler
+// is called based on the command.  It is not intended to be an exhaustive
+// test of Dhcpv6 statistics.
+TEST_F(HttpCtrlChannelDhcpv6Test, controlChannelStats) {
+    createHttpChannelServer();
+    std::string response;
+
+    // Check statistic-get
+    sendHttpCommand("{ \"command\" : \"statistic-get\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\" }}", response);
+    EXPECT_EQ("[ { \"arguments\": {  }, \"result\": 0 } ]", response);
+
+    // Check statistic-get-all
+    sendHttpCommand("{ \"command\" : \"statistic-get-all\", "
+                    "  \"arguments\": {}}", response);
+
+    std::set<std::string> initial_stats = {
+        "pkt6-received",
+        "pkt6-solicit-received",
+        "pkt6-advertise-received",
+        "pkt6-request-received",
+        "pkt6-reply-received",
+        "pkt6-renew-received",
+        "pkt6-rebind-received",
+        "pkt6-decline-received",
+        "pkt6-release-received",
+        "pkt6-infrequest-received",
+        "pkt6-dhcpv4-query-received",
+        "pkt6-dhcpv4-response-received",
+        "pkt6-unknown-received",
+        "pkt6-sent",
+        "pkt6-advertise-sent",
+        "pkt6-reply-sent",
+        "pkt6-dhcpv4-response-sent",
+        "pkt6-parse-failed",
+        "pkt6-receive-drop",
+        "v6-allocation-fail",
+        "v6-allocation-fail-shared-network",
+        "v6-allocation-fail-subnet",
+        "v6-allocation-fail-no-pools",
+        "v6-allocation-fail-classes",
+        "v6-ia-na-lease-reuses",
+        "v6-ia-pd-lease-reuses",
+    };
+
+    std::ostringstream s;
+    bool first = true;
+    s << "[ { \"arguments\": { ";
+    for (auto const& st : initial_stats) {
+        if (!first) {
+            s << ", ";
+        } else {
+            first = false;
+        }
+        s << "\"" << st << "\": [ [ 0, \"";
+        s << isc::util::clockToText(StatsMgr::instance().getObservation(st)->getInteger().second);
+        s << "\" ] ]";
+    }
+    s << " }, \"result\": 0 } ]";
+
+    auto stats_get_all = s.str();
+
+    EXPECT_EQ(stats_get_all, response);
+
+    // Check statistic-reset
+    sendHttpCommand("{ \"command\" : \"statistic-reset\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\" }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-reset-all
+    sendHttpCommand("{ \"command\" : \"statistic-reset-all\", "
+                    "  \"arguments\": {}}", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": "
+              "\"All statistics reset to neutral values.\" } ]",
+              response);
+
+    // Check statistic-remove
+    sendHttpCommand("{ \"command\" : \"statistic-remove\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\" }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-remove-all (deprecated)
+
+    // Check statistic-sample-age-set
+    sendHttpCommand("{ \"command\" : \"statistic-sample-age-set\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\", \"duration\": 1245 }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-sample-age-set-all
+    sendHttpCommand("{ \"command\" : \"statistic-sample-age-set-all\", "
+                    "  \"arguments\": {"
+                    "  \"duration\": 1245 }}", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"All statistics duration "
+              "limit are set.\" } ]",
+              response);
+
+    // Check statistic-sample-count-set
+    sendHttpCommand("{ \"command\" : \"statistic-sample-count-set\", "
+                    "  \"arguments\": {"
+                    "  \"name\":\"bogus\", \"max-samples\": 100 }}", response);
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"No 'bogus' statistic found\" } ]",
+              response);
+
+    // Check statistic-sample-count-set-all
+    sendHttpCommand("{ \"command\" : \"statistic-sample-count-set-all\", "
+                    "  \"arguments\": {"
+                    "  \"max-samples\": 100 }}", response);
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"All statistics count limit "
+              "are set.\" } ]",
+              response);
+}
+
+// Tests that the server properly responds to shutdown command sent
+// via ControlChannel
+TEST_F(HttpCtrlChannelDhcpv6Test, listCommands) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"list-commands\" }", response);
+
+    ConstElementPtr rsp;
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+
+    // We expect the server to report at least the following commands:
+    checkListCommands(rsp, "build-report");
+    checkListCommands(rsp, "config-backend-pull");
+    checkListCommands(rsp, "config-get");
+    checkListCommands(rsp, "config-hash-get");
+    checkListCommands(rsp, "config-reload");
+    checkListCommands(rsp, "config-set");
+    checkListCommands(rsp, "config-test");
+    checkListCommands(rsp, "config-write");
+    checkListCommands(rsp, "list-commands");
+    checkListCommands(rsp, "leases-reclaim");
+    checkListCommands(rsp, "version-get");
+    checkListCommands(rsp, "server-tag-get");
+    checkListCommands(rsp, "shutdown");
+    checkListCommands(rsp, "statistic-get");
+    checkListCommands(rsp, "statistic-get-all");
+    checkListCommands(rsp, "statistic-remove");
+    checkListCommands(rsp, "statistic-remove-all");
+    checkListCommands(rsp, "statistic-reset");
+    checkListCommands(rsp, "statistic-reset-all");
+    checkListCommands(rsp, "statistic-sample-age-set");
+    checkListCommands(rsp, "statistic-sample-age-set-all");
+    checkListCommands(rsp, "statistic-sample-count-set");
+    checkListCommands(rsp, "statistic-sample-count-set-all");
+}
+
+// Tests if config-write can be called without any parameters.
+TEST_F(HttpCtrlChannelDhcpv6Test, configWriteNoFilename) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set by the command line -c parameter.
+    server_->setConfigFile("test1.json");
+
+    // If the filename is not explicitly specified, the name used
+    // in -c command line switch is used.
+    sendHttpCommand("{ \"command\": \"config-write\" }", response);
+
+    checkConfigWrite(response, CONTROL_RESULT_SUCCESS, "test1.json");
+    ::remove("test1.json");
+}
+
+// Tests if config-write can be called with a valid filename as parameter.
+TEST_F(HttpCtrlChannelDhcpv6Test, configWriteFilename) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"config-write\", "
+                    "\"arguments\": { \"filename\": \"test2.json\" } }", response);
+
+    checkConfigWrite(response, CONTROL_RESULT_SUCCESS, "test2.json");
+    ::remove("test2.json");
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is missing.
+TEST_F(HttpCtrlChannelDhcpv6Test, configReloadMissingFile) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test6.json");
+
+    // Tell the server to reload its configuration. It should attempt to load
+    // test6.json (and fail, because the file is not there).
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    // Verify the reload was rejected.
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"Config reload failed: "
+              "configuration error using file 'test6.json': Unable to "
+              "open file test6.json\" } ]",
+              response);
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is not a valid JSON.
+TEST_F(HttpCtrlChannelDhcpv6Test, configReloadBrokenFile) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test7.json");
+
+    // Although Kea is smart, its AI routines are not smart enough to handle
+    // this one... at least not yet.
+    ofstream f("test7.json", ios::trunc);
+    f << "gimme some addrs, bro!";
+    f.close();
+
+    // Now tell Kea to reload its config.
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    // Verify the reload will fail.
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"Config reload failed: "
+              "configuration error using file 'test7.json': "
+              "test7.json:1.1: Invalid character: g\" } ]",
+              response);
+
+    ::remove("test7.json");
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is loaded correctly.
+TEST_F(HttpCtrlChannelDhcpv6Test, configReloadValid) {
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test8.json");
+
+    // Ok, enough fooling around. Let's create a valid config.
+    const std::string cfg_txt =
+        "{ \"Dhcp6\": {"
+        "    \"interfaces-config\": {"
+        "        \"interfaces\": [ \"*\" ]"
+        "    },"
+        "    \"subnet6\": ["
+        "        { \"subnet\": \"2001:db8:1::/64\", \"id\": 1 },"
+        "        { \"subnet\": \"2001:db8:2::/64\", \"id\": 2 }"
+        "     ],"
+        "    \"lease-database\": {"
+        "       \"type\": \"memfile\", \"persist\": false }"
+        "} }";
+    ofstream f("test8.json", ios::trunc);
+    f << cfg_txt;
+    f.close();
+
+    // This command should reload test8.json config.
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"2D97C398AFE8414A818D9F04C9ADB62D493861EDD3689015D081880D6A85A3C3\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+    EXPECT_NE(response.find("\"result\": 0"), std::string::npos);
+    EXPECT_NE(response.find("\"text\": \"Configuration successful.\""), std::string::npos);
+
+    // Check that the config was indeed applied.
+    const Subnet6Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(2, subnets->size());
+
+    ::remove("test8.json");
+}
+
+// Tests if config-reload attempts to reload a file and reports that the
+// file is loaded correctly.
+TEST_F(HttpCtrlChannelDhcpv6Test, configReloadDetectInterfaces) {
+    interfaces_ = "\"eth0\"";
+    IfacePtr eth0 = IfaceMgrTestConfig::createIface("eth0", ETH0_INDEX,
+                                                    "11:22:33:44:55:66");
+    auto detectIfaces = [&](bool update_only) {
+        if (!update_only) {
+            eth0->addAddress(IOAddress("10.0.0.1"));
+            eth0->addAddress(IOAddress("fe80::3a60:77ff:fed5:cdef"));
+            eth0->addAddress(IOAddress("2001:db8:1::1"));
+            IfaceMgr::instance().addInterface(eth0);
+        }
+        return (false);
+    };
+    IfaceMgr::instance().setDetectCallback(detectIfaces);
+    IfaceMgr::instance().clearIfaces();
+    IfaceMgr::instance().closeSockets();
+    IfaceMgr::instance().detectIfaces();
+    createHttpChannelServer();
+    std::string response;
+
+    // This is normally set to whatever value is passed to -c when the server is
+    // started, but we're not starting it that way, so need to set it by hand.
+    server_->setConfigFile("test8.json");
+
+    // Ok, enough fooling around. Let's create a valid config.
+    const std::string cfg_txt =
+        "{ \"Dhcp6\": {"
+        "    \"interfaces-config\": {"
+        "        \"interfaces\": [ \"eth1\" ]"
+        "    },"
+        "    \"subnet6\": ["
+        "        { \"subnet\": \"2001:db8:1::/64\", \"id\": 1 },"
+        "        { \"subnet\": \"2001:db8:2::/64\", \"id\": 2 }"
+        "     ],"
+        "    \"lease-database\": {"
+        "       \"type\": \"memfile\", \"persist\": false }"
+        "} }";
+    ofstream f("test8.json", ios::trunc);
+    f << cfg_txt;
+    f.close();
+
+    IfacePtr eth1 = IfaceMgrTestConfig::createIface("eth1", ETH1_INDEX,
+                                                    "AA:BB:CC:DD:EE:FF");
+    auto detectUpdateIfaces = [&](bool update_only) {
+        if (!update_only) {
+            eth1->addAddress(IOAddress("192.0.2.3"));
+            eth1->addAddress(IOAddress("fe80::3a60:77ff:fed5:abcd"));
+            eth1->addAddress(IOAddress("3001:db8:100::1"));
+            IfaceMgr::instance().addInterface(eth1);
+        }
+        return (false);
+    };
+    IfaceMgr::instance().setDetectCallback(detectUpdateIfaces);
+
+    // This command should reload test8.json config.
+    sendHttpCommand("{ \"command\": \"config-reload\" }", response);
+
+    EXPECT_EQ("[ { \"arguments\": { \"hash\": \"A3FB93A0D56418589F9368478403AA6164B94D907F3D7BA7FDF764AD58448611\" }, \"result\": 0, \"text\": \"Configuration successful.\" } ]",
+              response);
+
+    // Check that the config was indeed applied.
+    const Subnet6Collection* subnets =
+        CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll();
+    EXPECT_EQ(2, subnets->size());
+
+    ::remove("test8.json");
+}
+
+// This test verifies that disable DHCP service command performs sanity check on
+// parameters.
+TEST_F(HttpCtrlChannelDhcpv6Test, dhcpDisableBadParam) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"max-period\": -3"
+                    "    }"
+                    "}", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'max-period' must be positive "
+              "integer\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"foo\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: (empty string)\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"test\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: test\" } ]",
+              response);
+}
+
+// This test verifies if it is possible to disable DHCP service via command.
+TEST_F(HttpCtrlChannelDhcpv6Test, dhcpDisable) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"dhcp-disable\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::USER_COMMAND);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::USER_COMMAND);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"ha-partner\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::HA_REMOTE_COMMAND);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": 2001"
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::HA_REMOTE_COMMAND+1);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+// This test verifies if it is possible to disable DHCP service using
+// the origin-id.
+TEST_F(HttpCtrlChannelDhcpv6Test, dhcpDisableOriginId) {
+    createHttpChannelServer();
+    std::string response;
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": 2002,"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->enableService(NetworkState::HA_REMOTE_COMMAND+2);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+// This test verifies that it is possible to disable DHCP service for a short
+// period of time, after which the service is automatically enabled.
+TEST_F(HttpCtrlChannelDhcpv6Test, dhcpDisableTemporarily) {
+    createHttpChannelServer();
+    std::string response;
+
+    // Send a command to disable DHCP service for 3 seconds.
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-disable\","
+                    "    \"arguments\": {"
+                    "        \"max-period\": 3"
+                    "    }"
+                    "}", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // The service should be disabled.
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+    // And the timer should be scheduled which counts the time to automatic
+    // enabling of the service.
+    EXPECT_TRUE(server_->network_state_->isDelayedEnableService());
+}
+
+// This test verifies that enable DHCP service command performs sanity check on
+// parameters.
+TEST_F(HttpCtrlChannelDhcpv6Test, dhcpEnableBadParam) {
+    createHttpChannelServer();
+    std::string response;
+    ConstElementPtr rsp;
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": \"foo\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"'origin-id' argument must "
+              "be a number\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: (empty string)\" } ]",
+              response);
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"test\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    EXPECT_EQ("[ { \"result\": 1, \"text\": \"invalid value used for 'origin' "
+              "parameter: test\" } ]",
+              response);
+}
+
+// This test verifies if it is possible to enable DHCP service via command.
+TEST_F(HttpCtrlChannelDhcpv6Test, dhcpEnable) {
+    createHttpChannelServer();
+    std::string response;
+
+    sendHttpCommand("{ \"command\": \"dhcp-enable\" }", response);
+    ConstElementPtr rsp;
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    int status;
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->disableService(NetworkState::USER_COMMAND);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->disableService(NetworkState::HA_REMOTE_COMMAND);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": \"ha-partner\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+
+    server_->network_state_->disableService(NetworkState::HA_REMOTE_COMMAND+2);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin\": 2002"
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+// This test verifies if it is possible to enable DHCP service using
+// the origin-id.
+TEST_F(HttpCtrlChannelDhcpv6Test, dhcpEnableOriginId) {
+    createHttpChannelServer();
+    std::string response;
+
+    ConstElementPtr rsp;
+
+    int status;
+
+    // Disable the service using two distinct origins.
+    server_->network_state_->disableService(NetworkState::HA_REMOTE_COMMAND+1);
+    server_->network_state_->disableService(NetworkState::USER_COMMAND);
+
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    // Enable the service for the 'origin-id' of 2001. The 'origin' should
+    // be ignored.
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": 2001,"
+                    "        \"origin\": \"user\""
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    ConstElementPtr cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // The service should still be disabled.
+    EXPECT_FALSE(server_->network_state_->isServiceEnabled());
+
+    // Enable the service for the user command.
+    sendHttpCommand("{"
+                    "    \"command\": \"dhcp-enable\","
+                    "    \"arguments\": {"
+                    "        \"origin-id\": 1"
+                    "    }"
+                    "}", response);
+
+    // The response should be a valid JSON.
+    EXPECT_NO_THROW(rsp = Element::fromJSON(response));
+    ASSERT_TRUE(rsp);
+
+    cfg = parseListAnswer(status, rsp);
+    EXPECT_EQ(CONTROL_RESULT_SUCCESS, status);
+
+    // The service should be enabled.
+    EXPECT_TRUE(server_->network_state_->isServiceEnabled());
+}
+
+/// Verify that concurrent connections over the HTTP control channel can be
+/// established.
+TEST_F(HttpCtrlChannelDhcpv6Test, concurrentConnections) {
+    EXPECT_NO_THROW(createHttpChannelServer());
+
+    const size_t NB = 5;
+    vector<IOServicePtr> io_services;
+    vector<TestHttpClientPtr> clients;
+
+    // Create clients.
+    for (size_t i = 0; i < NB; ++i) {
+        IOServicePtr io_service(new IOService());
+        io_services.push_back(io_service);
+        TestHttpClientPtr client(new TestHttpClient(io_service, SERVER_ADDRESS,
+                                                    SERVER_PORT));
+        clients.push_back(client);
+    }
+    ASSERT_EQ(NB, io_services.size());
+    ASSERT_EQ(NB, clients.size());
+
+    // Send requests and receive responses.
+    atomic<size_t> terminated;
+    terminated = 0;
+    vector<thread> threads;
+    const string command = "{ \"command\": \"list-commands\" }";
+    for (size_t i = 0; i < NB; ++i) {
+        threads.push_back(thread([&, i] () {
+            TestHttpClientPtr client = clients[i];
+            ASSERT_TRUE(client);
+            client->startRequest(buildPostStr(command));
+            IOServicePtr io_service = io_services[i];
+            ASSERT_TRUE(io_service);
+            io_service->run();
+            ASSERT_TRUE(client->receiveDone());
+            HttpResponsePtr hr;
+            ASSERT_NO_THROW(hr = parseResponse(client->getResponse()));
+            string response = hr->getBody();
+            EXPECT_TRUE(response.find("\"result\": 0") != std::string::npos);
+            client->close();
+            ++terminated;
+        }));
+    }
+    ASSERT_EQ(NB, threads.size());
+
+    // Run the service IO services with a timeout.
+    IntervalTimer test_timer(getIOService());
+    bool timeout = false;
+    test_timer.setup([&timeout] () { timeout = true; },
+                     TEST_TIMEOUT, IntervalTimer::ONE_SHOT);
+    while (!timeout && (terminated < NB)) {
+        getIOService()->poll();
+    }
+    test_timer.cancel();
+    EXPECT_FALSE(timeout);
+
+    // Cleanup clients.
+    for (IOServicePtr io_service : io_services) {
+        io_service->stopAndPoll();
+    }
+    for (auto th = threads.begin(); th != threads.end(); ++th) {
+        th->join();
+    }
+}
+
+// This test verifies that the server can receive and process a large command.
+TEST_F(HttpCtrlChannelDhcpv6Test, longCommand) {
+
+    ostringstream command;
+
+    // This is the desired size of the command sent to the server (100kB).
+    // The actual size sent will be slightly greater than that.
+    const size_t command_size = 1024 * 100; // was 1024 * 1000 (1MB).
+
+    while (command.tellp() < command_size) {
+
+        // We're sending command 'foo' with arguments being a list of
+        // strings. If this is the first transmission, send command name
+        // and open the arguments list. Also insert the first argument
+        // so as all subsequent arguments can be prefixed with a comma.
+        if (command.tellp() == 0) {
+            command << "{ \"command\": \"foo\", \"arguments\": [ \"begin\"";
+
+        } else {
+            // Generate a random number and insert it into the stream as
+            // 10 digits long string.
+            ostringstream arg;
+            arg << setw(10) << std::rand();
+            // Append the argument in the command.
+            command << ", \"" << arg.str() << "\"\n";
+
+            // If we have hit the limit of the command size, close braces to
+            // get appropriate JSON.
+            if (command.tellp() > command_size) {
+                command << "] }";
+            }
+        }
+    }
+
+    ASSERT_NO_THROW(
+        CommandMgr::instance().registerCommand("foo",
+            std::bind(&HttpCtrlChannelDhcpv6Test::longCommandHandler,
+                      command.str(), ph::_1, ph::_2));
+    );
+
+    createHttpChannelServer();
+
+    string response;
+    ASSERT_NO_THROW(sendHttpCommand(command.str(), response));
+
+    EXPECT_EQ("[ { \"result\": 0, \"text\": \"long command received ok\" } ]",
+              response);
+}
+
+// This test verifies that the server can send long response to the client.
+TEST_F(HttpCtrlChannelDhcpv6Test, longResponse) {
+    // We need to generate large response. The simplest way is to create
+    // a command and a handler which will generate some static response
+    // of a desired size.
+    ASSERT_NO_THROW(
+        CommandMgr::instance().registerCommand("foo",
+            std::bind(&HttpCtrlChannelDhcpv6Test::longResponseHandler,
+                      ph::_1, ph::_2));
+    );
+
+    createHttpChannelServer();
+
+    // The entire response should be received but anayway check it.
+    ConstElementPtr raw_response =
+        longResponseHandler("foo", ConstElementPtr());
+    ElementPtr json_response = Element::createList();
+    json_response->add(isc::data::copy(raw_response));
+    string reference_response = json_response->str();
+
+    string response;
+    string command = "{ \"command\": \"foo\", \"arguments\": { }  }";
+    ASSERT_NO_THROW(sendHttpCommand(command, response));
+
+    // Make sure we have received correct response.
+    EXPECT_EQ(reference_response, response);
+}
+
+// This test verifies that the server signals timeout if the transmission
+// takes too long, having received no data from the client.
+TEST_F(HttpCtrlChannelDhcpv6Test, connectionTimeoutNoData) {
+    // Set connection timeout to 2s to prevent long waiting time for the
+    // timeout during this test.
+    const unsigned short timeout = 2000;
+    HttpCommandMgr::instance().setConnectionTimeout(timeout);
+
+    createHttpChannelServer();
+
+    string response;
+    ASSERT_NO_THROW(sendHttpCommand("{ \"command\": ", response));
+
+    EXPECT_EQ("{ \"result\": 400, \"text\": \"Bad Request\" }", response);
+}
+
+} // End of anonymous namespace