diff -uNr systemd-228/src/network/networkd-conf.c systemd-228-duid/src/network/networkd-conf.c
--- systemd-228/src/network/networkd-conf.c	2016-06-21 21:08:43.975661002 +0000
+++ systemd-228-duid/src/network/networkd-conf.c	2016-06-23 13:46:08.990634508 +0000
@@ -21,9 +21,11 @@
 
 #include <ctype.h>
 
+#include "alloc-util.h"
 #include "conf-parser.h"
 #include "def.h"
 #include "dhcp-identifier.h"
+#include "hexdecoct.h"
 #include "networkd-conf.h"
 #include "string-table.h"
 
@@ -32,7 +34,7 @@
 
         return config_parse_many(PKGSYSCONFDIR "/networkd.conf",
                                  CONF_PATHS_NULSTR("systemd/networkd.conf.d"),
-                                 "DUID\0",
+                                 "DHCP\0",
                                  config_item_perf_lookup, networkd_gperf_lookup,
                                  false, m);
 }
@@ -58,17 +60,13 @@
                 const char *rvalue,
                 void *data,
                 void *userdata) {
-        int r;
-        long byte;
-        char *cbyte, *pnext;
-        const char *pduid = rvalue;
-        size_t count = 0, duid_index = 0;
         Manager *m;
         Network *n;
         DUIDType *duid_type;
         uint16_t *dhcp_duid_type;
         size_t *dhcp_duid_len;
         uint8_t *dhcp_duid;
+        size_t count = 0;
 
         assert(filename);
         assert(lvalue);
@@ -90,66 +88,50 @@
                 dhcp_duid = n->dhcp_duid;
         }
 
-        if (*duid_type == _DUID_TYPE_INVALID)
-                *duid_type = DUID_TYPE_RAW;
-
-        switch (*duid_type) {
-        case DUID_TYPE_LLT:
-                /* RawData contains DUID-LLT link-layer address (offset 6) */
-                duid_index = 6;
-                break;
-        case DUID_TYPE_EN:
-                /* RawData contains DUID-EN identifier (offset 4) */
-                duid_index = 4;
-                break;
-        case DUID_TYPE_LL:
-                /* RawData contains DUID-LL link-layer address (offset 2) */
-                duid_index = 2;
-                break;
-        case DUID_TYPE_UUID:
-                /* RawData specifies UUID (offset 0) - fall thru */
-        case DUID_TYPE_RAW:
-                /* First two bytes of RawData is DUID Type - fall thru */
-        default:
-                break;
+        if ((*duid_type < DUID_TYPE_LLT) || (*duid_type > DUID_TYPE_UUID)) {
+                log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid DUID type, ignoring assignment: %s.", rvalue);
+                return 0;
         }
+        *dhcp_duid_type = (uint16_t)(*duid_type);
 
-        if (*duid_type != DUID_TYPE_RAW)
-                *dhcp_duid_type = (uint16_t)(*duid_type);
+        /* RawData contains DUID in format "NN:NN:NN..." */
+        for (;;) {
+                int n1, n2, len, r;
+                uint32_t byte;
+                _cleanup_free_ char *cbyte = NULL;
 
-        /* RawData contains DUID in format " NN:NN:NN... " */
-        while (true) {
-                r = extract_first_word(&pduid, &cbyte, ":", 0);
+                r = extract_first_word(&rvalue, &cbyte, ":", 0);
                 if (r < 0) {
-                        log_error("Failed to read DUID.");
-                        return -EINVAL;
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to read DUID, ignoring assignment: %s.", rvalue);
+                        return 0;
                 }
                 if (r == 0)
                         break;
-                if (duid_index >= MAX_DUID_LEN) {
-                        log_error("DUID length exceeds maximum length.");
-                        return -EINVAL;
+                if (count >= MAX_DUID_LEN) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Max DUID length exceeded, ignoring assignment: %s.", rvalue);
+                        return 0;
                 }
 
-                errno = 0;
-                byte = strtol(cbyte, &pnext, 16);
-                if ((errno == ERANGE && (byte == LONG_MAX || byte == LONG_MIN))
-                    || (errno != 0 && byte == 0) || (cbyte == pnext)) {
-                        log_error("Invalid DUID byte: %s.", cbyte);
-                        return -EINVAL; 
+                len = strlen(cbyte);
+                if (len != 1 && len != 2) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid length - DUID byte: %s, ignoring assignment: %s.", cbyte, rvalue);
+                        return 0;
                 }
-
-                /* If DUID_TYPE_RAW, first two bytes hold DHCP DUID type code */
-                if ((*duid_type == DUID_TYPE_RAW) && (count < 2)) {
-                        *dhcp_duid_type |= (byte << (8 * (1 - count)));
-                        count++;
-                        continue;
+                n1 = unhexchar(cbyte[0]);
+                if (len == 2)
+                        n2 = unhexchar(cbyte[1]);
+                else
+                        n2 = 0;
+
+                if (n1 < 0 || n2 < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid DUID byte: %s. Ignoring assignment: %s.", cbyte, rvalue);
+                        return 0;
                 }
 
-                dhcp_duid[duid_index++] = byte;
+                byte = ((uint8_t) n1 << (4 * (len-1))) | (uint8_t) n2;
+                dhcp_duid[count++] = byte;
         }
 
-        *dhcp_duid_len = duid_index;
-
+        *dhcp_duid_len = count;
         return 0;
 }
diff -uNr systemd-228/src/network/networkd-gperf.gperf systemd-228-duid/src/network/networkd-gperf.gperf
--- systemd-228/src/network/networkd-gperf.gperf	2016-06-21 21:08:43.975661002 +0000
+++ systemd-228-duid/src/network/networkd-gperf.gperf	2016-06-21 21:17:18.179685521 +0000
@@ -14,5 +14,5 @@
 %struct-type
 %includes
 %%
-DUID.Type,              config_parse_duid_type,                 0,                                  offsetof(Manager, duid_type)
-DUID.RawData,           config_parse_duid_rawdata,              DUID_CONFIG_SOURCE_GLOBAL,          offsetof(Manager, dhcp_duid)
+DHCP.DUIDType,              config_parse_duid_type,                 0,                                  offsetof(Manager, duid_type)
+DHCP.DUIDRawData,           config_parse_duid_rawdata,              DUID_CONFIG_SOURCE_GLOBAL,          offsetof(Manager, dhcp_duid)
diff -uNr systemd-228/src/network/networkd-network-gperf.gperf systemd-228-duid/src/network/networkd-network-gperf.gperf
--- systemd-228/src/network/networkd-network-gperf.gperf	2016-06-21 21:08:43.975661002 +0000
+++ systemd-228-duid/src/network/networkd-network-gperf.gperf	2016-06-21 21:16:14.571682488 +0000
@@ -27,9 +27,6 @@
 Match.Architecture,                     config_parse_net_condition,                     CONDITION_ARCHITECTURE,        offsetof(Network, match_arch)
 Link.MACAddress,                        config_parse_hwaddr,                            0,                             offsetof(Network, mac)
 Link.MTUBytes,                          config_parse_iec_size,                          0,                             offsetof(Network, mtu)
-Link.IAID,                              config_parse_iaid,                              0,                             offsetof(Network, iaid)
-DUID.Type,                              config_parse_duid_type,                         0,                             offsetof(Network, duid_type)
-DUID.RawData,                           config_parse_duid_rawdata,                      DUID_CONFIG_SOURCE_NETWORK,    offsetof(Network, dhcp_duid)
 Network.Description,                    config_parse_string,                            0,                             offsetof(Network, description)
 Network.Bridge,                         config_parse_netdev,                            0,                             offsetof(Network, bridge)
 Network.Bond,                           config_parse_netdev,                            0,                             offsetof(Network, bond)
@@ -82,6 +79,9 @@
 DHCP.VendorClassIdentifier,             config_parse_string,                            0,                             offsetof(Network, dhcp_vendor_class_identifier)
 DHCP.RouteMetric,                       config_parse_unsigned,                          0,                             offsetof(Network, dhcp_route_metric)
 DHCP.UseTimezone,                       config_parse_bool,                              0,                             offsetof(Network, dhcp_timezone)
+DHCP.DUIDType,                          config_parse_duid_type,                         0,                             offsetof(Network, duid_type)
+DHCP.DUIDRawData,                       config_parse_duid_rawdata,                      DUID_CONFIG_SOURCE_NETWORK,    offsetof(Network, dhcp_duid)
+DHCP.IAID,                              config_parse_iaid,                              0,                             offsetof(Network, iaid)
 DHCPServer.MaxLeaseTimeSec,             config_parse_sec,                               0,                             offsetof(Network, dhcp_server_max_lease_time_usec)
 DHCPServer.DefaultLeaseTimeSec,         config_parse_sec,                               0,                             offsetof(Network, dhcp_server_default_lease_time_usec)
 DHCPServer.EmitDNS,                     config_parse_bool,                              0,                             offsetof(Network, dhcp_server_emit_dns)
diff -uNr systemd-228/src/network/networkd-network.c systemd-228-duid/src/network/networkd-network.c
--- systemd-228/src/network/networkd-network.c	2016-06-21 21:08:43.975661002 +0000
+++ systemd-228-duid/src/network/networkd-network.c	2016-06-23 13:46:37.878635885 +0000
@@ -133,7 +133,6 @@
         r = config_parse(NULL, filename, file,
                          "Match\0"
                          "Link\0"
-                         "DUID\0"
                          "Network\0"
                          "Address\0"
                          "Route\0"