diff --git a/.dhcp.metadata b/.dhcp.metadata
new file mode 100644
index 0000000..5ad3be0
--- /dev/null
+++ b/.dhcp.metadata
@@ -0,0 +1 @@
+fb0417530e49368fe032cd9722f51c74f93180ac SOURCES/dhcp-4.3.6.tar.gz
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b16842b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/dhcp-4.3.6.tar.gz
diff --git a/SOURCES/11-dhclient b/SOURCES/11-dhclient
new file mode 100644
index 0000000..8bd0c75
--- /dev/null
+++ b/SOURCES/11-dhclient
@@ -0,0 +1,37 @@
+#!/bin/bash
+# run dhclient.d scripts in an emulated environment
+
+PATH=/bin:/usr/bin:/sbin
+ETCDIR=/etc/dhcp
+SAVEDIR=/var/lib/dhclient
+interface=$1
+
+for optname in "${!DHCP4_@}"; do
+    newoptname=${optname,,};
+    newoptname=new_${newoptname#dhcp4_};
+    export "${newoptname}"="${!optname}";
+done
+
+[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
+
+[ -f /etc/sysconfig/network-scripts/ifcfg-"${interface}" ] && \
+    . /etc/sysconfig/network-scripts/ifcfg-"${interface}"
+
+if [ -d $ETCDIR/dhclient.d ]; then
+    for f in $ETCDIR/dhclient.d/*.sh; do
+        if [ -x "${f}" ]; then
+            subsystem="${f%.sh}"
+            subsystem="${subsystem##*/}"
+            . "${f}"
+            if [ "$2" = "up" ]; then
+                "${subsystem}_config"
+            elif [ "$2" = "dhcp4-change" ]; then
+                if [ "$subsystem" = "chrony" -o "$subsystem" = "ntp" ]; then
+                    "${subsystem}_config"
+                fi
+            elif [ "$2" = "down" ]; then
+                "${subsystem}_restore"
+            fi
+        fi
+    done
+fi
diff --git a/SOURCES/12-dhcpd b/SOURCES/12-dhcpd
new file mode 100644
index 0000000..e75aa93
--- /dev/null
+++ b/SOURCES/12-dhcpd
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+INTERFACE=$1 # The interface which is brought up or down
+STATUS=$2 # The new state of the interface
+
+# whenever interface is brought up by NM (rhbz #565921)
+if [ "$STATUS" = "up" ]; then
+    # wait a few seconds to allow interface startup to complete
+    # (important at boot time without this the service still fails
+    # time-out for dispatcher script is 3s (rhbz#1003695#8)
+    sleep 2
+    # restart the services
+    # In case this dispatcher script is called several times in a short period of time, it might happen that
+    # systemd refuses to further restart the units. Therefore we use reset-failed command to prevent it.
+    systemctl -q is-enabled dhcpd.service && systemctl restart dhcpd.service && systemctl reset-failed dhcpd.service
+    systemctl -q is-enabled dhcpd6.service && systemctl restart dhcpd6.service && systemctl reset-failed dhcpd6.service
+fi
+
+exit 0
diff --git a/SOURCES/56dhclient b/SOURCES/56dhclient
new file mode 100644
index 0000000..7f185f1
--- /dev/null
+++ b/SOURCES/56dhclient
@@ -0,0 +1,61 @@
+#!/bin/sh
+# If we are running dhclient, shutdown running instances cleanly and
+# bring them back up on resume.
+
+. "${PM_FUNCTIONS}"
+
+PM_DHCLIENT_RUNDIR="${PM_UTILS_RUNDIR}/network"
+PM_DHCLIENT_SUSPEND="${PM_DHCLIENT_RUNDIR}/dhclient.suspend"
+
+suspend_dhclient() {
+    [ ! -d /etc/sysconfig/network-scripts ] && return
+    [ ! -x /sbin/ifdown ] && return
+
+    [ ! -d ${PM_DHCLIENT_RUNDIR} ] && /bin/mkdir -p ${PM_DHCLIENT_RUNDIR}
+    [ -f ${PM_DHCLIENT_SUSPEND} ] && /bin/rm -f ${PM_DHCLIENT_SUSPEND}
+
+    cd /etc/sysconfig/network-scripts
+    for ifcfg in ifcfg-* ; do
+        # Clear relevant parameters set by previous interface
+        # (lo doesn't set them)
+        NM_CONTROLLED=
+        BOOTPROTO=
+
+        . ./"${ifcfg}"
+
+        if [ "${NM_CONTROLLED}" = "no" ] || [ "${NM_CONTROLLED}" = "n" ] || [ "${NM_CONTROLLED}" = "false" ]; then
+            if [ "${BOOTPROTO}" = "bootp" ] || [ "${BOOTPROTO}" = "dhcp" ] || [ -z "${BOOTPROTO}" ]; then
+                # device is not NetworkManager controlled and uses dhcp,
+                # now see if it's actually up at the moment
+                /sbin/ip link show ${DEVICE} | /bin/grep -qE "state (UP|UNKNOWN)" >/dev/null 2>&1
+                if [ $? -eq 0 ]; then
+                    echo "${DEVICE}" >> ${PM_DHCLIENT_SUSPEND}
+                    /sbin/ifdown ${DEVICE}
+                fi
+            fi
+        fi
+    done
+}
+
+resume_dhclient() {
+    [ ! -f ${PM_DHCLIENT_SUSPEND} ] && return
+    [ ! -x /sbin/ifup ] && return
+
+    cd /etc/sysconfig/network-scripts
+    while read device ; do
+        /sbin/ifup ${device}
+    done < ${PM_DHCLIENT_SUSPEND}
+
+    /bin/rm -f ${PM_DHCLIENT_SUSPEND}
+}
+
+case "$1" in
+    hibernate|suspend)
+        suspend_dhclient
+        ;;
+    thaw|resume)
+        resume_dhclient
+        ;;
+    *) exit $NA
+        ;;
+esac
diff --git a/SOURCES/README.dhclient.d b/SOURCES/README.dhclient.d
new file mode 100644
index 0000000..6899aaa
--- /dev/null
+++ b/SOURCES/README.dhclient.d
@@ -0,0 +1,47 @@
+The /etc/dhcp/dhclient.d directory allows other packages and system
+administrators to create application-specific option handlers for dhclient.
+
+When dhclient is run, any option listed in the dhcp-options(5) man page can
+be requested.  dhclient-script does not handle every option available
+because doing so would make the script unmaintainable as the components
+using those options might change over time.  The knowledge of how to handle
+those options should be under the responsibility of the package maintainer
+for that component (e.g., NTP options belong in a handler in the ntp
+package).
+
+To make maintenance easier, application specific DHCP options can be handled
+by creating a bash script with two functions and placing it in /etc/dhcp/dhclient.d
+
+The script must follow a specific form:
+
+(1) The script must be named NAME.sh.  NAME can be anything, but it makes
+    sense to name it for the service it handles.  e.g., ntp.sh
+
+(2) The script must provide a NAME_config() function to read the options and
+    do whatever it takes to put those options in place.
+
+(3) The script must provide a NAME_restore() function to restore original
+    configuration state when dhclient stops.
+
+(4) The script must be 'chmod +x' or dhclient-script will ignore it.
+
+The scripts execute in the same environment as dhclient-script.  That means
+all of the functions and variables available to it are available to your
+NAME.sh script.  Things of note:
+
+    ${SAVEDIR} is where original configuration files are saved.  Save your
+    original configuration files here before you take the DHCP provided
+    values and generate new files.
+
+    Variables set in /etc/sysconfig/network, /etc/sysconfig/networking/network,
+    and /etc/sysconfig/network-scripts/ifcfg-$interface are available to
+    you.
+
+See the scripts in /etc/dhcp/dhclient.d for examples.
+
+NOTE:  Do not use functions defined in /usr/sbin/dhclient-script.  Consider
+dhclient-script a black box.  This script may change over time, so the
+dhclient.d scripts should not be using functions defined in it.
+
+-- 
+David Cantrell <dcantrell@redhat.com>
diff --git a/SOURCES/dhclient-script b/SOURCES/dhclient-script
new file mode 100644
index 0000000..5f58112
--- /dev/null
+++ b/SOURCES/dhclient-script
@@ -0,0 +1,975 @@
+#!/bin/bash
+#
+# dhclient-script: Network interface configuration script run by
+#                  dhclient based on DHCP client communication
+#
+# Copyright (C) 2008-2014  Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Author(s): David Cantrell <dcantrell@redhat.com>
+#            Jiri Popelka <jpopelka@redhat.com>
+#
+# ----------
+# This script is a rewrite/reworking on dhclient-script originally
+# included as part of dhcp-970306:
+# dhclient-script for Linux. Dan Halbert, March, 1997.
+# Updated for Linux 2.[12] by Brian J. Murrell, January 1999.
+# Modified by David Cantrell <dcantrell@redhat.com> for Fedora and RHEL
+# ----------
+#
+
+PATH=/bin:/usr/bin:/sbin
+# scripts in dhclient.d/ use $SAVEDIR (#833054)
+export SAVEDIR=/var/lib/dhclient
+
+LOGFACILITY="local7"
+LOGLEVEL="notice"
+
+ETCDIR="/etc/dhcp"
+
+RESOLVCONF="/etc/resolv.conf"
+
+logmessage() {
+    msg="${1}"
+    logger -p "${LOGFACILITY}.${LOGLEVEL}" -t "NET" "dhclient: ${msg}"
+}
+
+eventually_add_hostnames_domain_to_search() {
+# For the case when hostname for this machine has a domain that is not in domain_search list
+# 1) get a hostname with `ipcalc --hostname` or `hostnamectl --transient`
+# 2) get the domain from this hostname
+# 3) add this domain to search line in resolv.conf if it's not already
+#    there (domain list that we have recently added there is a parameter of this function)
+# We can't do this directly when generating resolv.conf in make_resolv_conf(), because
+# we need to first save the resolv.conf with obtained values before we can call `ipcalc --hostname`.
+# See bug 637763
+    search="${1}"
+    if need_hostname; then
+        status=1
+        OLD_HOSTNAME=$HOSTNAME
+        if [ -n "${new_ip_address}" ]; then
+            eval $(/usr/bin/ipcalc --silent --hostname "${new_ip_address}" ; echo "status=$?")
+        elif [ -n "${new_ip6_address}" ]; then
+            eval $(/usr/bin/ipcalc --silent --hostname "${new_ip6_address}" ; echo "status=$?")
+        fi
+
+        if [ ${status} -eq 0 ]; then
+            domain=$(echo "${HOSTNAME}" | cut -s -d "." -f 2-)
+        fi
+        HOSTNAME=$OLD_HOSTNAME
+    else
+          domain=$(hostnamectl --transient 2>/dev/null | cut -s -d "." -f 2-)
+    fi
+
+    if [ -n "${domain}" ] &&
+       [ ! "${domain}" = "localdomain" ] &&
+       [ ! "${domain}" = "localdomain6" ] &&
+       [ ! "${domain}" = "(none)" ] &&
+       [[ ! "${domain}" = *\ * ]]; then
+       is_in="false"
+       for s in ${search}; do
+           if [ "${s}" = "${domain}" ] ||
+              [ "${s}" = "${domain}." ]; then
+              is_in="true"
+           fi
+       done
+
+       if [ "${is_in}" = "false" ]; then
+           # Add domain name to search list (#637763)
+          sed -i -e "s/${search}/${search} ${domain}/" "${RESOLVCONF}"
+       fi
+    fi
+}
+
+make_resolv_conf() {
+    [ "${PEERDNS}" = "no" ] && return
+
+    if [ "${reason}" = "RENEW" ] &&
+       [ "${new_domain_name}" = "${old_domain_name}" ] &&
+       [ "${new_domain_name_servers}" = "${old_domain_name_servers}" ]; then
+        return
+    fi
+
+    if [ -n "${new_domain_name}" ] ||
+       [ -n "${new_domain_name_servers}" ] ||
+       [ -n "${new_domain_search}" ]; then
+        rscf="$(mktemp "${TMPDIR:-/tmp}/XXXXXX")"
+        [[ -z "${rscf}" ]] && return
+        echo "; generated by /usr/sbin/dhclient-script" > "${rscf}"
+
+        if [ -n "${SEARCH}" ]; then
+            search="${SEARCH}"
+        else
+            if [ -n "${new_domain_search}" ]; then
+                # Remove instaces of \032 (#450042)
+                search="${new_domain_search//\\032/ }"
+            elif [ -n "${new_domain_name}" ]; then
+                # Note that the DHCP 'Domain Name Option' is really just a domain
+                # name, and that this practice of using the domain name option as
+                # a search path is both nonstandard and deprecated.
+                search="${new_domain_name}"
+            fi
+        fi
+
+        if [ -n "${search}" ]; then
+            echo "search ${search}" >> "${rscf}"
+        fi
+
+        if [ -n "${RES_OPTIONS}" ]; then
+            echo "options ${RES_OPTIONS}" >> "${rscf}"
+        fi
+
+        if [ -n "${new_domain_name_servers}" ]; then
+            for nameserver in ${new_domain_name_servers} ; do
+                echo "nameserver ${nameserver}" >> "${rscf}"
+            done
+        else # keep 'old' nameservers
+            sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p "${RESOLVCONF}" >> "${rscf}"
+        fi
+
+        change_resolv_conf "${rscf}"
+        rm -f "${rscf}"
+
+        if [ -n "${search}" ]; then
+            eventually_add_hostnames_domain_to_search "${search}"
+        fi
+    elif [ -n "${new_dhcp6_name_servers}" ] ||
+         [ -n "${new_dhcp6_domain_search}" ]; then
+        rscf="$(mktemp "${TMPDIR:-/tmp}/XXXXXX")"
+        [[ -z "${rscf}" ]] && return
+        echo "; generated by /usr/sbin/dhclient-script" > "${rscf}"
+
+        if [ -n "${SEARCH}" ]; then
+            search="${SEARCH}"
+        else
+            if [ -n "${new_dhcp6_domain_search}" ]; then
+                search="${new_dhcp6_domain_search//\\032/ }"
+            fi
+        fi
+
+        if [ -n "${search}" ]; then
+            echo "search ${search}" >> "${rscf}"
+        fi
+
+        if [ -n "${RES_OPTIONS}" ]; then
+            echo "options ${RES_OPTIONS}" >> "${rscf}"
+        fi
+
+        shopt -s nocasematch
+        if [ -n "${new_dhcp6_name_servers}" ]; then
+            for nameserver in ${new_dhcp6_name_servers} ; do
+                # If the nameserver has a link-local address
+                # add a <zone_id> (interface name) to it.
+                if  [[ "$nameserver" =~ ^fe80:: ]]
+                then
+                    zone_id="%${interface}"
+                else
+                    zone_id=
+                fi
+                echo "nameserver ${nameserver}$zone_id" >> "${rscf}"
+            done
+        else # keep 'old' nameservers
+            sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p "${RESOLVCONF}" >> "${rscf}"
+        fi
+        shopt -u nocasematch
+
+        change_resolv_conf "${rscf}"
+        rm -f "${rscf}"
+
+        if [ -n "${search}" ]; then
+            eventually_add_hostnames_domain_to_search "${search}"
+        fi
+    fi
+}
+
+# run given script
+run_hook() {
+    local script
+    local exit_status
+    script="${1}"
+
+    if [ -f ${script} ]; then
+        . ${script}
+    fi
+
+    if [ -n "${exit_status}" ] && [ "${exit_status}" -ne 0 ]; then
+        logmessage "${script} returned non-zero exit status ${exit_status}"
+    fi
+
+    return ${exit_status}
+}
+
+# run scripts in given directory
+run_hookdir() {
+    local dir
+    dir="${1}"
+
+    if [ -d "${dir}" ]; then
+        for script in $(find $dir -executable ! -empty); do
+            run_hook ${script} || return $?
+        done
+    fi
+
+    return 0
+}
+
+exit_with_hooks() {
+    # Source the documented exit-hook script, if it exists
+    run_hook "${ETCDIR}/dhclient-exit-hooks" || exit $?
+    # Now run scripts in the hooks directory.
+    run_hookdir "${ETCDIR}/dhclient-exit-hooks.d" || exit $?
+
+    exit ${1}
+}
+
+quad2num() {
+    if [ $# -eq 4 ]; then
+        let n="${1} << 24 | ${2} << 16 | ${3} << 8 | ${4}"
+        echo "${n}"
+        return 0
+    else
+        echo "0"
+        return 1
+    fi
+}
+
+ip2num() {
+    IFS='.' quad2num ${1}
+}
+
+num2ip() {
+    let n="${1}"
+    let o1="(${n} >> 24) & 0xff"
+    let o2="(${n} >> 16) & 0xff"
+    let o3="(${n} >> 8) & 0xff"
+    let o4="${n} & 0xff"
+    echo "${o1}.${o2}.${o3}.${o4}"
+}
+
+get_network_address() {
+# get network address for the given IP address and (netmask or prefix)
+    ip="${1}"
+    nm="${2}"
+
+    if [ -n "${ip}" -a -n "${nm}" ]; then
+        if [[ "${nm}" = *.* ]]; then
+            ipcalc -s -n "${ip}" "${nm}" | cut -d '=' -f 2
+        else
+            ipcalc -s -n "${ip}/${nm}" | cut -d '=' -f 2
+        fi
+    fi
+}
+
+get_prefix() {
+# get prefix for the given IP address and mask
+    ip="${1}"
+    nm="${2}"
+
+    if [ -n "${ip}" -a -n "${nm}" ]; then
+        ipcalc -s -p "${ip}" "${nm}" | cut -d '=' -f 2
+    fi
+}
+
+class_bits() {
+    let ip=$(IFS='.' ip2num "${1}")
+    let bits=32
+    let mask='255'
+    for ((i=0; i <= 3; i++, 'mask<<=8')); do
+        let v='ip&mask'
+        if [ "$v" -eq 0 ] ; then
+             let bits-=8
+        else
+             break
+        fi
+    done
+    echo $bits
+}
+
+is_router_reachable() {
+    # handle DHCP servers that give us a router not on our subnet
+    router="${1}"
+    routersubnet="$(get_network_address "${router}" "${new_subnet_mask}")"
+    mysubnet="$(get_network_address "${new_ip_address}" "${new_subnet_mask}")"
+
+    if [ ! "${routersubnet}" = "${mysubnet}" ]; then
+        # TODO: This function should not have side effects such as adding or
+        # removing routes. Can this be done with "ip route get" or similar
+        # instead? Are there cases that rely on this route being created here?
+        ip -4 route replace "${router}/32" dev "${interface}"
+        if [ "$?" -ne 0 ]; then
+            logmessage "failed to create host route for ${router}"
+            return 1
+        fi
+    fi
+
+    return 0
+}
+
+add_default_gateway() {
+    router="${1}"
+
+    if is_router_reachable "${router}" ; then
+        if [ $# -gt 1 ] && [ -n "${2}" ] && [[ "${2}" -gt 0 ]]; then
+            ip -4 route replace default via "${router}" dev "${interface}" metric "${2}"
+        else
+            ip -4 route replace default via "${router}" dev "${interface}"
+        fi
+        if [ $? -ne 0 ]; then
+            logmessage "failed to create default route: ${router} dev ${interface} ${metric}"
+            return 1
+        else
+            return 0
+        fi
+    fi
+
+    return 1
+}
+
+execute_client_side_configuration_scripts() {
+# execute any additional client side configuration scripts we have
+    if [ "${1}" == "config" ] || [ "${1}" == "restore" ]; then
+        for f in ${ETCDIR}/dhclient.d/*.sh ; do
+            if [ -x "${f}" ]; then
+                subsystem="${f%.sh}"
+                subsystem="${subsystem##*/}"
+                . "${f}"
+                "${subsystem}_${1}"
+            fi
+        done
+    fi
+}
+
+flush_dev() {
+# Instead of bringing the interface down (#574568)
+# explicitly clear ARP cache and flush all addresses & routes.
+    ip -4 addr flush dev "${1}" >/dev/null 2>&1
+    ip -4 route flush dev "${1}" >/dev/null 2>&1
+    ip -4 neigh flush dev "${1}" >/dev/null 2>&1
+}
+
+remove_old_addr() {
+    if [ -n "${old_ip_address}" ]; then
+        if [ -n "${old_prefix}" ]; then
+            ip -4 addr del "${old_ip_address}/${old_prefix}" dev "${interface}" >/dev/null 2>&1
+        else
+            ip -4 addr del "${old_ip_address}" dev "${interface}" >/dev/null 2>&1
+        fi
+    fi
+}
+
+dhconfig() {
+    if [ -n "${old_ip_address}" ] && [ -n "${alias_ip_address}" ] &&
+       [ ! "${alias_ip_address}" = "${old_ip_address}" ]; then
+        # possible new alias, remove old alias first
+        ip -4 addr del "${old_ip_address}" dev "${interface}" label "${interface}:0"
+    fi
+
+    if [ -n "${old_ip_address}" ] &&
+       [ ! "${old_ip_address}" = "${new_ip_address}" ]; then
+        # IP address changed. Delete all routes, and clear the ARP cache.
+        flush_dev "${interface}"
+    fi
+
+    # make sure the interface is up
+    ip link set dev "${interface}" up
+
+    # replace = add if it doesn't exist or override (update lifetimes) if it's there
+    ip -4 addr replace "${new_ip_address}/${new_prefix}" broadcast "${new_broadcast_address}" dev "${interface}" \
+       valid_lft "${new_dhcp_lease_time}" preferred_lft "${new_dhcp_lease_time}" >/dev/null 2>&1
+
+    if [ "${reason}" = "BOUND" ] || [ "${reason}" = "REBOOT" ] ||
+       [ ! "${old_ip_address}" = "${new_ip_address}" ] ||
+       [ ! "${old_subnet_mask}" = "${new_subnet_mask}" ] ||
+       [ ! "${old_network_number}" = "${new_network_number}" ] ||
+       [ ! "${old_broadcast_address}" = "${new_broadcast_address}" ] ||
+       [ ! "${old_routers}" = "${new_routers}" ] ||
+       [ ! "${old_interface_mtu}" = "${new_interface_mtu}" ]; then
+
+        # The 576 MTU is only used for X.25 and dialup connections
+        # where the admin wants low latency.  Such a low MTU can cause
+        # problems with UDP traffic, among other things.  As such,
+        # disallow MTUs from 576 and below by default, so that broken
+        # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc).
+        if [ -n "${new_interface_mtu}" ] && [ "${new_interface_mtu}" -gt 576 ]; then
+            ip link set dev "${interface}" mtu "${new_interface_mtu}"
+        fi
+
+        # static routes
+        if [ -n "${new_classless_static_routes}" ] ||
+           [ -n "${new_static_routes}" ]; then
+            if [ -n "${new_classless_static_routes}" ]; then
+                IFS=', |' static_routes=(${new_classless_static_routes})
+                # If the DHCP server returns both a Classless Static Routes option and
+                # a Router option, the DHCP client MUST ignore the Router option. (RFC3442)
+                new_routers=""
+            else
+                IFS=', |' static_routes=(${new_static_routes})
+            fi
+            route_targets=()
+
+            for((i=0; i<${#static_routes[@]}; i+=2)); do
+                target=${static_routes[$i]}
+                if [ -n "${new_classless_static_routes}" ]; then
+                    if [ "${target}" = "0" ]; then
+                        new_routers="${static_routes[$i+1]}"
+                        continue
+                    else
+                        prefix=${target%%.*}
+                        target=${target#*.}
+                        IFS="." target_arr=(${target})
+                        unset IFS
+                        ((pads=4-${#target_arr[@]}))
+                        for j in $(seq $pads); do
+                            target="${target}.0"
+                        done
+
+                        # Client MUST zero any bits in the subnet number where the corresponding bit in the mask is zero.
+                        # In other words, the subnet number installed in the routing table is the logical AND of
+                        # the subnet number and subnet mask given in the Classless Static Routes option. (RFC3442)
+                        target="$(get_network_address "${target}" "${prefix}")"
+                    fi
+                else
+                    prefix=$(class_bits "${target}")
+                fi
+                gateway=${static_routes[$i+1]}
+
+                # special case 0.0.0.0 to allow static routing for link-local addresses
+                # (including IPv4 multicast) which will not have a next-hop (#769463, #787318)
+                if [ "${gateway}" = "0.0.0.0" ]; then
+                    valid_gateway=0
+                    scope='scope link'
+                else
+                    is_router_reachable "${gateway}"
+                    valid_gateway=$?
+                    scope=''
+                fi
+                if [ "${valid_gateway}" -eq 0 ]; then
+                    metric=''
+                    for t in "${route_targets[@]}"; do
+                        if [ "${t}" = "${target}" ]; then
+                            if [ -z "${metric}" ]; then
+                                metric=1
+                            else
+                                ((metric=metric+1))
+                            fi
+                        fi
+                    done
+
+                    if [ -n "${metric}" ]; then
+                        metric="metric ${metric}"
+                    fi
+
+                    ip -4 route replace "${target}/${prefix}" proto static via "${gateway}" dev "${interface}" ${metric} ${scope}
+
+                    if [ $? -ne 0 ]; then
+                        logmessage "failed to create static route: ${target}/${prefix} via ${gateway} dev ${interface} ${metric}"
+                    else
+                        route_targets=(${route_targets[@]} ${target})
+                    fi
+                fi
+            done
+        fi
+
+        # gateways
+        if [[ ( "${DEFROUTE}" != "no" ) &&
+              (( -z "${GATEWAYDEV}" ) || ( "${GATEWAYDEV}" = "${interface}" )) ]]; then
+            if [[ ( -z "${GATEWAY}" ) ||
+                  (( -n "${DHCLIENT_IGNORE_GATEWAY}" ) && ( "${DHCLIENT_IGNORE_GATEWAY}" = [Yy]* )) ]]; then
+                metric="${METRIC:-}"
+                let i="${METRIC:-0}"
+                default_routers=()
+
+                for router in ${new_routers} ; do
+                    added_router=-
+
+                    for r in "${default_routers[@]}" ; do
+                        if [ "${r}" = "${router}" ]; then
+                            added_router=1
+                        fi
+                    done
+
+                    if [ -z "${router}" ] ||
+                       [ "${added_router}" = "1" ] ||
+                       [ "$(IFS='.' ip2num ${router})" -le 0 ] ||
+                       [[ ( "${router}" = "${new_broadcast_address}" ) &&
+                          ( "${new_subnet_mask}" != "255.255.255.255" ) ]]; then
+                        continue
+                    fi
+
+                    default_routers=(${default_routers[@]} ${router})
+                    add_default_gateway "${router}" "${metric}"
+                    let i=i+1
+                    metric=${i}
+                done
+            elif [ -n "${GATEWAY}" ]; then
+                routersubnet=$(get_network_address "${GATEWAY}" "${new_subnet_mask}")
+                mysubnet=$(get_network_address "${new_ip_address}" "${new_subnet_mask}")
+
+                if [ "${routersubnet}" = "${mysubnet}" ]; then
+                    ip -4 route replace default via "${GATEWAY}" dev "${interface}"
+                fi
+            fi
+        fi
+    fi
+
+    if [ ! "${new_ip_address}" = "${alias_ip_address}" ] &&
+       [ -n "${alias_ip_address}" ]; then
+        # Reset the alias address (fix: this should really only do this on changes)
+        ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
+        ip -4 addr replace "${alias_ip_address}/${alias_prefix}" broadcast "${alias_broadcast_address}" dev "${interface}" label "${interface}:0"
+        ip -4 route replace "${alias_ip_address}/32" dev "${interface}"
+    fi
+
+    # After dhclient brings an interface UP with a new IP address, subnet mask, 
+    # and routes, in the REBOOT/BOUND states -> search for "dhclient-up-hooks".
+    if [ "${reason}" = "BOUND" ] || [ "${reason}" = "REBOOT" ] ||
+       [ ! "${old_ip_address}" = "${new_ip_address}" ] ||
+       [ ! "${old_subnet_mask}" = "${new_subnet_mask}" ] ||
+       [ ! "${old_network_number}" = "${new_network_number}" ] ||
+       [ ! "${old_broadcast_address}" = "${new_broadcast_address}" ] ||
+       [ ! "${old_routers}" = "${new_routers}" ] ||
+       [ ! "${old_interface_mtu}" = "${new_interface_mtu}" ]; then
+
+        if [ -x "${ETCDIR}/dhclient-${interface}-up-hooks" ]; then
+            . "${ETCDIR}/dhclient-${interface}-up-hooks"
+        elif [ -x ${ETCDIR}/dhclient-up-hooks ]; then
+            . ${ETCDIR}/dhclient-up-hooks
+        fi
+    fi
+
+    make_resolv_conf
+
+    if [ -n "${new_host_name}" ] && need_hostname; then
+        hostnamectl set-hostname --transient --no-ask-password "${new_host_name}"
+    fi
+
+    if [[ ( "${DHCP_TIME_OFFSET_SETS_TIMEZONE}" = [yY1]* ) &&
+          ( -n "${new_time_offset}" ) ]]; then
+        # DHCP option "time-offset" is requested by default and should be
+        # handled.  The geographical zone abbreviation cannot be determined
+        # from the GMT offset, but the $ZONEINFO/Etc/GMT$offset file can be
+        # used - note: this disables DST.
+        ((z=new_time_offset/3600))
+        ((hoursWest=$(printf '%+d' $z)))
+
+        if (( $hoursWest < 0 )); then
+            # tzdata treats negative 'hours west' as positive 'gmtoff'!
+            ((hoursWest*=-1))
+        fi
+
+        tzfile=/usr/share/zoneinfo/Etc/GMT$(printf '%+d' ${hoursWest})
+        if [ -e "${tzfile}" ]; then
+            cp -fp "${tzfile}" /etc/localtime
+            touch /etc/localtime
+        fi
+    fi
+
+    execute_client_side_configuration_scripts "config"
+}
+
+wait_for_link_local() {
+    # we need a link-local address to be ready (not tentative)
+    for i in $(seq 50); do
+        linklocal=$(ip -6 addr show dev "${interface}" scope link)
+        # tentative flag means DAD is still not complete
+        tentative=$(echo "${linklocal}" | grep tentative)
+        [[ -n "${linklocal}" && -z "${tentative}" ]] && exit_with_hooks 0
+        sleep 0.1
+    done
+}
+
+# Section 18.1.8. (Receipt of Reply Messages) of RFC 3315 says:
+# The client SHOULD perform duplicate address detection on each of
+# the addresses in any IAs it receives in the Reply message before
+# using that address for traffic.
+add_ipv6_addr_with_DAD() {
+            ip -6 addr replace "${new_ip6_address}/${new_ip6_prefixlen}" \
+                dev "${interface}" scope global valid_lft "${new_max_life}" \
+                                          preferred_lft "${new_preferred_life}"
+
+            # repeatedly test whether newly added address passed
+            # duplicate address detection (DAD)
+            for i in $(seq 5); do
+                sleep 1 # give the DAD some time
+
+                addr=$(ip -6 addr show dev "${interface}" \
+                       | grep "${new_ip6_address}/${new_ip6_prefixlen}")
+
+                # tentative flag == DAD is still not complete
+                tentative=$(echo "${addr}" | grep tentative)
+                # dadfailed flag == address is already in use somewhere else
+                dadfailed=$(echo "${addr}" | grep dadfailed)
+
+                if [ -n "${dadfailed}" ] ; then
+                    # address was added with valid_lft/preferred_lft 'forever', remove it
+                    ip -6 addr del "${new_ip6_address}/${new_ip6_prefixlen}" dev "${interface}"
+                    exit_with_hooks 3
+                fi
+                if [ -z "${tentative}" ] ; then
+                    if [ -n "${addr}" ]; then
+                        # DAD is over
+                        return 0
+                    else
+                        # address was auto-removed (or not added at all)
+                        exit_with_hooks 3
+                    fi
+                fi
+            done
+            return 0
+}
+
+dh6config() {
+    if [ -n "${old_ip6_prefix}" ] ||
+       [ -n "${new_ip6_prefix}" ]; then
+        echo "Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix}"
+        exit_with_hooks 0
+    fi
+
+    case "${reason}" in
+        BOUND6)
+            if [ -z "${new_ip6_address}" ] ||
+               [ -z "${new_ip6_prefixlen}" ]; then
+                exit_with_hooks 2
+            fi
+
+            add_ipv6_addr_with_DAD
+
+            make_resolv_conf
+            ;;
+
+        RENEW6|REBIND6)
+            if [[ -n "${new_ip6_address}" ]] &&
+               [[ -n "${new_ip6_prefixlen}" ]]; then
+               if [[  ! "${new_ip6_address}" = "${old_ip6_address}" ]]; then
+                   [[ -n "${old_ip6_address}" ]] && ip -6 addr del "${old_ip6_address}" dev "${interface}"
+               fi
+               # call it even if new_ip6_address = old_ip6_address to update lifetimes
+               add_ipv6_addr_with_DAD
+            fi
+
+            if [ ! "${new_dhcp6_name_servers}" = "${old_dhcp6_name_servers}" ] ||
+               [ ! "${new_dhcp6_domain_search}" = "${old_dhcp6_domain_search}" ]; then
+                make_resolv_conf
+            fi
+            ;;
+
+        DEPREF6)
+            if [ -z "${new_ip6_prefixlen}" ]; then
+                exit_with_hooks 2
+            fi
+
+            ip -6 addr change "${new_ip6_address}/${new_ip6_prefixlen}" \
+                dev "${interface}" scope global preferred_lft 0
+            ;;
+    esac
+
+    execute_client_side_configuration_scripts "config"
+}
+
+# Functions from /etc/sysconfig/network-scripts/network-functions
+
+need_hostname ()
+{
+    CHECK_HOSTNAME=$(hostnamectl --transient)
+    if [[ "${CHECK_HOSTNAME}" = "(none)" ]] ||
+       [[ "${CHECK_HOSTNAME}" = "localhost" ]] ||
+       [[ "${CHECK_HOSTNAME}" = "localhost.localdomain" ]]; then
+        return 0
+    else
+        return 1
+    fi
+}
+
+# Takes one argument - temporary resolv.conf file
+change_resolv_conf ()
+{
+    options=$(grep '^[\ \	]*option' "${RESOLVCONF}" 2>/dev/null);
+    if [[ -n "${options}" ]]; then
+       # merge options from existing resolv.conf with specified resolv.conf content
+       newres="${options}"$'\n'$(grep -vF "${options}" "${1}");
+    else
+       newres=$(cat "${1}");
+    fi;
+
+    eval $(echo "${newres}" > "${RESOLVCONF}"; echo "status=$?")
+    if [[ $status -eq 0 ]]; then
+        logger -p local7.notice -t "NET" -i "${0} : updated ${RESOLVCONF}";
+        [[ -e /var/run/nscd/socket ]] && /usr/sbin/nscd -i hosts; # invalidate cache
+    fi;
+    return $status;
+}
+
+get_config_by_name ()
+{
+    LANG=C grep -E -i -l \
+        "^[[:space:]]*NAME=\"(Auto |System )?${1}\"" \
+        /etc/sysconfig/network-scripts/ifcfg-* \
+        | LC_ALL=C sed -e "$__sed_discard_ignored_files"
+}
+
+get_hwaddr ()
+{
+    if [ -f /sys/class/net/${1}/address ]; then
+        awk '{ print toupper($0) }' < /sys/class/net/${1}/address
+    elif [ -d "/sys/class/net/${1}" ]; then
+        LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \
+            awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/,
+                                        "\\1", 1)); }'
+    fi
+}
+
+validate_resolv_conf()
+{
+    # It's possible to have broken symbolic link $RESOLVCONF -> <some_nm_dir>
+    # https://bugzilla.redhat.com/1475279
+    # Remove broken link and hope NM will survive
+    if [ -h "${RESOLVCONF}" -a ! -e "${RESOLVCONF}" ];
+    then
+        logmessage "${RESOLVCONF} is broken symlink. Recreating..."
+        unlink "${RESOLVCONF}"
+        touch "${RESOLVCONF}"
+    fi;
+}
+
+
+get_config_by_hwaddr ()
+{
+    LANG=C grep -il "^[[:space:]]*HWADDR=\"\?${1}\"\?\([[:space:]#]\|$\)" /etc/sysconfig/network-scripts/ifcfg-* \
+      | LC_ALL=C sed -e "$__sed_discard_ignored_files"
+}
+
+get_config_by_device ()
+{
+    LANG=C grep -l "^[[:space:]]*DEVICE=\"\?${1}\"\?\([[:space:]#]\|$\)" \
+        /etc/sysconfig/network-scripts/ifcfg-* \
+        | LC_ALL=C sed -e "$__sed_discard_ignored_files"
+}
+
+need_config ()
+{
+    # A sed expression to filter out the files that is_ignored_file recognizes
+    __sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
+
+    local nconfig
+
+    CONFIG="ifcfg-${1}"
+    [ -f "${CONFIG}" ] && return
+    CONFIG="${1##*/}"
+    [ -f "${CONFIG}" ] && return
+    nconfig=$(get_config_by_name "${1}")
+    if [ -n "$nconfig" ] && [ -f "$nconfig" ]; then
+      CONFIG=${nconfig##*/}
+      return
+    fi
+    local addr=$(get_hwaddr ${1})
+    if [ -n "$addr" ]; then
+      nconfig=$(get_config_by_hwaddr ${addr})
+      if [ -n "$nconfig" ] ; then
+        CONFIG=${nconfig##*/}
+        [ -f "${CONFIG}" ] && return
+      fi
+    fi
+    nconfig=$(get_config_by_device ${1})
+    if [ -n "$nconfig" ] && [ -f "$nconfig" ]; then
+      CONFIG=${nconfig##*/}
+      return
+    fi
+}
+
+# We need this because of PEERDNS
+source_config ()
+{
+    CONFIG=${CONFIG##*/}
+    . /etc/sysconfig/network-scripts/$CONFIG
+}
+
+#
+# ### MAIN
+#
+
+# Invoke the local dhcp client enter hooks, if they exist.
+run_hook "${ETCDIR}/dhclient-enter-hooks" || exit $?
+run_hookdir "${ETCDIR}/dhclient-enter-hooks.d" || exit $?
+
+[ "${PEERDNS}" = "no" ] || validate_resolv_conf
+
+if [ -f /etc/sysconfig/network ]; then
+    . /etc/sysconfig/network
+fi
+
+if [ -f /etc/sysconfig/networking/network ]; then
+    . /etc/sysconfig/networking/network
+fi
+
+## it's possible initscripts package is not installed
+## for example in container. Don't flood stderr then
+if [ -d /etc/sysconfig/network-scripts ]; then
+        cd /etc/sysconfig/network-scripts
+        CONFIG="${interface}"
+        need_config "${CONFIG}"
+        source_config >/dev/null 2>&1
+fi;
+
+# In case there's some delay in rebinding, it might happen, that the valid_lft drops to 0,
+# address is removed by kernel and then re-added few seconds later by dhclient-script.
+# With this work-around the address lives a minute longer.
+# "4294967235" = infinite (forever) - 60
+[[ "${new_dhcp_lease_time}" -lt "4294967235" ]] && new_dhcp_lease_time=$((new_dhcp_lease_time + 60))
+[[ "${new_max_life}" -lt "4294967235" ]] && new_max_life=$((new_max_life + 60))
+
+new_prefix="$(get_prefix "${new_ip_address}" "${new_subnet_mask}")"
+old_prefix="$(get_prefix "${old_ip_address}" "${old_subnet_mask}")"
+alias_prefix="$(get_prefix "${alias_ip_address}" "${alias_subnet_mask}")"
+
+case "${reason}" in
+    MEDIUM|ARPCHECK|ARPSEND)
+        # Do nothing
+        exit_with_hooks 0
+        ;;
+
+    PREINIT)
+        if [ -n "${alias_ip_address}" ]; then
+            # Flush alias, its routes will disappear too.
+            ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
+        fi
+
+        # upstream dhclient-script removes (ifconfig $interface 0 up) old adresses in PREINIT,
+        # but we sometimes (#125298) need (for iSCSI/nfs root to have a dhcp interface) to keep the existing ip
+        # flush_dev ${interface}
+        ip link set dev "${interface}" up
+        if [ -n "${DHCLIENT_DELAY}" ] && [ "${DHCLIENT_DELAY}" -gt 0 ]; then
+            # We need to give the kernel some time to get the interface up.
+            sleep "${DHCLIENT_DELAY}"
+        fi
+
+        exit_with_hooks 0
+        ;;
+
+    PREINIT6)
+        # ensure interface is up
+        ip link set dev "${interface}" up
+
+        # Removing stale addresses from aborted clients shouldn't be needed
+        # since we've been adding addresses with lifetimes.
+        # Which means that kernel eventually removes them automatically.
+        # ip -6 addr flush dev "${interface}" scope global permanent
+
+        wait_for_link_local
+
+        exit_with_hooks 0
+        ;;
+
+    BOUND|RENEW|REBIND|REBOOT)
+        if [ -z "${interface}" ] || [ -z "${new_ip_address}" ]; then
+            exit_with_hooks 2
+        fi
+        if arping -D -q -c2 -I "${interface}" "${new_ip_address}"; then
+            dhconfig
+            exit_with_hooks 0
+        else  # DAD failed, i.e. address is already in use
+            ARP_REPLY=$(arping -D -c2 -I "${interface}" "${new_ip_address}" | grep reply | awk '{print toupper($5)}' | cut -d "[" -f2 | cut -d "]" -f1)
+            OUR_MACS=$(ip link show | grep link | awk '{print toupper($2)}' | uniq)
+            if [[ "${OUR_MACS}" = *"${ARP_REPLY}"* ]]; then
+                # the reply can come from our system, that's OK (#1116004#c33)
+                dhconfig
+                exit_with_hooks 0
+            else
+                exit_with_hooks 1
+            fi
+        fi
+        ;;
+
+    BOUND6|RENEW6|REBIND6|DEPREF6)
+        dh6config
+        exit_with_hooks 0
+        ;;
+
+    EXPIRE6|RELEASE6|STOP6)
+        if [ -z "${old_ip6_address}" ] || [ -z "${old_ip6_prefixlen}" ]; then
+            exit_with_hooks 2
+        fi
+
+        ip -6 addr del "${old_ip6_address}/${old_ip6_prefixlen}" \
+            dev "${interface}"
+
+        execute_client_side_configuration_scripts "restore"
+
+        if [ -x "${ETCDIR}/dhclient-${interface}-down-hooks" ]; then
+            . "${ETCDIR}/dhclient-${interface}-down-hooks"
+        elif [ -x ${ETCDIR}/dhclient-down-hooks ]; then
+            . ${ETCDIR}/dhclient-down-hooks
+        fi
+
+        exit_with_hooks 0
+        ;;
+
+    EXPIRE|FAIL|RELEASE|STOP)
+        execute_client_side_configuration_scripts "restore"
+
+        if [ -x "${ETCDIR}/dhclient-${interface}-down-hooks" ]; then
+            . "${ETCDIR}/dhclient-${interface}-down-hooks"
+        elif [ -x ${ETCDIR}/dhclient-down-hooks ]; then
+            . ${ETCDIR}/dhclient-down-hooks
+        fi
+
+        if [ -n "${alias_ip_address}" ]; then
+            # Flush alias
+            ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
+        fi
+
+        # upstream script sets interface down here,
+        # we only remove old ip address
+        #flush_dev ${interface}
+        remove_old_addr
+
+        if [ -n "${alias_ip_address}" ]; then
+            ip -4 addr replace "${alias_ip_address}/${alias_prefix}" broadcast "${alias_broadcast_address}" dev "${interface}" label "${interface}:0"
+            ip -4 route replace "${alias_ip_address}/32" dev "${interface}"
+        fi
+
+        exit_with_hooks 0
+        ;;
+
+    TIMEOUT)
+        if [ -n "${new_routers}" ]; then
+            if [ -n "${alias_ip_address}" ]; then
+                ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
+            fi
+
+            ip -4 addr replace "${new_ip_address}/${new_prefix}" \
+                broadcast "${new_broadcast_address}" dev "${interface}" \
+                valid_lft "${new_dhcp_lease_time}" preferred_lft "${new_dhcp_lease_time}"
+            set ${new_routers}
+
+            if ping -q -c 1 -w 10 -I "${interface}" "${1}"; then
+                dhconfig
+                exit_with_hooks 0
+            fi
+
+            #flush_dev ${interface}
+            remove_old_addr
+            exit_with_hooks 1
+        else
+            exit_with_hooks 1
+        fi
+        ;;
+
+    *)
+        logmessage "unhandled state: ${reason}"
+        exit_with_hooks 1
+        ;;
+esac
+
+exit_with_hooks 0
diff --git a/SOURCES/dhcp-4.2.5-expiry_before_renewal_v2.patch b/SOURCES/dhcp-4.2.5-expiry_before_renewal_v2.patch
new file mode 100644
index 0000000..069da1f
--- /dev/null
+++ b/SOURCES/dhcp-4.2.5-expiry_before_renewal_v2.patch
@@ -0,0 +1,31 @@
+diff -up dhcp-4.2.5/client/dhclient.c.orig dhcp-4.2.5/client/dhclient.c
+--- dhcp-4.2.5/client/dhclient.c.orig	2018-11-07 14:21:16.756152614 +0100
++++ dhcp-4.2.5/client/dhclient.c	2018-11-08 17:30:15.754440523 +0100
+@@ -1618,8 +1618,14 @@ void dhcpack (packet)
+ 	} else
+ 			client -> new -> renewal = 0;
+ 
+-	/* If it wasn't specified by the server, calculate it. */
+-	if (!client -> new -> renewal)
++	/* 
++	 * If it wasn't specified by the server, calculate it. Also use expiry
++	 * instead of renewal time when it is shorter. This better follows 
++	 * RFC 2131 (section 4.4.5) when dealing with some DHCP servers.
++	 */
++	
++	if (!client -> new -> renewal ||
++	    client -> new -> renewal > client -> new -> expiry)
+ 		client -> new -> renewal = client -> new -> expiry / 2 + 1;
+ 
+ 	if (client -> new -> renewal <= 0)
+@@ -1645,7 +1651,9 @@ void dhcpack (packet)
+ 	} else
+ 			client -> new -> rebind = 0;
+ 
+-	if (client -> new -> rebind <= 0) {
++	/* Rebinding time must not be longer than expiry. */
++	if (client -> new -> rebind <= 0 ||
++	    client -> new -> rebind > client -> new -> expiry) {
+ 		if (client -> new -> expiry <= TIME_MAX / 7)
+ 			client -> new -> rebind =
+ 					client -> new -> expiry * 7 / 8;
diff --git a/SOURCES/dhcp-4.3.6-isc-util.patch b/SOURCES/dhcp-4.3.6-isc-util.patch
new file mode 100644
index 0000000..50a0248
--- /dev/null
+++ b/SOURCES/dhcp-4.3.6-isc-util.patch
@@ -0,0 +1,77 @@
+From c37721f799e6b32da156759a830011949311205a Mon Sep 17 00:00:00 2001
+From: Petr Mensik <pemensik@redhat.com>
+Date: Fri, 16 Feb 2018 17:50:40 +0100
+Subject: [PATCH] New bind includes never includes isc/util.h from any public
+ headers. Include them to all compiled files that require it.
+
+---
+ client/dhclient.c   | 1 +
+ common/execute.c    | 1 +
+ common/parse.c      | 1 +
+ common/socket.c     | 1 +
+ omapip/connection.c | 1 +
+ 5 files changed, 5 insertions(+)
+
+diff --git a/client/dhclient.c b/client/dhclient.c
+index 228b4fe..014365d 100644
+--- a/client/dhclient.c
++++ b/client/dhclient.c
+@@ -38,6 +38,7 @@
+ #include <sys/wait.h>
+ #include <limits.h>
+ #include <isc/file.h>
++#include <isc/util.h>
+ #include <dns/result.h>
+ 
+ #ifdef HAVE_LIBCAP_NG
+diff --git a/common/execute.c b/common/execute.c
+index fa4e0f8..1ee1e7d 100644
+--- a/common/execute.c
++++ b/common/execute.c
+@@ -28,6 +28,7 @@
+ 
+ #include "dhcpd.h"
+ #include <omapip/omapip_p.h>
++#include <isc/util.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ 
+diff --git a/common/parse.c b/common/parse.c
+index d08cd2c..729d442 100644
+--- a/common/parse.c
++++ b/common/parse.c
+@@ -27,6 +27,7 @@
+  */
+ 
+ #include "dhcpd.h"
++#include <isc/util.h>
+ #include <syslog.h>
+ 
+ /* Enumerations can be specified in option formats, and are used for
+diff --git a/common/socket.c b/common/socket.c
+index 2b352a1..94ce334 100644
+--- a/common/socket.c
++++ b/common/socket.c
+@@ -35,6 +35,7 @@
+  */
+ 
+ #include "dhcpd.h"
++#include <isc/util.h>
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <sys/uio.h>
+diff --git a/omapip/connection.c b/omapip/connection.c
+index 9aac0c8..a74becc 100644
+--- a/omapip/connection.c
++++ b/omapip/connection.c
+@@ -30,6 +30,7 @@
+ #include "dhcpd.h"
+ 
+ #include <omapip/omapip_p.h>
++#include <isc/util.h>
+ #include <arpa/inet.h>
+ #include <arpa/nameser.h>
+ #include <errno.h>
+-- 
+2.14.3
+
diff --git a/SOURCES/dhcp-4.3.6-omapi-leak.patch b/SOURCES/dhcp-4.3.6-omapi-leak.patch
new file mode 100644
index 0000000..0ffcfe3
--- /dev/null
+++ b/SOURCES/dhcp-4.3.6-omapi-leak.patch
@@ -0,0 +1,52 @@
+commit ccff9ed69d0b26d33ce9cac8e83dab535b64d627
+Author: Thomas Markwalder <tmark@isc.org>
+Date:   Tue Dec 5 15:12:34 2017 -0500
+
+    [46767] Plugged a socket descriptor leak in OMAPI
+    
+    If disconnect is triggered by the reader closing the socket, while there
+    is data left to write, the socket would be orphaned.
+    
+    omapip/buffer.c
+        omapi_connection_writea() - added logic to recall disconnect once
+        pending data has been written
+    
+    omapip/message.c
+        Removed static declaration from omapi_message_unregister so you can
+        actually compile when DEBUG_PROTOCOL is defined.
+    
+    Added a release note
+
+diff --git a/omapip/buffer.c b/omapip/buffer.c
+index 6e0621b..a21f0a8 100644
+--- a/omapip/buffer.c
++++ b/omapip/buffer.c
+@@ -565,6 +565,15 @@ isc_result_t omapi_connection_writer (omapi_object_t *h)
+ 			omapi_buffer_dereference (&buffer, MDL);
+ 		}
+ 	}
++
++	/* If we had data left to write when we're told to disconnect,
++	* we need recall disconnect, now that we're done writing.
++	* See rt46767. */
++	if (c->out_bytes == 0 && c->state == omapi_connection_disconnecting) {
++		omapi_disconnect (h, 1);
++		return ISC_R_SHUTTINGDOWN;
++	}
++
+ 	return ISC_R_SUCCESS;
+ }
+ 
+diff --git a/omapip/message.c b/omapip/message.c
+index ee15d82..37abbd2 100644
+--- a/omapip/message.c
++++ b/omapip/message.c
+@@ -339,7 +339,7 @@ isc_result_t omapi_message_unregister (omapi_object_t *mo)
+ }
+ 
+ #ifdef DEBUG_PROTOCOL
+-static const char *omapi_message_op_name(int op) {
++const char *omapi_message_op_name(int op) {
+ 	switch (op) {
+ 	case OMAPI_OP_OPEN:    return "OMAPI_OP_OPEN";
+ 	case OMAPI_OP_REFRESH: return "OMAPI_OP_REFRESH";
diff --git a/SOURCES/dhcp-4.3.6-options_overflow.patch b/SOURCES/dhcp-4.3.6-options_overflow.patch
new file mode 100644
index 0000000..a51c0cc
--- /dev/null
+++ b/SOURCES/dhcp-4.3.6-options_overflow.patch
@@ -0,0 +1,41 @@
+diff --git a/common/options.c b/common/options.c
+index 83e0384..8a1deca 100644
+--- a/common/options.c
++++ b/common/options.c
+@@ -1672,7 +1672,8 @@ format_min_length(format, oc)
+ 
+ 
+ /* Format the specified option so that a human can easily read it. */
+-
++/* Maximum pretty printed size */
++#define MAX_OUTPUT_SIZE 32*1024
+ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes)
+ 	struct option *option;
+ 	const unsigned char *data;
+@@ -1680,8 +1681,9 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes)
+ 	int emit_commas;
+ 	int emit_quotes;
+ {
+-	static char optbuf [32768]; /* XXX */
+-	static char *endbuf = &optbuf[sizeof(optbuf)];
++	/* We add 128 byte pad so we don't have to add checks everywhere. */
++	static char optbuf [MAX_OUTPUT_SIZE + 128]; /* XXX */
++	static char *endbuf = optbuf + MAX_OUTPUT_SIZE;
+ 	int hunksize = 0;
+ 	int opthunk = 0;
+ 	int hunkinc = 0;
+@@ -2132,7 +2134,14 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes)
+ 				log_error ("Unexpected format code %c",
+ 					   fmtbuf [j]);
+ 			}
++
+ 			op += strlen (op);
++			if (op >= endbuf) {
++				log_error ("Option data exceeds"
++					   " maximum size %d", MAX_OUTPUT_SIZE);
++					   return ("<error>");
++			}
++
+ 			if (dp == data + len)
+ 				break;
+ 			if (j + 1 < numelem && comma != ':')
diff --git a/SOURCES/dhcp-4.3.6-reference_count_overflow.patch b/SOURCES/dhcp-4.3.6-reference_count_overflow.patch
new file mode 100644
index 0000000..c6c94cd
--- /dev/null
+++ b/SOURCES/dhcp-4.3.6-reference_count_overflow.patch
@@ -0,0 +1,13 @@
+diff --git a/common/options.c b/common/options.c
+index 83e0384..a58c5fc 100644
+--- a/common/options.c
++++ b/common/options.c
+@@ -189,6 +189,8 @@ int parse_option_buffer (options, buffer, length, universe)
+ 
+ 		/* If the length is outrageous, the options are bad. */
+ 		if (offset + len > length) {
++			/* Avoid reference count overflow */
++			option_dereference(&option, MDL);
+ 			reason = "option length exceeds option buffer length";
+ 		      bogus:
+ 			log_error("parse_option_buffer: malformed option "
diff --git a/SOURCES/dhcp-64_bit_lease_parse.patch b/SOURCES/dhcp-64_bit_lease_parse.patch
new file mode 100644
index 0000000..a07b5b0
--- /dev/null
+++ b/SOURCES/dhcp-64_bit_lease_parse.patch
@@ -0,0 +1,75 @@
+diff -up dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse dhcp-4.3.0a1/common/parse.c
+--- dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse	2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/common/parse.c	2013-12-19 15:45:25.990771814 +0100
+@@ -938,8 +938,8 @@ TIME
+ parse_date_core(cfile)
+ 	struct parse *cfile;
+ {
+-	int guess;
+-	int tzoff, year, mon, mday, hour, min, sec;
++	TIME guess;
++	long int tzoff, year, mon, mday, hour, min, sec;
+ 	const char *val;
+ 	enum dhcp_token token;
+ 	static int months[11] = { 31, 59, 90, 120, 151, 181,
+@@ -965,7 +965,7 @@ parse_date_core(cfile)
+ 		}
+ 
+ 		skip_token(&val, NULL, cfile); /* consume number */
+-		guess = atoi(val);
++		guess = atol(val);
+ 
+ 		return((TIME)guess);
+ 	}
+@@ -993,7 +993,7 @@ parse_date_core(cfile)
+ 	   somebody invents a time machine, I think we can safely disregard
+ 	   it.   This actually works around a stupid Y2K bug that was present
+ 	   in a very early beta release of dhcpd. */
+-	year = atoi(val);
++	year = atol(val);
+ 	if (year > 1900)
+ 		year -= 1900;
+ 
+@@ -1039,7 +1039,7 @@ parse_date_core(cfile)
+ 		return((TIME)0);
+ 	}
+ 	skip_token(&val, NULL, cfile); /* consume day of month */
+-	mday = atoi(val);
++	mday = atol(val);
+ 
+ 	/* Hour... */
+ 	token = peek_token(&val, NULL, cfile);
+@@ -1050,7 +1050,7 @@ parse_date_core(cfile)
+ 		return((TIME)0);
+ 	}
+ 	skip_token(&val, NULL, cfile); /* consume hour */
+-	hour = atoi(val);
++	hour = atol(val);
+ 
+ 	/* Colon separating hour from minute... */
+ 	token = peek_token(&val, NULL, cfile);
+@@ -1072,7 +1072,7 @@ parse_date_core(cfile)
+ 		return((TIME)0);
+ 	}
+ 	skip_token(&val, NULL, cfile); /* consume minute */
+-	min = atoi(val);
++	min = atol(val);
+ 
+ 	/* Colon separating minute from second... */
+ 	token = peek_token(&val, NULL, cfile);
+@@ -1094,13 +1094,13 @@ parse_date_core(cfile)
+ 		return((TIME)0);
+ 	}
+ 	skip_token(&val, NULL, cfile); /* consume second */
+-	sec = atoi(val);
++	sec = atol(val);
+ 
+ 	tzoff = 0;
+ 	token = peek_token(&val, NULL, cfile);
+ 	if (token == NUMBER) {
+ 		skip_token(&val, NULL, cfile); /* consume tzoff */
+-		tzoff = atoi(val);
++		tzoff = atol(val);
+ 	} else if (token != SEMI) {
+ 		skip_token(&val, NULL, cfile);
+ 		parse_warn(cfile,
diff --git a/SOURCES/dhcp-CLOEXEC.patch b/SOURCES/dhcp-CLOEXEC.patch
new file mode 100644
index 0000000..309a87c
--- /dev/null
+++ b/SOURCES/dhcp-CLOEXEC.patch
@@ -0,0 +1,336 @@
+diff -up dhcp-4.3.3b1/client/clparse.c.cloexec dhcp-4.3.3b1/client/clparse.c
+--- dhcp-4.3.3b1/client/clparse.c.cloexec	2015-08-10 10:46:20.264755543 +0200
++++ dhcp-4.3.3b1/client/clparse.c	2015-08-10 10:46:20.274755510 +0200
+@@ -247,7 +247,7 @@ int read_client_conf_file (const char *n
+ 	int token;
+ 	isc_result_t status;
+ 
+-	if ((file = open (name, O_RDONLY)) < 0)
++	if ((file = open (name, O_RDONLY | O_CLOEXEC)) < 0)
+ 		return uerr2isc (errno);
+ 
+ 	cfile = NULL;
+@@ -323,7 +323,7 @@ void read_client_leases ()
+ 
+ 	/* Open the lease file.   If we can't open it, just return -
+ 	   we can safely trust the server to remember our state. */
+-	if ((file = open (path_dhclient_db, O_RDONLY)) < 0)
++	if ((file = open (path_dhclient_db, O_RDONLY | O_CLOEXEC)) < 0)
+ 		return;
+ 
+ 	cfile = NULL;
+diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c
+--- dhcp-4.3.3b1/client/dhclient.c.cloexec	2015-08-10 10:46:20.260755556 +0200
++++ dhcp-4.3.3b1/client/dhclient.c	2015-08-10 10:46:20.275755506 +0200
+@@ -153,11 +153,11 @@ main(int argc, char **argv) {
+ 	/* Make sure that file descriptors 0 (stdin), 1, (stdout), and
+ 	   2 (stderr) are open. To do this, we assume that when we
+ 	   open a file the lowest available file descriptor is used. */
+-	fd = open("/dev/null", O_RDWR);
++	fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ 	if (fd == 0)
+-		fd = open("/dev/null", O_RDWR);
++		fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ 	if (fd == 1)
+-		fd = open("/dev/null", O_RDWR);
++		fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ 	if (fd == 2)
+ 		log_perror = 0; /* No sense logging to /dev/null. */
+ 	else if (fd != -1)
+@@ -519,7 +519,7 @@ main(int argc, char **argv) {
+ 		long temp;
+ 		int e;
+ 
+-		if ((pidfd = fopen(path_dhclient_pid, "r")) != NULL) {
++		if ((pidfd = fopen(path_dhclient_pid, "re")) != NULL) {
+ 			e = fscanf(pidfd, "%ld\n", &temp);
+ 			oldpid = (pid_t)temp;
+ 
+@@ -574,7 +574,7 @@ main(int argc, char **argv) {
+ 					strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx);
+ 					sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name);
+ 
+-					if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) {
++					if ((pidfd = fopen(new_path_dhclient_pid, "re")) != NULL) {
+ 						e = fscanf(pidfd, "%ld\n", &temp);
+ 						oldpid = (pid_t)temp;
+ 
+@@ -599,7 +599,7 @@ main(int argc, char **argv) {
+ 		int dhc_running = 0;
+ 		char procfn[256] = "";
+ 
+-		if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
++		if ((pidfp = fopen(path_dhclient_pid, "re")) != NULL) {
+ 			if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) {
+ 				snprintf(procfn,256,"/proc/%u",dhcpid);
+ 				dhc_running = (access(procfn, F_OK) == 0);
+@@ -3120,7 +3120,7 @@ void rewrite_client_leases ()
+ 
+ 	if (leaseFile != NULL)
+ 		fclose (leaseFile);
+-	leaseFile = fopen (path_dhclient_db, "w");
++	leaseFile = fopen (path_dhclient_db, "we");
+ 	if (leaseFile == NULL) {
+ 		log_error ("can't create %s: %m", path_dhclient_db);
+ 		return;
+@@ -3313,7 +3313,7 @@ write_duid(struct data_string *duid)
+ 		return DHCP_R_INVALIDARG;
+ 
+ 	if (leaseFile == NULL) {	/* XXX? */
+-		leaseFile = fopen(path_dhclient_db, "w");
++		leaseFile = fopen(path_dhclient_db, "we");
+ 		if (leaseFile == NULL) {
+ 			log_error("can't create %s: %m", path_dhclient_db);
+ 			return ISC_R_IOERROR;
+@@ -3493,7 +3493,7 @@ int write_client_lease (client, lease, r
+ 		return 1;
+ 
+ 	if (leaseFile == NULL) {	/* XXX */
+-		leaseFile = fopen (path_dhclient_db, "w");
++		leaseFile = fopen (path_dhclient_db, "we");
+ 		if (leaseFile == NULL) {
+ 			log_error ("can't create %s: %m", path_dhclient_db);
+ 			return 0;
+@@ -4011,9 +4011,9 @@ void go_daemon ()
+ 	(void) close(2);
+ 
+ 	/* Reopen them on /dev/null. */
+-	(void) open("/dev/null", O_RDWR);
+-	(void) open("/dev/null", O_RDWR);
+-	(void) open("/dev/null", O_RDWR);
++	(void) open("/dev/null", O_RDWR | O_CLOEXEC);
++	(void) open("/dev/null", O_RDWR | O_CLOEXEC);
++	(void) open("/dev/null", O_RDWR | O_CLOEXEC);
+ 
+ 	write_client_pid_file ();
+ 
+@@ -4030,14 +4030,14 @@ void write_client_pid_file ()
+ 		return;
+ 	}
+ 
+-	pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY, 0644);
++	pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC, 0644);
+ 
+ 	if (pfdesc < 0) {
+ 		log_error ("Can't create %s: %m", path_dhclient_pid);
+ 		return;
+ 	}
+ 
+-	pf = fdopen (pfdesc, "w");
++	pf = fdopen (pfdesc, "we");
+ 	if (!pf) {
+ 		close(pfdesc);
+ 		log_error ("Can't fdopen %s: %m", path_dhclient_pid);
+diff -up dhcp-4.3.3b1/common/bpf.c.cloexec dhcp-4.3.3b1/common/bpf.c
+--- dhcp-4.3.3b1/common/bpf.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/common/bpf.c	2015-08-10 10:46:20.275755506 +0200
+@@ -95,7 +95,7 @@ int if_register_bpf (info)
+ 	for (b = 0; 1; b++) {
+ 		/* %Audit% 31 bytes max. %2004.06.17,Safe% */
+ 		sprintf(filename, BPF_FORMAT, b);
+-		sock = open (filename, O_RDWR, 0);
++		sock = open (filename, O_RDWR | O_CLOEXEC, 0);
+ 		if (sock < 0) {
+ 			if (errno == EBUSY) {
+ 				continue;
+diff -up dhcp-4.3.3b1/common/dlpi.c.cloexec dhcp-4.3.3b1/common/dlpi.c
+--- dhcp-4.3.3b1/common/dlpi.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/common/dlpi.c	2015-08-10 10:46:20.275755506 +0200
+@@ -804,7 +804,7 @@ dlpiopen(const char *ifname) {
+ 	}
+ 	*dp = '\0';
+ 	
+-	return open (devname, O_RDWR, 0);
++	return open (devname, O_RDWR | O_CLOEXEC, 0);
+ }
+ 
+ /*
+diff -up dhcp-4.3.3b1/common/nit.c.cloexec dhcp-4.3.3b1/common/nit.c
+--- dhcp-4.3.3b1/common/nit.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/common/nit.c	2015-08-10 10:46:20.275755506 +0200
+@@ -75,7 +75,7 @@ int if_register_nit (info)
+ 	struct strioctl sio;
+ 
+ 	/* Open a NIT device */
+-	sock = open ("/dev/nit", O_RDWR);
++	sock = open ("/dev/nit", O_RDWR | O_CLOEXEC);
+ 	if (sock < 0)
+ 		log_fatal ("Can't open NIT device for %s: %m", info -> name);
+ 
+diff -up dhcp-4.3.3b1/common/resolv.c.cloexec dhcp-4.3.3b1/common/resolv.c
+--- dhcp-4.3.3b1/common/resolv.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/common/resolv.c	2015-08-10 10:46:20.276755503 +0200
+@@ -44,7 +44,7 @@ void read_resolv_conf (parse_time)
+ 	struct domain_search_list *dp, *dl, *nd;
+ 	isc_result_t status;
+ 
+-	if ((file = open (path_resolv_conf, O_RDONLY)) < 0) {
++	if ((file = open (path_resolv_conf, O_RDONLY | O_CLOEXEC)) < 0) {
+ 		log_error ("Can't open %s: %m", path_resolv_conf);
+ 		return;
+ 	}
+diff -up dhcp-4.3.3b1/common/upf.c.cloexec dhcp-4.3.3b1/common/upf.c
+--- dhcp-4.3.3b1/common/upf.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/common/upf.c	2015-08-10 10:46:20.276755503 +0200
+@@ -71,7 +71,7 @@ int if_register_upf (info)
+ 		/* %Audit% Cannot exceed 36 bytes. %2004.06.17,Safe% */
+ 		sprintf(filename, "/dev/pf/pfilt%d", b);
+ 
+-		sock = open (filename, O_RDWR, 0);
++		sock = open (filename, O_RDWR | O_CLOEXEC, 0);
+ 		if (sock < 0) {
+ 			if (errno == EBUSY) {
+ 				continue;
+diff -up dhcp-4.3.3b1/omapip/trace.c.cloexec dhcp-4.3.3b1/omapip/trace.c
+--- dhcp-4.3.3b1/omapip/trace.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/omapip/trace.c	2015-08-10 10:46:20.276755503 +0200
+@@ -138,10 +138,10 @@ isc_result_t trace_begin (const char *fi
+ 		return DHCP_R_INVALIDARG;
+ 	}
+ 
+-	traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL, 0600);
++	traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL | O_CLOEXEC, 0600);
+ 	if (traceoutfile < 0 && errno == EEXIST) {
+ 		log_error ("WARNING: Overwriting trace file \"%s\"", filename);
+-		traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC,
++		traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC | O_CLOEXEC,
+ 				     0600);
+ 	}
+ 
+@@ -429,7 +429,7 @@ void trace_file_replay (const char *file
+ 	isc_result_t result;
+ 	int len;
+ 
+-	traceinfile = fopen (filename, "r");
++	traceinfile = fopen (filename, "re");
+ 	if (!traceinfile) {
+ 		log_error("Can't open tracefile %s: %m", filename);
+ 		return;
+diff -up dhcp-4.3.3b1/relay/dhcrelay.c.cloexec dhcp-4.3.3b1/relay/dhcrelay.c
+--- dhcp-4.3.3b1/relay/dhcrelay.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/relay/dhcrelay.c	2015-08-10 10:46:20.276755503 +0200
+@@ -187,11 +187,11 @@ main(int argc, char **argv) {
+ 	/* Make sure that file descriptors 0(stdin), 1,(stdout), and
+ 	   2(stderr) are open. To do this, we assume that when we
+ 	   open a file the lowest available file descriptor is used. */
+-	fd = open("/dev/null", O_RDWR);
++	fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ 	if (fd == 0)
+-		fd = open("/dev/null", O_RDWR);
++		fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ 	if (fd == 1)
+-		fd = open("/dev/null", O_RDWR);
++		fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ 	if (fd == 2)
+ 		log_perror = 0; /* No sense logging to /dev/null. */
+ 	else if (fd != -1)
+@@ -558,13 +558,13 @@ main(int argc, char **argv) {
+ 
+ 		if (no_pid_file == ISC_FALSE) {
+ 			pfdesc = open(path_dhcrelay_pid,
+-				      O_CREAT | O_TRUNC | O_WRONLY, 0644);
++				      O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC, 0644);
+ 
+ 			if (pfdesc < 0) {
+ 				log_error("Can't create %s: %m",
+ 					  path_dhcrelay_pid);
+ 			} else {
+-				pf = fdopen(pfdesc, "w");
++				pf = fdopen(pfdesc, "we");
+ 				if (!pf)
+ 					log_error("Can't fdopen %s: %m",
+ 						  path_dhcrelay_pid);
+diff -up dhcp-4.3.3b1/server/confpars.c.cloexec dhcp-4.3.3b1/server/confpars.c
+--- dhcp-4.3.3b1/server/confpars.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/server/confpars.c	2015-08-10 10:46:20.277755500 +0200
+@@ -111,7 +111,7 @@ isc_result_t read_conf_file (const char
+ 	}
+ #endif
+ 
+-	if ((file = open (filename, O_RDONLY)) < 0) {
++	if ((file = open (filename, O_RDONLY | O_CLOEXEC)) < 0) {
+ 		if (leasep) {
+ 			log_error ("Can't open lease database %s: %m --",
+ 				   path_dhcpd_db);
+diff -up dhcp-4.3.3b1/server/db.c.cloexec dhcp-4.3.3b1/server/db.c
+--- dhcp-4.3.3b1/server/db.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/server/db.c	2015-08-10 10:47:32.644518358 +0200
+@@ -1072,7 +1072,7 @@ void db_startup (testp)
+ 	}
+ #endif
+ 	if (!testp) {
+-		db_file = fopen (path_dhcpd_db, "a");
++		db_file = fopen (path_dhcpd_db, "ae");
+ 		if (!db_file)
+ 			log_fatal ("Can't open %s for append.", path_dhcpd_db);
+ 		expire_all_pools ();
+@@ -1120,7 +1120,7 @@ int new_lease_file ()
+ 		     path_dhcpd_db, (int)t) >= sizeof newfname)
+ 		log_fatal("new_lease_file: lease file path too long");
+ 
+-	db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT, 0664);
++	db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, 0664);
+ 	if (db_fd < 0) {
+ 		log_error ("Can't create new lease file: %m");
+ 		return 0;
+@@ -1141,7 +1141,7 @@ int new_lease_file ()
+ 	}
+ #endif /* PARANOIA */
+ 
+-	if ((new_db_file = fdopen(db_fd, "w")) == NULL) {
++	if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
+ 		log_error("Can't fdopen new lease file: %m");
+ 		close(db_fd);
+ 		goto fdfail;
+diff -up dhcp-4.3.3b1/server/dhcpd.c.cloexec dhcp-4.3.3b1/server/dhcpd.c
+--- dhcp-4.3.3b1/server/dhcpd.c.cloexec	2015-07-30 15:17:16.000000000 +0200
++++ dhcp-4.3.3b1/server/dhcpd.c	2015-08-10 10:46:20.278755497 +0200
+@@ -194,11 +194,11 @@ main(int argc, char **argv) {
+         /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
+            2 (stderr) are open. To do this, we assume that when we
+            open a file the lowest available file descriptor is used. */
+-        fd = open("/dev/null", O_RDWR);
++        fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+         if (fd == 0)
+-                fd = open("/dev/null", O_RDWR);
++                fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+         if (fd == 1)
+-                fd = open("/dev/null", O_RDWR);
++                fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+         if (fd == 2)
+                 log_perror = 0; /* No sense logging to /dev/null. */
+         else if (fd != -1)
+@@ -743,7 +743,7 @@ main(int argc, char **argv) {
+ 	 * appropriate.
+ 	 */
+ 	if (no_pid_file == ISC_FALSE) {
+-		i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644);
++		i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0644);
+ 		if (i >= 0) {
+ 			sprintf(pbuf, "%d\n", (int) getpid());
+ 			IGNORE_RET(write(i, pbuf, strlen(pbuf)));
+@@ -787,9 +787,9 @@ main(int argc, char **argv) {
+                 (void) close(2);
+ 
+                 /* Reopen them on /dev/null. */
+-                (void) open("/dev/null", O_RDWR);
+-                (void) open("/dev/null", O_RDWR);
+-                (void) open("/dev/null", O_RDWR);
++                (void) open("/dev/null", O_RDWR | O_CLOEXEC);
++                (void) open("/dev/null", O_RDWR | O_CLOEXEC);
++                (void) open("/dev/null", O_RDWR | O_CLOEXEC);
+                 log_perror = 0; /* No sense logging to /dev/null. */
+ 
+        		IGNORE_RET (chdir("/"));
+diff -up dhcp-4.3.3b1/server/ldap.c.cloexec dhcp-4.3.3b1/server/ldap.c
+--- dhcp-4.3.3b1/server/ldap.c.cloexec	2015-07-30 21:03:40.000000000 +0200
++++ dhcp-4.3.3b1/server/ldap.c	2015-08-10 10:46:20.279755493 +0200
+@@ -1442,7 +1442,7 @@ ldap_start (void)
+ 
+   if (ldap_debug_file != NULL && ldap_debug_fd == -1)
+     {
+-      if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC | O_WRONLY,
++      if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC,
+                                  S_IRUSR | S_IWUSR)) < 0)
+         log_error ("Error opening debug LDAP log file %s: %s", ldap_debug_file,
+                    strerror (errno));
diff --git a/SOURCES/dhcp-IPoIB-log-id.patch b/SOURCES/dhcp-IPoIB-log-id.patch
new file mode 100644
index 0000000..e0369bb
--- /dev/null
+++ b/SOURCES/dhcp-IPoIB-log-id.patch
@@ -0,0 +1,164 @@
+--- a/server/dhcp.c     2017-07-14 15:32:14.611104590 +0200
++++ b/server/dhcp.c	2017-07-14 15:34:17.508858018 +0200
+@@ -87,6 +87,42 @@
+ 
+ static TIME leaseTimeCheck(TIME calculated, TIME alternate);
+ 
++char *print_client_identifier_from_packet (packet)
++	struct packet *packet;
++{
++	struct option_cache *oc;
++	struct data_string client_identifier;
++	char *ci;
++
++	memset (&client_identifier, 0, sizeof client_identifier);
++
++	oc = lookup_option (&dhcp_universe, packet -> options,
++			DHO_DHCP_CLIENT_IDENTIFIER);
++	if (oc &&
++	    evaluate_option_cache (&client_identifier,
++				    packet, (struct lease *)0,
++				    (struct client_state *)0,
++				    packet -> options,
++				    (struct option_state *)0,
++				    &global_scope, oc, MDL)) {
++		ci = print_hw_addr (HTYPE_INFINIBAND, client_identifier.len, client_identifier.data);
++		data_string_forget (&client_identifier, MDL);
++		return ci;
++	} else
++		return "\"no client id\"";
++}
++
++char *print_hw_addr_or_client_id (packet)
++	struct packet *packet;
++{
++	if (packet -> raw -> htype == HTYPE_INFINIBAND)
++		return print_client_identifier_from_packet (packet);
++	else
++		return print_hw_addr (packet -> raw -> htype,
++				      packet -> raw -> hlen,
++				      packet -> raw -> chaddr);
++}
++
+ void
+ dhcp (struct packet *packet) {
+ 	int ms_nulltp = 0;
+@@ -129,9 +165,7 @@
+ 
+ 		log_info("%s from %s via %s: %s", s,
+ 			 (packet->raw->htype
+-			  ? print_hw_addr(packet->raw->htype,
+-					  packet->raw->hlen,
+-					  packet->raw->chaddr)
++			  ? print_hw_addr_or_client_id(packet)
+ 			  : "<no identifier>"),
+ 			 packet->raw->giaddr.s_addr
+ 			 ? inet_ntoa(packet->raw->giaddr)
+@@ -328,9 +362,7 @@
+ #endif
+ 	snprintf (msgbuf, sizeof msgbuf, "DHCPDISCOVER from %s %s%s%svia %s",
+ 		 (packet -> raw -> htype
+-		  ? print_hw_addr (packet -> raw -> htype,
+-				   packet -> raw -> hlen,
+-				   packet -> raw -> chaddr)
++		  ? print_hw_addr_or_client_id (packet)
+ 		  : (lease
+ 		     ? print_hex_1(lease->uid_len, lease->uid, 60)
+ 		     : "<no identifier>")),
+@@ -542,9 +574,7 @@
+ 		 "DHCPREQUEST for %s%s from %s %s%s%svia %s",
+ 		 piaddr (cip), smbuf,
+ 		 (packet -> raw -> htype
+-		  ? print_hw_addr (packet -> raw -> htype,
+-				   packet -> raw -> hlen,
+-				   packet -> raw -> chaddr)
++		  ? print_hw_addr_or_client_id(packet)
+ 		  : (lease
+ 		     ? print_hex_1(lease->uid_len, lease->uid, 60)
+ 		     : "<no identifier>")),
+@@ -785,9 +815,7 @@
+ 	if ((oc = lookup_option (&dhcp_universe, packet -> options,
+ 				 DHO_DHCP_REQUESTED_ADDRESS))) {
+ 		log_info ("DHCPRELEASE from %s specified requested-address.",
+-		      print_hw_addr (packet -> raw -> htype,
+-				     packet -> raw -> hlen,
+-				     packet -> raw -> chaddr));
++		      print_hw_addr_or_client_id(packet));
+ 	}
+ 
+ 	oc = lookup_option (&dhcp_universe, packet -> options,
+@@ -879,9 +907,7 @@
+ 		 "DHCPRELEASE of %s from %s %s%s%svia %s (%sfound)",
+ 		 cstr,
+ 		 (packet -> raw -> htype
+-		  ? print_hw_addr (packet -> raw -> htype,
+-				   packet -> raw -> hlen,
+-				   packet -> raw -> chaddr)
++		  ? print_hw_addr_or_client_id(packet)
+ 		  : (lease
+ 		     ? print_hex_1(lease->uid_len, lease->uid, 60)
+ 		     : "<no identifier>")),
+@@ -986,9 +1012,7 @@
+ 		 "DHCPDECLINE of %s from %s %s%s%svia %s",
+ 		 piaddr (cip),
+ 		 (packet -> raw -> htype
+-		  ? print_hw_addr (packet -> raw -> htype,
+-				   packet -> raw -> hlen,
+-				   packet -> raw -> chaddr)
++		  ? print_hw_addr_or_client_id(packet)
+ 		  : (lease
+ 		     ? print_hex_1(lease->uid_len, lease->uid, 60)
+ 		     : "<no identifier>")),
+@@ -1707,8 +1731,7 @@
+ 	/* Report what we're sending. */
+ 	snprintf(msgbuf, sizeof msgbuf, "DHCPACK to %s (%s) via", piaddr(cip),
+ 		 (packet->raw->htype && packet->raw->hlen) ?
+-			print_hw_addr(packet->raw->htype, packet->raw->hlen,
+-				      packet->raw->chaddr) :
++			print_hw_addr_or_client_id(packet) :
+ 			"<no client hardware address>");
+ 	log_info("%s %s", msgbuf, gip.len ? piaddr(gip) :
+ 					    packet->interface->name);
+@@ -1886,9 +1909,7 @@
+ #endif
+ 	log_info ("DHCPNAK on %s to %s via %s",
+ 	      piaddr (*cip),
+-	      print_hw_addr (packet -> raw -> htype,
+-			     packet -> raw -> hlen,
+-			     packet -> raw -> chaddr),
++	      print_hw_addr_or_client_id(packet),
+ 	      packet -> raw -> giaddr.s_addr
+ 	      ? inet_ntoa (packet -> raw -> giaddr)
+ 	      : packet -> interface -> name);
+@@ -3897,7 +3918,7 @@
+ 		   ? (state -> offer == DHCPACK ? "DHCPACK" : "DHCPOFFER")
+ 		   : "BOOTREPLY"),
+ 		  piaddr (lease -> ip_addr),
+-		  (lease -> hardware_addr.hlen
++		  (lease -> hardware_addr.hlen > 1
+ 		   ? print_hw_addr (lease -> hardware_addr.hbuf [0],
+ 				    lease -> hardware_addr.hlen - 1,
+ 				    &lease -> hardware_addr.hbuf [1])
+@@ -4450,10 +4471,7 @@
+ 			if (uid_lease) {
+ 			    if (uid_lease->binding_state == FTS_ACTIVE) {
+ 				log_error ("client %s has duplicate%s on %s",
+-					   (print_hw_addr
+-					    (packet -> raw -> htype,
+-					     packet -> raw -> hlen,
+-					     packet -> raw -> chaddr)),
++					   (print_hw_addr_or_client_id(packet)),
+ 					   " leases",
+ 					   (ip_lease -> subnet ->
+ 					    shared_network -> name));
+@@ -4620,9 +4638,7 @@
+ 			log_error("uid lease %s for client %s is duplicate "
+ 				  "on %s",
+ 				  piaddr(uid_lease->ip_addr),
+-				  print_hw_addr(packet->raw->htype,
+-						packet->raw->hlen,
+-						packet->raw->chaddr),
++				  print_hw_addr_or_client_id(packet),
+ 				  uid_lease->subnet->shared_network->name);
+ 
+ 			if (!packet -> raw -> ciaddr.s_addr &&
diff --git a/SOURCES/dhcp-PPP.patch b/SOURCES/dhcp-PPP.patch
new file mode 100644
index 0000000..b3d82ea
--- /dev/null
+++ b/SOURCES/dhcp-PPP.patch
@@ -0,0 +1,150 @@
+diff -up dhcp-4.3.4/client/dhc6.c.PPP dhcp-4.3.4/client/dhc6.c
+--- dhcp-4.3.4/client/dhc6.c.PPP	2016-04-29 12:46:29.824988665 +0200
++++ dhcp-4.3.4/client/dhc6.c	2016-04-29 12:46:29.828988666 +0200
+@@ -5641,7 +5641,8 @@ make_client6_options(struct client_state
+ 	 */
+ 	if ((oc = lookup_option(&dhcpv6_universe, *op,
+ 				D6O_CLIENTID)) == NULL) {
+-		if (!option_cache(&oc, &default_duid, NULL, clientid_option,
++		if (default_duid.len == 0 ||
++		    !option_cache(&oc, &default_duid, NULL, clientid_option,
+ 				  MDL))
+ 			log_fatal("Failure assembling a DUID.");
+ 
+diff -up dhcp-4.3.4/client/dhclient.c.PPP dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.PPP	2016-04-29 12:46:29.815988664 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-04-29 12:46:29.830988666 +0200
+@@ -1077,8 +1077,8 @@ main(int argc, char **argv) {
+ 			if (default_duid.buffer != NULL)
+ 				data_string_forget(&default_duid, MDL);
+ 
+-			form_duid(&default_duid, MDL);
+-			write_duid(&default_duid);
++			if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS)
++				write_duid(&default_duid);
+ 		}
+ 	}
+ 
+@@ -3808,7 +3808,7 @@ write_options(struct client_state *clien
+  * is not how it is intended.  Upcoming rearchitecting the client should
+  * address this "one daemon model."
+  */
+-void
++isc_result_t
+ form_duid(struct data_string *duid, const char *file, int line)
+ {
+ 	struct interface_info *ip;
+@@ -3821,6 +3821,15 @@ form_duid(struct data_string *duid, cons
+ 	if (ip == NULL)
+ 		log_fatal("Impossible condition at %s:%d.", MDL);
+ 
++	while (ip && ip->hw_address.hbuf[0] == HTYPE_RESERVED) {
++		/* Try the other interfaces */
++		log_debug("Cannot form default DUID from interface %s.", ip->name);
++		ip = ip->next;
++	}
++	if (ip == NULL) {
++		return ISC_R_UNEXPECTED;
++	}
++
+ 	if ((ip->hw_address.hlen == 0) ||
+ 	    (ip->hw_address.hlen > sizeof(ip->hw_address.hbuf)))
+ 		log_fatal("Impossible hardware address length at %s:%d.", MDL);
+@@ -3866,6 +3875,8 @@ form_duid(struct data_string *duid, cons
+ 		log_info("Created duid %s.", str);
+ 		dfree(str, MDL);
+ 	}
++	
++	return ISC_R_SUCCESS;
+ }
+ 
+ /* Write the default DUID to the lease store. */
+diff -up dhcp-4.3.4/common/bpf.c.PPP dhcp-4.3.4/common/bpf.c
+--- dhcp-4.3.4/common/bpf.c.PPP	2016-04-29 12:46:29.794988660 +0200
++++ dhcp-4.3.4/common/bpf.c	2016-04-29 12:46:29.830988666 +0200
+@@ -599,6 +599,22 @@ get_hw_addr(const char *name, struct har
+                         memcpy(&hw->hbuf[1], LLADDR(sa), sa->sdl_alen);
+                         break;
+ #endif /* IFT_FDDI */
++#if defined(IFT_PPP)
++                case IFT_PPP:
++                        if (local_family != AF_INET6)
++                             log_fatal("Unsupported device type %d for \"%s\"",
++                                        sa->sdl_type, name);
++                        hw->hlen = 0;
++                        hw->hbuf[0] = HTYPE_RESERVED;
++                        /* 0xdeadbeef should never occur on the wire,
++                         *  and is a signature that something went wrong.
++                         */
++                        hw->hbuf[1] = 0xde;
++                        hw->hbuf[2] = 0xad;
++                        hw->hbuf[3] = 0xbe;
++                        hw->hbuf[4] = 0xef;
++                        break;
++#endif
+                 default:
+                         log_fatal("Unsupported device type %d for \"%s\"",
+                                   sa->sdl_type, name);
+diff -up dhcp-4.3.4/common/lpf.c.PPP dhcp-4.3.4/common/lpf.c
+--- dhcp-4.3.4/common/lpf.c.PPP	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/common/lpf.c	2016-04-29 12:46:29.830988666 +0200
+@@ -548,6 +548,22 @@ get_hw_addr(const char *name, struct har
+ 			hw->hbuf[0] = HTYPE_FDDI;
+ 			memcpy(&hw->hbuf[1], sa->sa_data, 6);
+ 			break;
++#if defined(ARPHRD_PPP)
++		case ARPHRD_PPP:
++			if (local_family != AF_INET6)
++				log_fatal("Unsupported device type %d for \"%s\"",
++				           sa->sa_family, name);
++			hw->hlen = 0;
++			hw->hbuf[0] = HTYPE_RESERVED;
++			/* 0xdeadbeef should never occur on the wire,
++			 * and is a signature that something went wrong.
++			 */
++			hw->hbuf[1] = 0xde;
++			hw->hbuf[2] = 0xad;
++			hw->hbuf[3] = 0xbe;
++			hw->hbuf[4] = 0xef;
++			break;
++#endif
+ 		default:
+ 			log_fatal("Unsupported device type %ld for \"%s\"",
+ 				  (long int)sa->sa_family, name);
+diff -up dhcp-4.3.4/includes/dhcpd.h.PPP dhcp-4.3.4/includes/dhcpd.h
+--- dhcp-4.3.4/includes/dhcpd.h.PPP	2016-04-29 12:46:29.831988667 +0200
++++ dhcp-4.3.4/includes/dhcpd.h	2016-04-29 12:47:13.167995959 +0200
+@@ -2990,7 +2990,7 @@ void client_dns_remove(struct client_sta
+ 
+ void dhcpv4_client_assignments(void);
+ void dhcpv6_client_assignments(void);
+-void form_duid(struct data_string *duid, const char *file, int line);
++isc_result_t form_duid(struct data_string *duid, const char *file, int line);
+ 
+ void dhcp4o6_start(void);
+ 
+diff -up dhcp-4.3.4/includes/dhcp.h.PPP dhcp-4.3.4/includes/dhcp.h
+--- dhcp-4.3.4/includes/dhcp.h.PPP	2016-04-29 12:46:29.822988665 +0200
++++ dhcp-4.3.4/includes/dhcp.h	2016-04-29 12:46:29.832988667 +0200
+@@ -81,6 +81,8 @@ struct dhcp_packet {
+ 					 * is no standard for this so we
+ 					 * just steal a type            */
+ 
++#define HTYPE_RESERVED	0		/* RFC 5494 */
++
+ /* Magic cookie validating dhcp options field (and bootp vendor
+    extensions field). */
+ #define DHCP_OPTIONS_COOKIE	"\143\202\123\143"
+diff -up dhcp-4.3.4/server/dhcpv6.c.PPP dhcp-4.3.4/server/dhcpv6.c
+--- dhcp-4.3.4/server/dhcpv6.c.PPP	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/server/dhcpv6.c	2016-04-29 12:46:29.833988667 +0200
+@@ -454,6 +454,9 @@ generate_new_server_duid(void) {
+ 		if (p->hw_address.hlen > 0) {
+ 			break;
+ 		}
++		if (p->next == NULL && p->hw_address.hbuf[0] == HTYPE_RESERVED) {
++			log_error("Can not generate DUID from interfaces which do not have hardware addresses, please configure server-duid!");
++		}
+ 	}
+ 	if (p == NULL) {
+ 		return ISC_R_UNEXPECTED;
diff --git a/SOURCES/dhcp-add_timeout_when_NULL.patch b/SOURCES/dhcp-add_timeout_when_NULL.patch
new file mode 100644
index 0000000..103824c
--- /dev/null
+++ b/SOURCES/dhcp-add_timeout_when_NULL.patch
@@ -0,0 +1,14 @@
+diff -up dhcp-4.3.0a1/common/dispatch.c.dracut dhcp-4.3.0a1/common/dispatch.c
+--- dhcp-4.3.0a1/common/dispatch.c.dracut	2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/common/dispatch.c	2013-12-19 15:39:50.350505860 +0100
+@@ -210,6 +210,10 @@ void add_timeout (when, where, what, ref
+ 	isc_interval_t interval;
+ 	isc_time_t expires;
+ 
++	if (when == NULL) {
++		return;
++	}
++
+ 	/* See if this timeout supersedes an existing timeout. */
+ 	t = (struct timeout *)0;
+ 	for (q = timeouts; q; q = q->next) {
diff --git a/SOURCES/dhcp-capability.patch b/SOURCES/dhcp-capability.patch
new file mode 100644
index 0000000..49dfbee
--- /dev/null
+++ b/SOURCES/dhcp-capability.patch
@@ -0,0 +1,257 @@
+diff --git a/client/Makefile.am b/client/Makefile.am
+index b1ecf82..387c097 100644
+--- a/client/Makefile.am
++++ b/client/Makefile.am
+@@ -15,6 +15,7 @@ dhclient_SOURCES = clparse.c dhclient.c dhc6.c \
+ 		   scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
+ 		   scripts/netbsd scripts/nextstep scripts/openbsd \
+ 		   scripts/solaris scripts/openwrt
+-dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(BIND_LIBS)
++dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \
++		 $(CAPNG_LDADD) $(BIND_LIBS)
+ man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
+ EXTRA_DIST = $(man_MANS)
+diff --git a/client/dhclient-script.8 b/client/dhclient-script.8
+index 3a3aaf7..fec726c 100644
+--- a/client/dhclient-script.8
++++ b/client/dhclient-script.8
+@@ -245,6 +245,16 @@ repeatedly initialized to the values provided by one server, and then
+ the other.   Assuming the information provided by both servers is
+ valid, this shouldn't cause any real problems, but it could be
+ confusing.
++.PP
++Normally, if dhclient was compiled with libcap-ng support,
++dhclient drops most capabilities immediately upon startup.
++While more secure, this greatly restricts the additional actions that
++hooks in dhclient-script can take. For example, any daemons that
++dhclient-script starts or restarts will inherit the restricted
++capabilities as well, which may interfere with their correct operation.
++Thus, the
++.BI \-nc
++option can be used to prevent dhclient from dropping capabilities.
+ .SH SEE ALSO
+ dhclient(8), dhcpd(8), dhcrelay(8), dhclient.conf(5) and
+ dhclient.leases(5).
+diff --git a/client/dhclient.8 b/client/dhclient.8
+index aa2238d..005cda5 100644
+--- a/client/dhclient.8
++++ b/client/dhclient.8
+@@ -134,6 +134,9 @@ dhclient - Dynamic Host Configuration Protocol Client
+ .B -w
+ ]
+ [
++.B -nc
++]
++[
+ .B -B
+ ]
+ [
+@@ -320,6 +323,32 @@ not to exit when it doesn't find any such interfaces.  The
+ program can then be used to notify the client when a network interface
+ has been added or removed, so that the client can attempt to configure an IP
+ address on that interface.
++.TP
++.BI \-nc
++Do not drop capabilities.
++
++Normally, if
++.B dhclient
++was compiled with libcap-ng support,
++.B dhclient
++drops most capabilities immediately upon startup.  While more secure,
++this greatly restricts the additional actions that hooks in
++.B dhclient-script (8)
++can take.  (For example, any daemons that 
++.B dhclient-script (8)
++starts or restarts will inherit the restricted capabilities as well,
++which may interfere with their correct operation.)  Thus, the
++.BI \-nc
++option can be used to prevent
++.B dhclient
++from dropping capabilities.
++
++The
++.BI \-nc
++option is ignored if
++.B dhclient
++was not compiled with libcap-ng support.
++
+ .TP
+ .BI \-n
+ Do not configure any interfaces.  This is most likely to be useful in
+diff --git a/client/dhclient.c b/client/dhclient.c
+index 09ae09b..2d564ff 100644
+--- a/client/dhclient.c
++++ b/client/dhclient.c
+@@ -40,6 +40,10 @@
+ #include <isc/file.h>
+ #include <dns/result.h>
+ 
++#ifdef HAVE_LIBCAP_NG
++#include <cap-ng.h>
++#endif
++
+ /*
+  * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
+  * that when building ISC code.
+@@ -239,6 +243,9 @@ main(int argc, char **argv) {
+ 	int timeout_arg = 0;
+ 	char *arg_conf = NULL;
+ 	int arg_conf_len = 0;
++#ifdef HAVE_LIBCAP_NG
++	int keep_capabilities = 0;
++#endif
+ 
+ 	/* Initialize client globals. */
+ 	memset(&default_duid, 0, sizeof(default_duid));
+@@ -548,6 +555,10 @@ main(int argc, char **argv) {
+ 			}
+ 
+ 			dhclient_request_options = argv[i];
++		} else if (!strcmp(argv[i], "-nc")) {
++#ifdef HAVE_LIBCAP_NG
++			keep_capabilities = 1;
++#endif
+ 		} else if (argv[i][0] == '-') {
+ 			usage("Unknown command: %s", argv[i]);
+ 		} else if (interfaces_requested < 0) {
+@@ -608,6 +619,19 @@ main(int argc, char **argv) {
+ 		path_dhclient_script = s;
+ 	}
+ 
++#ifdef HAVE_LIBCAP_NG
++	/* Drop capabilities */
++	if (!keep_capabilities) {
++		capng_clear(CAPNG_SELECT_CAPS);
++		capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
++				CAP_DAC_OVERRIDE); // Drop this someday
++		capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
++				CAP_NET_ADMIN, CAP_NET_RAW,
++				CAP_NET_BIND_SERVICE, CAP_SYS_ADMIN, -1);
++		capng_apply(CAPNG_SELECT_CAPS);
++	}
++#endif
++
+ 	/* Set up the initial dhcp option universe. */
+ 	initialize_common_option_spaces();
+ 
+diff --git a/configure.ac b/configure.ac
+index adc98a8..8bbe5ca 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -592,6 +592,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[void foo() __attribute__((noreturn));
+ # Look for optional headers.
+ AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h)
+ 
++# look for capabilities library
++AC_ARG_WITH(libcap-ng,
++    [  --with-libcap-ng=[auto/yes/no]  Add Libcap-ng support [default=auto]],,
++    with_libcap_ng=auto)
++
++# Check for Libcap-ng API
++#
++# libcap-ng detection
++if test x$with_libcap_ng = xno ; then
++    have_libcap_ng=no;
++else
++    # Start by checking for header file
++    AC_CHECK_HEADER(cap-ng.h, capng_headers=yes, capng_headers=no)
++
++    # See if we have libcap-ng library
++    AC_CHECK_LIB(cap-ng, capng_clear,
++                 CAPNG_LDADD=-lcap-ng,)
++
++    # Check results are usable
++    if test x$with_libcap_ng = xyes -a x$CAPNG_LDADD = x ; then
++       AC_MSG_ERROR(libcap-ng support was requested and the library was not found)
++    fi
++    if test x$CAPNG_LDADD != x -a $capng_headers = no ; then
++       AC_MSG_ERROR(libcap-ng libraries found but headers are missing)
++    fi
++fi
++AC_SUBST(CAPNG_LDADD)
++AC_MSG_CHECKING(whether to use libcap-ng)
++if test x$CAPNG_LDADD != x ; then
++    AC_DEFINE(HAVE_LIBCAP_NG,1,[libcap-ng support])
++    AC_MSG_RESULT(yes)
++else
++    AC_MSG_RESULT(no)
++fi
++
+ # Solaris needs some libraries for functions
+ AC_SEARCH_LIBS(socket, [socket])
+ AC_SEARCH_LIBS(inet_ntoa, [nsl])
+diff --git a/relay/Makefile.am b/relay/Makefile.am
+index 316a524..999e543 100644
+--- a/relay/Makefile.am
++++ b/relay/Makefile.am
+@@ -5,7 +5,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localstatedir@"'
+ sbin_PROGRAMS = dhcrelay
+ dhcrelay_SOURCES = dhcrelay.c
+ dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \
+-		 $(BIND_LIBS)
++		 $(CAPNG_LDADD) $(BIND_LIBS)
+ man_MANS = dhcrelay.8
+ EXTRA_DIST = $(man_MANS)
+ 
+diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c
+index eac119c..d2ab448 100644
+--- a/relay/dhcrelay.c
++++ b/relay/dhcrelay.c
+@@ -32,6 +32,11 @@
+ #include <sys/time.h>
+ #include <isc/file.h>
+ 
++#ifdef HAVE_LIBCAP_NG
++#  include <cap-ng.h>
++   int keep_capabilities = 0;
++#endif
++
+ TIME default_lease_time = 43200; /* 12 hours... */
+ TIME max_lease_time = 86400; /* 24 hours... */
+ struct tree_cache *global_options[256];
+@@ -472,6 +477,10 @@ main(int argc, char **argv) {
+ 			if (++i == argc)
+ 				usage(use_noarg, argv[i-1]);
+ 			dhcrelay_sub_id = argv[i];
++#endif
++		} else if (!strcmp(argv[i], "-nc")) {
++#ifdef HAVE_LIBCAP_NG
++			keep_capabilities = 1;
+ #endif
+ 		} else if (!strcmp(argv[i], "-pf")) {
+ 			if (++i == argc)
+@@ -547,6 +556,17 @@ main(int argc, char **argv) {
+ #endif
+ 	}
+ 
++#ifdef HAVE_LIBCAP_NG
++	/* Drop capabilities */
++	if (!keep_capabilities) {
++		capng_clear(CAPNG_SELECT_BOTH);
++		capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
++				CAP_NET_RAW, CAP_NET_BIND_SERVICE, -1);
++		capng_apply(CAPNG_SELECT_BOTH);
++		log_info ("Dropped all unnecessary capabilities.");
++	}
++#endif
++
+ 	if (!quiet) {
+ 		log_info("%s %s", message, PACKAGE_VERSION);
+ 		log_info(copyright);
+@@ -699,6 +719,15 @@ main(int argc, char **argv) {
+ 	signal(SIGTERM, dhcp_signal_handler);  /* kill */
+ #endif
+ 
++#ifdef HAVE_LIBCAP_NG
++	/* Drop all capabilities */
++	if (!keep_capabilities) {
++		capng_clear(CAPNG_SELECT_BOTH);
++		capng_apply(CAPNG_SELECT_BOTH);
++		log_info ("Dropped all capabilities.");
++	}
++#endif
++
+ 	/* Start dispatching packets and timeouts... */
+ 	dispatch();
+ 
diff --git a/SOURCES/dhcp-client-request-release-bind-iface.patch b/SOURCES/dhcp-client-request-release-bind-iface.patch
new file mode 100644
index 0000000..7b9f271
--- /dev/null
+++ b/SOURCES/dhcp-client-request-release-bind-iface.patch
@@ -0,0 +1,61 @@
+diff -up dhcp-4.3.4/client/dhclient.c.bind-iface dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.bind-iface	2016-04-29 13:06:50.595257108 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-04-29 13:08:30.237281528 +0200
+@@ -3023,6 +3023,14 @@ void send_request (cpp)
+ #endif
+ 	if (destination.sin_addr.s_addr != INADDR_BROADCAST &&
+ 	    fallback_interface) {
++#if defined(SO_BINDTODEVICE)
++		if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET,
++			       SO_BINDTODEVICE, client->interface->name,
++			       strlen(client->interface->name)) < 0) {
++			log_error("%s:%d: Failed to bind fallback interface"
++				  " to %s: %m", MDL, client->interface->name);
++		}
++#endif
+ 		result = send_packet(fallback_interface, NULL, &client->packet,
+ 				     client->packet_length, from, &destination,
+ 				     NULL);
+@@ -3032,6 +3040,13 @@ void send_request (cpp)
+ 				  client->packet_length,
+ 				  fallback_interface->name);
+ 		}
++#if defined(SO_BINDTODEVICE)
++		if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET,
++			       SO_BINDTODEVICE, NULL, 0) < 0) {
++			log_fatal("%s:%d: Failed to unbind fallback interface:"
++				  " %m", MDL);
++		}
++#endif
+         }
+ 	else {
+ 		/* Send out a packet. */
+@@ -3144,6 +3159,14 @@ void send_release (cpp)
+ 	} else
+ #endif
+ 	if (fallback_interface) {
++#if defined(SO_BINDTODEVICE)
++		if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET,
++			       SO_BINDTODEVICE, client->interface->name,
++			       strlen(client->interface->name)) < 0) {
++			log_error("%s:%d: Failed to bind fallback interface"
++				  " to %s: %m", MDL, client->interface->name);
++		}
++#endif
+ 		result = send_packet(fallback_interface, NULL, &client->packet,
+ 				      client->packet_length, from, &destination,
+ 				      NULL);
+@@ -3153,6 +3176,13 @@ void send_release (cpp)
+ 				  client->packet_length,
+ 				  fallback_interface->name);
+ 		}
++#if defined(SO_BINDTODEVICE)
++		if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET,
++			       SO_BINDTODEVICE, NULL, 0) < 0) {
++			log_fatal("%s:%d: Failed to unbind fallback interface:"
++				  " %m", MDL);
++		}
++#endif
+         } else {
+ 		/* Send out a packet. */
+ 		result = send_packet(client->interface, NULL, &client->packet,
diff --git a/SOURCES/dhcp-default-requested-options.patch b/SOURCES/dhcp-default-requested-options.patch
new file mode 100644
index 0000000..f57fa1f
--- /dev/null
+++ b/SOURCES/dhcp-default-requested-options.patch
@@ -0,0 +1,44 @@
+diff -up dhcp-4.3.4/client/clparse.c.requested dhcp-4.3.4/client/clparse.c
+--- dhcp-4.3.4/client/clparse.c.requested	2016-04-29 12:18:50.157151352 +0200
++++ dhcp-4.3.4/client/clparse.c	2016-04-29 12:19:22.235137243 +0200
+@@ -31,7 +31,7 @@
+ 
+ struct client_config top_level_config;
+ 
+-#define NUM_DEFAULT_REQUESTED_OPTS	9
++#define NUM_DEFAULT_REQUESTED_OPTS	14
+ /* There can be 2 extra requested options for DHCPv4-over-DHCPv6. */
+ struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 2 + 1];
+ 
+@@ -116,6 +116,31 @@ isc_result_t read_client_conf ()
+ 	option_code_hash_lookup(&default_requested_options[8],
+ 				dhcpv6_universe.code_hash, &code, 0, MDL);
+ 
++	/* 10 */
++	code = DHO_NIS_DOMAIN;
++	option_code_hash_lookup(&default_requested_options[9],
++				dhcp_universe.code_hash, &code, 0, MDL);
++
++	/* 11 */
++	code = DHO_NIS_SERVERS;
++	option_code_hash_lookup(&default_requested_options[10],
++				dhcp_universe.code_hash, &code, 0, MDL);
++
++	/* 12 */
++	code = DHO_NTP_SERVERS;
++	option_code_hash_lookup(&default_requested_options[11],
++				dhcp_universe.code_hash, &code, 0, MDL);
++
++	/* 13 */
++	code = DHO_INTERFACE_MTU;
++	option_code_hash_lookup(&default_requested_options[12],
++				dhcp_universe.code_hash, &code, 0, MDL);
++
++	/* 14 */
++	code = DHO_DOMAIN_SEARCH;
++	option_code_hash_lookup(&default_requested_options[13],
++				dhcp_universe.code_hash, &code, 0, MDL);
++
+ 	for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
+ 		if (default_requested_options[code] == NULL)
+ 			log_fatal("Unable to find option definition for "
diff --git a/SOURCES/dhcp-dhclient-decline-backoff.patch b/SOURCES/dhcp-dhclient-decline-backoff.patch
new file mode 100644
index 0000000..1fc1c12
--- /dev/null
+++ b/SOURCES/dhcp-dhclient-decline-backoff.patch
@@ -0,0 +1,63 @@
+diff -up dhcp-4.3.4/client/dhclient.c.backoff dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.backoff	2016-04-29 12:16:26.976245611 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-04-29 12:16:26.979245609 +0200
+@@ -1423,6 +1423,8 @@ void state_init (cpp)
+ 	void *cpp;
+ {
+ 	struct client_state *client = cpp;
++	enum dhcp_state init_state = client->state;
++	struct timeval tv;
+ 
+ 	ASSERT_STATE(state, S_INIT);
+ 
+@@ -1435,9 +1437,18 @@ void state_init (cpp)
+ 	client -> first_sending = cur_time;
+ 	client -> interval = client -> config -> initial_interval;
+ 
+-	/* Add an immediate timeout to cause the first DHCPDISCOVER packet
+-	   to go out. */
+-	send_discover (client);
++	if (init_state != S_DECLINED) {
++		/* Add an immediate timeout to cause the first DHCPDISCOVER packet
++		   to go out. */
++		send_discover(client);
++	} else {
++		/* We've received an OFFER and it has been DECLINEd by dhclient-script.
++		 * wait for a random time between 1 and backoff_cutoff seconds before
++		 * trying again. */
++		tv . tv_sec = cur_time + ((1 + (random() >> 2)) %  client->config->backoff_cutoff);
++		tv . tv_usec = 0;
++		add_timeout(&tv, send_discover, client, 0, 0);
++	}
+ }
+ 
+ /*
+@@ -1734,5 +1745,6 @@ void bind_lease (client)
+#endif
+ 			exit(2);
+ 		} else {
++			client -> state = S_DECLINED;
+ 			state_init(client);
+ 			return;
+ 		}
+@@ -4626,6 +4638,7 @@ void client_location_changed ()
+ 			      case S_INIT:
+ 			      case S_REBINDING:
+ 			      case S_STOPPED:
++			      case S_DECLINED:
+ 				break;
+ 			}
+ 			client -> state = S_INIT;
+diff -up dhcp-4.3.4/includes/dhcpd.h.backoff dhcp-4.3.4/includes/dhcpd.h
+--- dhcp-4.3.4/includes/dhcpd.h.backoff	2016-04-29 12:16:26.980245609 +0200
++++ dhcp-4.3.4/includes/dhcpd.h	2016-04-29 12:17:30.893203533 +0200
+@@ -1171,7 +1171,8 @@ enum dhcp_state {
+ 	S_BOUND = 5,
+ 	S_RENEWING = 6,
+ 	S_REBINDING = 7,
+-	S_STOPPED = 8
++	S_STOPPED = 8,
++	S_DECLINED = 9
+ };
+ 
+ /* Possible pending client operations. */
diff --git a/SOURCES/dhcp-dhclient-options.patch b/SOURCES/dhcp-dhclient-options.patch
new file mode 100644
index 0000000..806ac63
--- /dev/null
+++ b/SOURCES/dhcp-dhclient-options.patch
@@ -0,0 +1,449 @@
+diff --git a/client/clparse.c b/client/clparse.c
+index 03190c3..2033427 100644
+--- a/client/clparse.c
++++ b/client/clparse.c
+@@ -189,6 +189,7 @@ isc_result_t read_client_conf ()
+ 	/* Requested lease time, used by DHCPv6 (DHCPv4 uses the option cache)
+ 	 */
+ 	top_level_config.requested_lease = 7200;
++	top_level_config.bootp_broadcast_always = 0;
+ 
+ 	group_allocate (&top_level_config.on_receipt, MDL);
+ 	if (!top_level_config.on_receipt)
+@@ -394,7 +395,8 @@ void read_client_leases ()
+ 	interface-declaration |
+ 	LEASE client-lease-statement |
+ 	ALIAS client-lease-statement |
+-	KEY key-definition */
++	KEY key-definition |
++	BOOTP_BROADCAST_ALWAYS */
+ 
+ void parse_client_statement (cfile, ip, config)
+ 	struct parse *cfile;
+@@ -817,6 +819,12 @@ void parse_client_statement (cfile, ip, config)
+ 		parse_lease_id_format(cfile);
+ 		break;
+ 
++	      case BOOTP_BROADCAST_ALWAYS:
++		token = next_token(&val, (unsigned*)0, cfile);
++		config -> bootp_broadcast_always = 1;
++		parse_semi (cfile);
++		return;
++
+ 
+ 	      default:
+ 		lose = 0;
+diff --git a/client/dhclient.8 b/client/dhclient.8
+index 24f8f12..aa2238d 100644
+--- a/client/dhclient.8
++++ b/client/dhclient.8
+@@ -134,6 +134,33 @@ dhclient - Dynamic Host Configuration Protocol Client
+ .B -w
+ ]
+ [
++.B -B
++]
++[
++.B -C
++.I dhcp-client-identifier
++]
++[
++.B -H
++.I host-name
++]
++[
++.B -F
++.I fqdn.fqdn
++]
++[
++.B -V
++.I vendor-class-identifier
++]
++[
++.B --request-options
++.I request-option-list
++]
++[
++.B --timeout
++.I timeout
++]
++[
+ .B --dad-wait-time
+ .I seconds
+ ]
+diff --git a/client/dhclient.c b/client/dhclient.c
+index dcf3f1a..270a960 100644
+--- a/client/dhclient.c
++++ b/client/dhclient.c
+@@ -40,6 +40,12 @@
+ #include <isc/file.h>
+ #include <dns/result.h>
+ 
++/*
++ * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
++ * that when building ISC code.
++ */
++extern int asprintf(char **strp, const char *fmt, ...);
++
+ TIME default_lease_time = 43200; /* 12 hours... */
+ TIME max_lease_time = 86400; /* 24 hours... */
+ 
+@@ -101,6 +107,10 @@ char *mockup_relay = NULL;
+ 
+ char *progname = NULL;
+ 
++int bootp_broadcast_always = 0;
++
++extern struct option *default_requested_options[];
++
+ void run_stateless(int exit_mode, u_int16_t port);
+ 
+ static isc_result_t write_duid(struct data_string *duid);
+@@ -179,7 +189,11 @@ usage(const char *sfmt, const char *sarg)
+ 		  "                [-s server-addr] [-cf config-file]\n"
+ 		  "                [-df duid-file] [-lf lease-file]\n"
+ 		  "                [-pf pid-file] [--no-pid] [-e VAR=val]\n"
+-		  "                [-sf script-file] [interface]*",
++		  "                [-sf script-file] [interface]*\n"
++		  "                [-C <dhcp-client-identifier>] [-B]\n"
++		  "                [-H <host-name> | -F <fqdn.fqdn>] [--timeout <timeout>]\n"
++		  "                [-V <vendor-class-identifier>]\n"
++		  "                [--request-options <request option list>]",
+ 		  isc_file_basename(progname));
+ }
+ 
+@@ -216,6 +230,16 @@ main(int argc, char **argv) {
+ 	progname = argv[0];
+ #endif
+ 
++	char *dhcp_client_identifier_arg = NULL;
++	char *dhcp_host_name_arg = NULL;
++	char *dhcp_fqdn_arg = NULL;
++	char *dhcp_vendor_class_identifier_arg = NULL;
++	char *dhclient_request_options = NULL;
++
++	int timeout_arg = 0;
++	char *arg_conf = NULL;
++	int arg_conf_len = 0;
++
+ 	/* Initialize client globals. */
+ 	memset(&default_duid, 0, sizeof(default_duid));
+ 
+@@ -442,6 +466,88 @@ main(int argc, char **argv) {
+ 					 strlen(PACKAGE_VERSION)));
+ 			IGNORE_RET(write(STDERR_FILENO, "\n", 1));
+ 			exit(0);
++		} else if (!strcmp(argv[i], "-C")) {
++			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
++				usage(use_noarg, argv[i-1]);
++				exit(1);
++			}
++
++			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
++				log_error("-C option dhcp-client-identifier string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
++				exit(1);
++			}
++
++			dhcp_client_identifier_arg = argv[i];
++		} else if (!strcmp(argv[i], "-B")) {
++			bootp_broadcast_always = 1;
++		} else if (!strcmp(argv[i], "-H")) {
++			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
++				usage(use_noarg, argv[i-1]);
++				exit(1);
++			}
++
++			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
++				log_error("-H option host-name string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
++				exit(1);
++			}
++
++			if (dhcp_host_name_arg != NULL) {
++				log_error("The -H <host-name> and -F <fqdn> arguments are mutually exclusive");
++				exit(1);
++			}
++
++			dhcp_host_name_arg = argv[i];
++		} else if (!strcmp(argv[i], "-F")) {
++			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
++				usage(use_noarg, argv[i-1]);
++				exit(1);
++			}
++
++			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
++				log_error("-F option fqdn.fqdn string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
++				exit(1);
++			}
++
++			if (dhcp_fqdn_arg != NULL) {
++				log_error("Only one -F <fqdn> argument can be specified");
++				exit(1);
++			}
++
++			if (dhcp_host_name_arg != NULL) {
++				log_error("The -F <fqdn> and -H <host-name> arguments are mutually exclusive");
++				exit(1);
++			}
++
++			dhcp_fqdn_arg = argv[i];
++		} else if (!strcmp(argv[i], "--timeout")) {
++			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
++				usage(use_noarg, argv[i-1]);
++				exit(1);
++			}
++
++			if ((timeout_arg = atoi(argv[i])) <= 0) {
++				log_error("timeout option must be > 0 - bad value: %s",argv[i]);
++				exit(1);
++			}
++		} else if (!strcmp(argv[i], "-V")) {
++			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
++				usage(use_noarg, argv[i-1]);
++				exit(1);
++			}
++
++			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
++				log_error("-V option vendor-class-identifier string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
++				exit(1);
++			}
++
++			dhcp_vendor_class_identifier_arg = argv[i];
++		} else if (!strcmp(argv[i], "--request-options")) {
++			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
++				usage(use_noarg, argv[i-1]);
++				exit(1);
++			}
++
++			dhclient_request_options = argv[i];
+ 		} else if (argv[i][0] == '-') {
+ 			usage("Unknown command: %s", argv[i]);
+ 		} else if (interfaces_requested < 0) {
+@@ -641,6 +747,156 @@ main(int argc, char **argv) {
+ 	/* Parse the dhclient.conf file. */
+ 	read_client_conf();
+ 
++	/* Parse any extra command line configuration arguments: */
++	if ((dhcp_client_identifier_arg != NULL) && (*dhcp_client_identifier_arg != '\0')) {
++		arg_conf_len = asprintf(&arg_conf, "send dhcp-client-identifier \"%s\";", dhcp_client_identifier_arg);
++
++		if ((arg_conf == 0) || (arg_conf_len <= 0))
++			log_fatal("Unable to send -C option dhcp-client-identifier");
++	}
++
++	if ((dhcp_host_name_arg != NULL) && (*dhcp_host_name_arg != '\0')) {
++		if (arg_conf == 0) {
++			arg_conf_len = asprintf(&arg_conf, "send host-name \"%s\";", dhcp_host_name_arg);
++
++			if ((arg_conf == 0) || (arg_conf_len <= 0))
++				log_fatal("Unable to send -H option host-name");
++		} else {
++			char *last_arg_conf = arg_conf;
++			arg_conf = NULL;
++			arg_conf_len = asprintf(&arg_conf, "%s\nsend host-name \"%s\";", last_arg_conf, dhcp_host_name_arg);
++
++			if ((arg_conf == 0) || (arg_conf_len <= 0))
++				log_fatal("Unable to send -H option host-name");
++
++			free(last_arg_conf);
++		}
++	}
++
++	if ((dhcp_fqdn_arg != NULL) && (*dhcp_fqdn_arg != '\0')) {
++		if (arg_conf == 0) {
++			arg_conf_len = asprintf(&arg_conf,  "send fqdn.fqdn \"%s\";", dhcp_fqdn_arg);
++
++			if ((arg_conf == 0) || (arg_conf_len <= 0))
++				log_fatal("Unable to send -F option fqdn.fqdn");
++		} else {
++			char *last_arg_conf = arg_conf;
++			arg_conf = NULL;
++			arg_conf_len = asprintf(&arg_conf, "%s\nsend fqdn.fqdn \"%s\";", last_arg_conf, dhcp_fqdn_arg);
++
++			if ((arg_conf == 0)  || (arg_conf_len <= 0))
++				log_fatal("Unable to send -F option fqdn.fqdn");
++
++			free(last_arg_conf);
++		}
++	}
++
++	if (timeout_arg) {
++		if (arg_conf == 0) {
++			arg_conf_len = asprintf(&arg_conf,  "timeout %d;", timeout_arg);
++
++			if ((arg_conf == 0) || (arg_conf_len <= 0))
++				log_fatal("Unable to process --timeout timeout argument");
++		} else {
++			char *last_arg_conf = arg_conf;
++			arg_conf = NULL;
++			arg_conf_len = asprintf(&arg_conf, "%s\ntimeout %d;", last_arg_conf, timeout_arg);
++
++			if ((arg_conf == 0) || (arg_conf_len == 0))
++				log_fatal("Unable to process --timeout timeout argument");
++
++			free(last_arg_conf);
++		}
++	}
++
++	if ((dhcp_vendor_class_identifier_arg != NULL) && (*dhcp_vendor_class_identifier_arg != '\0')) {
++		if (arg_conf == 0) {
++			arg_conf_len = asprintf(&arg_conf,  "send vendor-class-identifier \"%s\";", dhcp_vendor_class_identifier_arg);
++
++			if ((arg_conf == 0) || (arg_conf_len <= 0))
++				log_fatal("Unable to send -V option vendor-class-identifier");
++		} else {
++			char *last_arg_conf = arg_conf;
++			arg_conf = NULL;
++			arg_conf_len = asprintf(&arg_conf, "%s\nsend vendor-class-identifier \"%s\";", last_arg_conf, dhcp_vendor_class_identifier_arg);
++
++			if ((arg_conf == 0) || (arg_conf_len <= 0))
++				log_fatal("Unable to send -V option vendor-class-identifier");
++
++			free(last_arg_conf);
++		}
++	}
++
++	if (dhclient_request_options != NULL) {
++		if (arg_conf == 0) {
++			arg_conf_len = asprintf(&arg_conf,  "request %s;", dhclient_request_options);
++
++			if ((arg_conf == 0) || (arg_conf_len <= 0))
++				log_fatal("Unable to parse --request-options <request options list> argument");
++		} else {
++			char *last_arg_conf = arg_conf;
++			arg_conf = NULL;
++			arg_conf_len = asprintf(&arg_conf, "%s\nrequest %s;", last_arg_conf, dhclient_request_options);
++
++			if ((arg_conf == 0)  || (arg_conf_len <= 0))
++				log_fatal("Unable to parse --request-options <request options list> argument");
++
++			free(last_arg_conf);
++		}
++	}
++
++	if (arg_conf) {
++		if (arg_conf_len == 0)
++			if ((arg_conf_len = strlen(arg_conf)) == 0)
++				/* huh ? cannot happen ! */
++				log_fatal("Unable to process -C/-H/-F/--timeout/-V/--request-options configuration arguments");
++
++		/* parse the extra dhclient.conf configuration arguments
++		 * into top level config: */
++		struct parse *cfile = (struct parse *)0;
++		const char *val = NULL;
++		int token;
++
++		status = new_parse(&cfile, -1, arg_conf, arg_conf_len, "extra dhclient -C/-H/-F/--timeout/-V/--request-options configuration arguments", 0);
++
++		if ((status != ISC_R_SUCCESS) || (cfile -> warnings_occurred))
++			log_fatal("Cannot parse -C/-H/-F/--timeout/-V/--request-options configuration arguments !");
++		/* more detailed parse failures will be logged */
++
++		do {
++			token = peek_token(&val, (unsigned *)0, cfile);
++			if (token == END_OF_FILE)
++				break;
++
++			parse_client_statement(cfile, (struct interface_info *)0, &top_level_config);
++		} while (1);
++
++		if (cfile -> warnings_occurred)
++			log_fatal("Cannot parse -C/-H/-F/--timeout/-V/--request-options configuration arguments !");
++		end_parse(&cfile);
++
++		if (timeout_arg) {
++			/* we just set the toplevel timeout, but per-client
++			 * timeouts may still be at defaults.
++			 */
++			for (ip=interfaces; ip; ip = ip->next) {
++				if (ip->client->config->timeout == 60)
++					ip->client->config->timeout = timeout_arg;
++			}
++		}
++
++		if ((dhclient_request_options != 0) && (top_level_config.requested_options != default_requested_options)) {
++			for (ip=interfaces; ip; ip = ip->next) {
++				if (ip->client->config->requested_options == default_requested_options)
++					ip->client->config->requested_options = top_level_config.requested_options;
++			}
++		}
++
++		free(arg_conf);
++		arg_conf = NULL;
++		arg_conf_len = 0;
++	}
++
+ 	/* Parse the lease database. */
+ 	read_client_leases();
+ 
+@@ -3092,7 +3348,8 @@ void make_discover (client, lease)
+ 	client -> packet.xid = random ();
+ 	client -> packet.secs = 0; /* filled in by send_discover. */
+ 
+-	if (can_receive_unicast_unconfigured (client -> interface))
++	if ((!(bootp_broadcast_always || client->config->bootp_broadcast_always))
++	    && can_receive_unicast_unconfigured(client->interface))
+ 		client -> packet.flags = 0;
+ 	else
+ 		client -> packet.flags = htons (BOOTP_BROADCAST);
+@@ -3177,7 +3434,9 @@ void make_request (client, lease)
+ 	} else {
+ 		memset (&client -> packet.ciaddr, 0,
+ 			sizeof client -> packet.ciaddr);
+-		if (can_receive_unicast_unconfigured (client -> interface))
++		if ((!(bootp_broadcast_always ||
++		    client ->config->bootp_broadcast_always)) &&
++		    can_receive_unicast_unconfigured (client -> interface))
+ 			client -> packet.flags = 0;
+ 		else
+ 			client -> packet.flags = htons (BOOTP_BROADCAST);
+@@ -3240,7 +3499,8 @@ void make_decline (client, lease)
+ 	client -> packet.hops = 0;
+ 	client -> packet.xid = client -> xid;
+ 	client -> packet.secs = 0; /* Filled in by send_request. */
+-	if (can_receive_unicast_unconfigured (client -> interface))
++	if ((!(bootp_broadcast_always || client->config-> bootp_broadcast_always))
++	    && can_receive_unicast_unconfigured (client->interface))
+ 		client -> packet.flags = 0;
+ 	else
+ 		client -> packet.flags = htons (BOOTP_BROADCAST);
+diff --git a/common/conflex.c b/common/conflex.c
+index fe994ac..bdb4a52 100644
+--- a/common/conflex.c
++++ b/common/conflex.c
+@@ -832,6 +832,8 @@ intern(char *atom, enum dhcp_token dfv) {
+ 		if (!strcasecmp(atom+1, "ig-endian")) {
+ 			return TOKEN_BIG_ENDIAN;
+ 		}
++		if (!strcasecmp (atom + 1, "ootp-broadcast-always"))
++			return BOOTP_BROADCAST_ALWAYS;
+ 		break;
+ 	      case 'c':
+ 		if (!strcasecmp(atom + 1, "ase"))
+diff --git a/includes/dhcpd.h b/includes/dhcpd.h
+index eab09a6..cfdac23 100644
+--- a/includes/dhcpd.h
++++ b/includes/dhcpd.h
+@@ -1251,6 +1251,9 @@ struct client_config {
+ 
+ 	int lease_id_format;		/* format for IDs in lease file,
+ 					   TOKEN_OCTAL or TOKEN_HEX */
++
++	int bootp_broadcast_always;	/* If nonzero, always set the BOOTP_BROADCAST
++					   flag in requests */
+ };
+ 
+ /* Per-interface state used in the dhcp client... */
+diff --git a/includes/dhctoken.h b/includes/dhctoken.h
+index 15bbd1c..b312e7a 100644
+--- a/includes/dhctoken.h
++++ b/includes/dhctoken.h
+@@ -373,7 +373,8 @@ enum dhcp_token {
+ 	TOKEN_BIG_ENDIAN = 675,
+ 	LEASE_ID_FORMAT = 676,
+ 	TOKEN_HEX = 677,
+-	TOKEN_OCTAL = 678
++	TOKEN_OCTAL = 678,
++	BOOTP_BROADCAST_ALWAYS = 679
+ };
+ 
+ #define is_identifier(x)	((x) >= FIRST_TOKEN &&	\
diff --git a/SOURCES/dhcp-dhclient-preinit6s.patch b/SOURCES/dhcp-dhclient-preinit6s.patch
new file mode 100644
index 0000000..0ce1cf8
--- /dev/null
+++ b/SOURCES/dhcp-dhclient-preinit6s.patch
@@ -0,0 +1,64 @@
+diff -up dhcp-4.3.4/client/dhclient.c.preinit6s dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.preinit6s	2016-04-29 13:15:10.361379493 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-04-29 13:17:43.622415423 +0200
+@@ -812,6 +812,12 @@ main(int argc, char **argv) {
+ 
+ 	inaddr_any.s_addr = INADDR_ANY;
+ 
++	/* Discover all the network interfaces. */
++	discover_interfaces(DISCOVER_UNCONFIGURED);
++
++	/* Parse the dhclient.conf file. */
++	read_client_conf();
++
+ 	/* Stateless special case. */
+ 	if (stateless) {
+ 		if (release_mode || (wanted_ia_na > 0) ||
+@@ -828,12 +834,6 @@ main(int argc, char **argv) {
+ 		return 0;
+ 	}
+ 
+-	/* Discover all the network interfaces. */
+-	discover_interfaces(DISCOVER_UNCONFIGURED);
+-
+-	/* Parse the dhclient.conf file. */
+-	read_client_conf();
+-
+ 	/* Parse any extra command line configuration arguments: */
+ 	if ((dhcp_client_identifier_arg != NULL) && (*dhcp_client_identifier_arg != '\0')) {
+ 		arg_conf_len = asprintf(&arg_conf, "send dhcp-client-identifier \"%s\";", dhcp_client_identifier_arg);
+@@ -1288,20 +1288,30 @@ void run_stateless(int exit_mode, u_int1
+ 	IGNORE_UNUSED(port);
+ #endif
+ 
+-	/* Discover the network interface. */
+-	discover_interfaces(DISCOVER_REQUESTED);
++	struct interface_info *ip;
+ 
+ 	if (!interfaces)
+ 		usage("No interfaces available for stateless command: %s", "-S");
+ 
+-	/* Parse the dhclient.conf file. */
+ #ifdef DHCP4o6
+ 	if (dhcpv4_over_dhcpv6) {
+ 		/* Mark we want to request IRT too! */
+ 		dhcpv4_over_dhcpv6++;
+ 	}
+ #endif
+-	read_client_conf();
++
++	for (ip = interfaces; ip; ip = ip->next) {
++		if ((interfaces_requested > 0) &&
++		    ((ip->flags & (INTERFACE_REQUESTED |
++				   INTERFACE_AUTOMATIC)) !=
++		     INTERFACE_REQUESTED))
++			continue;
++		script_init(ip->client, "PREINIT6", NULL);
++		script_go(ip->client);
++	}
++
++	/* Discover the network interface. */
++	discover_interfaces(DISCOVER_REQUESTED);
+ 
+ 	/* Parse the lease database. */
+ 	read_client_leases();
diff --git a/SOURCES/dhcp-duid_uuid.patch b/SOURCES/dhcp-duid_uuid.patch
new file mode 100644
index 0000000..73961df
--- /dev/null
+++ b/SOURCES/dhcp-duid_uuid.patch
@@ -0,0 +1,111 @@
+diff -up dhcp-4.3.4/client/dhclient.c.duid_uuid dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.duid_uuid	2016-04-29 12:58:14.846150838 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-04-29 12:58:14.851150839 +0200
+@@ -3868,6 +3868,59 @@ write_options(struct client_state *clien
+ 	}
+ }
+ 
++int unhexchar(char c) {
++
++	if (c >= '0' && c <= '9')
++		return c - '0';
++
++	if (c >= 'a' && c <= 'f')
++		return c - 'a' + 10;
++
++	if (c >= 'A' && c <= 'F')
++		return c - 'A' + 10;
++
++	return -1;
++}
++
++isc_result_t
++read_uuid(u_int8_t* uuid) {
++	const char *id_fname = "/etc/machine-id";
++	char id[32];
++	size_t nread;
++	FILE * file = fopen( id_fname , "r");
++	if (!file) {
++		log_debug("Cannot open %s", id_fname);
++		return ISC_R_IOERROR;
++	}
++	nread = fread(id, 1, sizeof id, file);
++	fclose(file);
++
++	if (nread < 32) {
++		log_debug("Not enough data in %s", id_fname);
++		return ISC_R_IOERROR;
++	}
++	int j;
++	for (j = 0; j < 16; j++) {
++		int a, b;
++
++		a = unhexchar(id[j*2]);
++		b = unhexchar(id[j*2+1]);
++
++		if (a < 0 || b < 0) {
++			log_debug("Wrong data in %s", id_fname);
++                        return ISC_R_IOERROR;
++		}
++		uuid[j] = a << 4 | b;
++	}
++
++	/* Set UUID version to 4 --- truly random generation */
++	uuid[6] = (uuid[6] & 0x0F) | 0x40;
++	/* Set the UUID variant to DCE */
++	uuid[8] = (uuid[8] & 0x3F) | 0x80;
++
++	return ISC_R_SUCCESS;
++}
++
+ /*
+  * The "best" default DUID, since we cannot predict any information
+  * about the system (such as whether or not the hardware addresses are
+@@ -3888,6 +3941,7 @@ form_duid(struct data_string *duid, cons
+ 	struct interface_info *ip;
+ 	int len;
+ 	char *str;
++	u_int8_t uuid[16];
+ 
+ 	/* For now, just use the first interface on the list. */
+ 	ip = interfaces;
+@@ -3908,9 +3962,16 @@ form_duid(struct data_string *duid, cons
+ 	    (ip->hw_address.hlen > sizeof(ip->hw_address.hbuf)))
+ 		log_fatal("Impossible hardware address length at %s:%d.", MDL);
+ 
+-	if (duid_type == 0)
+-		duid_type = stateless ? DUID_LL : DUID_LLT;
+-
++	if (duid_type == 0) {
++		if (read_uuid(uuid) == ISC_R_SUCCESS)
++		    duid_type = DUID_UUID;
++		else
++		    duid_type = stateless ? DUID_LL : DUID_LLT;
++	}
++	
++	if (duid_type == DUID_UUID)
++		len = 2 + sizeof (uuid);
++	else {
+ 	/*
+ 	 * 2 bytes for the 'duid type' field.
+ 	 * 2 bytes for the 'htype' field.
+@@ -3921,13 +3982,18 @@ form_duid(struct data_string *duid, cons
+ 	len = 4 + (ip->hw_address.hlen - 1);
+ 	if (duid_type == DUID_LLT)
+ 		len += 4;
++	}
+ 	if (!buffer_allocate(&duid->buffer, len, MDL))
+ 		log_fatal("no memory for default DUID!");
+ 	duid->data = duid->buffer->data;
+ 	duid->len = len;
+ 
++	if (duid_type == DUID_UUID) {
++		putUShort(duid->buffer->data, DUID_UUID);
++		memcpy(duid->buffer->data + 2, uuid, sizeof(uuid));
++	}
+ 	/* Basic Link Local Address type of DUID. */
+-	if (duid_type == DUID_LLT) {
++	else if (duid_type == DUID_LLT) {
+ 		putUShort(duid->buffer->data, DUID_LLT);
+ 		putUShort(duid->buffer->data + 2, ip->hw_address.hbuf[0]);
+ 		putULong(duid->buffer->data + 4, cur_time - DUID_TIME_EPOCH);
diff --git a/SOURCES/dhcp-duidv4.patch b/SOURCES/dhcp-duidv4.patch
new file mode 100644
index 0000000..52fde3b
--- /dev/null
+++ b/SOURCES/dhcp-duidv4.patch
@@ -0,0 +1,34 @@
+diff -up dhcp-4.3.1b1/client/dhclient.8.KrJcIv dhcp-4.3.1b1/client/dhclient.8
+--- dhcp-4.3.1b1/client/dhclient.8.KrJcIv	2014-07-10 17:39:25.852763873 +0200
++++ dhcp-4.3.1b1/client/dhclient.8	2014-07-10 17:54:26.841012988 +0200
+@@ -458,6 +458,9 @@ used to construct a RFC4361 style client
+ in the client's messages.  This client id can be overridden by
+ setting a client id in the configuration file.  Overridding the
+ client id in this fashion is discouraged.
++This option is turned on by default, if you want to redefine or turn off
++sending of client id, use send dhcp-client-identifier = "better identifier"
++or send dhcp-client-identifier = "" in /etc/dhcp/dhclient.conf.
+ .TP
+ .BI \-I
+ Use the standard DDNS scheme from RFCs 4701 & 4702.  
+diff -up dhcp-4.3.1b1/client/dhclient.c.KrJcIv dhcp-4.3.1b1/client/dhclient.c
+--- dhcp-4.3.1b1/client/dhclient.c.KrJcIv	2014-07-10 17:54:26.829013157 +0200
++++ dhcp-4.3.1b1/client/dhclient.c	2014-07-10 17:55:50.155835918 +0200
+@@ -73,7 +73,7 @@ struct sockaddr_in sockaddr_broadcast;
+ struct in_addr giaddr;
+ struct data_string default_duid;
+ int duid_type = 0;
+-int duid_v4 = 0;
++int duid_v4 = 1;
+ int std_dhcid = 0;
+ 
+ /* ASSERT_STATE() does nothing now; it used to be
+@@ -1301,7 +1301,7 @@ static void setup_ib_interface(struct in
+ 	}
+ 
+ 	/* No client ID specified */
+-	log_fatal("dhcp-client-identifier must be specified for InfiniBand");
++	//log_fatal("dhcp-client-identifier must be specified for InfiniBand");
+ }
+ 
+ /* Individual States:
diff --git a/SOURCES/dhcp-errwarn-message.patch b/SOURCES/dhcp-errwarn-message.patch
new file mode 100644
index 0000000..18f77cf
--- /dev/null
+++ b/SOURCES/dhcp-errwarn-message.patch
@@ -0,0 +1,64 @@
+diff -up dhcp-4.3.5/omapip/errwarn.c.errwarn dhcp-4.3.5/omapip/errwarn.c
+--- dhcp-4.3.5/omapip/errwarn.c.errwarn	2016-09-27 21:16:50.000000000 +0200
++++ dhcp-4.3.5/omapip/errwarn.c	2016-11-29 19:44:03.515031147 +0100
+@@ -49,6 +49,41 @@ void (*log_cleanup) (void);
+ static char mbuf [CVT_BUF_MAX + 1];
+ static char fbuf [CVT_BUF_MAX + 1];
+ 
++// get BUG_REPORT_URL from /etc/os-release
++char * bug_report_url(void) {
++    FILE * file = fopen("/etc/os-release", "r");
++    size_t len;
++    char * line = NULL;
++    char * url = NULL;
++    size_t url_len = 256;
++
++    url = (char *) malloc(url_len * sizeof(char));
++    strcpy(url, "https://bugzilla.redhat.com/");
++
++    if (!file)
++        return url;
++
++    while ((getline(&line, &len, file)) != -1) {
++        if (strstr(line, "BUG_REPORT_URL") != NULL) {
++            char * start = strchr(line, '=');
++            char * rquotes = strrchr(line, '"');
++
++            if (rquotes != NULL) {
++                *rquotes = '\0';
++                strncpy(url, start+2, url_len);
++            } else {
++                strncpy(url, start+1, url_len);
++            }
++            url[url_len-1] = '\0';
++            fclose(file);
++            return url;
++        }
++    }
++    fclose(file);
++    return url;
++}
++
++
+ /* Log an error message, then exit... */
+ 
+ void log_fatal (const char * fmt, ... )
+@@ -75,11 +110,13 @@ void log_fatal (const char * fmt, ... )
+   }
+ 
+   log_error ("%s", "");
+-  log_error ("If you think you have received this message due to a bug rather");
+-  log_error ("than a configuration issue please read the section on submitting");
+-  log_error ("bugs on either our web page at www.isc.org or in the README file");
+-  log_error ("before submitting a bug.  These pages explain the proper");
+-  log_error ("process and the information we find helpful for debugging.");
++  log_error ("This version of ISC DHCP is based on the release available");
++  log_error ("on ftp.isc.org. Features have been added and other changes");
++  log_error ("have been made to the base software release in order to make");
++  log_error ("it work better with this distribution.");
++  log_error ("%s", "");
++  log_error ("Please report issues with this software via: ");
++  log_error ("%s", bug_report_url());
+   log_error ("%s", "");
+   log_error ("exiting.");
+ 
diff --git a/SOURCES/dhcp-garbage-chars.patch b/SOURCES/dhcp-garbage-chars.patch
new file mode 100644
index 0000000..131360b
--- /dev/null
+++ b/SOURCES/dhcp-garbage-chars.patch
@@ -0,0 +1,12 @@
+diff -up dhcp-4.3.0rc1/common/tables.c.garbage dhcp-4.3.0rc1/common/tables.c
+--- dhcp-4.3.0rc1/common/tables.c.garbage	2014-01-29 10:03:52.132624677 +0100
++++ dhcp-4.3.0rc1/common/tables.c	2014-01-29 10:04:51.413875343 +0100
+@@ -213,7 +213,7 @@ static struct option dhcp_options[] = {
+ 	{ "name-service-search", "Sa",		&dhcp_universe, 117, 1 },
+ #endif
+ 	{ "subnet-selection", "I",		&dhcp_universe, 118, 1 },
+-	{ "domain-search", "Dc",		&dhcp_universe, 119, 1 },
++	{ "domain-search", "D",			&dhcp_universe, 119, 1 },
+ 	{ "vivco", "Evendor-class.",		&dhcp_universe, 124, 1 },
+ 	{ "vivso", "Evendor.",			&dhcp_universe, 125, 1 },
+ #if 0
diff --git a/SOURCES/dhcp-handle_ctx_signals.patch b/SOURCES/dhcp-handle_ctx_signals.patch
new file mode 100644
index 0000000..9bbe548
--- /dev/null
+++ b/SOURCES/dhcp-handle_ctx_signals.patch
@@ -0,0 +1,44 @@
+diff --git a/omapip/isclib.c b/omapip/isclib.c
+index 9ec1a0f..42d82ff 100644
+--- a/omapip/isclib.c
++++ b/omapip/isclib.c
+@@ -185,16 +185,6 @@ dhcp_context_create(int flags,
+ 		if (result != ISC_R_SUCCESS)
+ 			goto cleanup;
+ 
+-		result = isc_app_ctxstart(dhcp_gbl_ctx.actx);
+-		if (result != ISC_R_SUCCESS)
+-			return (result);
+-		dhcp_gbl_ctx.actx_started = ISC_TRUE;
+-
+-		/* Not all OSs support suppressing SIGPIPE through socket
+-		 * options, so set the sigal action to be ignore.  This allows
+-		 * broken connections to fail gracefully with EPIPE on writes */
+-		handle_signal(SIGPIPE, SIG_IGN);
+-
+ 		result = isc_taskmgr_createinctx(dhcp_gbl_ctx.mctx,
+ 						 dhcp_gbl_ctx.actx,
+ 						 1, 0,
+@@ -217,6 +207,21 @@ dhcp_context_create(int flags,
+ 		result = isc_task_create(dhcp_gbl_ctx.taskmgr, 0, &dhcp_gbl_ctx.task);
+ 		if (result != ISC_R_SUCCESS)
+ 			goto cleanup;
++
++		result = isc_app_ctxstart(dhcp_gbl_ctx.actx);
++		if (result != ISC_R_SUCCESS)
++			return (result);
++		dhcp_gbl_ctx.actx_started = ISC_TRUE;
++
++		/* Not all OSs support suppressing SIGPIPE through socket
++		 * options, so set the sigal action to be ignore.  This allows
++		 * broken connections to fail gracefully with EPIPE on writes */
++		handle_signal(SIGPIPE, SIG_IGN);
++
++		/* Reset handlers installed by isc_app_ctxstart()
++		 * to default for control-c and kill */
++		handle_signal(SIGINT, SIG_DFL);
++		handle_signal(SIGTERM, SIG_DFL);
+ 	}
+ 
+ #if defined (NSUPDATE)
+
diff --git a/SOURCES/dhcp-honor-expired.patch b/SOURCES/dhcp-honor-expired.patch
new file mode 100644
index 0000000..bd89297
--- /dev/null
+++ b/SOURCES/dhcp-honor-expired.patch
@@ -0,0 +1,49 @@
+diff -up dhcp-4.3.0a1/client/dhc6.c.honor-expired dhcp-4.3.0a1/client/dhc6.c
+--- dhcp-4.3.0a1/client/dhc6.c.honor-expired	2013-12-19 16:00:28.062183037 +0100
++++ dhcp-4.3.0a1/client/dhc6.c	2013-12-19 16:00:28.076182842 +0100
+@@ -1351,6 +1351,32 @@ start_info_request6(struct client_state
+ 		go_daemon();
+ }
+ 
++/* Run through the addresses in lease and return true if there's any unexpired.
++ * Return false otherwise.
++ */
++isc_boolean_t
++unexpired_address_in_lease(struct dhc6_lease *lease)
++{
++	struct dhc6_ia *ia;
++	struct dhc6_addr *addr;
++
++	for (ia = lease->bindings ; ia != NULL ; ia = ia->next) {
++		for (addr = ia->addrs ; addr != NULL ; addr = addr->next) {
++			if (addr->flags & DHC6_ADDR_EXPIRED)
++				continue;
++
++			if (addr->starts + addr->max_life > cur_time) {
++				return ISC_TRUE;
++			}
++		}
++	}
++
++	log_info("PRC: Previous lease is devoid of active addresses."
++		 "  Re-initializing.");
++
++	return ISC_FALSE;
++}
++
+ /*
+  * start_confirm6() kicks off an "init-reboot" version of the process, at
+  * startup to find out if old bindings are 'fair' and at runtime whenever
+@@ -1363,8 +1389,10 @@ start_confirm6(struct client_state *clie
+ 
+ 	/* If there is no active lease, there is nothing to check. */
+ 	if ((client->active_lease == NULL) ||
+-	    !active_prefix(client) ||
+-	    client->active_lease->released) {
++		!active_prefix(client) ||
++		client->active_lease->released ||
++		!unexpired_address_in_lease(client->active_lease)) {
++		dhc6_lease_destroy(&client->active_lease, MDL);
+ 		start_init6(client);
+ 		return;
+ 	}
diff --git a/SOURCES/dhcp-improved-xid.patch b/SOURCES/dhcp-improved-xid.patch
new file mode 100644
index 0000000..69a6975
--- /dev/null
+++ b/SOURCES/dhcp-improved-xid.patch
@@ -0,0 +1,138 @@
+diff -up dhcp-4.3.4/client/dhclient.c.improved-xid dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.improved-xid	2016-04-29 12:54:55.997102182 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-04-29 12:57:25.123139587 +0200
+@@ -1045,6 +1045,26 @@ main(int argc, char **argv) {
+ 		}
+ 	}
+ 
++	/* We create a backup seed before rediscovering interfaces in order to
++	   have a seed built using all of the available interfaces
++	   It's interesting if required interfaces doesn't let us defined
++	   a really unique seed due to a lack of valid HW addr later
++	   (this is the case with DHCP over IB)
++	   We only use the last device as using a sum could broke the
++	   uniqueness of the seed among multiple nodes
++	 */
++	unsigned backup_seed = 0;
++	for (ip = interfaces; ip; ip = ip -> next) {
++		int junk;
++		if ( ip -> hw_address.hlen <= sizeof seed )
++		  continue;
++		memcpy (&junk,
++			&ip -> hw_address.hbuf [ip -> hw_address.hlen -
++						sizeof seed], sizeof seed);
++		backup_seed = junk;
++	}
++
++
+ 	/* At this point, all the interfaces that the script thinks
+ 	   are relevant should be running, so now we once again call
+ 	   discover_interfaces(), and this time ask it to actually set
+@@ -1059,14 +1079,36 @@ main(int argc, char **argv) {
+ 	   Not much entropy, but we're booting, so we're not likely to
+ 	   find anything better. */
+ 	seed = 0;
++	int seed_flag = 0;
+ 	for (ip = interfaces; ip; ip = ip->next) {
+ 		int junk;
++		if ( ip -> hw_address.hlen <= sizeof seed )
++		  continue;
+ 		memcpy(&junk,
+ 		       &ip->hw_address.hbuf[ip->hw_address.hlen -
+ 					    sizeof seed], sizeof seed);
+ 		seed += junk;
++		seed_flag = 1;
+ 	}
+-	srandom(seed + cur_time + (unsigned)getpid());
++	if ( seed_flag == 0 ) {
++		if ( backup_seed != 0 ) {
++		  seed = backup_seed;
++		  log_info ("xid: rand init seed (0x%x) built using all"
++			    " available interfaces",seed);
++		}
++		else {
++		  seed = cur_time^((unsigned) gethostid()) ;
++		  log_info ("xid: warning: no netdev with useable HWADDR found"
++			    " for seed's uniqueness enforcement");
++		  log_info ("xid: rand init seed (0x%x) built using gethostid",
++			    seed);
++		}
++		/* we only use seed and no current time as a broadcast reply */
++		/* will certainly be used by the hwaddrless interface */
++		srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid());
++	}
++	else
++	        srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid());
+ 
+ 	/* Setup specific Infiniband options */
+ 	for (ip = interfaces; ip; ip = ip->next) {
+@@ -1633,7 +1675,7 @@ void dhcpack (packet)
+ 		return;
+ 	}
+ 
+-	log_info ("DHCPACK from %s", piaddr (packet -> client_addr));
++	log_info ("DHCPACK from %s (xid=0x%x)", piaddr (packet -> client_addr), ntohl(client -> xid));
+ 
+ 	lease = packet_to_lease (packet, client);
+ 	if (!lease) {
+@@ -2541,7 +2583,7 @@ void dhcpnak (packet)
+ 		return;
+ 	}
+ 
+-	log_info ("DHCPNAK from %s", piaddr (packet -> client_addr));
++	log_info ("DHCPNAK from %s (xid=0x%x)", piaddr (packet -> client_addr), ntohl(client -> xid));
+ 
+ 	if (!client -> active) {
+ #if defined (DEBUG)
+@@ -2674,10 +2716,10 @@ void send_discover (cpp)
+ 			  (long)(client -> interval));
+ 	} else
+ #endif
+-	log_info ("DHCPDISCOVER on %s to %s port %d interval %ld",
++	log_info ("DHCPDISCOVER on %s to %s port %d interval %ld (xid=0x%x)",
+ 	      client -> name ? client -> name : client -> interface -> name,
+ 	      inet_ntoa (sockaddr_broadcast.sin_addr),
+-	      ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval));
++	      ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval), ntohl(client -> xid));
+ 
+ 	/* Send out a packet. */
+ #if defined(DHCPv6) && defined(DHCP4o6)
+@@ -2962,10 +3004,10 @@ void send_request (cpp)
+ 		log_info ("DHCPREQUEST");
+ 	} else
+ #endif
+-	log_info ("DHCPREQUEST on %s to %s port %d",
++	log_info ("DHCPREQUEST on %s to %s port %d (xid=0x%x)",
+ 	      client -> name ? client -> name : client -> interface -> name,
+ 	      inet_ntoa (destination.sin_addr),
+-	      ntohs (destination.sin_port));
++	      ntohs (destination.sin_port), ntohl(client -> xid));
+ 
+ #if defined(DHCPv6) && defined(DHCP4o6)
+ 	if (dhcpv4_over_dhcpv6) {
+@@ -3022,10 +3064,10 @@ void send_decline (cpp)
+ 		log_info ("DHCPDECLINE");
+ 	} else
+ #endif
+-	log_info ("DHCPDECLINE on %s to %s port %d",
++	log_info ("DHCPDECLINE on %s to %s port %d (xid=0x%x)",
+ 	      client->name ? client->name : client->interface->name,
+ 	      inet_ntoa(sockaddr_broadcast.sin_addr),
+-	      ntohs(sockaddr_broadcast.sin_port));
++	      ntohs(sockaddr_broadcast.sin_port), ntohl(client -> xid));
+ 
+ 	/* Send out a packet. */
+ #if defined(DHCPv6) && defined(DHCP4o6)
+@@ -3084,10 +3126,10 @@ void send_release (cpp)
+ 		log_info ("DHCPRELEASE");
+ 	} else
+ #endif
+-	log_info ("DHCPRELEASE on %s to %s port %d",
++	log_info ("DHCPRELEASE on %s to %s port %d (xid=0x%x)",
+ 	      client -> name ? client -> name : client -> interface -> name,
+ 	      inet_ntoa (destination.sin_addr),
+-	      ntohs (destination.sin_port));
++	      ntohs (destination.sin_port), ntohl(client -> xid));
+ 
+ #if defined(DHCPv6) && defined(DHCP4o6)
+ 	if (dhcpv4_over_dhcpv6) {
diff --git a/SOURCES/dhcp-lpf-ib.patch b/SOURCES/dhcp-lpf-ib.patch
new file mode 100644
index 0000000..766d518
--- /dev/null
+++ b/SOURCES/dhcp-lpf-ib.patch
@@ -0,0 +1,614 @@
+diff -up dhcp-4.3.4/client/dhclient.c.lpf-ib dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.lpf-ib	2016-05-02 14:37:36.945128001 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-05-02 14:37:36.952128005 +0200
+@@ -163,6 +163,8 @@ static const char use_noarg[] = "No argu
+ static const char use_v6command[] = "Command not used for DHCPv4: %s";
+ #endif
+ 
++static void setup_ib_interface(struct interface_info *ip);
++
+ static void
+ usage(const char *sfmt, const char *sarg)
+ {
+@@ -1066,6 +1068,13 @@ main(int argc, char **argv) {
+ 	}
+ 	srandom(seed + cur_time + (unsigned)getpid());
+ 
++	/* Setup specific Infiniband options */
++	for (ip = interfaces; ip; ip = ip->next) {
++		if (ip->client &&
++		    (ip->hw_address.hbuf[0] == HTYPE_INFINIBAND)) {
++			setup_ib_interface(ip);
++		}
++	}
+ 
+ 	/*
+ 	 * Establish a default DUID.  We always do so for v6 and
+@@ -1361,6 +1370,29 @@ int find_subnet (struct subnet **sp,
+ 	return 0;
+ }
+ 
++static void setup_ib_interface(struct interface_info *ip)
++{
++	struct group *g;
++
++	/* Set the broadcast flag */
++	ip->client->config->bootp_broadcast_always = 1;
++
++	/*
++	 * Find out if a dhcp-client-identifier option was specified either
++	 * in the config file or on the command line
++	 */
++	for (g = ip->client->config->on_transmission; g != NULL; g = g->next) {
++		if ((g->statements != NULL) &&
++		    (strcmp(g->statements->data.option->option->name,
++			    "dhcp-client-identifier") == 0)) {
++			return;
++		}
++	}
++
++	/* No client ID specified */
++	log_fatal("dhcp-client-identifier must be specified for InfiniBand");
++}
++
+ /* Individual States:
+  *
+  * Each routine is called from the dhclient_state_machine() in one of
+diff -up dhcp-4.3.4/common/bpf.c.lpf-ib dhcp-4.3.4/common/bpf.c
+--- dhcp-4.3.4/common/bpf.c.lpf-ib	2016-05-02 14:37:36.946128001 +0200
++++ dhcp-4.3.4/common/bpf.c	2016-05-02 14:37:36.952128005 +0200
+@@ -198,11 +198,43 @@ struct bpf_insn dhcp_bpf_filter [] = {
+ 	BPF_STMT(BPF_RET+BPF_K, 0),
+ };
+ 
++/* Packet filter program for DHCP over Infiniband.
++ *
++ * XXX
++ * Changes to the filter program may require changes to the constant offsets
++ * used in lpf_gen_filter_setup to patch the port in the BPF program!
++ * XXX
++ */
++struct bpf_insn dhcp_ib_bpf_filter [] = {
++	/* Packet filter for Infiniband */
++	/* Make sure it's a UDP packet... */
++	BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 9),
++	BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6),
++
++	/* Make sure this isn't a fragment... */
++	BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 6),
++	BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0),
++
++	/* Get the IP header length... */
++	BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 0),
++
++	/* Make sure it's to the right port... */
++	BPF_STMT(BPF_LD + BPF_H + BPF_IND, 2),
++	BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1),
++
++	/* If we passed all the tests, ask for the whole packet. */
++	BPF_STMT(BPF_RET + BPF_K, (u_int)-1),
++
++	/* Otherwise, drop it. */
++	BPF_STMT(BPF_RET + BPF_K, 0),
++};
++
+ #if defined (DEC_FDDI)
+ struct bpf_insn *bpf_fddi_filter = NULL;
+ #endif
+ 
+ int dhcp_bpf_filter_len = sizeof dhcp_bpf_filter / sizeof (struct bpf_insn);
++int dhcp_ib_bpf_filter_len = sizeof dhcp_ib_bpf_filter / sizeof (struct bpf_insn);
+ #if defined (HAVE_TR_SUPPORT)
+ struct bpf_insn dhcp_bpf_tr_filter [] = {
+         /* accept all token ring packets due to variable length header */
+diff -up dhcp-4.3.4/common/discover.c.lpf-ib dhcp-4.3.4/common/discover.c
+--- dhcp-4.3.4/common/discover.c.lpf-ib	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/common/discover.c	2016-05-02 14:38:08.257147982 +0200
+@@ -1235,7 +1235,7 @@ discover_interfaces(int state) {
+ 				if_register_send(tmp);
+ 			} else {
+ 				/* get_hw_addr() was called by register. */
+-				get_hw_addr(tmp->name, &tmp->hw_address);
++				get_hw_addr(tmp);
+ 			}
+ 			break;
+ #ifdef DHCPv6
+@@ -1248,7 +1248,7 @@ discover_interfaces(int state) {
+ 				   so now we have to call it explicitly
+ 				   to not leave the hardware address unknown
+ 				   (some code expects it cannot be. */
+-				get_hw_addr(tmp->name, &tmp->hw_address);
++				get_hw_addr(tmp);
+ 			} else {
+ 				if_register_linklocal6(tmp);
+ 			}
+diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c
+--- dhcp-4.3.4/common/lpf.c.lpf-ib	2016-05-02 14:37:36.947128002 +0200
++++ dhcp-4.3.4/common/lpf.c	2016-05-02 14:37:36.953128006 +0200
+@@ -47,6 +47,17 @@
+ #include <sys/ioctl.h>
+ #include <sys/socket.h>
+ #include <net/if.h>
++#include <ifaddrs.h>
++
++/* Default broadcast address for IPoIB */
++static unsigned char default_ib_bcast_addr[20] = {
++ 	0x00, 0xff, 0xff, 0xff,
++	0xff, 0x12, 0x40, 0x1b,
++	0x00, 0x00, 0x00, 0x00,
++	0x00, 0x00, 0x00, 0x00,
++	0xff, 0xff, 0xff, 0xff
++};
++
+ #endif
+ 
+ #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
+@@ -80,10 +91,20 @@ int if_register_lpf (info)
+ 		struct sockaddr common;
+ 		} sa;
+ 	struct ifreq ifr;
++	int type;
++	int protocol;
++
++	get_hw_addr(info);
++	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
++		type = SOCK_DGRAM;
++		protocol = ETHERTYPE_IP;
++	} else {
++		type = SOCK_RAW;
++		protocol = ETH_P_ALL;
++	}
+ 
+ 	/* Make an LPF socket. */
+-	if ((sock = socket(PF_PACKET, SOCK_RAW,
+-			   htons((short)ETH_P_ALL))) < 0) {
++	if ((sock = socket(PF_PACKET, type, htons((short)protocol))) < 0) {
+ 		if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
+ 		    errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
+ 		    errno == EAFNOSUPPORT || errno == EINVAL) {
+@@ -106,6 +127,7 @@ int if_register_lpf (info)
+ 	/* Bind to the interface name */
+ 	memset (&sa, 0, sizeof sa);
+ 	sa.ll.sll_family = AF_PACKET;
++	sa.ll.sll_protocol = htons(protocol);
+ 	sa.ll.sll_ifindex = ifr.ifr_ifindex;
+ 	if (bind (sock, &sa.common, sizeof sa)) {
+ 		if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
+@@ -122,8 +144,6 @@ int if_register_lpf (info)
+ 
+ 	}
+ 
+-	get_hw_addr(info->name, &info->hw_address);
+-
+ 	return sock;
+ }
+ #endif /* USE_LPF_SEND || USE_LPF_RECEIVE */
+@@ -178,6 +198,8 @@ void if_deregister_send (info)
+    in bpf includes... */
+ extern struct sock_filter dhcp_bpf_filter [];
+ extern int dhcp_bpf_filter_len;
++extern struct sock_filter dhcp_ib_bpf_filter [];
++extern int dhcp_ib_bpf_filter_len;
+ 
+ #if defined (HAVE_TR_SUPPORT)
+ extern struct sock_filter dhcp_bpf_tr_filter [];
+@@ -196,11 +218,12 @@ void if_register_receive (info)
+ #ifdef PACKET_AUXDATA
+ 	{
+ 	int val = 1;
+-
+-	if (setsockopt(info->rfdesc, SOL_PACKET, PACKET_AUXDATA,
+-		       &val, sizeof(val)) < 0) {
+-		if (errno != ENOPROTOOPT) {
+-			log_fatal ("Failed to set auxiliary packet data: %m");
++	if (info->hw_address.hbuf[0] != HTYPE_INFINIBAND) {
++		if (setsockopt(info->rfdesc, SOL_PACKET, PACKET_AUXDATA,
++			      &val, sizeof(val)) < 0) {
++			if (errno != ENOPROTOOPT) {
++				log_fatal ("Failed to set auxiliary packet data: %m");
++			}
+ 		}
+ 	}
+ 	}
+@@ -250,15 +273,28 @@ static void lpf_gen_filter_setup (info)
+ 
+ 	memset(&p, 0, sizeof(p));
+ 
+-	/* Set up the bpf filter program structure.    This is defined in
+-	   bpf.c */
+-	p.len = dhcp_bpf_filter_len;
+-	p.filter = dhcp_bpf_filter;
+-
+-        /* Patch the server port into the LPF  program...
+-	   XXX changes to filter program may require changes
+-	   to the insn number(s) used below! XXX */
+-	dhcp_bpf_filter [8].k = ntohs ((short)local_port);
++	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
++		/* Set up the bpf filter program structure. */
++		p.len = dhcp_ib_bpf_filter_len;
++		p.filter = dhcp_ib_bpf_filter;
++
++		/* Patch the server port into the LPF program...
++		   XXX
++		   changes to filter program may require changes
++		   to the insn number(s) used below!
++		   XXX */
++		dhcp_ib_bpf_filter[6].k = ntohs ((short)local_port);
++	} else {
++		/* Set up the bpf filter program structure.
++		   This is defined in bpf.c */
++		p.len = dhcp_bpf_filter_len;
++		p.filter = dhcp_bpf_filter;
++
++		/* Patch the server port into the LPF  program...
++		   XXX changes to filter program may require changes
++		   to the insn number(s) used below! XXX */
++		dhcp_bpf_filter [8].k = ntohs ((short)local_port);
++	}
+ 
+ 	if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
+ 			sizeof p) < 0) {
+@@ -315,6 +351,54 @@ static void lpf_tr_filter_setup (info)
+ #endif /* USE_LPF_RECEIVE */
+ 
+ #ifdef USE_LPF_SEND
++ssize_t send_packet_ib(interface, packet, raw, len, from, to, hto)
++	struct interface_info *interface;
++	struct packet *packet;
++	struct dhcp_packet *raw;
++	size_t len;
++	struct in_addr from;
++	struct sockaddr_in *to;
++	struct hardware *hto;
++{
++	unsigned ibufp = 0;
++	double ih [1536 / sizeof (double)];
++	unsigned char *buf = (unsigned char *)ih;
++	ssize_t result;
++
++	union sockunion {
++		struct sockaddr sa;
++		struct sockaddr_ll sll;
++		struct sockaddr_storage ss;
++	} su;
++
++	assemble_udp_ip_header (interface, buf, &ibufp, from.s_addr,
++				to->sin_addr.s_addr, to->sin_port,
++				(unsigned char *)raw, len);
++	memcpy (buf + ibufp, raw, len);
++
++	memset(&su, 0, sizeof(su));
++	su.sll.sll_family = AF_PACKET;
++	su.sll.sll_protocol = htons(ETHERTYPE_IP);
++
++	if (!(su.sll.sll_ifindex = if_nametoindex(interface->name))) {
++		errno = ENOENT;
++		log_error ("send_packet_ib: %m - failed to get if index");
++		return -1;
++	}
++
++	su.sll.sll_hatype = htons(HTYPE_INFINIBAND);
++	su.sll.sll_halen = sizeof(interface->bcast_addr);
++	memcpy(&su.sll.sll_addr, interface->bcast_addr, 20);
++
++	result = sendto(interface->wfdesc, buf, ibufp + len, 0,
++			&su.sa, sizeof(su));
++
++	if (result < 0)
++		log_error ("send_packet_ib: %m");
++
++	return result;
++}
++
+ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
+ 	struct interface_info *interface;
+ 	struct packet *packet;
+@@ -335,6 +419,11 @@ ssize_t send_packet (interface, packet,
+ 		return send_fallback (interface, packet, raw,
+ 				      len, from, to, hto);
+ 
++	if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
++		return send_packet_ib(interface, packet, raw, len, from,
++				      to, hto);
++	}
++
+ 	if (hto == NULL && interface->anycast_mac_addr.hlen)
+ 		hto = &interface->anycast_mac_addr;
+ 
+@@ -355,6 +444,42 @@ ssize_t send_packet (interface, packet,
+ #endif /* USE_LPF_SEND */
+ 
+ #ifdef USE_LPF_RECEIVE
++ssize_t receive_packet_ib (interface, buf, len, from, hfrom)
++	struct interface_info *interface;
++	unsigned char *buf;
++	size_t len;
++	struct sockaddr_in *from;
++	struct hardware *hfrom;
++{
++	int length = 0;
++	int offset = 0;
++	unsigned char ibuf [1536];
++	unsigned bufix = 0;
++	unsigned paylen;
++
++	length = read(interface->rfdesc, ibuf, sizeof(ibuf));
++
++	if (length <= 0)
++		return length;
++
++	offset = decode_udp_ip_header(interface, ibuf, bufix, from,
++				       (unsigned)length, &paylen, 0);
++
++	if (offset < 0)
++		return 0;
++
++	bufix += offset;
++	length -= offset;
++
++	if (length < paylen)
++		log_fatal("Internal inconsistency at %s:%d.", MDL);
++
++	/* Copy out the data in the packet... */
++	memcpy(buf, &ibuf[bufix], paylen);
++
++	return (ssize_t)paylen;
++}
++
+ ssize_t receive_packet (interface, buf, len, from, hfrom)
+ 	struct interface_info *interface;
+ 	unsigned char *buf;
+@@ -393,6 +518,10 @@ ssize_t receive_packet (interface, buf,
+ 	};
+ #endif /* PACKET_AUXDATA */
+ 
++	if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
++		return receive_packet_ib(interface, buf, len, from, hfrom);
++	}
++
+ 	length = recvmsg (interface->rfdesc, &msg, 0);
+ 	if (length <= 0)
+ 		return length;
+@@ -506,11 +635,33 @@ void maybe_setup_fallback ()
+ #endif
+ 
+ #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
+-void
+-get_hw_addr(const char *name, struct hardware *hw) {
++struct sockaddr_ll *
++get_ll (struct ifaddrs *ifaddrs, struct ifaddrs **ifa, char *name)
++{
++	for (*ifa = ifaddrs; *ifa != NULL; *ifa = (*ifa)->ifa_next) {
++		if ((*ifa)->ifa_addr == NULL)
++			continue;
++
++		if ((*ifa)->ifa_addr->sa_family != AF_PACKET)
++			continue;
++
++		if ((*ifa)->ifa_flags & IFF_LOOPBACK)
++			continue;
++
++		if (strcmp((*ifa)->ifa_name, name) == 0)
++			return (struct sockaddr_ll *)(void *)(*ifa)->ifa_addr;
++	}
++	*ifa = NULL;
++	return NULL;
++}
++
++struct sockaddr_ll *
++ioctl_get_ll(char *name)
++{
+ 	int sock;
+ 	struct ifreq tmp;
+-	struct sockaddr *sa;
++	struct sockaddr *sa = NULL;
++	struct sockaddr_ll *sll = NULL;
+ 
+ 	if (strlen(name) >= sizeof(tmp.ifr_name)) {
+ 		log_fatal("Device name too long: \"%s\"", name);
+@@ -524,16 +675,61 @@ get_hw_addr(const char *name, struct har
+ 	memset(&tmp, 0, sizeof(tmp));
+ 	strcpy(tmp.ifr_name, name);
+ 	if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
+-		log_fatal("Error getting hardware address for \"%s\": %m", 
++		log_fatal("Error getting hardware address for \"%s\": %m",
+ 			  name);
+ 	}
++	close(sock);
+ 
+ 	sa = &tmp.ifr_hwaddr;
+-	switch (sa->sa_family) {
++	// needs to be freed outside this function
++	sll = dmalloc (sizeof (struct sockaddr_ll), MDL);
++	if (!sll)
++		log_fatal("Unable to allocate memory for link layer address");
++	memcpy(&sll->sll_hatype, &sa->sa_family, sizeof (sll->sll_hatype));
++	memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
++	switch (sll->sll_hatype) {
++		case ARPHRD_INFINIBAND:
++			sll->sll_halen = HARDWARE_ADDR_LEN_IOCTL;
++			break;
++		default:
++			break;
++	}
++	return sll;
++}
++
++void
++get_hw_addr(struct interface_info *info)
++{
++	struct hardware *hw = &info->hw_address;
++	char *name = info->name;
++	struct ifaddrs *ifaddrs = NULL;
++	struct ifaddrs *ifa = NULL;
++	struct sockaddr_ll *sll = NULL;
++	int sll_allocated = 0;
++	char *dup = NULL;
++	char *colon = NULL;
++
++	if (getifaddrs(&ifaddrs) == -1)
++		log_fatal("Failed to get interfaces");
++
++	if ((sll = get_ll(ifaddrs, &ifa, name)) == NULL) {
++		/*
++		 * We were unable to get link-layer address for name.
++		 * Fall back to ioctl(SIOCGIFHWADDR).
++		 */
++		sll = ioctl_get_ll(name);
++		if (sll != NULL)
++			sll_allocated = 1;
++		else
++			// shouldn't happen
++			log_fatal("Unexpected internal error");
++	}
++
++	switch (sll->sll_hatype) {
+ 		case ARPHRD_ETHER:
+ 			hw->hlen = 7;
+ 			hw->hbuf[0] = HTYPE_ETHER;
+-			memcpy(&hw->hbuf[1], sa->sa_data, 6);
++			memcpy(&hw->hbuf[1], sll->sll_addr, 6);
+ 			break;
+ 		case ARPHRD_IEEE802:
+ #ifdef ARPHRD_IEEE802_TR
+@@ -541,18 +737,50 @@ get_hw_addr(const char *name, struct har
+ #endif /* ARPHRD_IEEE802_TR */
+ 			hw->hlen = 7;
+ 			hw->hbuf[0] = HTYPE_IEEE802;
+-			memcpy(&hw->hbuf[1], sa->sa_data, 6);
++			memcpy(&hw->hbuf[1], sll->sll_addr, 6);
+ 			break;
+ 		case ARPHRD_FDDI:
+ 			hw->hlen = 7;
+ 			hw->hbuf[0] = HTYPE_FDDI;
+-			memcpy(&hw->hbuf[1], sa->sa_data, 6);
++			memcpy(&hw->hbuf[1], sll->sll_addr, 6);
++			break;
++		case ARPHRD_INFINIBAND:
++			dup = strdup(name);
++			/* Aliased infiniband interface is special case where
++			 * neither get_ll() nor ioctl_get_ll() get's correct hw
++			 * address, so we have to truncate the :0 and run
++			 * get_ll() again for the rest.
++			*/
++			if ((colon = strchr(dup, ':')) != NULL) {
++				*colon = '\0';
++				if ((sll = get_ll(ifaddrs, &ifa, dup)) == NULL)
++					log_fatal("Error getting hardware address for \"%s\": %m", name);
++			}
++			free (dup);
++			/* For Infiniband, save the broadcast address and store
++			 * the port GUID into the hardware address.
++			 */
++			if (ifa && (ifa->ifa_flags & IFF_BROADCAST)) {
++				struct sockaddr_ll *bll;
++
++				bll = (struct sockaddr_ll *)ifa->ifa_broadaddr;
++				memcpy(&info->bcast_addr, bll->sll_addr, 20);
++			} else {
++				memcpy(&info->bcast_addr, default_ib_bcast_addr,
++				       20);
++			}
++
++			hw->hlen = HARDWARE_ADDR_LEN_IOCTL + 1;
++			hw->hbuf[0] = HTYPE_INFINIBAND;
++			memcpy(&hw->hbuf[1],
++			       &sll->sll_addr[sll->sll_halen - HARDWARE_ADDR_LEN_IOCTL],
++			       HARDWARE_ADDR_LEN_IOCTL);
+ 			break;
+ #if defined(ARPHRD_PPP)
+ 		case ARPHRD_PPP:
+ 			if (local_family != AF_INET6)
+-				log_fatal("Unsupported device type %d for \"%s\"",
+-				           sa->sa_family, name);
++				log_fatal("local_family != AF_INET6 for \"%s\"",
++					  name);
+ 			hw->hlen = 0;
+ 			hw->hbuf[0] = HTYPE_RESERVED;
+ 			/* 0xdeadbeef should never occur on the wire,
+@@ -565,10 +793,13 @@ get_hw_addr(const char *name, struct har
+ 			break;
+ #endif
+ 		default:
+-			log_fatal("Unsupported device type %ld for \"%s\"",
+-				  (long int)sa->sa_family, name);
++			freeifaddrs(ifaddrs);
++			log_fatal("Unsupported device type %hu for \"%s\"",
++				  sll->sll_hatype, name);
+ 	}
+ 
+-	close(sock);
++	if (sll_allocated)
++		dfree(sll, MDL);
++	freeifaddrs(ifaddrs);
+ }
+ #endif
+diff -up dhcp-4.3.4/common/socket.c.lpf-ib dhcp-4.3.4/common/socket.c
+--- dhcp-4.3.4/common/socket.c.lpf-ib	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/common/socket.c	2016-05-02 14:37:36.953128006 +0200
+@@ -328,7 +328,7 @@ void if_register_send (info)
+ 	info->wfdesc = if_register_socket(info, AF_INET, 0, NULL);
+ 	/* If this is a normal IPv4 address, get the hardware address. */
+ 	if (strcmp(info->name, "fallback") != 0)
+-		get_hw_addr(info->name, &info->hw_address);
++		get_hw_addr(info);
+ #if defined (USE_SOCKET_FALLBACK)
+ 	/* Fallback only registers for send, but may need to receive as
+ 	   well. */
+@@ -391,7 +391,7 @@ void if_register_receive (info)
+ #endif /* IP_PKTINFO... */
+ 	/* If this is a normal IPv4 address, get the hardware address. */
+ 	if (strcmp(info->name, "fallback") != 0)
+-		get_hw_addr(info->name, &info->hw_address);
++		get_hw_addr(info);
+ 
+ 	if (!quiet_interface_discovery)
+ 		log_info ("Listening on Socket/%s%s%s",
+@@ -505,7 +505,7 @@ if_register6(struct interface_info *info
+ 	if (req_multi)
+ 		if_register_multicast(info);
+ 
+-	get_hw_addr(info->name, &info->hw_address);
++	get_hw_addr(info);
+ 
+ 	if (!quiet_interface_discovery) {
+ 		if (info->shared_network != NULL) {
+@@ -561,7 +561,7 @@ if_register_linklocal6(struct interface_
+ 	info->rfdesc = sock;
+ 	info->wfdesc = sock;
+ 
+-	get_hw_addr(info->name, &info->hw_address);
++	get_hw_addr(info);
+ 
+ 	if (!quiet_interface_discovery) {
+ 		if (info->shared_network != NULL) {
+diff -up dhcp-4.3.4/includes/dhcpd.h.lpf-ib dhcp-4.3.4/includes/dhcpd.h
+--- dhcp-4.3.4/includes/dhcpd.h.lpf-ib	2016-05-02 14:37:36.948128002 +0200
++++ dhcp-4.3.4/includes/dhcpd.h	2016-05-02 14:37:36.954128006 +0200
+@@ -482,6 +482,9 @@ struct packet {
+ 
+ #define HARDWARE_ADDR_LEN 20
+ 
++/* ioctl limits hardware addresses to 8 bytes */
++#define HARDWARE_ADDR_LEN_IOCTL	8
++
+ struct hardware {
+ 	u_int8_t hlen;
+ 	u_int8_t hbuf[HARDWARE_ADDR_LEN + 1];
+@@ -1343,6 +1346,7 @@ struct interface_info {
+ 	struct shared_network *shared_network;
+ 				/* Networks connected to this interface. */
+ 	struct hardware hw_address;	/* Its physical address. */
++	u_int8_t bcast_addr[20];	/* Infiniband broadcast address */
+ 	struct in_addr *addresses;	/* Addresses associated with this
+ 					 * interface.
+ 					 */
+@@ -2580,7 +2584,7 @@ void print_dns_status (int, struct dhcp_
+ #endif
+ const char *print_time(TIME);
+ 
+-void get_hw_addr(const char *name, struct hardware *hw);
++void get_hw_addr(struct interface_info *info);
+ char *buf_to_hex (const unsigned char *s, unsigned len,
+                    const char *file, int line);
+ char *format_lease_id(const unsigned char *s, unsigned len, int format,
diff --git a/SOURCES/dhcp-manpages.patch b/SOURCES/dhcp-manpages.patch
new file mode 100644
index 0000000..24d6972
--- /dev/null
+++ b/SOURCES/dhcp-manpages.patch
@@ -0,0 +1,148 @@
+diff -up dhcp-4.3.5b1/client/dhclient.conf.5.man dhcp-4.3.5b1/client/dhclient.conf.5
+--- dhcp-4.3.5b1/client/dhclient.conf.5.man	2016-08-26 20:19:53.000000000 +0200
++++ dhcp-4.3.5b1/client/dhclient.conf.5	2016-09-12 17:09:23.243313514 +0200
+@@ -228,7 +228,8 @@ responding to the client send the client
+ options.  Only the option names should be specified in the request
+ statement - not option parameters.  By default, the DHCPv4 client
+ requests the subnet-mask, broadcast-address, time-offset, routers,
+-domain-name, domain-name-servers and host-name options while the DHCPv6
++domain-search, domain-name, domain-name-servers, host-name, nis-domain,
++nis-servers, ntp-servers and interface-mtu options while the DHCPv6
+ client requests the dhcp6 name-servers and domain-search options.  Note
+ that if you enter a \'request\' statement, you over-ride these defaults
+ and these options will not be requested.
+@@ -736,6 +737,17 @@ know the DHCP service(s) anycast MAC add
+ client.  The \fIlink-type\fR and \fImac-address\fR parameters are configured
+ in a similar manner to the \fBhardware\fR statement.
+ .PP
++ \fBbootp-broadcast-always;\fR
++.PP
++The
++.B bootp-broadcast-always
++statement instructs dhclient to always set the bootp broadcast flag in
++request packets, so that servers will always broadcast replies.
++This is equivalent to supplying the dhclient -B argument, and has
++the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
++This option is provided as an extension to enable dhclient to work
++on IBM s390 Linux guests.
++.PP
+ .SH SAMPLE
+ The following configuration file was used on a laptop running NetBSD
+ 1.3, though the domains have been modified.
+diff -up dhcp-4.3.5b1/client/dhclient-script.8.man dhcp-4.3.5b1/client/dhclient-script.8
+--- dhcp-4.3.5b1/client/dhclient-script.8.man	2016-08-26 20:19:53.000000000 +0200
++++ dhcp-4.3.5b1/client/dhclient-script.8	2016-09-12 17:08:09.516254385 +0200
+@@ -45,7 +45,7 @@ customizations are needed, they should b
+ exit hooks provided (see HOOKS for details).   These hooks will allow the
+ user to override the default behaviour of the client in creating a
+ .B /etc/resolv.conf
+-file.
++file, and to handle DHCP options not handled by default.
+ .PP
+ No standard client script exists for some operating systems, even though
+ the actual client may work, so a pioneering user may well need to create
+@@ -89,6 +89,26 @@ present.   The
+ .B ETCDIR/dhclient-exit-hooks
+ script can modify the valid of exit_status to change the exit status
+ of dhclient-script.
++.PP
++Immediately after dhclient brings an interface UP with a new IP address,
++subnet mask, and routes, in the REBOOT/BOUND states, it will check for the
++existence of an executable
++.B ETCDIR/dhclient-up-hooks
++script, and source it if found. This script can handle DHCP options in
++the environment that are not handled by default. A per-interface.
++.B ETCDIR/dhclient-${IF}-up-hooks
++script will override the generic script and be sourced when interface
++$IF has been brought up.
++.PP
++Immediately before dhclient brings an interface DOWN, removing its IP
++address, subnet mask, and routes, in the STOP/RELEASE  states, it will
++check for the existence of an executable
++.B ETCDIR/dhclient-down-hooks
++script, and source it if found. This script can handle DHCP options in
++the environment that are not handled by default. A per-interface
++.B ETCDIR/dhclient-${IF}-down-hooks
++script will override the generic script and be sourced when interface
++$IF is about to be brought down.
+ .SH OPERATION
+ When dhclient needs to invoke the client configuration script, it
+ defines a set of variables in the environment, and then invokes
+diff -up dhcp-4.3.5b1/common/dhcp-options.5.man dhcp-4.3.5b1/common/dhcp-options.5
+--- dhcp-4.3.5b1/common/dhcp-options.5.man	2016-08-26 20:19:53.000000000 +0200
++++ dhcp-4.3.5b1/common/dhcp-options.5	2016-09-12 17:08:09.517254386 +0200
+@@ -1013,6 +1013,21 @@ classless IP routing - it does not inclu
+ classless IP routing is now the most widely deployed routing standard,
+ this option is virtually useless, and is not implemented by any of the
+ popular DHCP clients, for example the Microsoft DHCP client.
++.PP
++NOTE to Fedora dhclient users:
++.br
++dhclient-script interprets trailing 0 octets of the target as indicating
++the subnet class of the route, so for the following static-routes value:
++.br
++        option static-routes 172.0.0.0 172.16.2.254,
++.br
++                             192.168.0.0 192.168.2.254;
++.br
++dhclient-script will create routes:
++.br
++        172/8 via 172.16.2.254 dev $interface
++.br
++        192.168/16 via 192.168.2.254 dev $interface
+ .RE
+ .PP
+ .nf
+diff -up dhcp-4.3.5b1/server/dhcpd.conf.5.man dhcp-4.3.5b1/server/dhcpd.conf.5
+--- dhcp-4.3.5b1/server/dhcpd.conf.5.man	2016-08-26 20:19:53.000000000 +0200
++++ dhcp-4.3.5b1/server/dhcpd.conf.5	2016-09-12 17:10:11.205351980 +0200
+@@ -528,6 +528,9 @@ pool {
+ };
+ .fi
+ .PP
++Dynamic BOOTP leases are not compatible with failover, and, as such,
++you need to disallow BOOTP in pools that you are using failover for.
++.PP
+ The  server currently  does very  little  sanity checking,  so if  you
+ configure it wrong, it will just  fail in odd ways.  I would recommend
+ therefore that you either do  failover or don't do failover, but don't
+@@ -542,9 +545,9 @@ primary server might look like this:
+ failover peer "foo" {
+   primary;
+   address anthrax.rc.example.com;
+-  port 519;
++  port 647;
+   peer address trantor.rc.example.com;
+-  peer port 520;
++  peer port 847;
+   max-response-delay 60;
+   max-unacked-updates 10;
+   mclt 3600;
+@@ -1246,7 +1249,7 @@ the zone containing PTR records - for IS
+ .PP
+ .nf
+ key DHCP_UPDATER {
+-  algorithm HMAC-MD5.SIG-ALG.REG.INT;
++  algorithm hmac-md5;
+   secret pRP5FapFoJ95JEL06sv4PQ==;
+ };
+ 
+@@ -1269,7 +1272,7 @@ dhcpd.conf file:
+ .PP
+ .nf
+ key DHCP_UPDATER {
+-  algorithm HMAC-MD5.SIG-ALG.REG.INT;
++  algorithm hmac-md5;
+   secret pRP5FapFoJ95JEL06sv4PQ==;
+ };
+ 
+@@ -2742,7 +2745,8 @@ statement
+ The \fInext-server\fR statement is used to specify the host address of
+ the server from which the initial boot file (specified in the
+ \fIfilename\fR statement) is to be loaded.  \fIServer-name\fR should
+-be a numeric IP address or a domain name.
++be a numeric IP address or a domain name.  If no \fInext-server\fR statement
++applies to a given client, the address 0.0.0.0 is used.
+ .RE
+ .PP
+ The
diff --git a/SOURCES/dhcp-no-subnet-error2info.patch b/SOURCES/dhcp-no-subnet-error2info.patch
new file mode 100644
index 0000000..975a4d4
--- /dev/null
+++ b/SOURCES/dhcp-no-subnet-error2info.patch
@@ -0,0 +1,48 @@
+diff -up dhcp-4.3.0a1/common/discover.c.error2info dhcp-4.3.0a1/common/discover.c
+--- dhcp-4.3.0a1/common/discover.c.error2info	2013-12-20 13:59:15.148553898 +0100
++++ dhcp-4.3.0a1/common/discover.c	2013-12-20 13:59:15.181553438 +0100
+@@ -779,9 +779,9 @@ discover_interfaces(int state) {
+ 
+ 		/* We must have a subnet declaration for each interface. */
+ 		if (!tmp->shared_network && (state == DISCOVER_SERVER)) {
+-			log_error("%s", "");
++			log_info("%s", "");
+ 			if (local_family == AF_INET) {
+-				log_error("No subnet declaration for %s (%s).",
++				log_info("No subnet declaration for %s (%s).",
+ 					  tmp->name, 
+ 					  (tmp->addresses == NULL) ?
+ 					   "no IPv4 addresses" :
+@@ -796,26 +796,26 @@ discover_interfaces(int state) {
+ 				} else {
+ 					strcpy(abuf, "no IPv6 addresses");
+ 				}
+-				log_error("No subnet6 declaration for %s (%s).",
++				log_info("No subnet6 declaration for %s (%s).",
+ 					  tmp->name,
+ 					  abuf);
+ #endif /* DHCPv6 */
+ 			}
+ 			if (supports_multiple_interfaces(tmp)) {
+-				log_error ("** Ignoring requests on %s.  %s",
++				log_info ("** Ignoring requests on %s.  %s",
+ 					   tmp -> name, "If this is not what");
+-				log_error ("   you want, please write %s",
++				log_info ("   you want, please write %s",
+ #ifdef DHCPv6
+ 				           (local_family != AF_INET) ?
+ 					   "a subnet6 declaration" :
+ #endif
+ 					   "a subnet declaration");
+-				log_error ("   in your dhcpd.conf file %s",
++				log_info ("   in your dhcpd.conf file %s",
+ 					   "for the network segment");
+-				log_error ("   to %s %s %s",
++				log_info ("   to %s %s %s",
+ 					   "which interface",
+ 					   tmp -> name, "is attached. **");
+-				log_error ("%s", "");
++				log_info ("%s", "");
+ 				goto next;
+ 			} else {
+ 				log_error ("You must write a %s",
diff --git a/SOURCES/dhcp-option97-pxe-client-id.patch b/SOURCES/dhcp-option97-pxe-client-id.patch
new file mode 100644
index 0000000..fac2ace
--- /dev/null
+++ b/SOURCES/dhcp-option97-pxe-client-id.patch
@@ -0,0 +1,217 @@
+diff -up dhcp-4.3.5b1/common/options.c.option97 dhcp-4.3.5b1/common/options.c
+--- dhcp-4.3.5b1/common/options.c.option97	2016-09-12 17:17:13.972691041 +0200
++++ dhcp-4.3.5b1/common/options.c	2016-09-12 17:19:17.706790276 +0200
+@@ -4434,13 +4434,26 @@ int validate_packet(struct packet *packe
+ 				"a future version of ISC DHCP will reject this");
+ 		}
+ 	} else {
+-		/*
+-		 * If hlen is 0 we don't have any identifier, we warn the user
+-		 * but continue processing the packet as we can.
+-		 */
+-		if (packet->raw->hlen == 0) {
+-			log_debug("Received DHCPv4 packet without client-id"
+-				  " option and empty hlen field.");
++		oc = lookup_option (&dhcp_universe, packet->options,
++				    DHO_PXE_CLIENT_ID);
++		if (oc) {
++			/* Let's check if pxe-client-id is sane */
++			if ((oc->data.len < 2) ||
++			    (oc->data.data[0] == '\0' &&
++			     oc->data.len != 17)) {
++				log_debug("Dropped DHCPv4 packet with wrong "
++				    "(len == %d) pxe-client-id", oc->data.len);
++				return (0);
++			}
++		} else {
++			/*
++			 * If hlen is 0 we don't have any identifier, we warn the user
++			 * but continue processing the packet as we can.
++			 */
++			if (packet->raw->hlen == 0) {
++				log_debug("Received DHCPv4 packet without client-id"
++						" option and empty hlen field.");
++			}
+ 		}
+ 	}
+ 
+diff -up dhcp-4.3.5b1/common/tables.c.option97 dhcp-4.3.5b1/common/tables.c
+--- dhcp-4.3.5b1/common/tables.c.option97	2016-09-12 17:17:13.927691005 +0200
++++ dhcp-4.3.5b1/common/tables.c	2016-09-12 17:17:13.972691041 +0200
+@@ -196,8 +196,9 @@ static struct option dhcp_options[] = {
+ 	/* Defined by RFC 4578 */
+ 	{ "pxe-system-type", "S",		&dhcp_universe,  93, 1 },
+ 	{ "pxe-interface-id", "BBB",		&dhcp_universe,  94, 1 },
+-	{ "pxe-client-id", "BX",		&dhcp_universe,  97, 1 },
+ #endif
++	{ "pxe-client-id", "BX",		&dhcp_universe,  97, 1 },
++
+ 	{ "uap-servers", "t",			&dhcp_universe,  98, 1 },
+ #if defined(RFC4776_OPTIONS)
+         { "geoconf-civic", "X",                 &dhcp_universe, 99, 1 },
+diff -up dhcp-4.3.5b1/includes/dhcp.h.option97 dhcp-4.3.5b1/includes/dhcp.h
+--- dhcp-4.3.5b1/includes/dhcp.h.option97	2016-09-12 17:17:13.936691013 +0200
++++ dhcp-4.3.5b1/includes/dhcp.h	2016-09-12 17:17:13.972691041 +0200
+@@ -159,6 +159,7 @@ struct dhcp_packet {
+ #define DHO_AUTHENTICATE			90  /* RFC3118, was 210 */
+ #define DHO_CLIENT_LAST_TRANSACTION_TIME	91
+ #define DHO_ASSOCIATED_IP			92
++#define DHO_PXE_CLIENT_ID			97  /* RFC4578 */
+ #define DHO_SUBNET_SELECTION			118 /* RFC3011! */
+ #define DHO_DOMAIN_SEARCH			119 /* RFC3397 */
+ #define DHO_CLASSLESS_STATIC_ROUTES		121 /* RFC3442 */
+diff -up dhcp-4.3.5b1/server/dhcp.c.option97 dhcp-4.3.5b1/server/dhcp.c
+--- dhcp-4.3.5b1/server/dhcp.c.option97	2016-09-12 17:17:13.947691021 +0200
++++ dhcp-4.3.5b1/server/dhcp.c	2016-09-12 17:17:13.973691042 +0200
+@@ -221,6 +221,10 @@ dhcp (struct packet *packet) {
+ 			oc = lookup_option (&dhcp_universe, packet -> options,
+ 					    DHO_DHCP_CLIENT_IDENTIFIER);
+ 			if (!oc)
++				oc = lookup_option (&dhcp_universe,
++						    packet -> options,
++						    DHO_PXE_CLIENT_ID);
++			if (!oc)
+ 				goto nolease;
+ 
+ 			memset (&data, 0, sizeof data);
+@@ -818,6 +822,9 @@ void dhcprelease (packet, ms_nulltp)
+ 
+ 	oc = lookup_option (&dhcp_universe, packet -> options,
+ 			    DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option (&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset (&data, 0, sizeof data);
+ 	if (oc &&
+ 	    evaluate_option_cache (&data, packet, (struct lease *)0,
+@@ -1286,6 +1293,9 @@ void dhcpinform (packet, ms_nulltp)
+          */
+ 	oc = lookup_option(&dhcp_universe, packet->options,
+ 			   DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option (&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset(&d1, 0, sizeof(d1));
+ 	if (oc &&
+ 	    evaluate_option_cache(&d1, packet, NULL, NULL,
+@@ -2381,6 +2391,9 @@ void ack_lease (packet, lease, offer, wh
+ 		   can be used. */
+ 		oc = lookup_option (&dhcp_universe, packet -> options,
+ 				    DHO_DHCP_CLIENT_IDENTIFIER);
++		if (!oc)
++			oc = lookup_option (&dhcp_universe, packet -> options,
++					    DHO_PXE_CLIENT_ID);
+ 		if (oc &&
+ 		    evaluate_option_cache (&d1, packet, lease,
+ 					   (struct client_state *)0,
+@@ -2962,6 +2975,9 @@ void ack_lease (packet, lease, offer, wh
+ 		/* Record the uid, if given... */
+ 		oc = lookup_option (&dhcp_universe, packet -> options,
+ 				    DHO_DHCP_CLIENT_IDENTIFIER);
++		if (!oc)
++			oc = lookup_option (&dhcp_universe, packet -> options,
++					    DHO_PXE_CLIENT_ID);
+ 		if (oc &&
+ 		    evaluate_option_cache(&d1, packet, lease, NULL,
+ 					  packet->options, state->options,
+@@ -4068,6 +4084,9 @@ int find_lease (struct lease **lp,
+ 	   specified unique client identifier. */
+ 	oc = lookup_option (&dhcp_universe, packet -> options,
+ 			    DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option (&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset (&client_identifier, 0, sizeof client_identifier);
+ 	if (oc &&
+ 	    evaluate_option_cache (&client_identifier,
+diff -up dhcp-4.3.5b1/server/dhcpd.conf.5.option97 dhcp-4.3.5b1/server/dhcpd.conf.5
+--- dhcp-4.3.5b1/server/dhcpd.conf.5.option97	2016-09-12 17:17:13.885690972 +0200
++++ dhcp-4.3.5b1/server/dhcpd.conf.5	2016-09-12 17:17:13.974691043 +0200
+@@ -1587,10 +1587,12 @@ should be a name identifying the host.
+ not specified for the host, \fIhostname\fR is used.
+ .PP
+ \fIHost\fR declarations are matched to actual DHCP or BOOTP clients
+-by matching the \fRdhcp-client-identifier\fR option specified in the
++by matching the \fIdhcp-client-identifier\fR or \fIpxe-client-id\fR
++options specified in the
+ \fIhost\fR declaration to the one supplied by the client, or, if the
+ \fIhost\fR declaration or the client does not provide a
+-\fRdhcp-client-identifier\fR option, by matching the \fIhardware\fR
++\fIdhcp-client-identifier\fR or \fIpxe-client-id\fR options,
++by matching the \fIhardware\fR
+ parameter in the \fIhost\fR declaration to the network hardware
+ address supplied by the client.  BOOTP clients do not normally
+ provide a \fIdhcp-client-identifier\fR, so the hardware address must
+@@ -1602,7 +1604,8 @@ to identify hosts.
+ .PP
+ Please be aware that
+ .B only
+-the \fIdhcp-client-identifier\fR option and the hardware address can be
++the \fIdhcp-client-identifier\fR and \fIpxe-client-id\fR
++options and the hardware address can be
+ used to match a host declaration, or the \fIhost-identifier option\fR
+ parameter for DHCPv6 servers.  For example, it is not possible to
+ match a host declaration to a \fIhost-name\fR option.  This is
+diff -up dhcp-4.3.5b1/server/dhcpleasequery.c.option97 dhcp-4.3.5b1/server/dhcpleasequery.c
+--- dhcp-4.3.5b1/server/dhcpleasequery.c.option97	2016-08-26 20:19:53.000000000 +0200
++++ dhcp-4.3.5b1/server/dhcpleasequery.c	2016-09-12 17:17:13.974691043 +0200
+@@ -273,7 +273,7 @@ dhcpleasequery(struct packet *packet, in
+ 		 */
+ 
+ 		memset(&uid, 0, sizeof(uid));
+-		if (get_option(&uid, 
++		i = get_option(&uid,
+ 			       &dhcp_universe,
+ 			       packet,
+ 			       NULL,
+@@ -283,8 +283,20 @@ dhcpleasequery(struct packet *packet, in
+ 			       packet->options, 
+ 			       &global_scope,
+ 			       DHO_DHCP_CLIENT_IDENTIFIER,
+-			       MDL)) {
+-
++			       MDL);
++		if (!i)
++			i = get_option(&uid,
++				       &dhcp_universe,
++				       packet,
++				       NULL,
++				       NULL,
++				       packet->options,
++				       NULL,
++				       packet->options,
++				       &global_scope,
++				       DHO_PXE_CLIENT_ID,
++				       MDL);
++		if (i) {
+ 			snprintf(dbg_info, 
+ 				 sizeof(dbg_info), 
+ 				 "client-id %s",
+diff -up dhcp-4.3.5b1/server/failover.c.option97 dhcp-4.3.5b1/server/failover.c
+--- dhcp-4.3.5b1/server/failover.c.option97	2016-08-26 20:19:53.000000000 +0200
++++ dhcp-4.3.5b1/server/failover.c	2016-09-12 17:17:13.975691044 +0200
+@@ -5957,6 +5957,9 @@ int load_balance_mine (struct packet *pa
+ 
+ 	oc = lookup_option(&dhcp_universe, packet->options,
+ 			   DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option(&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset(&ds, 0, sizeof ds);
+ 	if (oc &&
+ 	    evaluate_option_cache(&ds, packet, NULL, NULL,
+diff -up dhcp-4.3.5b1/server/mdb.c.option97 dhcp-4.3.5b1/server/mdb.c
+--- dhcp-4.3.5b1/server/mdb.c.option97	2016-08-26 20:19:53.000000000 +0200
++++ dhcp-4.3.5b1/server/mdb.c	2016-09-12 17:17:13.975691044 +0200
+@@ -129,8 +129,9 @@ static int find_uid_statement (struct ex
+ 	    esp -> data.option &&
+ 	    (esp -> data.option -> option -> universe ==
+ 	     &dhcp_universe) &&
+-	    (esp -> data.option -> option -> code ==
+-	     DHO_DHCP_CLIENT_IDENTIFIER)) {
++	    ((esp -> data.option -> option -> code ==
++						DHO_DHCP_CLIENT_IDENTIFIER) ||
++	     (esp -> data.option -> option -> code == DHO_PXE_CLIENT_ID))) {
+ 		if (condp) {
+ 			log_error ("dhcp client identifier may not be %s",
+ 				   "specified conditionally.");
diff --git a/SOURCES/dhcp-paths.patch b/SOURCES/dhcp-paths.patch
new file mode 100644
index 0000000..59a711d
--- /dev/null
+++ b/SOURCES/dhcp-paths.patch
@@ -0,0 +1,38 @@
+diff -up dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf.paths dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf
+--- dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf.paths	2013-11-07 20:15:08.000000000 +0100
++++ dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf	2013-12-19 15:34:16.262247711 +0100
+@@ -42,7 +42,7 @@ option dhcp6.domain-search "test.example
+ option dhcp6.info-refresh-time 21600;
+ 
+ # The path of the lease file
+-dhcpv6-lease-file-name "/usr/local/var/db/dhcpd6.leases";
++dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases";
+ 
+ # Static definition (must be global)
+ host myclient {
+diff -up dhcp-4.3.0a1/includes/dhcpd.h.paths dhcp-4.3.0a1/includes/dhcpd.h
+--- dhcp-4.3.0a1/includes/dhcpd.h.paths	2013-12-19 15:34:16.253247840 +0100
++++ dhcp-4.3.0a1/includes/dhcpd.h	2013-12-19 15:34:16.263247697 +0100
+@@ -1429,7 +1429,7 @@ typedef unsigned char option_mask [16];
+ #else /* !DEBUG */
+ 
+ #ifndef _PATH_DHCPD_CONF
+-#define _PATH_DHCPD_CONF	"/etc/dhcpd.conf"
++#define _PATH_DHCPD_CONF	"/etc/dhcp/dhcpd.conf"
+ #endif /* DEBUG */
+ 
+ #ifndef _PATH_DHCPD_DB
+@@ -1451,11 +1451,11 @@ typedef unsigned char option_mask [16];
+ #endif /* DEBUG */
+ 
+ #ifndef _PATH_DHCLIENT_CONF
+-#define _PATH_DHCLIENT_CONF	"/etc/dhclient.conf"
++#define _PATH_DHCLIENT_CONF	"/etc/dhcp/dhclient.conf"
+ #endif
+ 
+ #ifndef _PATH_DHCLIENT_SCRIPT
+-#define _PATH_DHCLIENT_SCRIPT	"/sbin/dhclient-script"
++#define _PATH_DHCLIENT_SCRIPT	"/usr/sbin/dhclient-script"
+ #endif
+ 
+ #ifndef _PATH_DHCLIENT_PID
diff --git a/SOURCES/dhcp-release-by-ifup.patch b/SOURCES/dhcp-release-by-ifup.patch
new file mode 100644
index 0000000..677eb5c
--- /dev/null
+++ b/SOURCES/dhcp-release-by-ifup.patch
@@ -0,0 +1,85 @@
+diff -up dhcp-4.3.0a1/client/dhclient.c.ifup dhcp-4.3.0a1/client/dhclient.c
+--- dhcp-4.3.0a1/client/dhclient.c.ifup	2013-12-19 14:53:08.817760677 +0100
++++ dhcp-4.3.0a1/client/dhclient.c	2013-12-19 15:05:16.290518574 +0100
+@@ -521,9 +521,81 @@ main(int argc, char **argv) {
+ 				}
+ 			}
+ 			fclose(pidfd);
++		} else {
++			/* handle release for interfaces requested with Red Hat
++			 * /sbin/ifup - pidfile will be /var/run/dhclient-$interface.pid
++			 */
++
++			if ((path_dhclient_pid == NULL) || (*path_dhclient_pid == '\0'))
++				path_dhclient_pid = "/var/run/dhclient.pid";
++
++			char *new_path_dhclient_pid;
++			struct interface_info *ip;
++			int pdp_len = strlen(path_dhclient_pid), pfx, dpfx;
++
++			/* find append point: beginning of any trailing '.pid'
++			 * or '-$IF.pid' */
++			for (pfx=pdp_len; (pfx >= 0) && (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--);
++				if (pfx == -1)
++					pfx = pdp_len;
++
++			if (path_dhclient_pid[pfx] == '/')
++				pfx += 1;
++
++			for (dpfx=pfx; (dpfx >= 0) && (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--);
++				if ((dpfx > -1) && (path_dhclient_pid[dpfx] != '/'))
++					pfx = dpfx;
++
++			for (ip = interfaces; ip; ip = ip->next) {
++				if (interfaces_requested && (ip->flags & (INTERFACE_REQUESTED))) {
++					int n_len = strlen(ip->name);
++
++					new_path_dhclient_pid = (char*) malloc(pfx + n_len + 6);
++					strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx);
++					sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name);
++
++					if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) {
++						e = fscanf(pidfd, "%ld\n", &temp);
++						oldpid = (pid_t)temp;
++
++						if (e != 0 && e != EOF) {
++							if (oldpid) {
++								if (kill(oldpid, SIGTERM) == 0)
++									unlink(path_dhclient_pid);
++							}
++						}
++
++						fclose(pidfd);
++					}
++
++					free(new_path_dhclient_pid);
++				}
++			}
++		}
++	} else {
++		FILE *pidfp = NULL;
++		long temp = 0;
++		pid_t dhcpid = 0;
++		int dhc_running = 0;
++		char procfn[256] = "";
++
++		if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
++			if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) {
++				snprintf(procfn,256,"/proc/%u",dhcpid);
++				dhc_running = (access(procfn, F_OK) == 0);
++			}
++
++			fclose(pidfp);
++		}
++
++		if (dhc_running) {
++			log_fatal("dhclient(%u) is already running - exiting. ", dhcpid);
++			return(1);
+ 		}
+ 	}
+ 
++	write_client_pid_file();
++
+ 	if (!quiet) {
+ 		log_info("%s %s", message, PACKAGE_VERSION);
+ 		log_info(copyright);
diff --git a/SOURCES/dhcp-remove-bind.patch b/SOURCES/dhcp-remove-bind.patch
new file mode 100644
index 0000000..7706c60
--- /dev/null
+++ b/SOURCES/dhcp-remove-bind.patch
@@ -0,0 +1,351 @@
+From 2698385647a6ebd58b5d25147333e494c3da2409 Mon Sep 17 00:00:00 2001
+From: Petr Mensik <pemensik@redhat.com>
+Date: Fri, 9 Feb 2018 15:24:53 +0100
+Subject: [PATCH] Support for isc-config.sh script on --with-libbind parameter
+
+Move checks only to isc-config section
+
+Fix detection of bind flags from config
+
+Add support for with-libbind=config, Improve help message
+---
+ client/Makefile.am       |  5 ++-
+ client/tests/Makefile.am |  8 ++---
+ common/tests/Makefile.am | 14 +++-----
+ configure.ac             | 84 ++++++++++++++++++++++++++++++++++++++++++------
+ dhcpctl/Makefile.am      |  8 ++---
+ omapip/Makefile.am       |  5 ++-
+ relay/Makefile.am        |  5 ++-
+ server/Makefile.am       |  6 ++--
+ server/tests/Makefile.am |  9 +++---
+ 9 files changed, 98 insertions(+), 46 deletions(-)
+
+diff --git a/client/Makefile.am b/client/Makefile.am
+index 2cb83d8..b85f5d2 100644
+--- a/client/Makefile.am
++++ b/client/Makefile.am
+@@ -4,7 +4,7 @@
+ # production code. Sadly, we are not there yet.
+ SUBDIRS = . tests
+ 
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
+ 
+ AM_CPPFLAGS = -DCLIENT_PATH='"PATH=$(sbindir):/sbin:/bin:/usr/sbin:/usr/bin"' \
+ 	      -DLOCALSTATEDIR='"$(localstatedir)"'
+@@ -15,7 +15,6 @@ dhclient_SOURCES = clparse.c dhclient.c dhc6.c \
+ 		   scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
+ 		   scripts/netbsd scripts/nextstep scripts/openbsd \
+ 		   scripts/solaris scripts/openwrt
+-dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \
+-		 $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a
++dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a $(BIND_LIBS)
+ man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
+ EXTRA_DIST = $(man_MANS)
+diff --git a/client/tests/Makefile.am b/client/tests/Makefile.am
+index 5031d0c..bb1fda4 100644
+--- a/client/tests/Makefile.am
++++ b/client/tests/Makefile.am
+@@ -1,9 +1,9 @@
+ SUBDIRS = .
+ 
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
+ 
+ AM_CPPFLAGS = $(ATF_CFLAGS) -DUNIT_TEST -I$(top_srcdir)/includes
+-AM_CPPFLAGS += -I@BINDDIR@/include -I$(top_srcdir)
++AM_CPPFLAGS += @BIND_CPPFLAGS@ -I$(top_srcdir)
+ AM_CPPFLAGS += -DLOCALSTATEDIR='"."'
+ AM_CPPFLAGS += -DCLIENT_PATH='"."'
+ 
+@@ -18,9 +18,7 @@ info:
+ DHCPSRC = ../clparse.c ../dhc6.c ../dhclient.c
+ 
+ DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a    \
+-          $(top_builddir)/dhcpctl/libdhcpctl.a $(BINDLIBDIR)/libirs.a \
+-	  $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a \
+-	  $(BINDLIBDIR)/libisc.a
++          $(top_builddir)/dhcpctl/libdhcpctl.a $(BIND_LIBS)
+ 
+ ATF_TESTS =
+ if HAVE_ATF
+diff --git a/common/tests/Makefile.am b/common/tests/Makefile.am
+index f6a43e4..196aa44 100644
+--- a/common/tests/Makefile.am
++++ b/common/tests/Makefile.am
+@@ -1,6 +1,6 @@
+ SUBDIRS = .
+ 
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
+ 
+ AM_CPPFLAGS = $(ATF_CFLAGS) -I$(top_srcdir)/includes
+ 
+@@ -15,26 +15,22 @@ ATF_TESTS += alloc_unittest dns_unittest misc_unittest ns_name_unittest
+ alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
+ alloc_unittest_LDADD = $(ATF_LDFLAGS)
+ alloc_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \
+-	$(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a  $(BINDLIBDIR)/libisc.a
++	../../omapip/libomapi.a $(BIND_LIBS)
+ 
+ dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ dns_unittest_LDADD = $(ATF_LDFLAGS)
+ dns_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \
+-	$(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a  $(BINDLIBDIR)/libisc.a
++	../../omapip/libomapi.a $(BIND_LIBS)
+ 
+ misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ misc_unittest_LDADD = $(ATF_LDFLAGS)
+ misc_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \
+-	$(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a  $(BINDLIBDIR)/libisc.a
++	../../omapip/libomapi.a $(BIND_LIBS)
+ 
+ ns_name_unittest_SOURCES = ns_name_test.c $(top_srcdir)/tests/t_api_dhcp.c
+ ns_name_unittest_LDADD = $(ATF_LDFLAGS)
+ ns_name_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \
+-	$(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a  $(BINDLIBDIR)/libisc.a
++	../../omapip/libomapi.a $(BIND_LIBS)
+ 
+ check: $(ATF_TESTS)
+ 	@if test $(top_srcdir) != ${top_builddir}; then \
+diff --git a/configure.ac b/configure.ac
+index cdfa352..ef55f8d 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -688,8 +688,12 @@ AC_CHECK_MEMBER(struct tpacket_auxdata.tp_vlan_tci,
+ 
+ BINDDIR=
+ BINDSRCDIR=
++BIND_CONFIG=
++BIND_CPPFLAGS=
++BIND_LIBS=
+ AC_ARG_WITH(libbind,
+-	AS_HELP_STRING([--with-libbind=PATH],[bind includes and libraries are in PATH
++	AS_HELP_STRING([--with-libbind=PATH|config],[bind includes and libraries are in PATH.
++		        Use config to obtain libraries from isc-config.sh.
+ 		        (default is ./bind)]),
+ 	use_libbind="$withval", use_libbind="no")
+ case "$use_libbind" in
+@@ -701,23 +705,85 @@ no)
+ 	BINDDIR="\${top_srcdir}/bind"
+ 	BINDSRCDIR="\${top_srcdir}/bind"
+ 	;;
++config)
++	AC_PATH_PROG(BIND_CONFIG, [isc-config.sh bind9-config])
++	;;
+ *)
+-	BINDDIR="$use_libbind"
+-	if test ! -d "$srcdir/bind"; then
+-		# no bind directory, create it with a fake Makefile.in
+-		# (AC_CONFIG_FILES and top Makefile refer to it so
+-		# it must exits)
+-		mkdir $srcdir/bind
+-		cat > $srcdir/bind/Makefile.in << EOF
++	if test -f "$use_libbind" -a -x "$use_libbind"; then
++		# passed full path of isc-config.sh
++		BIND_CONFIG="$use_libbind"
++	else
++		BINDDIR="$use_libbind"
++		if test ! -d "$srcdir/bind"; then
++			# no bind directory, create it with a fake Makefile.in
++			# (AC_CONFIG_FILES and top Makefile refer to it so
++			# it must exits)
++			mkdir $srcdir/bind
++			cat > $srcdir/bind/Makefile.in << EOF
+ # placeholder
+ all check clean distclean distdir install uninstall:
+ 
+ EOF
++		fi
+ 	fi
+ 	;;
+ esac
++if test -z "$BIND_CONFIG"; then
++	BIND_CPPFLAGS="-I${BINDDIR}/include"
++	BIND_LIBDIR="${BINDDIR}/lib"
++	BIND_LIBS="$(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a  $(BINDLIBDIR)/libisc.a"
++else
++	BIND_CPPFLAGS=`$BIND_CONFIG --cflags`
++	BIND_LIBS=`$BIND_CONFIG --libs irs dns isccfg isc`
++
++	# bind is already built
++	AC_CHECKING([Checking bind libraries have no thread support])
++	saved_libs="$LIBS"
++	saved_CPPFLAGS="$CPPFLAGS"
++	CPPFLAGS="${CPPFLAGS} ${BIND_CPPFLAGS}"
++	LIBS="${LIBS} ${BIND_LIBS}"
++AC_TRY_LINK([
++#include <isc/bind9.h>
++#include <isc/lib.h>
++],[
++#ifdef BIND9
++#error Export BIND library has to be used with BIND version up to 9.9
++#endif
++isc_lib_register();
++], [AC_MSG_RESULT(Bind export library found)
++    BIND_EXPORT=yes], [BIND_EXPORT=no]
++)
++
++# Allow build with disabled threads for dhcp
++AC_TRY_LINK([
++#include <isc/platform.h>
++#include <isc/bind9.h>
++#include <isc/lib.h>
++],[
++#ifdef ISC_PLATFORM_USETHREADS
++#error Bind library must not be compiled with threads
++#endif
++isc_lib_register();
++if (isc_bind9 != 0) {}
++], [AC_MSG_RESULT(Bind single thread library found)
++    BIND_SINGLETHREAD=yes], [BIND_SINGLETHREAD=no]
++)
++
++	if test "x$BIND_EXPORT" != xyes -a "x$BIND_SINGLETHREADED" != xyes
++	then
++		AC_MSG_RESULT([BIND_CONFIG=${BIND_CONFIG}])
++		AC_MSG_RESULT([BIND_CPPFLAGS=${BIND_CPPFLAGS}])
++		AC_MSG_RESULT([BIND_LIBS=${BIND_LIBS}])
++		AC_MSG_ERROR([Bind libraries are not useable for dhcp])
++	fi
++	CPPFLAGS="$saved_CPPFLAGS"
++	LIBS="$saved_LIBS"
++fi
++
+ AC_SUBST(BINDDIR)
+ AC_SUBST(BINDSRCDIR)
++AC_SUBST(BIND_CPPFLAGS)
++AC_SUBST(BIND_LIBS)
+ 
+ # OpenLDAP support.
+ AC_ARG_WITH(ldap,
+@@ -795,7 +861,7 @@ fi
+ CFLAGS="$CFLAGS $STD_CWARNINGS"
+ 
+ # Try to add the bind and dhcp include directories
+-CFLAGS="$CFLAGS -I\$(top_srcdir)/includes -I$BINDDIR/include"
++CFLAGS="$CFLAGS -I\$(top_srcdir)/includes $BIND_CPPFLAGS"
+ 
+ case "$host" in
+ *-darwin*)
+diff --git a/dhcpctl/Makefile.am b/dhcpctl/Makefile.am
+index ceb0de1..fa20a78 100644
+--- a/dhcpctl/Makefile.am
++++ b/dhcpctl/Makefile.am
+@@ -1,4 +1,4 @@
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
+ 
+ bin_PROGRAMS = omshell
+ lib_LIBRARIES = libdhcpctl.a
+@@ -8,12 +8,10 @@ EXTRA_DIST = $(man_MANS)
+ 
+ omshell_SOURCES = omshell.c
+ omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
+-	        $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \
+-	        $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a
++	        $(BIND_LIBS)
+ 
+ libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
+ 
+ cltest_SOURCES = cltest.c
+ cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
+-	       $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \
+-               $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a
++	       $(BIND_LIBS)
+diff --git a/omapip/Makefile.am b/omapip/Makefile.am
+index 446a594..b0d2680 100644
+--- a/omapip/Makefile.am
++++ b/omapip/Makefile.am
+@@ -1,4 +1,4 @@
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
+ 
+ lib_LIBRARIES = libomapi.a
+ noinst_PROGRAMS = svtest
+@@ -12,6 +12,5 @@ man_MANS = omapi.3
+ EXTRA_DIST = $(man_MANS)
+ 
+ svtest_SOURCES = test.c
+-svtest_LDADD = libomapi.a $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \
+-		$(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a
++svtest_LDADD = libomapi.a $(BIND_LIBS)
+ 
+diff --git a/relay/Makefile.am b/relay/Makefile.am
+index 3060eca..c9a1cba 100644
+--- a/relay/Makefile.am
++++ b/relay/Makefile.am
+@@ -1,12 +1,11 @@
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
+ 
+ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localstatedir@"'
+ 
+ sbin_PROGRAMS = dhcrelay
+ dhcrelay_SOURCES = dhcrelay.c
+ dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
+-		 $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \
+-		 $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a
++		 $(BIND_LIBS)
+ man_MANS = dhcrelay.8
+ EXTRA_DIST = $(man_MANS)
+ 
+diff --git a/server/Makefile.am b/server/Makefile.am
+index 54feedf..30cf2b1 100644
+--- a/server/Makefile.am
++++ b/server/Makefile.am
+@@ -4,7 +4,7 @@
+ # production code. Sadly, we are not there yet.
+ SUBDIRS = . tests
+ 
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
+ 
+ AM_CPPFLAGS = -I.. -DLOCALSTATEDIR='"@localstatedir@"'
+ 
+@@ -16,9 +16,7 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c confpars.c db.c class.c failover.c \
+ 
+ dhcpd_CFLAGS = $(LDAP_CFLAGS)
+ dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
+-	      ../dhcpctl/libdhcpctl.a $(BINDLIBDIR)/libirs.a \
+-	      $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a \
+-	      $(BINDLIBDIR)/libisc.a $(LDAP_LIBS)
++	      ../dhcpctl/libdhcpctl.a $(BIND_LIBS) $(LDAP_LIBS)
+ 
+ man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
+ EXTRA_DIST = $(man_MANS)
+diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am
+index a87c5e7..771de06 100644
+--- a/server/tests/Makefile.am
++++ b/server/tests/Makefile.am
+@@ -1,9 +1,10 @@
+ SUBDIRS = .
+ 
+-BINDLIBDIR = @BINDDIR@/lib
++BIND_LIBS = @BIND_LIBS@
++
+ 
+ AM_CPPFLAGS = $(ATF_CFLAGS) -DUNIT_TEST -I$(top_srcdir)/includes
+-AM_CPPFLAGS += -I@BINDDIR@/include -I$(top_srcdir)
++AM_CPPFLAGS += $(BIND_CPPFLAGS) -I$(top_srcdir)
+ AM_CPPFLAGS += -DLOCALSTATEDIR='"."'
+ 
+ EXTRA_DIST = Atffile
+@@ -20,9 +21,7 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpars.c ../db.c ../class.c      \
+           ../ldap.c ../ldap_casa.c ../dhcpd.c ../leasechain.c
+ 
+ DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \
+-          $(top_builddir)/dhcpctl/libdhcpctl.a $(BINDLIBDIR)/libirs.a \
+-	  $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a \
+-	  $(BINDLIBDIR)/libisc.a
++          $(top_builddir)/dhcpctl/libdhcpctl.a $(BIND_LIBS)
+ 
+ ATF_TESTS =
+ if HAVE_ATF
+-- 
+2.14.3
+
diff --git a/SOURCES/dhcp-replay_file_limit.patch b/SOURCES/dhcp-replay_file_limit.patch
new file mode 100644
index 0000000..e58ccdf
--- /dev/null
+++ b/SOURCES/dhcp-replay_file_limit.patch
@@ -0,0 +1,45 @@
+diff --git a/server/confpars.c b/server/confpars.c
+index d79489b..c20d618 100644
+--- a/server/confpars.c
++++ b/server/confpars.c
+@@ -134,6 +134,11 @@ isc_result_t read_conf_file (const char *filename, struct group *group,
+ 
+ 	cfile = (struct parse *)0;
+ #if defined (TRACING)
++	// No need to dmalloc huge memory region if we're not going to re-play
++	if (!trace_playback()){
++		status = new_parse(&cfile, file, NULL, 0, filename, 0);
++		goto noreplay;
++	};
+ 	flen = lseek (file, (off_t)0, SEEK_END);
+ 	if (flen < 0) {
+ 	      boom:
+@@ -174,6 +179,7 @@ isc_result_t read_conf_file (const char *filename, struct group *group,
+ #else
+ 	status = new_parse(&cfile, file, NULL, 0, filename, 0);
+ #endif
++      noreplay:
+ 	if (status != ISC_R_SUCCESS || cfile == NULL)
+ 		return status;
+ 
+diff --git a/server/confpars.c b/server/confpars.c
+index 3aecd05..5be4ab1 100644
+--- a/server/confpars.c
++++ b/server/confpars.c
+@@ -176,6 +176,7 @@ isc_result_t read_conf_file (const char *filename, struct group *group,
+ 	if (trace_record ())
+ 		trace_write_packet (ttype, ulen + tflen + 1, dbuf, MDL);
+ 	status = new_parse(&cfile, -1, fbuf, ulen, filename, 0); /* XXX */
++	dfree(dbuf, MDL);
+ #else
+ 	status = new_parse(&cfile, file, NULL, 0, filename, 0);
+ #endif
+@@ -188,9 +189,6 @@ isc_result_t read_conf_file (const char *filename, struct group *group,
+ 	else
+ 		status = conf_file_subparse (cfile, group, group_type);
+ 	end_parse (&cfile);
+-#if defined (TRACING)
+-	dfree (dbuf, MDL);
+-#endif
+ 	return status;
+ }
diff --git a/SOURCES/dhcp-rfc3442-classless-static-routes.patch b/SOURCES/dhcp-rfc3442-classless-static-routes.patch
new file mode 100644
index 0000000..6c3a239
--- /dev/null
+++ b/SOURCES/dhcp-rfc3442-classless-static-routes.patch
@@ -0,0 +1,405 @@
+diff -up dhcp-4.3.4/client/clparse.c.rfc3442 dhcp-4.3.4/client/clparse.c
+--- dhcp-4.3.4/client/clparse.c.rfc3442	2016-04-29 12:23:34.192032714 +0200
++++ dhcp-4.3.4/client/clparse.c	2016-04-29 12:24:37.531016317 +0200
+@@ -31,7 +31,7 @@
+ 
+ struct client_config top_level_config;
+ 
+-#define NUM_DEFAULT_REQUESTED_OPTS	14
++#define NUM_DEFAULT_REQUESTED_OPTS	15
+ /* There can be 2 extra requested options for DHCPv4-over-DHCPv6. */
+ struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 2 + 1];
+ 
+@@ -87,7 +87,11 @@ isc_result_t read_client_conf ()
+ 				dhcp_universe.code_hash, &code, 0, MDL);
+ 
+ 	/* 4 */
+-	code = DHO_ROUTERS;
++	/* The Classless Static Routes option code MUST appear in the parameter
++     * request list prior to both the Router option code and the Static
++     * Routes option code, if present. (RFC3442)
++	 */
++	code = DHO_CLASSLESS_STATIC_ROUTES;
+ 	option_code_hash_lookup(&default_requested_options[3],
+ 				dhcp_universe.code_hash, &code, 0, MDL);
+ 
+@@ -141,6 +145,11 @@ isc_result_t read_client_conf ()
+ 	option_code_hash_lookup(&default_requested_options[13],
+ 				dhcp_universe.code_hash, &code, 0, MDL);
+ 
++	/* 15 */
++	code = DHO_ROUTERS;
++	option_code_hash_lookup(&default_requested_options[14],
++				dhcp_universe.code_hash, &code, 0, MDL);
++
+ 	for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
+ 		if (default_requested_options[code] == NULL)
+ 			log_fatal("Unable to find option definition for "
+diff -up dhcp-4.3.4/common/dhcp-options.5.rfc3442 dhcp-4.3.4/common/dhcp-options.5
+--- dhcp-4.3.4/common/dhcp-options.5.rfc3442	2016-04-29 12:23:34.183032716 +0200
++++ dhcp-4.3.4/common/dhcp-options.5	2016-04-29 12:23:34.237032703 +0200
+@@ -111,6 +111,26 @@ hexadecimal, separated by colons.  For e
+ or
+   option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;
+ .fi
++.PP
++The
++.B destination-descriptor
++describe the IP subnet number and subnet mask
++of a particular destination using a compact encoding. This encoding
++consists of one octet describing the width of the subnet mask,
++followed by all the significant octets of the subnet number.
++The following table contains some examples of how various subnet
++number/mask combinations can be encoded:
++.nf
++.sp 1
++Subnet number   Subnet mask      Destination descriptor
++0               0                0
++10.0.0.0        255.0.0.0        8.10
++10.0.0.0        255.255.255.0    24.10.0.0
++10.17.0.0       255.255.0.0      16.10.17
++10.27.129.0     255.255.255.0    24.10.27.129
++10.229.0.128    255.255.255.128  25.10.229.0.128
++10.198.122.47   255.255.255.255  32.10.198.122.47
++.fi
+ .SH SETTING OPTION VALUES USING EXPRESSIONS
+ Sometimes it's helpful to be able to set the value of a DHCP option
+ based on some value that the client has sent.  To do this, you can
+@@ -1031,6 +1051,29 @@ dhclient-script will create routes:
+ .RE
+ .PP
+ .nf
++.B option \fBclassless-static-routes\fR \fIdestination-descriptor ip-address\fR
++                            [\fB,\fR \fIdestination-descriptor ip-address\fR...]\fB;\fR
++.fi
++.RS 0.25i
++.PP
++This option (see RFC3442) specifies a list of classless static routes
++that the client should install in its routing cache.
++.PP
++This option can contain one or more static routes, each of which
++consists of a destination descriptor and the IP address of the router
++that should be used to reach that destination.
++.PP
++Many clients may not implement the Classless Static Routes option.
++DHCP server administrators should therefore configure their DHCP
++servers to send both a Router option and a Classless Static Routes
++option, and should specify the default router(s) both in the Router
++option and in the Classless Static Routes option.
++.PP
++If the DHCP server returns both a Classless Static Routes option and
++a Router option, the DHCP client ignores the Router option.
++.RE
++.PP
++.nf
+ .B option \fBstreettalk-directory-assistance-server\fR \fIip-address\fR
+                                            [\fB,\fR \fIip-address\fR...]\fB;\fR
+ .fi
+diff -up dhcp-4.3.4/common/inet.c.rfc3442 dhcp-4.3.4/common/inet.c
+--- dhcp-4.3.4/common/inet.c.rfc3442	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/common/inet.c	2016-04-29 12:23:34.237032703 +0200
+@@ -519,6 +519,60 @@ free_iaddrcidrnetlist(struct iaddrcidrne
+ 	return ISC_R_SUCCESS;
+ }
+ 
++static const char *
++inet_ntopdd(const unsigned char *src, unsigned srclen, char *dst, size_t size)
++{
++	char tmp[sizeof("32.255.255.255.255")];
++	int len;
++
++	switch (srclen) {
++		case 2:
++			len = sprintf (tmp, "%u.%u", src[0], src[1]);
++			break;
++		case 3:
++			len = sprintf (tmp, "%u.%u.%u", src[0], src[1], src[2]);
++			break;
++		case 4:
++			len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
++			break;
++		case 5:
++			len = sprintf (tmp, "%u.%u.%u.%u.%u", src[0], src[1], src[2], src[3], src[4]);
++			break;
++		default:
++			return NULL;
++	}
++	if (len < 0)
++		return NULL;
++
++	if (len > size) {
++		errno = ENOSPC;
++		return NULL;
++	}
++
++	return strcpy (dst, tmp);
++}
++
++/* pdestdesc() turns an iaddr structure into a printable dest. descriptor */
++const char *
++pdestdesc(const struct iaddr addr) {
++	static char pbuf[sizeof("255.255.255.255.255")];
++
++	if (addr.len == 0) {
++		return "<null destination descriptor>";
++	}
++	if (addr.len == 1) {
++		return "0";
++	}
++	if ((addr.len >= 2) && (addr.len <= 5)) {
++		return inet_ntopdd(addr.iabuf, addr.len, pbuf, sizeof(pbuf));
++	}
++
++	log_fatal("pdestdesc():%s:%d: Invalid destination descriptor length %d.",
++		  MDL, addr.len);
++	/* quell compiler warnings */
++	return NULL;
++}
++
+ /* piaddr() turns an iaddr structure into a printable address. */
+ /* XXX: should use a const pointer rather than passing the structure */
+ const char *
+diff -up dhcp-4.3.4/common/options.c.rfc3442 dhcp-4.3.4/common/options.c
+--- dhcp-4.3.4/common/options.c.rfc3442	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/common/options.c	2016-04-29 12:23:34.237032703 +0200
+@@ -713,7 +713,11 @@ cons_options(struct packet *inpacket, st
+ 		 * packet.
+ 		 */
+ 		priority_list[priority_len++] = DHO_SUBNET_MASK;
+-		priority_list[priority_len++] = DHO_ROUTERS;
++		if (lookup_option(&dhcp_universe, cfg_options,
++							DHO_CLASSLESS_STATIC_ROUTES))
++			priority_list[priority_len++] = DHO_CLASSLESS_STATIC_ROUTES;
++		else
++			priority_list[priority_len++] = DHO_ROUTERS;
+ 		priority_list[priority_len++] = DHO_DOMAIN_NAME_SERVERS;
+ 		priority_list[priority_len++] = DHO_HOST_NAME;
+ 		priority_list[priority_len++] = DHO_FQDN;
+@@ -1694,6 +1698,7 @@ const char *pretty_print_option (option,
+ 	unsigned long tval;
+ 	isc_boolean_t a_array = ISC_FALSE;
+ 	int len_used;
++	unsigned int octets = 0;
+ 
+ 	if (emit_commas)
+ 		comma = ',';
+@@ -1702,6 +1707,7 @@ const char *pretty_print_option (option,
+ 
+ 	memset (enumbuf, 0, sizeof enumbuf);
+ 
++	if (option->format[0] != 'R') { /* see explanation lower */
+ 	/* Figure out the size of the data. */
+ 	for (l = i = 0; option -> format [i]; i++, l++) {
+ 		if (l >= sizeof(fmtbuf) - 1)
+@@ -1894,6 +1900,33 @@ const char *pretty_print_option (option,
+ 	if (numhunk < 0)
+ 		numhunk = 1;
+ 
++	} else { /* option->format[i] == 'R') */
++		/* R (destination descriptor) has variable length.
++		 * We can find it only in classless static route option,
++		 * so we are for sure parsing classless static route option now.
++		 * We go through whole the option to check whether there are no
++		 * missing/extra bytes.
++		 * I didn't find out how to improve the existing code and that's the
++		 * reason for this separate 'else' where I do my own checkings.
++		 * I know it's little bit unsystematic, but it works.
++		 */
++		numhunk = 0;
++		numelem = 2; /* RI */
++		fmtbuf[0]='R'; fmtbuf[1]='I'; fmtbuf[2]=0;
++		for (i =0; i < len; i = i + octets + 5) {
++			if (data[i] > 32) { /* subnet mask width */
++				log_error ("wrong subnet mask width in destination descriptor");
++				break;
++			}
++			numhunk++;
++			octets = ((data[i]+7) / 8);
++		}
++		if (i != len) {
++			log_error ("classless static routes option has wrong size or "
++					   "there's some garbage in format");
++		}
++	}
++
+ 	/* Cycle through the array (or hunk) printing the data. */
+ 	for (i = 0; i < numhunk; i++) {
+ 		if ((a_array == ISC_TRUE) && (i != 0) && (numelem > 0)) {
+@@ -2049,6 +2082,20 @@ const char *pretty_print_option (option,
+ 				strcpy(op, piaddr(iaddr));
+ 				dp += 4;
+ 				break;
++
++			      case 'R':
++				if (dp[0] <= 32)
++					iaddr.len = (((dp[0]+7)/8)+1);
++				else {
++					log_error ("wrong subnet mask width in destination descriptor");
++					return "<error>";
++				}
++
++				memcpy(iaddr.iabuf, dp, iaddr.len);
++				strcpy(op, pdestdesc(iaddr));
++				dp += iaddr.len;
++				break;
++
+ 			      case '6':
+ 				iaddr.len = 16;
+ 				memcpy(iaddr.iabuf, dp, 16);
+diff -up dhcp-4.3.4/common/parse.c.rfc3442 dhcp-4.3.4/common/parse.c
+--- dhcp-4.3.4/common/parse.c.rfc3442	2016-04-29 12:23:34.220032707 +0200
++++ dhcp-4.3.4/common/parse.c	2016-04-29 12:23:34.238032702 +0200
+@@ -341,6 +341,39 @@ int parse_ip_addr (cfile, addr)
+ }	
+ 
+ /*
++ * destination-descriptor :== NUMBER DOT NUMBER |
++ *                            NUMBER DOT NUMBER DOT NUMBER |
++ *                            NUMBER DOT NUMBER DOT NUMBER DOT NUMBER |
++ *                            NUMBER DOT NUMBER DOT NUMBER DOT NUMBER DOT NUMBER
++ */
++
++int parse_destination_descriptor (cfile, addr)
++	struct parse *cfile;
++	struct iaddr *addr;
++{
++		unsigned int mask_width, dest_dest_len;
++		addr -> len = 0;
++		if (parse_numeric_aggregate (cfile, addr -> iabuf,
++									 &addr -> len, DOT, 10, 8)) {
++			mask_width = (unsigned int)addr->iabuf[0];
++			dest_dest_len = (((mask_width+7)/8)+1);
++			if (mask_width > 32) {
++				parse_warn (cfile,
++				"subnet mask width (%u) greater than 32.", mask_width);
++			}
++			else if (dest_dest_len != addr->len) {
++				parse_warn (cfile,
++				"destination descriptor with subnet mask width %u "
++				"should have %u octets, but has %u octets.",
++				mask_width, dest_dest_len, addr->len);
++			}
++
++			return 1;
++		}
++		return 0;
++}
++
++/*
+  * Return true if every character in the string is hexadecimal.
+  */
+ static int
+@@ -720,8 +753,10 @@ unsigned char *parse_numeric_aggregate (
+ 		if (count) {
+ 			token = peek_token (&val, (unsigned *)0, cfile);
+ 			if (token != separator) {
+-				if (!*max)
++				if (!*max) {
++					*max = count;
+ 					break;
++				}
+ 				if (token != RBRACE && token != LBRACE)
+ 					token = next_token (&val,
+ 							    (unsigned *)0,
+@@ -1668,6 +1703,9 @@ int parse_option_code_definition (cfile,
+ 	      case IP_ADDRESS:
+ 		type = 'I';
+ 		break;
++	      case DESTINATION_DESCRIPTOR:
++		type = 'R';
++		break;
+ 	      case IP6_ADDRESS:
+ 		type = '6';
+ 		break;
+@@ -5097,6 +5135,15 @@ int parse_option_token (rv, cfile, fmt,
+ 		}
+ 		break;
+ 
++	      case 'R': /* destination descriptor */
++		if (!parse_destination_descriptor (cfile, &addr)) {
++			return 0;
++		}
++		if (!make_const_data (&t, addr.iabuf, addr.len, 0, 1, MDL)) {
++			return 0;
++		}
++		break;
++
+ 	      case '6': /* IPv6 address. */
+ 		if (!parse_ip6_addr(cfile, &addr)) {
+ 			return 0;
+@@ -5374,6 +5421,13 @@ int parse_option_decl (oc, cfile)
+ 					goto exit;
+ 				len = ip_addr.len;
+ 				dp = ip_addr.iabuf;
++				goto alloc;
++
++			      case 'R': /* destination descriptor */
++				if (!parse_destination_descriptor (cfile, &ip_addr))
++					goto exit;
++				len = ip_addr.len;
++				dp = ip_addr.iabuf;
+ 
+ 			      alloc:
+ 				if (hunkix + len > sizeof hunkbuf) {
+diff -up dhcp-4.3.4/common/tables.c.rfc3442 dhcp-4.3.4/common/tables.c
+--- dhcp-4.3.4/common/tables.c.rfc3442	2016-04-29 12:23:34.209032710 +0200
++++ dhcp-4.3.4/common/tables.c	2016-04-29 12:23:34.238032702 +0200
+@@ -45,6 +45,7 @@ HASH_FUNCTIONS (option_code, const unsig
+    Format codes:
+ 
+    I - IPv4 address
++   R - destination descriptor (RFC3442)
+    6 - IPv6 address
+    l - 32-bit signed integer
+    L - 32-bit unsigned integer
+@@ -216,6 +217,7 @@ static struct option dhcp_options[] = {
+ #endif
+ 	{ "subnet-selection", "I",		&dhcp_universe, 118, 1 },
+ 	{ "domain-search", "D",			&dhcp_universe, 119, 1 },
++	{ "classless-static-routes", "RIA",	&dhcp_universe, 121, 1 },
+ 	{ "vivco", "Evendor-class.",		&dhcp_universe, 124, 1 },
+ 	{ "vivso", "Evendor.",			&dhcp_universe, 125, 1 },
+ #if 0
+diff -up dhcp-4.3.4/includes/dhcpd.h.rfc3442 dhcp-4.3.4/includes/dhcpd.h
+--- dhcp-4.3.4/includes/dhcpd.h.rfc3442	2016-04-29 12:23:34.186032716 +0200
++++ dhcp-4.3.4/includes/dhcpd.h	2016-04-29 12:23:34.239032702 +0200
+@@ -2894,6 +2894,7 @@ isc_result_t range2cidr(struct iaddrcidr
+ 			const struct iaddr *lo, const struct iaddr *hi);
+ isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result);
+ const char *piaddr (struct iaddr);
++const char *pdestdesc (struct iaddr);
+ char *piaddrmask(struct iaddr *, struct iaddr *);
+ char *piaddrcidr(const struct iaddr *, unsigned int);
+ u_int16_t validate_port(char *);
+@@ -3108,6 +3109,7 @@ void parse_client_lease_declaration (str
+ int parse_option_decl (struct option_cache **, struct parse *);
+ void parse_string_list (struct parse *, struct string_list **, int);
+ int parse_ip_addr (struct parse *, struct iaddr *);
++int parse_destination_descriptor (struct parse *, struct iaddr *);
+ int parse_ip_addr_with_subnet(struct parse *, struct iaddrmatch *);
+ void parse_reject_statement (struct parse *, struct client_config *);
+ 
+diff -up dhcp-4.3.4/includes/dhcp.h.rfc3442 dhcp-4.3.4/includes/dhcp.h
+--- dhcp-4.3.4/includes/dhcp.h.rfc3442	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/includes/dhcp.h	2016-04-29 12:23:34.239032702 +0200
+@@ -159,6 +159,7 @@ struct dhcp_packet {
+ #define DHO_ASSOCIATED_IP			92
+ #define DHO_SUBNET_SELECTION			118 /* RFC3011! */
+ #define DHO_DOMAIN_SEARCH			119 /* RFC3397 */
++#define DHO_CLASSLESS_STATIC_ROUTES		121 /* RFC3442 */
+ #define DHO_VIVCO_SUBOPTIONS			124
+ #define DHO_VIVSO_SUBOPTIONS			125
+ 
+diff -up dhcp-4.3.4/includes/dhctoken.h.rfc3442 dhcp-4.3.4/includes/dhctoken.h
+--- dhcp-4.3.4/includes/dhctoken.h.rfc3442	2016-04-29 12:23:34.239032702 +0200
++++ dhcp-4.3.4/includes/dhctoken.h	2016-04-29 12:25:07.236008628 +0200
+@@ -374,7 +374,8 @@ enum dhcp_token {
+ 	LEASE_ID_FORMAT = 676,
+ 	TOKEN_HEX = 677,
+ 	TOKEN_OCTAL = 678,
+-	BOOTP_BROADCAST_ALWAYS = 679
++	BOOTP_BROADCAST_ALWAYS = 679,
++	DESTINATION_DESCRIPTOR = 680
+ };
+ 
+ #define is_identifier(x)	((x) >= FIRST_TOKEN &&	\
diff --git a/SOURCES/dhcp-sd_notify.patch b/SOURCES/dhcp-sd_notify.patch
new file mode 100644
index 0000000..a123923
--- /dev/null
+++ b/SOURCES/dhcp-sd_notify.patch
@@ -0,0 +1,79 @@
+diff -up dhcp-4.3.4/configure.ac.sd_notify dhcp-4.3.4/configure.ac
+--- dhcp-4.3.4/configure.ac.sd_notify	2016-04-29 13:08:52.813287060 +0200
++++ dhcp-4.3.4/configure.ac	2016-04-29 13:08:52.872287075 +0200
+@@ -832,6 +832,17 @@ if test x$ldap = xyes || test x$ldapcryp
+     AC_SUBST(LDAP_CFLAGS, [$LDAP_CFLAGS])
+ fi
+ 
++AC_ARG_WITH(systemd,
++        AC_HELP_STRING([--with-systemd],
++                       [enable sending status notifications to systemd daemon (default is no)]),
++        [systemd=$withval],
++        [systemd=no])
++
++if test x$systemd = xyes ; then
++   AC_CHECK_LIB(systemd, sd_notifyf, ,
++                AC_MSG_FAILURE([*** systemd library not present - do you need to install systemd-libs package?]))
++fi
++
+ # Append selected warning levels to CFLAGS before substitution (but after
+ # AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[],[]) & etc).
+ CFLAGS="$CFLAGS $STD_CWARNINGS"
+diff -up dhcp-4.3.4/relay/dhcrelay.c.sd_notify dhcp-4.3.4/relay/dhcrelay.c
+--- dhcp-4.3.4/relay/dhcrelay.c.sd_notify	2016-04-29 13:08:52.814287061 +0200
++++ dhcp-4.3.4/relay/dhcrelay.c	2016-04-29 13:08:52.872287075 +0200
+@@ -37,6 +37,10 @@
+    int keep_capabilities = 0;
+ #endif
+ 
++#ifdef HAVE_LIBSYSTEMD
++#include <systemd/sd-daemon.h>
++#endif
++
+ TIME default_lease_time = 43200; /* 12 hours... */
+ TIME max_lease_time = 86400; /* 24 hours... */
+ struct tree_cache *global_options[256];
+@@ -709,6 +713,14 @@ main(int argc, char **argv) {
+ 	}
+ #endif
+ 
++#ifdef HAVE_LIBSYSTEMD
++        /* We are ready to process incomming packets. Let's notify systemd */
++        sd_notifyf(0, "READY=1\n"
++                   "STATUS=Dispatching packets...\n"
++                   "MAINPID=%lu",
++                   (unsigned long) getpid());
++#endif
++
+ 	/* Start dispatching packets and timeouts... */
+ 	dispatch();
+ 
+diff -up dhcp-4.3.4/server/dhcpd.c.sd_notify dhcp-4.3.4/server/dhcpd.c
+--- dhcp-4.3.4/server/dhcpd.c.sd_notify	2016-04-29 13:08:52.873287075 +0200
++++ dhcp-4.3.4/server/dhcpd.c	2016-04-29 13:12:00.655333096 +0200
+@@ -57,6 +57,10 @@ uid_t set_uid = 0;
+ gid_t set_gid = 0;
+ #endif /* PARANOIA */
+ 
++#ifdef HAVE_LIBSYSTEMD
++#include <systemd/sd-daemon.h>
++#endif
++
+ struct iaddr server_identifier;
+ int server_identifier_matched;
+ 
+@@ -931,6 +935,14 @@ main(int argc, char **argv) {
+ 	/* Log that we are about to start working */
+ 	log_info("Server starting service.");
+ 
++#ifdef HAVE_LIBSYSTEMD
++        /* We are ready to process incomming packets. Let's notify systemd */
++        sd_notifyf(0, "READY=1\n"
++                   "STATUS=Dispatching packets...\n"
++                   "MAINPID=%lu",
++                   (unsigned long) getpid());
++#endif
++
+ 	/*
+ 	 * Receive packets and dispatch them...
+ 	 * dispatch() will never return.
diff --git a/SOURCES/dhcp-sendDecline.patch b/SOURCES/dhcp-sendDecline.patch
new file mode 100644
index 0000000..ede9298
--- /dev/null
+++ b/SOURCES/dhcp-sendDecline.patch
@@ -0,0 +1,231 @@
+diff -up dhcp-4.3.4/client/dhc6.c.sendDecline dhcp-4.3.4/client/dhc6.c
+--- dhcp-4.3.4/client/dhc6.c.sendDecline	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/client/dhc6.c	2016-05-02 14:51:57.916578401 +0200
+@@ -115,6 +115,8 @@ void do_select6(void *input);
+ void do_refresh6(void *input);
+ static void do_release6(void *input);
+ static void start_bound(struct client_state *client);
++static void start_decline6(struct client_state *client);
++static void do_decline6(void *input);
+ static void start_informed(struct client_state *client);
+ void informed_handler(struct packet *packet, struct client_state *client);
+ void bound_handler(struct packet *packet, struct client_state *client);
+@@ -2314,6 +2316,7 @@ start_release6(struct client_state *clie
+ 	cancel_timeout(do_select6, client);
+ 	cancel_timeout(do_refresh6, client);
+ 	cancel_timeout(do_release6, client);
++	cancel_timeout(do_decline6, client);
+ 	client->state = S_STOPPED;
+ 
+ 	/*
+@@ -2968,6 +2971,7 @@ dhc6_check_reply(struct client_state *cl
+ 		break;
+ 
+ 	      case S_STOPPED:
++	      case S_DECLINED:
+ 		action = dhc6_stop_action;
+ 		break;
+ 
+@@ -3084,6 +3088,7 @@ dhc6_check_reply(struct client_state *cl
+ 		break;
+ 
+ 	      case S_STOPPED:
++	      case S_DECLINED:
+ 		/* Nothing critical to do at this stage. */
+ 		break;
+ 
+@@ -4214,17 +4219,23 @@ reply_handler(struct packet *packet, str
+ 	cancel_timeout(do_select6, client);
+ 	cancel_timeout(do_refresh6, client);
+ 	cancel_timeout(do_release6, client);
++	cancel_timeout(do_decline6, client);
+ 
+ 	/* If this is in response to a Release/Decline, clean up and return. */
+-	if (client->state == S_STOPPED) {
+-		if (client->active_lease == NULL)
+-			return;
++	if ((client->state == S_STOPPED) ||
++	    (client->state == S_DECLINED)) {
++
++		if (client->active_lease != NULL) {
++			dhc6_lease_destroy(&client->active_lease, MDL);
++			client->active_lease = NULL;
++			/* We should never wait for nothing!? */
++			if (stopping_finished())
++				exit(0);
++		}
++
++		if (client->state == S_DECLINED)
++			start_init6(client);
+ 
+-		dhc6_lease_destroy(&client->active_lease, MDL);
+-		client->active_lease = NULL;
+-		/* We should never wait for nothing!? */
+-		if (stopping_finished())
+-			exit(0);
+ 		return;
+ 	}
+ 
+@@ -4798,7 +4809,11 @@ start_bound(struct client_state *client)
+ 			dhc6_marshall_values("new_", client, lease, ia, addr);
+ 			script_write_requested6(client);
+ 
+-			script_go(client);
++			// when script returns 3, DAD failed
++			if (script_go(client) == 3) {
++				start_decline6(client);
++				return;
++			}
+ 		}
+ 
+ 		/* XXX: maybe we should loop on the old values instead? */
+@@ -4851,6 +4866,149 @@ start_bound(struct client_state *client)
+ 	dhc6_check_times(client);
+ }
+ 
++/*
++ * Decline addresses.
++ */
++void
++start_decline6(struct client_state *client)
++{
++	/* Cancel any pending transmissions */
++	cancel_timeout(do_confirm6, client);
++	cancel_timeout(do_select6, client);
++	cancel_timeout(do_refresh6, client);
++	cancel_timeout(do_release6, client);
++	cancel_timeout(do_decline6, client);
++	client->state = S_DECLINED;
++
++	if (client->active_lease == NULL)
++		return;
++
++	/* Set timers per RFC3315 section 18.1.7. */
++	client->IRT = DEC_TIMEOUT * 100;
++	client->MRT = 0;
++	client->MRC = DEC_MAX_RC;
++	client->MRD = 0;
++
++	dhc6_retrans_init(client);
++	client->v6_handler = reply_handler;
++
++	client->refresh_type = DHCPV6_DECLINE;
++	do_decline6(client);
++}
++
++/*
++ * do_decline6() creates a Decline packet and transmits it.
++ */
++static void
++do_decline6(void *input)
++{
++	struct client_state *client;
++	struct data_string ds;
++	struct timeval elapsed, tv;
++	int send_ret, added;
++
++	client = input;
++
++	if ((client->active_lease == NULL) || !active_prefix(client))
++		return;
++
++	if ((client->MRC != 0) && (client->txcount > client->MRC))  {
++		log_info("Max retransmission count exceeded.");
++		goto decline_done;
++	}
++
++	/*
++	 * Start_time starts at the first transmission.
++	 */
++	if (client->txcount == 0) {
++		client->start_time.tv_sec = cur_tv.tv_sec;
++		client->start_time.tv_usec = cur_tv.tv_usec;
++	}
++
++	/* elapsed = cur - start */
++	elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
++	elapsed.tv_usec = cur_tv.tv_usec - client->start_time.tv_usec;
++	if (elapsed.tv_usec < 0) {
++		elapsed.tv_sec -= 1;
++		elapsed.tv_usec += 1000000;
++	}
++
++	memset(&ds, 0, sizeof(ds));
++	if (!buffer_allocate(&ds.buffer, 4, MDL)) {
++		log_error("Unable to allocate memory for Decline.");
++		goto decline_done;
++	}
++
++	ds.data = ds.buffer->data;
++	ds.len = 4;
++	ds.buffer->data[0] = DHCPV6_DECLINE;
++	memcpy(ds.buffer->data + 1, client->dhcpv6_transaction_id, 3);
++
++	/* Form an elapsed option. */
++	/* Maximum value is 65535 1/100s coded as 0xffff. */
++	if ((elapsed.tv_sec < 0) || (elapsed.tv_sec > 655) ||
++	    ((elapsed.tv_sec == 655) && (elapsed.tv_usec > 350000))) {
++		client->elapsed = 0xffff;
++	} else {
++		client->elapsed = elapsed.tv_sec * 100;
++		client->elapsed += elapsed.tv_usec / 10000;
++	}
++
++	client->elapsed = htons(client->elapsed);
++
++	log_debug("XMT: Forming Decline.");
++	make_client6_options(client, &client->sent_options,
++			     client->active_lease, DHCPV6_DECLINE);
++	dhcpv6_universe.encapsulate(&ds, NULL, NULL, client, NULL,
++				    client->sent_options, &global_scope,
++				    &dhcpv6_universe);
++
++	/* Append IA's (but don't release temporary addresses). */
++	if (wanted_ia_na &&
++	    dhc6_add_ia_na(client, &ds, client->active_lease,
++			   DHCPV6_DECLINE, 0, &added) != ISC_R_SUCCESS) {
++		data_string_forget(&ds, MDL);
++		goto decline_done;
++	}
++	if (wanted_ia_pd &&
++	    dhc6_add_ia_pd(client, &ds, client->active_lease,
++			   DHCPV6_DECLINE, 0, &added) != ISC_R_SUCCESS) {
++		data_string_forget(&ds, MDL);
++		goto decline_done;
++	}
++
++	/* Transmit and wait. */
++	log_info("XMT: Decline on %s, interval %ld0ms.",
++		 client->name ? client->name : client->interface->name,
++		 (long int)client->RT);
++
++	send_ret = send_packet6(client->interface, ds.data, ds.len,
++				&DHCPv6DestAddr);
++	if (send_ret != ds.len) {
++		log_error("dhc6: sendpacket6() sent %d of %d bytes",
++			  send_ret, ds.len);
++	}
++
++	data_string_forget(&ds, MDL);
++
++	/* Wait RT */
++	tv.tv_sec = cur_tv.tv_sec + client->RT / 100;
++	tv.tv_usec = cur_tv.tv_usec + (client->RT % 100) * 10000;
++	if (tv.tv_usec >= 1000000) {
++		tv.tv_sec += 1;
++		tv.tv_usec -= 1000000;
++	}
++	add_timeout(&tv, do_decline6, client, NULL, NULL);
++	dhc6_retrans_advance(client);
++	return;
++
++decline_done:
++	dhc6_lease_destroy(&client->active_lease, MDL);
++	client->active_lease = NULL;
++	start_init6(client);
++	return;
++}
++
+ /* While bound, ignore packets.  In the future we'll want to answer
+  * Reconfigure-Request messages and the like.
+  */
diff --git a/SOURCES/dhcp-sharedlib.patch b/SOURCES/dhcp-sharedlib.patch
new file mode 100644
index 0000000..4e4869e
--- /dev/null
+++ b/SOURCES/dhcp-sharedlib.patch
@@ -0,0 +1,149 @@
+diff --git a/client/Makefile.am b/client/Makefile.am
+index b85f5d2..b1ecf82 100644
+--- a/client/Makefile.am
++++ b/client/Makefile.am
+@@ -15,6 +15,6 @@ dhclient_SOURCES = clparse.c dhclient.c dhc6.c \
+ 		   scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
+ 		   scripts/netbsd scripts/nextstep scripts/openbsd \
+ 		   scripts/solaris scripts/openwrt
+-dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a $(BIND_LIBS)
++dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(BIND_LIBS)
+ man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
+ EXTRA_DIST = $(man_MANS)
+diff --git a/common/tests/Makefile.am b/common/tests/Makefile.am
+index 196aa44..1ccaa05 100644
+--- a/common/tests/Makefile.am
++++ b/common/tests/Makefile.am
+@@ -15,22 +15,22 @@ ATF_TESTS += alloc_unittest dns_unittest misc_unittest ns_name_unittest
+ alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
+ alloc_unittest_LDADD = $(ATF_LDFLAGS)
+ alloc_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BIND_LIBS)
++	../../omapip/libomapi.la $(BIND_LIBS)
+ 
+ dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ dns_unittest_LDADD = $(ATF_LDFLAGS)
+ dns_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BIND_LIBS)
++	../../omapip/libomapi.la $(BIND_LIBS)
+ 
+ misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ misc_unittest_LDADD = $(ATF_LDFLAGS)
+ misc_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BIND_LIBS)
++	../../omapip/libomapi.la $(BIND_LIBS)
+ 
+ ns_name_unittest_SOURCES = ns_name_test.c $(top_srcdir)/tests/t_api_dhcp.c
+ ns_name_unittest_LDADD = $(ATF_LDFLAGS)
+ ns_name_unittest_LDADD += ../libdhcp.a  \
+-	../../omapip/libomapi.a $(BIND_LIBS)
++	../../omapip/libomapi.la $(BIND_LIBS)
+ 
+ check: $(ATF_TESTS)
+ 	@if test $(top_srcdir) != ${top_builddir}; then \
+diff --git a/configure.ac b/configure.ac
+index f594cfa..adc98a8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -47,7 +47,8 @@ AM_CONDITIONAL(CROSS_COMPILING, test "$cross_compiling" = "yes")
+ # Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
+ AC_USE_SYSTEM_EXTENSIONS
+ 
+-AC_PROG_RANLIB
++# Use libtool to simplify building of shared libraries
++AC_PROG_LIBTOOL
+ 
+ AC_PATH_PROG(AR, ar)
+ AC_SUBST(AR)
+diff --git a/dhcpctl/Makefile.am b/dhcpctl/Makefile.am
+index fa20a78..dd016e4 100644
+--- a/dhcpctl/Makefile.am
++++ b/dhcpctl/Makefile.am
+@@ -1,17 +1,17 @@
+ BIND_LIBS = @BIND_LIBS@
+ 
+ bin_PROGRAMS = omshell
+-lib_LIBRARIES = libdhcpctl.a
++lib_LTLIBRARIES = libdhcpctl.la
+ noinst_PROGRAMS = cltest
+ man_MANS = omshell.1 dhcpctl.3
+ EXTRA_DIST = $(man_MANS)
+ 
+ omshell_SOURCES = omshell.c
+-omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
++omshell_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
+ 	        $(BIND_LIBS)
+ 
+-libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
++libdhcpctl_la_SOURCES = dhcpctl.c callback.c remote.c
+ 
+ cltest_SOURCES = cltest.c
+-cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
++cltest_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
+ 	       $(BIND_LIBS)
+diff --git a/omapip/Makefile.am b/omapip/Makefile.am
+index b0d2680..265bcef 100644
+--- a/omapip/Makefile.am
++++ b/omapip/Makefile.am
+@@ -1,9 +1,9 @@
+ BIND_LIBS = @BIND_LIBS@
+ 
+-lib_LIBRARIES = libomapi.a
++lib_LTLIBRARIES = libomapi.la
+ noinst_PROGRAMS = svtest
+ 
+-libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
++libomapi_la_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
+ 		     errwarn.c listener.c dispatch.c generic.c support.c \
+ 		     handle.c message.c convert.c hash.c auth.c inet_addr.c \
+ 		     array.c trace.c toisc.c iscprint.c isclib.c
+@@ -12,5 +12,5 @@ man_MANS = omapi.3
+ EXTRA_DIST = $(man_MANS)
+ 
+ svtest_SOURCES = test.c
+-svtest_LDADD = libomapi.a $(BIND_LIBS)
++svtest_LDADD = libomapi.la $(BIND_LIBS)
+ 
+diff --git a/relay/Makefile.am b/relay/Makefile.am
+index c9a1cba..316a524 100644
+--- a/relay/Makefile.am
++++ b/relay/Makefile.am
+@@ -4,7 +4,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localstatedir@"'
+ 
+ sbin_PROGRAMS = dhcrelay
+ dhcrelay_SOURCES = dhcrelay.c
+-dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
++dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \
+ 		 $(BIND_LIBS)
+ man_MANS = dhcrelay.8
+ EXTRA_DIST = $(man_MANS)
+diff --git a/server/Makefile.am b/server/Makefile.am
+index 30cf2b1..f56f310 100644
+--- a/server/Makefile.am
++++ b/server/Makefile.am
+@@ -15,8 +15,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c confpars.c db.c class.c failover.c \
+ 		dhcpv6.c mdb6.c ldap.c ldap_casa.c leasechain.c ldap_krb_helper.c
+ 
+ dhcpd_CFLAGS = $(LDAP_CFLAGS)
+-dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
+-	      ../dhcpctl/libdhcpctl.a $(BIND_LIBS) $(LDAP_LIBS)
++dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \
++	      ../dhcpctl/libdhcpctl.la $(BIND_LIBS) $(LDAP_LIBS)
+ 
+ man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
+ EXTRA_DIST = $(man_MANS)
+diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am
+index 771de06..8d8a2c1 100644
+--- a/server/tests/Makefile.am
++++ b/server/tests/Makefile.am
+@@ -20,8 +20,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpars.c ../db.c ../class.c      \
+           ../ddns.c ../dhcpleasequery.c ../dhcpv6.c ../mdb6.c        \
+           ../ldap.c ../ldap_casa.c ../dhcpd.c ../leasechain.c
+ 
+-DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \
+-          $(top_builddir)/dhcpctl/libdhcpctl.a $(BIND_LIBS)
++DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.la \
++          $(top_builddir)/dhcpctl/libdhcpctl.la $(BIND_LIBS)
+ 
+ ATF_TESTS =
+ if HAVE_ATF
diff --git a/SOURCES/dhcp-stateless-DUID-LLT.patch b/SOURCES/dhcp-stateless-DUID-LLT.patch
new file mode 100644
index 0000000..72b7b0f
--- /dev/null
+++ b/SOURCES/dhcp-stateless-DUID-LLT.patch
@@ -0,0 +1,13 @@
+diff -up dhcp-4.3.4/client/dhclient.c.stateless-DUID-LLT dhcp-4.3.4/client/dhclient.c
+--- dhcp-4.3.4/client/dhclient.c.stateless-DUID-LLT	2016-04-29 13:13:50.467360008 +0200
++++ dhcp-4.3.4/client/dhclient.c	2016-04-29 13:14:53.389375428 +0200
+@@ -1317,6 +1317,9 @@ void run_stateless(int exit_mode, u_int1
+ 			data_string_forget(&default_duid, MDL);
+ 
+ 		form_duid(&default_duid, MDL);
++		if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS &&
++		    duid_type == DUID_LLT)
++			write_duid(&default_duid);
+ 	}
+ 
+ #ifdef DHCP4o6
diff --git a/SOURCES/dhcp-unicast-bootp.patch b/SOURCES/dhcp-unicast-bootp.patch
new file mode 100644
index 0000000..abf89f2
--- /dev/null
+++ b/SOURCES/dhcp-unicast-bootp.patch
@@ -0,0 +1,101 @@
+diff -up dhcp-4.3.4/server/bootp.c.unicast dhcp-4.3.4/server/bootp.c
+--- dhcp-4.3.4/server/bootp.c.unicast	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/server/bootp.c	2016-05-02 15:09:40.023243008 +0200
+@@ -52,6 +52,7 @@ void bootp (packet)
+ 	char msgbuf [1024];
+ 	int ignorep;
+ 	int peer_has_leases = 0;
++	int norelay = 0;
+ 
+ 	if (packet -> raw -> op != BOOTREQUEST)
+ 		return;
+@@ -67,7 +68,7 @@ void bootp (packet)
+ 		 ? inet_ntoa (packet -> raw -> giaddr)
+ 		 : packet -> interface -> name);
+ 
+-	if (!locate_network (packet)) {
++	if ((norelay = locate_network (packet)) == 0) {
+ 		log_info ("%s: network unknown", msgbuf);
+ 		return;
+ 	}
+@@ -428,6 +429,15 @@ void bootp (packet)
+ 
+ 			goto out;
+ 		}
++	} else if (norelay == 2) {
++		to.sin_addr = raw.ciaddr;
++		to.sin_port = remote_port;
++		if (fallback_interface) {
++			result = send_packet (fallback_interface, NULL, &raw,
++					      outgoing.packet_length, from,
++					      &to, &hto);
++			goto out;
++		}
+ 
+ 	/* If it comes from a client that already knows its address
+ 	   and is not requesting a broadcast response, and we can
+diff -up dhcp-4.3.4/server/dhcp.c.unicast dhcp-4.3.4/server/dhcp.c
+--- dhcp-4.3.4/server/dhcp.c.unicast	2016-03-22 14:16:51.000000000 +0100
++++ dhcp-4.3.4/server/dhcp.c	2016-05-02 15:10:13.255267511 +0200
+@@ -5132,6 +5132,7 @@ int locate_network (packet)
+ 	struct data_string data;
+ 	struct subnet *subnet = (struct subnet *)0;
+ 	struct option_cache *oc;
++	int norelay = 0;
+ 
+ #if defined(DHCPv6) && defined(DHCP4o6)
+ 	if (dhcpv4_over_dhcpv6 && (packet->dhcp4o6_response != NULL)) {
+@@ -5153,12 +5154,24 @@ int locate_network (packet)
+ 	   from the interface, if there is one.   If not, fail. */
+ 	if (!oc && !packet -> raw -> giaddr.s_addr) {
+ 		if (packet -> interface -> shared_network) {
+-			shared_network_reference
+-				(&packet -> shared_network,
+-				 packet -> interface -> shared_network, MDL);
+-			return 1;
++			struct in_addr any_addr;
++			any_addr.s_addr = INADDR_ANY;
++
++			if (!packet -> packet_type && memcmp(&packet -> raw -> ciaddr, &any_addr, 4)) {
++				struct iaddr cip;
++				memcpy(cip.iabuf, &packet -> raw -> ciaddr, 4);
++				cip.len = 4;
++				if (!find_grouped_subnet(&subnet, packet->interface->shared_network, cip, MDL))
++					norelay = 2;
++			}
++
++			if (!norelay) {
++				shared_network_reference(&packet -> shared_network, packet -> interface -> shared_network, MDL);
++				return 1;
++			}
++		} else {
++			return 0;
+ 		}
+-		return 0;
+ 	}
+ 
+ 	/* If there's an option indicating link connection, and it's valid,
+@@ -5185,7 +5198,10 @@ int locate_network (packet)
+ 		data_string_forget (&data, MDL);
+ 	} else {
+ 		ia.len = 4;
+-		memcpy (ia.iabuf, &packet -> raw -> giaddr, 4);
++		if (norelay)
++			memcpy (ia.iabuf, &packet->raw->ciaddr, 4);
++		else
++			memcpy (ia.iabuf, &packet->raw->giaddr, 4);
+ 	}
+ 
+ 	/* If we know the subnet on which the IP address lives, use it. */
+@@ -5193,7 +5209,10 @@ int locate_network (packet)
+ 		shared_network_reference (&packet -> shared_network,
+ 					  subnet -> shared_network, MDL);
+ 		subnet_dereference (&subnet, MDL);
+-		return 1;
++		if (norelay)
++			return norelay;
++		else
++			return 1;
+ 	}
+ 
+ 	/* Otherwise, fail. */
diff --git a/SOURCES/dhcpd.service b/SOURCES/dhcpd.service
new file mode 100644
index 0000000..7363d7d
--- /dev/null
+++ b/SOURCES/dhcpd.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=DHCPv4 Server Daemon
+Documentation=man:dhcpd(8) man:dhcpd.conf(5)
+Wants=network-online.target
+After=network-online.target
+After=time-sync.target
+
+[Service]
+Type=notify
+EnvironmentFile=-/etc/sysconfig/dhcpd
+ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS
+StandardError=null
+
+[Install]
+WantedBy=multi-user.target
diff --git a/SOURCES/dhcpd6.service b/SOURCES/dhcpd6.service
new file mode 100644
index 0000000..ff844c0
--- /dev/null
+++ b/SOURCES/dhcpd6.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=DHCPv6 Server Daemon
+Documentation=man:dhcpd(8) man:dhcpd.conf(5)
+Wants=network-online.target
+After=network-online.target
+After=time-sync.target
+
+[Service]
+Type=notify
+EnvironmentFile=-/etc/sysconfig/dhcpd6
+ExecStart=/usr/sbin/dhcpd -f -6 -cf /etc/dhcp/dhcpd6.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS
+StandardError=null
+
+[Install]
+WantedBy=multi-user.target
diff --git a/SOURCES/dhcrelay.service b/SOURCES/dhcrelay.service
new file mode 100644
index 0000000..43a0ca3
--- /dev/null
+++ b/SOURCES/dhcrelay.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=DHCP Relay Agent Daemon
+Documentation=man:dhcrelay(8)
+Wants=network-online.target
+After=network-online.target
+
+[Service]
+Type=notify
+ExecStart=/usr/sbin/dhcrelay -d --no-pid
+StandardError=null
+
+[Install]
+WantedBy=multi-user.target
diff --git a/SPECS/dhcp.spec b/SPECS/dhcp.spec
new file mode 100644
index 0000000..7cfd171
--- /dev/null
+++ b/SPECS/dhcp.spec
@@ -0,0 +1,2919 @@
+# SystemTap support is disabled by default
+%{!?sdt:%global sdt 0}
+
+#http://lists.fedoraproject.org/pipermail/devel/2011-August/155358.html
+%global _hardened_build 1
+
+# Where dhcp configuration files are stored
+%global dhcpconfdir %{_sysconfdir}/dhcp
+
+
+#global prever b1
+#global patchver P1
+%global DHCPVERSION %{version}%{?prever}%{?patchver:-%{patchver}}
+
+
+Summary:  Dynamic host configuration protocol software
+Name:     dhcp
+Version:  4.3.6
+Release:  30%{?dist}
+# NEVER CHANGE THE EPOCH on this package.  The previous maintainer (prior to
+# dcantrell maintaining the package) made incorrect use of the epoch and
+# that's why it is at 12 now.  It should have never been used, but it was.
+# So we are stuck with it.
+Epoch:    12
+License:  ISC
+Url:      http://isc.org/products/DHCP/
+Source0:  ftp://ftp.isc.org/isc/dhcp/%{DHCPVERSION}/dhcp-%{DHCPVERSION}.tar.gz
+Source1:  dhclient-script
+Source2:  README.dhclient.d
+Source3:  11-dhclient
+Source4:  12-dhcpd
+Source5:  56dhclient
+Source6:  dhcpd.service
+Source7:  dhcpd6.service
+Source8:  dhcrelay.service
+
+Patch0:   dhcp-remove-bind.patch
+
+Patch2:   dhcp-sharedlib.patch
+Patch3:   dhcp-errwarn-message.patch
+Patch4:   dhcp-dhclient-options.patch
+Patch5:   dhcp-release-by-ifup.patch
+Patch6:   dhcp-dhclient-decline-backoff.patch
+Patch7:   dhcp-unicast-bootp.patch
+Patch8:   dhcp-default-requested-options.patch
+
+Patch10:  dhcp-manpages.patch
+Patch11:  dhcp-paths.patch
+Patch12:  dhcp-CLOEXEC.patch
+Patch13:  dhcp-garbage-chars.patch
+Patch14:  dhcp-add_timeout_when_NULL.patch
+Patch15:  dhcp-64_bit_lease_parse.patch
+Patch16:  dhcp-capability.patch
+
+Patch18:  dhcp-sendDecline.patch
+Patch19:  dhcp-rfc3442-classless-static-routes.patch
+Patch20:  dhcp-honor-expired.patch
+Patch21:  dhcp-PPP.patch
+
+Patch23:  dhcp-lpf-ib.patch
+Patch24:  dhcp-IPoIB-log-id.patch
+Patch25:  dhcp-improved-xid.patch
+#Patch26:  dhcp-gpxe-cid.patch
+Patch26:  dhcp-duidv4.patch
+Patch27:  dhcp-duid_uuid.patch
+#Patch28:  dhcp-systemtap.patch
+
+Patch31:  dhcp-client-request-release-bind-iface.patch
+Patch33:  dhcp-no-subnet-error2info.patch
+Patch34:  dhcp-sd_notify.patch
+
+Patch36:  dhcp-option97-pxe-client-id.patch
+Patch37:  dhcp-stateless-DUID-LLT.patch
+Patch38:  dhcp-dhclient-preinit6s.patch
+Patch39:  dhcp-handle_ctx_signals.patch
+Patch40:  dhcp-4.3.6-omapi-leak.patch
+Patch41:  dhcp-4.3.6-isc-util.patch
+Patch42:  dhcp-4.3.6-options_overflow.patch
+Patch43:  dhcp-4.3.6-reference_count_overflow.patch
+Patch44:  dhcp-replay_file_limit.patch
+Patch45:  dhcp-4.2.5-expiry_before_renewal_v2.patch
+
+BuildRequires: autoconf
+BuildRequires: automake
+BuildRequires: libtool
+BuildRequires: openldap-devel
+# --with-ldap-gssapi
+BuildRequires: krb5-devel
+BuildRequires: libcap-ng-devel
+# https://fedorahosted.org/fpc/ticket/502#comment:3
+BuildRequires: bind-export-devel
+BuildRequires: systemd systemd-devel
+# dhcp-sd_notify.patch
+BuildRequires: pkgconfig(libsystemd)
+%if ! 0%{?_module_build}
+BuildRequires: doxygen
+%endif
+%if %{sdt}
+BuildRequires: systemtap-sdt-devel
+%global tapsetdir    /usr/share/systemtap/tapset
+%endif
+
+# In _docdir we ship some perl scripts and module from contrib subdirectory.
+# Because nothing under _docdir is allowed to "require" anything,
+# prevent _docdir from being scanned. (#674058)
+%filter_requires_in %{_docdir}
+%{filter_setup}
+
+%description
+DHCP (Dynamic Host Configuration Protocol)
+
+%package server
+Summary: Provides the ISC DHCP server
+Requires: %{name}-common = %{epoch}:%{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release}
+Requires(pre): shadow-utils
+Requires(post): coreutils grep sed
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+
+%description server
+DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
+individual devices on an IP network to get their own network
+configuration information (IP address, subnetmask, broadcast address,
+etc.) from a DHCP server. The overall purpose of DHCP is to make it
+easier to administer a large network.
+
+This package provides the ISC DHCP server.
+
+%package relay
+Summary: Provides the ISC DHCP relay agent
+Requires: %{name}-common = %{epoch}:%{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release}
+Requires(post): grep sed
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+
+%description relay
+DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
+individual devices on an IP network to get their own network
+configuration information (IP address, subnetmask, broadcast address,
+etc.) from a DHCP server. The overall purpose of DHCP is to make it
+easier to administer a large network.
+
+This package provides the ISC DHCP relay agent.
+
+%package client
+Summary: Provides the ISC DHCP client daemon and dhclient-script
+Provides: dhclient = %{epoch}:%{version}-%{release}
+Obsoletes: dhclient < %{epoch}:%{version}-%{release}
+# dhclient-script requires:
+Requires: coreutils gawk grep ipcalc iproute iputils sed systemd
+Requires: %{name}-common = %{epoch}:%{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release}
+
+%description client
+DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
+individual devices on an IP network to get their own network
+configuration information (IP address, subnetmask, broadcast address,
+etc.) from a DHCP server. The overall purpose of DHCP is to make it
+easier to administer a large network.
+
+This package provides the ISC DHCP client.
+
+%package common
+Summary: Common files used by ISC dhcp client, server and relay agent
+BuildArch: noarch
+
+%description common
+DHCP (Dynamic Host Configuration Protocol) is a protocol which allows
+individual devices on an IP network to get their own network
+configuration information (IP address, subnetmask, broadcast address,
+etc.) from a DHCP server. The overall purpose of DHCP is to make it
+easier to administer a large network.
+
+This package provides common files used by dhcp and dhclient package.
+
+%package libs
+Summary: Shared libraries used by ISC dhcp client and server
+
+%description libs
+This package contains shared libraries used by ISC dhcp client and server
+
+
+%package devel
+Summary: Development headers and libraries for interfacing to the DHCP server
+Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release}
+
+%description devel
+Header files and API documentation for using the ISC DHCP libraries.  The
+libdhcpctl and libomapi static libraries are also included in this package.
+
+%if ! 0%{?_module_build}
+%package devel-doc
+Summary: Developer's Guide for ISC DHCP
+Requires: %{name}-libs = %{epoch}:%{version}-%{release}
+BuildArch: noarch
+
+%description devel-doc
+This documentation is intended for developers, contributors and other
+programmers that are interested in internal operation of the code.
+This package contains doxygen-generated documentation.
+%endif
+
+%prep
+%setup -q -n dhcp-%{DHCPVERSION}
+
+# Remove bundled BIND source
+rm bind/bind.tar.gz
+
+# Fire away bundled BIND source.
+%patch0 -p1 -b .remove-bind %{?_rawbuild}
+
+#Build dhcp's libraries as shared libs instead of static libs.
+%patch2 -p1 -b .sharedlib
+
+# Replace the standard ISC warning message about requesting help with an
+# explanation that this is a patched build of ISC DHCP and bugs should be
+# reported through bugzilla.redhat.com
+%patch3 -p1 -b .errwarn
+
+# Add more dhclient options (-I, -B, -H, -F, -timeout, -V, and -R)
+%patch4 -p1 -b .options
+
+# Handle releasing interfaces requested by /sbin/ifup
+# pid file is assumed to be /var/run/dhclient-$interface.pid
+%patch5 -p1 -b .ifup
+
+# If we receive a DHCP offer in dhclient and it's DECLINEd in dhclient-script,
+# backoff for an amount of time before trying again
+%patch6 -p1 -b .backoff
+
+# Support unicast BOOTP for IBM pSeries systems (and maybe others)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #19146])
+%patch7 -p1 -b .unicast
+
+# Add NIS domain, NIS servers, NTP servers, interface-mtu and domain-search
+# to the list of default requested DHCP options
+%patch8 -p1 -b .requested
+
+
+# Various man-page-only fixes
+%patch10 -p1 -b .man
+
+# Change paths to conform to our standards
+%patch11 -p1 -b .paths
+
+# Make sure all open file descriptors are closed-on-exec for SELinux (#446632)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #19148])
+%patch12 -p1 -b .cloexec
+
+# Fix 'garbage in format string' error (#450042)
+%patch13 -p1 -b .garbage
+
+# Handle cases in add_timeout() where the function is called with a NULL
+# value for the 'when' parameter
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #19867])
+%patch14 -p1 -b .dracut
+
+# Ensure 64-bit platforms parse lease file dates & times correctly (#448615, #628258)
+# (Partly submitted to dhcp-bugs@isc.org - [ISC-Bugs #22033])
+%patch15 -p1 -b .64-bit_lease_parse
+
+# Drop unnecessary capabilities in
+# dhclient (#517649, #546765), dhcpd/dhcrelay (#699713)
+%patch16 -p1 -b .capability
+
+# If any of the bound addresses are found to be in use on the link,
+# the dhcpv6 client sends a Decline message to the server
+# as described in section 18.1.7 of RFC-3315 (#559147)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #21237])
+%patch18 -p1 -b .sendDecline
+
+# RFC 3442 - Classless Static Route Option for DHCPv4 (#516325)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #24572])
+%patch19 -p1 -b .rfc3442
+
+# check whether there is any unexpired address in previous lease
+# prior to confirming (INIT-REBOOT) the lease (#585418)
+# (Submitted to dhcp-suggest@isc.org - [ISC-Bugs #22675])
+%patch20 -p1 -b .honor-expired
+
+# DHCPv6 over PPP support (#626514)
+%patch21 -p1 -b .PPP
+
+# IPoIB support (#660681)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #24249])
+%patch23 -p1 -b .lpf-ib
+# add GUID/DUID to dhcpd logs (#1064416)
+%patch24 -p1 -b .IPoIB-log-id
+%patch25 -p1 -b .improved-xid
+
+# create client identifier per rfc4390
+#%%patch26 -p1 -b .gpxe-cid (not needed as we use DUIDs - see next patch)
+# Turn on creating/sending of DUID as client identifier with DHCPv4 clients (#560361c#40, rfc4361)
+%patch26 -p1 -b .duidv4
+# Implement DUID-UUID (RFC 6355) and make it default DUID type (#560361#60)
+%patch27 -p1 -b .duid_uuid
+
+# http://sourceware.org/systemtap/wiki/SystemTap
+#%%patch28 -p1 -b .systemtap
+
+# send unicast request/release via correct interface (#800561, #1177351)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #30544])
+%patch31 -p1 -b .bind-iface
+
+
+# 'No subnet declaration for <iface>' should be info, not error.
+%patch33 -p1 -b .error2info
+
+# support for sending startup notification to systemd (#1077666)
+%patch34 -p1 -b .sd_notify
+
+# option 97 - pxe-client-id (#1058674)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #38110])
+%patch36 -p1 -b .option97
+
+# dhclient: write DUID_LLT even in stateless mode (#1156356)
+# (Submitted to dhcp-bugs@isc.org - [ISC-Bugs #38144])
+%patch37 -p1 -b .stateless-DUID-LLT
+
+# dhclient: make sure link-local address is ready in stateless mode (#1263466)
+%patch38 -p1 -b .preinit6s
+
+# add signal handlers for proper work with share context
+%patch39 -p1 -b .signals
+
+# close omapi socker descriptions properly
+# https://bugzilla.redhat.com/1523547 
+%patch40 -p1 -b .omapi-leak
+
+# include isc/util.h explicitly, is it no longer contained in used headers
+%patch41 -p1 -b .isc-util
+
+## https://bugzilla.redhat.com/show_bug.cgi?id=1550246
+%patch42 -p1 
+%patch43 -p1
+
+## https://bugzilla.redhat.com/show_bug.cgi?id=1623794
+%patch44 -p1 -b .noreplay
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=1647786
+%patch45 -p1 -b .t2-expirity
+
+# DHCLIENT_DEFAULT_PREFIX_LEN  64 -> 128
+# https://bugzilla.gnome.org/show_bug.cgi?id=656610
+sed -i -e 's|DHCLIENT_DEFAULT_PREFIX_LEN 64|DHCLIENT_DEFAULT_PREFIX_LEN 128|g' includes/site.h
+
+# Update paths in all man pages
+for page in client/dhclient.conf.5 client/dhclient.leases.5 \
+            client/dhclient-script.8 client/dhclient.8 ; do
+    sed -i -e 's|CLIENTBINDIR|%{_sbindir}|g' \
+                -e 's|RUNDIR|%{_localstatedir}/run|g' \
+                -e 's|DBDIR|%{_localstatedir}/lib/dhclient|g' \
+                -e 's|ETCDIR|%{dhcpconfdir}|g' $page
+done
+
+for page in server/dhcpd.conf.5 server/dhcpd.leases.5 server/dhcpd.8 ; do
+    sed -i -e 's|CLIENTBINDIR|%{_sbindir}|g' \
+                -e 's|RUNDIR|%{_localstatedir}/run|g' \
+                -e 's|DBDIR|%{_localstatedir}/lib/dhcpd|g' \
+                -e 's|ETCDIR|%{dhcpconfdir}|g' $page
+done
+
+sed -i -e 's|/var/db/|%{_localstatedir}/lib/dhcpd/|g' contrib/dhcp-lease-list.pl
+
+%build
+#libtoolize --copy --force
+autoreconf --verbose --force --install
+
+CFLAGS="%{optflags} -fno-strict-aliasing" \
+%configure \
+    --with-srv-lease-file=%{_localstatedir}/lib/dhcpd/dhcpd.leases \
+    --with-srv6-lease-file=%{_localstatedir}/lib/dhcpd/dhcpd6.leases \
+    --with-cli-lease-file=%{_localstatedir}/lib/dhclient/dhclient.leases \
+    --with-cli6-lease-file=%{_localstatedir}/lib/dhclient/dhclient6.leases \
+    --with-srv-pid-file=%{_localstatedir}/run/dhcpd.pid \
+    --with-srv6-pid-file=%{_localstatedir}/run/dhcpd6.pid \
+    --with-cli-pid-file=%{_localstatedir}/run/dhclient.pid \
+    --with-cli6-pid-file=%{_localstatedir}/run/dhclient6.pid \
+    --with-relay-pid-file=%{_localstatedir}/run/dhcrelay.pid \
+    --with-libbind=/usr/bin/isc-export-config.sh \
+    --with-ldap \
+    --with-ldapcrypto \
+    --with-ldap-gssapi \
+    --disable-static \
+    --enable-log-pid \
+%if %{sdt}
+    --enable-systemtap \
+    --with-tapset-install-dir=%{tapsetdir} \
+%endif
+    --enable-paranoia --enable-early-chroot \
+    --enable-binary-leases \
+    --with-systemd
+make %{?_smp_mflags}
+%if ! 0%{?_module_build}
+pushd doc
+make %{?_smp_mflags} devel
+popd
+%endif
+
+%install
+make DESTDIR=%{buildroot} install %{?_smp_mflags}
+
+# We don't want example conf files in /etc
+rm -f %{buildroot}%{_sysconfdir}/dhclient.conf.example
+rm -f %{buildroot}%{_sysconfdir}/dhcpd.conf.example
+
+# dhclient-script
+install -D -p -m 0755 %{SOURCE1} %{buildroot}%{_sbindir}/dhclient-script
+
+# README.dhclient.d
+install -p -m 0644 %{SOURCE2} .
+
+# Empty directory for dhclient.d scripts
+mkdir -p %{buildroot}%{dhcpconfdir}/dhclient.d
+
+# NetworkManager dispatcher script
+mkdir -p %{buildroot}%{_sysconfdir}/NetworkManager/dispatcher.d
+install -p -m 0755 %{SOURCE3} %{buildroot}%{_sysconfdir}/NetworkManager/dispatcher.d
+install -p -m 0755 %{SOURCE4} %{buildroot}%{_sysconfdir}/NetworkManager/dispatcher.d
+
+# pm-utils script to handle suspend/resume and dhclient leases
+install -D -p -m 0755 %{SOURCE5} %{buildroot}%{_libdir}/pm-utils/sleep.d/56dhclient
+
+# systemd unit files
+mkdir -p %{buildroot}%{_unitdir}
+install -m 644 %{SOURCE6} %{buildroot}%{_unitdir}
+install -m 644 %{SOURCE7} %{buildroot}%{_unitdir}
+install -m 644 %{SOURCE8} %{buildroot}%{_unitdir}
+
+# Start empty lease databases
+mkdir -p %{buildroot}%{_localstatedir}/lib/dhcpd/
+touch %{buildroot}%{_localstatedir}/lib/dhcpd/dhcpd.leases
+touch %{buildroot}%{_localstatedir}/lib/dhcpd/dhcpd6.leases
+mkdir -p %{buildroot}%{_localstatedir}/lib/dhclient/
+
+# default sysconfig file for dhcpd
+mkdir -p %{buildroot}%{_sysconfdir}/sysconfig
+cat <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcpd
+# WARNING: This file is NOT used anymore.
+
+# If you are here to restrict what interfaces should dhcpd listen on,
+# be aware that dhcpd listens *only* on interfaces for which it finds subnet
+# declaration in dhcpd.conf. It means that explicitly enumerating interfaces
+# also on command line should not be required in most cases.
+
+# If you still insist on adding some command line options,
+# copy dhcpd.service from /lib/systemd/system to /etc/systemd/system and modify
+# it there.
+# https://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
+
+# example:
+# $ cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
+# $ vi /etc/systemd/system/dhcpd.service
+# $ ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
+# $ systemctl --system daemon-reload
+# $ systemctl restart dhcpd.service
+EOF
+
+# Copy sample conf files into position (called by doc macro)
+cp -p doc/examples/dhclient-dhcpv6.conf client/dhclient6.conf.example
+cp -p doc/examples/dhcpd-dhcpv6.conf server/dhcpd6.conf.example
+
+cat << EOF > client/dhclient-enter-hooks
+#!/bin/bash
+
+# For dhclient/dhclient-script debugging.
+# Copy this into /etc/dhcp/ and make it executable.
+# Run 'dhclient -d <interface>' to see info passed from dhclient to dhclient-script.
+# See also HOOKS section in dhclient-script(8) man page.
+
+echo "interface: ${interface}"
+echo "reason: ${reason}"
+
+( set -o posix ; set ) | grep "old_"
+( set -o posix ; set ) | grep "new_"
+( set -o posix ; set ) | grep "alias_"
+( set -o posix ; set ) | grep "requested_"
+EOF
+
+# Install default (empty) dhcpd.conf:
+mkdir -p %{buildroot}%{dhcpconfdir}
+cat << EOF > %{buildroot}%{dhcpconfdir}/dhcpd.conf
+#
+# DHCP Server Configuration file.
+#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
+#   see dhcpd.conf(5) man page
+#
+EOF
+
+# Install default dhclient.conf:
+%{__mkdir} -p %{buildroot}%{dhcpconfdir}
+%{__cat} << EOF > %{buildroot}%{dhcpconfdir}/dhclient.conf
+#
+# DHCP Client Configuration file.
+#   see /usr/share/doc/dhclient/dhclient.conf.example
+#   see dhclient.conf(5) man page
+#
+# Send client identifier as "hardware-type.link-layer address" (e.g. "1.c2.23.7d.c3.52.2c")
+# Required in environments where a bridge might be clobbering the forwarded
+# packet's MAC address (common in Wifi, Docsis, or ADSL bridging scenarios)
+# see dhcp-options(5) man page for 'dhcp-client-identifier'
+# see dhcp-eval(5) man page for 'hardware'
+send dhcp-client-identifier = hardware;
+EOF
+
+# Install default (empty) dhcpd6.conf:
+cat << EOF > %{buildroot}%{dhcpconfdir}/dhcpd6.conf
+#
+# DHCPv6 Server Configuration file.
+#   see /usr/share/doc/dhcp-server/dhcpd6.conf.example
+#   see dhcpd.conf(5) man page
+#
+EOF
+
+# Install dhcp.schema for LDAP configuration
+install -D -p -m 0644 contrib/ldap/dhcp.schema %{buildroot}%{_sysconfdir}/openldap/schema/dhcp.schema
+
+# Don't package libtool *.la files
+find %{buildroot} -type f -name "*.la" -delete -print
+
+rm %{buildroot}%{_includedir}/isc-dhcp/dst.h
+
+%pre server
+# /usr/share/doc/setup/uidgid
+%global gid_uid 177
+getent group dhcpd >/dev/null || groupadd --force --gid %{gid_uid} --system dhcpd
+if ! getent passwd dhcpd >/dev/null ; then
+    if ! getent passwd %{gid_uid} >/dev/null ; then
+      useradd --system --uid %{gid_uid} --gid dhcpd --home / --shell /sbin/nologin --comment "DHCP server" dhcpd
+    else
+      useradd --system --gid dhcpd --home / --shell /sbin/nologin --comment "DHCP server" dhcpd
+    fi
+fi
+exit 0
+
+%post server
+# Initial installation
+%systemd_post dhcpd.service dhcpd6.service
+
+
+for servicename in dhcpd dhcpd6; do
+  etcservicefile=%{_sysconfdir}/systemd/system/${servicename}.service
+  if [ -f ${etcservicefile} ]; then
+    grep -q Type= ${etcservicefile} || sed -i '/\[Service\]/a Type=notify' ${etcservicefile}
+    sed -i 's/After=network.target/Wants=network-online.target\nAfter=network-online.target/' ${etcservicefile}
+  fi
+done
+exit 0
+
+%post relay
+# Initial installation
+%systemd_post dhcrelay.service
+
+for servicename in dhcrelay; do
+  etcservicefile=%{_sysconfdir}/systemd/system/${servicename}.service
+  if [ -f ${etcservicefile} ]; then
+    grep -q Type= ${etcservicefile} || sed -i '/\[Service\]/a Type=notify' ${etcservicefile}
+    sed -i 's/After=network.target/Wants=network-online.target\nAfter=network-online.target/' ${etcservicefile}
+  fi
+done
+exit 0
+
+%preun server
+# Package removal, not upgrade
+%systemd_preun dhcpd.service dhcpd6.service
+
+%preun relay
+# Package removal, not upgrade
+%systemd_preun dhcrelay.service
+
+
+%postun server
+# Package upgrade, not uninstall
+%systemd_postun_with_restart dhcpd.service dhcpd6.service
+
+%postun relay
+# Package upgrade, not uninstall
+%systemd_postun_with_restart dhcrelay.service
+
+%ldconfig_scriptlets libs
+
+%triggerun -- dhcp
+# convert DHC*ARGS from /etc/sysconfig/dhc* to /etc/systemd/system/dhc*.service
+for servicename in dhcpd dhcpd6 dhcrelay; do
+  if [ -f %{_sysconfdir}/sysconfig/${servicename} ]; then
+    # get DHCPDARGS/DHCRELAYARGS value from /etc/sysconfig/${servicename}
+    source %{_sysconfdir}/sysconfig/${servicename}
+    if [ "${servicename}" == "dhcrelay" ]; then
+        args=$DHCRELAYARGS
+    else
+        args=$DHCPDARGS
+    fi
+    # value is non-empty (i.e. user modified) and there isn't a service unit yet
+    if [ -n "${args}" -a ! -f %{_sysconfdir}/systemd/system/${servicename}.service ]; then
+      # in $args replace / with \/ otherwise the next sed won't take it
+      args=$(echo $args | sed 's/\//\\\//'g)
+      # add $args to the end of ExecStart line
+      sed -r -e "/ExecStart=/ s/$/ ${args}/" \
+                < %{_unitdir}/${servicename}.service \
+                > %{_sysconfdir}/systemd/system/${servicename}.service
+    fi
+  fi
+done
+
+%files server
+%doc server/dhcpd.conf.example server/dhcpd6.conf.example
+%doc contrib/ldap/ contrib/dhcp-lease-list.pl
+%attr(0750,root,root) %dir %{dhcpconfdir}
+%attr(0755,dhcpd,dhcpd) %dir %{_localstatedir}/lib/dhcpd
+%attr(0644,dhcpd,dhcpd) %verify(mode) %config(noreplace) %{_localstatedir}/lib/dhcpd/dhcpd.leases
+%attr(0644,dhcpd,dhcpd) %verify(mode) %config(noreplace) %{_localstatedir}/lib/dhcpd/dhcpd6.leases
+%config(noreplace) %{_sysconfdir}/sysconfig/dhcpd
+%config(noreplace) %{dhcpconfdir}/dhcpd.conf
+%config(noreplace) %{dhcpconfdir}/dhcpd6.conf
+%dir %{_sysconfdir}/openldap/schema
+%config(noreplace) %{_sysconfdir}/openldap/schema/dhcp.schema
+%dir %{_sysconfdir}/NetworkManager
+%dir %{_sysconfdir}/NetworkManager/dispatcher.d
+%{_sysconfdir}/NetworkManager/dispatcher.d/12-dhcpd
+%attr(0644,root,root)   %{_unitdir}/dhcpd.service
+%attr(0644,root,root)   %{_unitdir}/dhcpd6.service
+%{_sbindir}/dhcpd
+%{_bindir}/omshell
+%attr(0644,root,root) %{_mandir}/man1/omshell.1.gz
+%attr(0644,root,root) %{_mandir}/man5/dhcpd.conf.5.gz
+%attr(0644,root,root) %{_mandir}/man5/dhcpd.leases.5.gz
+%attr(0644,root,root) %{_mandir}/man8/dhcpd.8.gz
+%if %{sdt}
+%{tapsetdir}/*.stp
+%endif
+
+%files relay
+%{_sbindir}/dhcrelay
+%attr(0644,root,root) %{_unitdir}/dhcrelay.service
+%attr(0644,root,root) %{_mandir}/man8/dhcrelay.8.gz
+
+
+%files client
+%doc README.dhclient.d
+%doc client/dhclient.conf.example client/dhclient6.conf.example client/dhclient-enter-hooks
+%attr(0750,root,root) %dir %{dhcpconfdir}
+%config(noreplace) %{dhcpconfdir}/dhclient.conf
+%dir %{dhcpconfdir}/dhclient.d
+%dir %{_localstatedir}/lib/dhclient
+%dir %{_sysconfdir}/NetworkManager
+%dir %{_sysconfdir}/NetworkManager/dispatcher.d
+%{_sysconfdir}/NetworkManager/dispatcher.d/11-dhclient
+%{_sbindir}/dhclient
+%{_sbindir}/dhclient-script
+%attr(0755,root,root) %{_libdir}/pm-utils/sleep.d/56dhclient
+%attr(0644,root,root) %{_mandir}/man5/dhclient.conf.5.gz
+%attr(0644,root,root) %{_mandir}/man5/dhclient.leases.5.gz
+%attr(0644,root,root) %{_mandir}/man8/dhclient.8.gz
+%attr(0644,root,root) %{_mandir}/man8/dhclient-script.8.gz
+
+%files common
+%{!?_licensedir:%global license %%doc}
+%{license} LICENSE
+%doc README RELNOTES doc/References.txt
+%attr(0644,root,root) %{_mandir}/man5/dhcp-options.5.gz
+%attr(0644,root,root) %{_mandir}/man5/dhcp-eval.5.gz
+
+%files libs
+%{_libdir}/libdhcpctl.so.*
+%{_libdir}/libomapi.so.*
+
+%files devel
+%doc doc/IANA-arp-parameters doc/api+protocol
+%{_includedir}/dhcpctl
+%{_includedir}/omapip
+%{_libdir}/libdhcpctl.so
+%{_libdir}/libomapi.so
+%attr(0644,root,root) %{_mandir}/man3/dhcpctl.3.gz
+%attr(0644,root,root) %{_mandir}/man3/omapi.3.gz
+
+%if ! 0%{?_module_build}
+%files devel-doc
+%doc doc/html/
+%endif
+
+%changelog
+* Mon Dec 17 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-30
+- Resolves: 1647786 - Recalculate renew time if it's greater than expirity time
+
+* Tue Sep 11 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-29
+- Related: #1623794 - Drop compat subpackage
+
+* Tue Sep 11 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-28
+- Resolves: #1623794 - Mmap() leases in replay mode only
+
+* Thu Jul 19 2018 Petr Menšík <pemensik@redhat.com> - 12:4.3.6-25
+- Update to bind 9.11.4
+
+* Mon Jun 18 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-24
+- Resolves: #1589966 - Handle dhcp4-change event.
+
+* Thu May 31 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-23
+- Always send hardware as identifier
+
+* Mon May 28 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-22
+- Do not use eval in dhclient scripts
+
+* Mon May 28 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-21
+- Bring dhclient.conf back (#1579768)
+
+* Tue May 15 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-20
+- Fix for CVE-2018-1111
+
+* Wed Mar 21 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-19
+- Don't use run-parts for hooks discovery (#1558612)
+
+* Fri Mar 09 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-18
+- Own ldap schema directory (#1553432)
+
+* Thu Mar  1 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-17
+- Fix CVE-2018-5732 CVE-2018-5733 (#1550246)
+
+* Thu Feb 22 2018 Petr Menšík <pemensik@redhat.com> - 12:4.3.6-16
+- Compile with recent bind includes, that does not include isc/util.h
+
+* Thu Feb 22 2018 Petr Menšík <pemensik@redhat.com> - 12:4.3.6-15
+- Do not rely on ignoring case sensitivity of VERSION variable
+
+* Thu Feb 22 2018 Petr Menšík <pemensik@redhat.com> - 12:4.3.6-14
+- Use bind-export-libs package instead of bind99
+- Use isc-config.sh to configure bind libs
+- Change requirement to bind-export-devel
+
+* Thu Feb 22 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-13
+- Do not parse sysconfig/network-scripts if initscripts not installed (#1098172)
+
+* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 12:4.3.6-12
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Sat Feb 03 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 12:4.3.6-11
+- Switch to %%ldconfig_scriptlets
+
+* Wed Jan 10 2018 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-10
+- Use released version
+
+* Wed Dec 20 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.5-9
+- Change duid_uuid patch to not use std99 feature
+
+* Fri Dec  8 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-8
+- Fix omapi SD leak (#1523547)
+
+* Thu Nov  9 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-7
+- Add patch for proper signal handling with shared context (#1457871)
+
+* Wed Sep 20 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-6
+- Do now override hostname variable in script
+
+* Sun Sep 10 2017 Peter Robinson <pbrobinson@fedoraproject.org> 12:4.3.6-5
+- Rebuild for bind 9.9.11
+
+* Tue Aug  1 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-4
+- Fix typos in dhclient-script
+
+* Thu Jul 27 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-3
+- Recreate /etc/resolv.conf if NetworkManager screwed it up (#1475279)
+
+* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 12:4.3.6-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+
+* Fri Jul 14 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.6-1
+- New version 4.3.6
+
+* Fri Jul 07 2017 Igor Gnatenko <ignatenko@redhat.com> - 12:4.3.5-10
+- Rebuild due to bug in RPM (RHBZ #1468476)
+
+* Mon Jul 03 2017 Petr Menšík <pemensik@redhat.com> - 12:4.3.5-9
+- Rebuild for bind 9.9.10
+
+* Wed May 31 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.5-8
+- Drop chown from the post section
+
+* Tue May 23 2017 Pavel Zhukov <pzhukov@redhat.com> - 12:4.3.5-7
+- Don't open ddns port until it's needed. Credits to Petr Menšík for the original idea
+
+* Wed Apr 19 2017 Dominika Hodovska <dhodovsk@redhat.com> - 12:4.3.5-5
+- don't build doxygen documentation during modular build
+
+* Tue Apr 04 2017 Pavel Zhukov <landgraf@fedoraproject.org> - 12:4.3.5-4
+- Add EnvironmentFile parameter for backward compatibility
+
+* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 12:4.3.5-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Wed Nov 30 2016 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.5-2
+- get BUG_REPORT_URL from /etc/os-release (#1399351)
+
+* Wed Oct 05 2016 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.5-1
+- 4.3.5
+
+* Mon Sep 12 2016 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.5-0.1b1
+- 4.3.5b1
+
+* Wed Aug 03 2016 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.4-3
+- [dhclient] rename -R option to --request-options (#1357947)
+- [dhclient] rename -timeout option to --timeout
+
+* Thu May 26 2016 Tomas Hozza <thozza@redhat.com> - 12:4.3.4-2
+- Rebuild against bind99-9.9.9-P1
+
+* Fri Apr 29 2016 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.4-1
+- 4.3.4
+- disable systemtap (I don't think anybody ever used it)
+
+* Wed Mar 23 2016 Zdenek Dohnal zdohnal@redhat.com - 12:4.3.3-13.P1
+- Mentioning the bash script is needed in README.dhclient.d
+
+* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 12:4.3.3-12.P1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Wed Jan 13 2016 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-11.P1
+- 4.3.3-P1 - fix for CVE-2015-8605 (#1298077)
+
+* Wed Dec 16 2015 Tomas Hozza <thozza@redhat.com> - 12:4.3.3-10
+- Rebuild against bind-9.9.8-P2
+
+* Mon Dec 14 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-9
+- implement DUID-UUID (RFC 6355) and make it default DUID type (#560361#60)
+
+* Tue Nov 24 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-8
+- dispatcher.d/12-dhcpd: use reset-failed command
+
+* Mon Nov 23 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-7
+- dhclient-script: hostname -> hostnamectl --transient
+
+* Tue Nov 03 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-6
+- dhclient-script: source ifcfg-* because of PEERDNS (#1277253)
+
+* Tue Oct 13 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-5
+- dhclient-script: fix for gateway not in the end of rfc3442 routes list (#1251644)
+
+* Tue Oct 13 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-4
+- dhclient-script: make_resolv_conf(): keep old nameservers
+  if server sends domain-name/search, but no nameservers (#1269595)
+
+* Tue Sep 22 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-3
+- dhclient: make sure link-local address is ready in stateless mode (#1263466)
+
+* Mon Sep 07 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-2
+- VLAN ID is only bottom 12-bits of TCI (#1259552)
+
+* Fri Sep 04 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-1
+- 4.3.3
+
+* Tue Aug 11 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-0.2b1
+- dhclient-script: respect DEFROUTE/GATEWAYDEV if Classless Static Routes are offered (#1251644)
+
+* Mon Aug 10 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.3-0.1b1
+- 4.3.3b1
+- enable krb5/gssapi authentication for OpenLDAP
+- enable support for binary insertion of leases
+
+* Wed Jul 15 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-12
+- fix ipcalc requires
+
+* Tue Jul 14 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-11
+- remove dependency on initscripts (#1098172)
+- make path to resolv.conf configurable (#1086425)
+
+* Thu Jul 09 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-10
+- spec cleanup
+
+* Thu Jul 02 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-9
+- test upstream fix for #866714 (paranoia.patch)
+
+* Wed Jun 24 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-8
+- add more randomness into xid generation (#1195693)
+
+* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.3.2-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Tue May 26 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-6
+- dhclient-script: run also scripts in dhclient-[enter/exit]-hooks.d dir
+
+* Tue Apr 21 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-5
+- dhclient-script: add a minute to address lifetimes (#1188423)
+
+* Mon Apr 13 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-4
+- dhclient-script: amend previous change (#1210984)
+
+* Wed Mar 25 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-3
+- dhclient-script: fix shellcheck.net suggestions
+
+* Fri Mar 13 2015 Tomas Hozza <thozza@redhat.com> - 12:4.3.2-2
+- rebuild against bind99 9.9.7 package
+
+* Thu Mar 05 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-1
+- 4.3.2
+
+* Wed Feb 25 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-0.6b1
+- correctly set IB's hw->hlen (#1185075)
+
+* Wed Feb 25 2015 Tomas Hozza <thozza@redhat.com> - 12:4.3.2-0.5b1
+- Rebuild against bind-9.10.2rc2
+
+* Tue Feb 17 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-0.4b1
+- dhclient-script: use 'ip addr replace' for both BOUND & RENEW
+
+* Tue Feb 17 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-0.3b1
+- doc/dhclient/dhclient-enter-hooks for dhclient-script debugging
+
+* Fri Feb 13 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-0.2b1
+- dhclient-script: s/addr add/addr replace/
+
+* Sun Feb 08 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.2-0.1b1
+- 4.3.2b1
+
+* Tue Feb 03 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-21
+- send unicast request/release via correct interface (#800561, #1177351)
+
+* Mon Feb 02 2015 Tomas Hozza <thozza@redhat.com> - 12:4.3.1-20
+- rebuild against bind-9.10.2rc1
+
+* Wed Jan 14 2015 Tomas Hozza <thozza@redhat.com> - 12:4.3.1-19
+- rebuild against bind 9.10.1-P1
+
+* Thu Dec 18 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-18
+- dhclient: write DUID_LLT even in stateless mode (#1156356)
+
+* Wed Dec 17 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-17
+- option 97 - pxe-client-id (#1058674)
+
+* Wed Nov 19 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-16
+- amend post scriptlets for #1120656
+
+* Mon Nov 10 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-15
+- dhclient-script: restorecon calls shouldn't be needed
+                   as we have SELinux transition rules (#1161500)
+
+* Tue Nov 04 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-14
+- GSSAPI support for ldap authentication (#1150542)
+
+* Fri Oct 31 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-13
+- redefine DHCLIENT_DEFAULT_PREFIX_LEN  64 -> 128
+
+* Fri Oct 10 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-12
+- Relay-forward Message's Hop Limit should be 32 (#1147240)
+
+* Wed Oct 08 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-11
+- dhcpd generates spurious responses when seeing requests
+  from vlans on plain interface (#1150587)
+
+* Fri Oct 03 2014 Tomas Hozza <thozza@redhat.com> - 12:4.3.1-10
+- rebuild against bind-9.9.6
+
+* Thu Sep 04 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-9
+- [dhclient -6] infinite preferred/valid lifetime represented as -1 (#1133839)
+
+* Mon Sep 01 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-8
+- better obsoletes for server & client
+
+* Sat Aug 30 2014 Kalev Lember <kalevlember@gmail.com> - 12:4.3.1-7
+- Fix dhclient obsoletes version
+
+* Tue Aug 26 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-6
+- dhclient-script: another improvement of add_ipv6_addr_with_DAD()
+
+* Mon Aug 25 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-5
+- spec: use -D with 'install'
+- dhclient-script: IPv6 address which fails DAD is auto-removed when it was
+  added with valid_lft/preferred_lft other then 'forever' (#1133465)
+
+* Sat Aug 16 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.3.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Thu Aug 14 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-3
+- dhclient-script: one more fix for #1129500
+
+* Thu Aug 14 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-2
+- dhclient-script: PREINIT6: make sure link-local address is available (#1129500)
+
+* Tue Aug 12 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-1
+- 4.3.1
+
+* Tue Aug 05 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-0.4.b1
+- dhclient-script: it's OK if the arping reply comes from our system (#1116004)
+
+* Tue Jul 22 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-0.3.b1
+- Use network-online.target instead of network.target (#1120656)
+
+* Fri Jul 11 2014 Tom Callaway <spot@fedoraproject.org> 12:4.3.1-0.2.b1
+- fix license handling
+
+* Thu Jul 10 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.1-0.1.b1
+- 4.3.1b1
+
+* Thu Jun 12 2014 Filipe Brandenburger <filbranden@google.com> - 12:4.3.0-15
+- dhclient-script: fix issue with classless static routes that breaks Fedora 20 on GCE cloud (#1102830)
+
+* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.3.0-14
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Fri May 30 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-13
+- systemtap: fixed dtrace input file (#1102797)
+
+* Thu May 29 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-12
+- dhcp-sd_notify.patch BuildRequires: pkgconfig(libsystemd)
+
+* Wed May 28 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-11
+- dhclient-script: fix stateless DHCPv6 mode (#1101149)
+
+* Wed May 07 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-10
+- use StandardError=null instead of log_perror.patch
+
+* Tue Mar 18 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-9
+- support for sending startup notifications to systemd (#1077666)
+
+* Fri Mar 07 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-8
+- rename doc subpackage do devel-doc
+
+* Mon Mar 03 2014 Jaromír Končický <jkoncick@redhat.com> - 12:4.3.0-7
+- added 'doc' package containing doxygen-generated documentation
+
+* Wed Feb 19 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-6
+- dhclient: rename our -I option to -C as upstream now uses -I
+
+* Wed Feb 19 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-5
+- dhclient-script: don't flush all addresses, just the used one
+
+* Tue Feb 18 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-4
+- IPoIB: add GUID/DUID to dhcpd logs (#1064416)
+
+* Mon Feb 17 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-3
+- don't try to run tests because there's no atf package since F21
+
+* Mon Feb 17 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-2
+- turn on using of DUID with DHCPv4 clients (#560361,c#40)
+- remove default /etc/dhcp/dhclient.conf
+
+* Tue Feb 04 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-1
+- 4.3.0
+
+* Wed Jan 29 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-0.7.rc1
+- 4.3.0rc1
+
+* Tue Jan 28 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-0.6.b1
+- don't apply retransmission.patch for now (RHBZ#1026565)
+
+* Sun Jan 26 2014 Kevin Fenzi <kevin@scrye.com> 12:4.3.0-0.5.b1
+- Rebuild for new bind
+
+* Tue Jan 21 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-0.4.b1
+- 4.3.0b1
+- ship dhcp-lease-list.pl
+- dhclient-script: don't ping router (#1055181)
+
+* Mon Jan 13 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-0.3.a1
+- update address lifetimes on RENEW/RENEW6 (#1032809)
+
+* Tue Jan 07 2014 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-0.2.a1
+- make it actually build
+
+* Thu Dec 19 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.3.0-0.1.a1
+- 4.3.0a1: requires bind-9.9.5
+
+* Thu Nov 21 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-28
+- dhclient-script: set address lifetimes (#1032809)
+
+* Thu Nov 14 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-27
+- dhclient-script(RENEW6|REBIND6): delete old ip6_address if it changed (#1015729)
+
+* Thu Oct 31 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-26
+- Provide default /etc/dhcp/dhclient.conf
+- Client always sends dhcp-client-identifier (#560361)
+
+* Thu Oct 24 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-25
+- use upstream patch for #1001742 ([ISC-Bugs #34784])
+
+* Mon Oct 07 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-24
+- dhcpd rejects the udp packet with checksum=0xffff (#1015997)
+
+* Fri Sep 27 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-23
+- 'No subnet declaration for <iface>' should be info, not error
+- decrease the sleep in 12-dhcpd due to timeout (#1003695#8)
+
+* Wed Sep 18 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-22
+- fix segfault introduced with previous commit
+
+* Tue Sep 17 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-21
+- 12-dhcpd: wait a few seconds before restarting services (#1003695)
+- another solution for #1001742 (#1005814#c10)
+
+* Thu Sep 12 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-20
+- bind DHCPv6 client to link-local address instead of 0 address (#1001742)
+
+* Mon Aug 26 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-19
+- don't crash on aliased infiniband interface (#996518)
+
+* Sun Aug 04 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-18
+- BuildRequires: systemd due to  %%{_unitdir}
+
+* Mon Jul 29 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-17
+- 12-dhcpd previously exited with error status 1 (#989207)
+
+* Mon Jul 15 2013 Tomas Hozza <thozza@redhat.com> - 12:4.2.5-16
+- rebuild against new bind
+
+* Tue Jul 02 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-15
+- fix several memory leaks in omapi (#978420)
+- remove send_release.patch (#979510)
+
+* Tue Jun 18 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-14
+- rebuilt against bind once more
+
+* Fri Jun 14 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-13
+- return /etc/sysconfig/dhcpd back, but do NOT use it (#909733)
+
+* Tue May 14 2013 Adam Williamson <awilliam@redhat.com> - 12:4.2.5-12
+- rebuild against new bind
+
+* Tue Apr 30 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-11
+- add missing conversion specifier in log_fatal() call (#957371)
+
+* Tue Apr 16 2013 Adam Tkac <atkac redhat com> - 12:4.2.5-10
+- rebuild against new bind
+
+* Wed Apr 03 2013 Tomas Hozza <thozza@redhat.com> - 12:4.2.5-9
+- Expose next-server DHCPv4 option to dhclient script
+
+* Tue Mar 26 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-8
+- describe -user/-group/-chroot in dhcpd.8
+
+* Fri Feb 22 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-7
+- remove triggerun condition (#895475)
+
+* Wed Feb 13 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.2.5-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Thu Jan 24 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-5
+- remove missing-ipv6-not-fatal.patch because the concerning code is later
+  removed with getifaddrs.patch
+
+* Wed Jan 23 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-4
+- Make sure range6 is correct for subnet6 where it's declared (#902966)
+
+* Fri Jan 18 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-3
+- simplify the previously added triggerun scriptlet
+
+* Thu Jan 17 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-2
+- during update convert DHC*ARGS from /etc/sysconfig/dhc*
+  to /etc/systemd/system/dhc*.service (#895475)
+- 12-dhcpd NM dispatcher script now restarts also dhcpd6 service
+
+* Thu Jan 10 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-1
+- 4.2.5
+
+* Wed Jan 02 2013 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-0.3.rc1
+- run %%check in Fedora only, there's no atf package in RHEL
+
+* Thu Dec 20 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-0.2.rc1
+- don't package ancient contrib/* files
+
+* Thu Dec 20 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-0.1.rc1
+- 4.2.5rc1
+  - added %%check - upstream unit tests (Automated Test Framework - ATF)
+
+* Fri Nov 30 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-23.P2
+- fix two resource leaks in lpf-ib.patch
+
+* Mon Nov 26 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-22.P2
+- add After=time-sync.target to dhcpd[6].service (#878293)
+- remove groff from BuildRequires (no idea why it's been there)
+
+* Fri Nov 16 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-21.P2
+- multiple key statements in zone definition causes inappropriate error (#873794)
+
+* Fri Oct 26 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-20.P2
+- fix path to dhcpd6.leases in dhcpd6.conf.sample (#870458)
+
+* Wed Oct 17 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-19.P2
+- dhcpd needs to chown leases file created before de-rooting itself (#866714)
+
+* Thu Oct 11 2012 Adam Tkac <atkac redhat com> - 12:4.2.4-18.P2
+- rebuild against new bind-libs-lite
+
+* Tue Oct 09 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-17.P2
+- do-forward-updates statement wasn't recognized (#863646)
+
+* Wed Sep 26 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-16.P2
+- dhclient-usage.patch+part of manpages.patch merged with dhclient-options.patch
+
+* Thu Sep 13 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-15.P2
+- 4.2.4-P2: fix for CVE-2012-3955 (#856770)
+
+* Fri Aug 24 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-14.P1
+- SystemD unit files don't use Environment files any more (#850558)
+- NetworkManager dispatcher script doesn't use DHCPDARGS any more 
+
+* Wed Aug 22 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-13.P1
+- fixed SPEC file so it comply with new systemd-rpm macros guidelines (#850089)
+
+* Mon Aug 20 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-12.P1
+- dhclient-script: fixed CONFIG variable value passed to need_config (#848858)
+- dhclient-script: calling dhclient-up-hooks after setting up route, gateways 
+                   & interface alias (#848869)
+
+* Fri Aug 17 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-11.P1
+- don't build libdst, it hasn't been used since 4.2.0 (#849166)
+
+* Fri Jul 27 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-10.P1
+- isc_time_nowplusinterval() is not safe with 64-bit time_t (#662254, #789601)
+
+* Fri Jul 27 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.2.4-9.P1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Wed Jul 25 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-8.P1
+- Dhclient does not correctly parse zero-length options in 
+  dhclient6.leases (#633318)
+
+* Wed Jul 25 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-7.P1
+- 4.2.4-P1: fix for CVE-2012-3570 CVE-2012-3571 and CVE-2012-3954 (#842892)
+
+* Mon Jul 23 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-6
+- ib.patch: added fall-back method (using ioctl(SIOCGIFHWADDR)) when getting
+            of HW address with getifaddrs() fails (#626514-c#63, #840601).
+
+* Mon Jul 23 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-5
+- Dhcpd does not correctly follow DhcpFailOverPeerDN (#838400)
+
+* Wed Jul 18 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-4
+- allow dhcpd to listen on alias interfaces (#840601)
+
+* Mon Jul 09 2012 Tomas Hozza <thozza@redhat.com> - 12:4.2.4-3
+- changed list of %%verify on the leases files (#837474)
+
+* Mon Jun 18 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-2
+- define $SAVEDIR in dhclient-script (#833054)
+
+* Wed Jun 06 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-1
+- 4.2.4
+
+* Tue Jun 05 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.8.rc2
+- return prematurely removed 12-dhcpd (NM dispatcher script) (#828522)
+
+* Fri May 25 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.7.rc2
+- getifaddrs.patch: use HAVE_SA_LEN macro
+
+* Wed May 23 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.6.rc2
+- 4.2.4rc2
+
+* Mon May 07 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.5.rc1
+- dhcpd.service: explicitly add -cf to indicate what conf file we use (#819325)
+- no need to copy /etc/*.conf to /etc/dhcp/*.conf in %%prep anymore
+
+* Tue May 01 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.4.rc1
+- 4.2.4rc1
+
+* Thu Apr 26 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.3.b1
+- remove inherit-leases.patch - it's probably not needed anymore (#815355)
+
+* Wed Apr 18 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.2.b1
+- update paths.patch and source URL
+
+* Mon Apr 16 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.4-0.1.b1
+- 4.2.4b1: noprefixavail.patch merged upstream
+
+* Fri Mar 30 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-25.P2
+- move dhclient & dhclient-script from /sbin to /usr/sbin
+
+* Fri Mar 23 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-24.P2
+- one more fix (#806342)
+
+* Fri Mar 23 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-23.P2
+- improve #449946 fix (#806342)
+
+* Wed Mar 21 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-22.P2
+- RFC5970 - DHCPv6 Options for Network Boot (#798735)
+
+* Wed Mar 21 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-21.P2
+- don't use fallback_interface when releasing lease (#800561)
+
+* Wed Mar 21 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-20.P2
+- use getifaddrs() to scan for interfaces on Linux (#449946)
+
+* Wed Feb 22 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-19.P2
+- don't send log messages to the standard error descriptor by default (#790387)
+
+* Mon Feb 13 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-18.P2
+- -timeout option (command line) with value 3 or less was driving dhclient mad (#789719)
+
+* Tue Feb 07 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-17.P2
+- dhclient-script: install link-local static routes with correct scope (#787318)
+
+* Wed Feb  1 2012 Adam Williamson <awilliam@redhat.com> - 12:4.2.3-16.P2
+- rebuild for new bind-libs-lite
+
+* Tue Jan 31 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-15.P2
+- revert previous change (#782499)
+- remove the rest of the sysvinit scriptlets
+
+* Tue Jan 17 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-14.P2
+- use PrivateTmp=true in service files (#782499)
+
+* Fri Jan 13 2012 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-13.P2
+- 4.2.3-P2: fix for CVE-2011-4868 (#781246)
+- clean up old Provides and Obsoletes
+
+* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.2.3-12.P1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Wed Dec 21 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-11.P1
+- revert change made in 4.2.3-3 because of failing failover inicialization (#765967)
+  the procedure is now:
+  init lease file, init failover, init PID file, change effective user/group ID
+- don't need to fix lease files ownership before starting service
+- dhclient-script: allow static route with a 0.0.0.0 next-hop address (#769463)
+
+* Tue Dec 20 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-10.P1
+- hopefully we don't need 12-dhcpd anymore as 'After=network.target'
+  in dhcpd[6].service should take care of the original problem (#565921)
+
+* Mon Dec 19 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-9.P1
+- don't ship legacy SysV initscripts
+- dhcpd6: move '-cf /etc/dhcp/dhcpd6.conf' from sysconfig/dhcpd6 to dhcpd6.service
+- run 'chown -R dhcpd:dhcpd /var/lib/dhcpd/' before starting dhcpd/dhcpd6 service
+  for the case where leases file is owned by root:root as a
+  consequence of running dhcpd without '-user dhcpd -group dhcpd' (#744292)
+
+* Fri Dec 09 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-8.P1
+- 4.2.3-P1: fix for CVE-2011-4539 (#765681)
+
+* Thu Nov 24 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-7
+- Send DHCPDECLINE and exit(2) when duplicate address was detected and
+  dhclient had been started with '-1' (#756759).
+- Don't build with -D_GNU_SOURCE, configure.ac uses AC_USE_SYSTEM_EXTENSIONS
+
+* Mon Nov 14 2011 Adam Tkac <atkac redhat com> - 12:4.2.3-6
+- rebuild against new bind
+
+* Fri Nov 11 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-5
+- dhclient-script: arping address in BOUND|RENEW|REBIND|REBOOT (#752116)
+
+* Wed Oct 26 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.2.3-4
+- Rebuilt for glibc bug#747377
+
+* Wed Oct 26 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-3
+- Write lease file AFTER changing of the effective user/group ID.
+- Move omshell from dhcp-common to main package (where it originally was).
+
+* Thu Oct 20 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-2
+- Write PID file BEFORE changing of the effective user/group ID.
+- Really define _hardened_build this time
+
+* Thu Oct 20 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-1
+- 4.2.3
+
+* Tue Oct 18 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.3-0.1.rc1
+- 4.2.3rc1
+
+* Sun Oct 09 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-12
+- change ownership of /var/lib/dhcpd/ to dhcpd:dhcpd (#744292)
+- no need to drop capabilies in dhcpd since it's been running as regular user
+
+* Fri Sep 30 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-11
+- 56dhclient: ifcfg file was not sourced (#742482)
+
+* Thu Sep 29 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-10
+- dhclient-script: address alias handling fixes from Scott Shambarger (#741786)
+
+* Thu Sep 22 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-9
+- dhclient-script: do not backup&restore /etc/resolv.conf and /etc/localtime.
+
+* Wed Sep 21 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-8
+- SystemTap support: spec file change, some dummy probes, tapset, simple script
+
+* Mon Sep 19 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-7
+- Support for IPoIB (IP over InfiniBand) interfaces (#660681)
+- Hopefully last tweak of adding of user and group (#699713)
+
+* Fri Sep 09 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-6
+- PIE-RELRO.patch is not needed anymore, defining _hardened_build does the same
+- One more tweak of adding of user and group (#699713)
+
+* Fri Sep 09 2011 Adam Tkac <atkac redhat com> - 12:4.2.2-5
+- rebuild against new bind
+
+* Fri Aug 26 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-4
+- Fix adding of user and group (#699713)
+
+* Fri Aug 19 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-3
+- Tighten explicit libs sub-package requirement so that it includes
+  the correct architecture as well.
+
+* Fri Aug 12 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-2
+- #699713:
+  - Use '--enable-paranoia --enable-early-chroot' configure flags
+  - Create/delete dhcpd user in %%post/%%postun
+  - Run dhcpd/dhcpd6 services with '-user dhcpd -group dhcpd'
+
+* Thu Aug 11 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-1
+- 4.2.2: fix for CVE-2011-2748, CVE-2011-2749 (#729850)
+
+* Wed Aug 10 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-0.4.rc1
+- Do not ship default /etc/dhcp/dhclient.conf (#560361,c#9)
+
+* Mon Jul 25 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-0.3.rc1
+- Improve capabilities patch to be able to run with PARANOIA & EARLY_CHROOT (#699713)
+
+* Mon Jul 18 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-0.2.rc1
+- 4.2.2rc1
+
+* Fri Jul 01 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.2-0.1.b1
+- 4.2.2b1: upstream merged initialization-delay.patch
+- Drop all capabilities in dhcpd/dhcrelay (#699713)
+
+* Fri Jun 17 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-12.P1
+- Removed upstream-merged IFNAMSIZ.patch
+- Polished patches according to results from static analysis of code.
+
+* Thu Jun 16 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-11.P1
+- Add triggerpostun scriptlet tied to dhcp-sysvinit
+- Make it possible to build without downstream patches (Kamil Dudka)
+
+* Tue May 17 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-10.P1
+- Fix typo in triggerun scriptlet (#705417)
+
+* Mon May 16 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-9.P1
+- Packages dhcp/dhclient/dhcp-common explicitly require the libs sub-package
+  with the same version and release (bug #705037).
+- Fix triggerun scriptlet
+
+* Mon May 09 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-8.P1
+- Fix 11-dhclient to export variables (#702735)
+
+* Fri Apr 29 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-7.P1
+- Comply with guidelines for systemd services
+
+* Wed Apr 27 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-6.P1
+- Fix NetworkManager dispatcher script for dhcpd to support arbitrary interface names
+
+* Wed Apr 06 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-5.P1
+- Better fix for CVE-2011-0997: making domain-name check more lenient (#694005)
+
+* Wed Apr 06 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-4.P1
+- 4.2.1-P1: fix for CVE-2011-0997 (#694005)
+
+* Fri Mar 25 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-3
+- Polished patches according to results from static analysis of code.
+
+* Mon Mar 07 2011 Rex Dieter <rdieter@fedoraproject.org> - 12:4.2.1-2
+- rebuild (bind)
+
+* Wed Mar 02 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-1
+- 4.2.1
+
+* Wed Feb 23 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-0.6.rc1
+- 4.2.1rc1
+- Fixed typo in dhclient.leases(5) (#676284)
+
+* Mon Feb 21 2011 Adam Tkac <atkac redhat com> - 12:4.2.1-0.5.b1
+- rebuild against new bind-libs-lite
+
+* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.2.1-0.4.b1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Jan 31 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-0.3.b1
+- Prevent anything under _docdir from being scanned. (#674058)
+
+* Fri Jan 28 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-0.2.b1
+- dhclient-script improvements, thanks to Ville Skyttä (#672279)
+
+* Thu Jan 27 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.1-0.1.b1
+- 4.2.1b1: fix for CVE-2011-0413 (#672996)
+- No longer need invalid-dhclient-conf, parse_date and release6-elapsed patches
+
+* Thu Jan 13 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-26.P2
+- Fix loading of configuration when LDAP is used (#668276)
+
+* Mon Jan 03 2011 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-25.P2
+- Fix OMAPI (#666441)
+
+* Tue Dec 21 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-24.P2
+- Provide default /etc/dhcp/dhclient.conf
+- Client always sends dhcp-client-identifier (#560361)
+
+* Wed Dec 15 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-23.P2
+- Add dhcp-common subpackage (#634673)
+
+* Mon Dec 13 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-22.P2
+- 4.2.0-P2: fix for CVE-2010-3616 (#662326)
+- Use upstream fix for #628258
+- Provide versioned symbols for rpmlint
+
+* Tue Dec 07 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-21.P1
+- Porting dhcpd/dhcpd6/dhcrelay services from SysV to Systemd
+
+* Tue Nov 23 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-20.P1
+- Remove explicit Obsoletes (#656310)
+
+* Fri Nov 19 2010 Dan Horák <dan[at]danny.cz> - 12:4.2.0-19.P1
+- fix build on sparc and s390
+
+* Tue Nov 09 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-18.P1
+- Applied Patrik Lahti's patch for DHCPv6 over PPP support (#626514)
+
+* Fri Nov 05 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-17.P1
+- fix broken dependencies
+
+* Thu Nov 04 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-16.P1
+- 4.2.0-P1: fix for CVE-2010-3611 (#649880)
+- dhclient-script: when updating 'search' statement in resolv.conf,
+  add domain part of hostname if it's not already there (#637763)
+
+* Wed Oct 20 2010 Adam Tkac <atkac redhat com> - 12:4.2.0-15
+- build dhcp's libraries as shared libs instead of static libs
+
+* Wed Oct 20 2010 Adam Tkac <atkac redhat com> - 12:4.2.0-14
+- fire away bundled BIND source
+
+* Wed Oct 20 2010 Adam Tkac <atkac redhat com> - 12:4.2.0-13
+- improve PIE patch (build libraries with -fpic, not with -fpie)
+
+* Wed Oct 13 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-12
+- Server was ignoring client's
+  Solicit (where client included address/prefix as a preference) (#634842)
+
+* Thu Oct 07 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-11
+- Use ping instead of arping in dhclient-script to handle
+  not-on-local-net gateway in ARP-less device (#524298)
+
+* Thu Oct 07 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-10
+- Check whether there is any unexpired address in previous lease
+  prior to confirming (INIT-REBOOT) the lease (#585418)
+
+* Mon Oct 04 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-9
+- RFC 3442 - ignore Router option only if
+  Classless Static Routes option contains default router
+
+* Thu Sep 30 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-8
+- Explicitly clear the ARP cache and flush all addresses & routes
+  instead of bringing the interface down (#574568)
+
+* Tue Sep 07 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-7
+- Hardening dhcpd/dhcrelay/dhclient by making them PIE & RELRO
+
+* Thu Sep 02 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-6
+- Another fix for handling time values on 64-bit platforms (#628258)
+
+* Wed Sep 01 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-5
+- Fix parsing of lease file dates & times on 64-bit platforms (#628258)
+
+* Tue Aug 31 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-4
+- RFC 3442 - Classless Static Route Option for DHCPv4 (#516325)
+
+* Fri Aug 20 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-3
+- Add DHCRELAYARGS variable to /etc/sysconfig/dhcrelay
+
+* Fri Jul 30 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-2
+- Add 12-dhcpd NM dispatcher script (#565921)
+- Rename 10-dhclient to 11-dhclient (10-sendmail already exists)
+
+* Wed Jul 21 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.0-1
+- 4.2.0: includes ldap-for-dhcp
+
+* Mon Jul 12 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-26.P1
+- Add LICENSE file to dhclient subpackage.
+
+* Thu Jul 01 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-25.P1
+- Adhere to Static Library Packaging Guidelines (#609605)
+
+* Tue Jun 29 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-24.P1
+- Fix parsing of date (#514828)
+
+* Thu Jun 03 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-23.P1
+- 4.1.1-P1: pair of bug fixes including one for CVE-2010-2156 (#601405)
+- Compile with -fno-strict-aliasing
+
+* Mon May 03 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-22
+- Fix the initialization-delay.patch (#587070)
+
+* Thu Apr 29 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-21
+- Cut down the 0-4 second delay before sending first DHCPDISCOVER (#587070)
+
+* Wed Apr 28 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-20
+- Move /etc/NetworkManager/dispatcher.d/10-dhclient script
+  from dhcp to dhclient subpackage (#586999)
+
+* Wed Apr 28 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-19
+- Add domain-search to the list of default requested DHCP options (#586906)
+
+* Wed Apr 21 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-18
+- If the Reply was received in response to Renew or Rebind message,
+  client adds any new addresses in the IA option to the IA (#578097)
+
+* Mon Apr 19 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-17
+- Fill in Elapsed Time Option in Release/Decline messages (#582939)
+
+* Thu Mar 25 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-16
+- In client initiated message exchanges stop retransmission
+  upon reaching the MRD rather than at some point after it (#559153)
+
+* Wed Mar 24 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-15
+- In dhclient-script check whether bound address
+  passed duplicate address detection (DAD) (#559147)
+- If the bound address failed DAD (is found to be in use on the link),
+  the dhcpv6 client sends a Decline message to the server
+  as described in section 18.1.7 of RFC-3315 (#559147)
+
+* Fri Mar 19 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-14
+- Fix UseMulticast.patch to not repeatedly parse dhcpd.conf for unicast option
+- Fix dhclient-script to set interface MTU only when it's greater than 576 (#574629)
+
+* Fri Mar 12 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-13
+- Discard unicast Request/Renew/Release/Decline message
+  (unless we set unicast option) and respond with Reply
+  with UseMulticast Status Code option (#573090)
+- Remove DHCPV6 OPERATION section from dhclient.conf.5
+  describing deprecated 'send dhcp6.oro' syntax
+
+* Thu Feb 25 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-12
+- Fix paths in man pages (#568031)
+- Remove odd tests in %%preun
+
+* Mon Feb 22 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-11
+- Add interface-mtu to the list of default requested DHCP options (#566873)
+
+* Fri Feb 19 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-10
+- Fix pm-utils/sleep.d/ directory ownership conflict
+
+* Fri Feb 19 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-9
+- In dhclient-script:
+  - use ip command options '-4' or '-6' as shortcuts for '-f[amily] inet' resp. '-f[amily] inet6'
+  - do not use IP protocol family identifier with 'ip link'
+
+* Thu Feb 18 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-8
+- Fix installation of pm-utils script (#479639, c#16)
+
+* Tue Feb 16 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-7
+- ldap-for-dhcp-4.1.1-2 (#564810)
+
+* Tue Feb 16 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-6
+- Fix ldap patch to explicitly link with liblber (#564810)
+
+* Mon Feb 08 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-5
+- Fix dhclient-decline-backoff.patch (#562854)
+
+* Fri Feb 05 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-4
+- Fix dhclient-script to delete address which the client is going to release
+  as soon as it begins the Release message exchange process (#559142)
+
+* Wed Feb 03 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-3
+- move /etc/dhcp.conf to /etc/dhcp.conf.rpmsave in %%post (#561094)
+- document -nc option in dhclient(8) man page
+
+* Tue Feb 02 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-2
+- Fix capability patch (#546765)
+
+* Wed Jan 20 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.1-1
+- Upgraded to ISC dhcp-4.1.1
+
+* Mon Jan 18 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-18
+- Hide startup info when starting dhcpd6 service.
+- Remove -TERM from calling killproc when stopping dhcrelay (#555672)
+
+* Fri Jan 15 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-17
+- Added init script to also start dhcpd for IPv6 (#552453)
+- Added dhcpd6.conf.sample
+
+* Thu Jan 07 2010 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-16
+- Use %%global instead of %%define.
+
+* Mon Dec 14 2009 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-15
+- dhclient logs its pid to make troubleshooting NM managed systems
+  with multiple dhclients running easier (#546792)
+
+* Mon Nov 23 2009 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-14
+- Honor DEFROUTE=yes|no for all connection types (#530209)
+
+* Fri Oct 30 2009 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-13
+- Make dhclient-script add IPv6 address to interface (#531997)
+
+* Tue Oct 13 2009 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-12
+- Fix 56dhclient so network comes back after suspend/hibernate (#527641)
+
+* Thu Sep 24 2009 Jiri Popelka <jpopelka@redhat.com> - 12:4.1.0p1-11
+- Make dhcpd and dhcrelay init scripts LSB compliant (#522134, #522146)
+
+* Mon Sep 21 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-10
+- Obsolete the dhcpv6 and dhcpv6-client packages
+
+* Fri Sep 18 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-9
+- Update dhclient-script with handlers for DHCPv6 states
+
+* Wed Aug 26 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-8
+- Conditionalize restorecon calls in post scriptlets (#519479)
+
+* Wed Aug 26 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-7
+- Do not require policycoreutils for post scriptlet (#519479)
+
+* Fri Aug 21 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-6
+- BR libcap-ng-devel (#517649)
+
+* Tue Aug 18 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-5
+- Drop unnecessary capabilities in dhclient (#517649)
+
+* Fri Aug 14 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-4
+- Upgrade to latest ldap-for-dhcp patch which makes sure that only
+  dhcpd links with OpenLDAP (#517474)
+
+* Wed Aug 12 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-3
+- Update NetworkManager dispatcher script to remove case conversion
+  and source /etc/sysconfig/network
+
+* Thu Aug 06 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-2
+- Add /usr/lib[64]/pm-utils/sleep.d/56dhclient to handle suspend and
+  resume with active dhclient leases (#479639)
+
+* Wed Aug 05 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0p1-1
+- Upgrade to dhcp-4.1.0p1, which is the official upstream release to fix
+  CVE-2009-0692
+
+* Wed Aug 05 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-27
+- Fix for CVE-2009-0692
+- Fix for CVE-2009-1892 (#511834)
+
+* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.1.0-26
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Thu Jul 23 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-25
+- Include NetworkManager dispatcher script to run dhclient.d scripts (#459276)
+
+* Thu Jul 09 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-24
+- Ensure 64-bit platforms parse lease file dates & times correctly (#448615)
+
+* Thu Jul 09 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-23
+- Upgrade to ldap-for-dhcp-4.1.0-4
+
+* Wed Jul 01 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-22
+- Set permissions on /etc/dhcp to 0750 (#508247)
+- Update to new ldap-for-dhcp patch set
+- Correct problems when upgrading from a previous release and your
+  dhcpd.conf file not being placed in /etc/dhcp (#506600)
+
+* Fri Jun 26 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-21
+- Handle cases in add_timeout() where the function is called with a NULL
+  value for the 'when' parameter (#506626)
+- Fix SELinux denials in dhclient-script when the script makes backup
+  configuration files and restores them later (#483747)
+
+* Wed May 06 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-20
+- Obsolete libdhcp4client <= 12:4.0.0-34.fc10 (#499290)
+
+* Mon Apr 20 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-19
+- Restrict interface names given on the dhcpd command line to length
+  IFNAMSIZ or shorter (#441524)
+- Change to /etc/sysconfig/network-scripts in dhclient-script before
+  calling need_config or source_config (#496233)
+
+* Mon Apr 20 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-18
+- Make dhclient-script work with pre-configured wireless interfaces (#491157)
+
+* Thu Apr 16 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-17
+- Fix setting default route when client IP address changes (#486512, #473658)
+- 'reload' and 'try-restart' on dhcpd and dhcrelay init scripts
+  will display usage information and return code 3
+
+* Mon Apr 13 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-16
+- Correct %%post problems in dhclient package (#495361)
+- Read hooks scripts from /etc/dhcp (#495361)
+- Update to latest ldap-for-dhcp
+
+* Fri Apr 03 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-15
+- Obsolete libdhcp and libdhcp-devel (#493547)
+
+* Thu Apr 02 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-14
+- Obsolete libdhcp and libdhcp-devel (#493547)
+
+* Tue Mar 31 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-13
+- dhclient obsoletes libdhcp4client (#493213)
+- dhcp-devel obsolets libdhcp4client-devel (#493213)
+
+* Wed Mar 11 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-12
+- Fix problems with dhclient.d script execution (#488864)
+
+* Mon Mar 09 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-11
+- Use LDAP configuration patch from upstream tarball
+
+* Thu Mar 05 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-10
+- restorecon fixes for /etc/localtime and /etc/resolv.conf (#488470)
+
+* Tue Feb 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 12:4.1.0-9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Wed Feb 18 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-8
+- Correct subsystem execution in dhclient-script (#486251)
+
+* Wed Feb 18 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-7
+- Do not segfault if the ipv6 kernel module is not loaded (#486097)
+
+* Mon Feb 16 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-6
+- Enable dhcpv6 support (#480798)
+- Fix config file migration in scriptlets (#480543)
+- Allow dhclient-script expansion with /etc/dhcp/dhclient.d/*.sh scripts
+
+* Thu Jan 15 2009 Tomas Mraz <tmraz@redhat.com> - 12:4.1.0-5
+- rebuild with new openssl
+
+* Tue Jan 13 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-4
+- Updated LSB init script header to reference /etc/dhcp/dhcpd.conf (#479012)
+
+* Sun Jan 11 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-3
+- Correct syntax errors in %%post script (#479012)
+
+* Sat Jan 10 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-2
+- Make sure all /etc/dhcp config files are marked in the manifest
+- Include new config file directies in the dhcp and dhclient packages
+- Do not overwrite new config files if they already exist
+
+* Tue Jan 06 2009 David Cantrell <dcantrell@redhat.com> - 12:4.1.0-1
+- Upgraded to ISC dhcp-4.1.0
+- Had to rename the -T option to -timeout as ISC is now using -T
+- Allow package rebuilders to easily enable DHCPv6 support with:
+      rpmbuild --with DHCPv6 dhcp.spec
+  Note that Fedora is still using the 'dhcpv6' package, but some
+  users may want to experiment with the ISC DHCPv6 implementation
+  locally.
+
+* Thu Dec 18 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-34
+- Move /etc/dhclient.conf to /etc/dhcp/dhclient.conf
+- Move /etc/dhcpd.conf to /etc/dhcp/dhcpd.conf
+
+* Thu Dec 18 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-33
+- Remove unnecessary success/failure lines in init scripts (#476846)
+
+* Wed Dec 03 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-32
+- Enable LDAP/SSL support in dhcpd (#467740)
+- Do not calculate a prefix for an address we did not receive (#473885)
+- Removed libdhcp4client because libdhcp has been removed from Fedora
+
+* Wed Oct 29 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-31
+- Use O_CLOEXEC in open(2) calls and "e" mode in fopen(3) calls, build
+  with -D_GNU_SOURCE so we pick up O_CLOEXEC (#468984)
+- Add missing prototype for validate_port() in common/inet.c
+
+* Thu Oct 23 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-30
+- Fix dhclient.conf man page and sample config file to say 'supersede
+  domain-search', which is what was actually demonstrated (#467955)
+
+* Wed Oct 01 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-29
+- Make sure /etc/resolv.conf has restorecon run on it (#451560)
+
+* Tue Sep 30 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-28
+- Forgot to actually include <errno.h> (#438149)
+
+* Tue Sep 30 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-27
+- Fix patch fuzziness and include errno.h in includes/dhcpd.h (#438149)
+
+* Tue Sep 30 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-26
+- Validate port numbers for dhclient, dhcpd, and dhcrelay to ensure
+  that are within the correct range (#438149)
+
+* Mon Sep 29 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-25
+- Fix dhcpd so it can find configuration data via LDAP (#452985)
+
+* Tue Sep 16 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-24
+- 'server' -> 'service' in dhclient-script (#462343)
+
+* Fri Aug 29 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-23
+- Prevent $metric from being set to '' (#460640)
+- Remove unnecessary warning messages
+- Do not source config file (ifcfg-DEVICE) unless it exists
+
+* Sun Aug 24 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-22
+- Add missing '[' to dhclient-script (#459860)
+- Correct test statement in add_default_gateway() in dhclient-script (#459860)
+
+* Sat Aug 23 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-21
+- Fix syntax error in dhclient-script (#459860)
+
+* Fri Aug 22 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-20
+- Rewrite of /sbin/dhclient-script (make the script a little more readable,
+  discontinue use of ifconfig in favor of ip, store backup copies of orig
+  files in /var rather than in /etc)
+
+* Wed Aug 06 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-19
+- Remove 'c' from the domain-search format string in common/tables.c
+- Prevent \032 from appearing in resolv.conf search line (#450042)
+- Restore SELinux context on saved /etc files (#451560)
+
+* Sun Aug 03 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 12:4.0.0-18
+- filter out false positive perl requires
+
+* Fri Aug 01 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-17
+- Carry over RES_OPTIONS from ifcfg-ethX files to /etc/resolv.conf (#202923)
+- Clean up Requires tags for devel packages
+- Allow SEARCH variable in ifcfg files to override search path (#454152)
+- Do not down interface if there is an active lease (#453982)
+- Clean up how dhclient-script restarts ypbind
+- Set close-on-exec on dhclient.leases for SELinux (#446632)
+
+* Sat Jun 21 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-16
+- Remove instaces of \032 in domain search option (#450042)
+- Make 'service dhcpd configtest' display text indicating the status
+
+* Fri May 16 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-15
+- Set close-on-exec on dhclient.leases for SELinux (#446632)
+
+* Tue Apr 01 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-14
+- Avoid dhclient crash when run via NetworkManager (#439796)
+
+* Tue Mar 25 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-13
+- Update dhclient-script to handle domain-search correctly (#437840)
+
+* Tue Mar 25 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-12
+- Remove Requires on openldap-server (#432180)
+- Replace CLIENTBINDIR, ETCDIR, DBDIR, and RUNDIR in the man pages with the
+  correct paths
+
+* Wed Feb 13 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-11
+- Add missing newline to usage() screen in dhclient
+
+* Thu Feb 07 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-10
+- Save conf files adding '.predhclient.$interface' to the name (#306381)
+- Only restore conf files on EXPIRE/FAIL/RELEASE/STOP if there are no other
+  dhclient processes running (#306381)
+
+* Wed Feb 06 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-9
+- Match LDAP server option values in stables.c and dhcpd.h (#431003)
+- Fix invalid sprintf() statement in server/ldap.c (#431003)
+
+* Wed Feb 06 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-8
+- Remove invalid fclose() patch
+
+* Tue Feb 05 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-7
+- Don't leak /var/lib/dhclient/dhclient.leases file descriptors (#429890)
+
+* Tue Jan 22 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-6
+- read_function() comes from the LDAP patch, so fix it there
+- Init new struct universe structs in libdhcp4client so we don't crash on
+  multiple DHCP attempts (#428203)
+
+* Thu Jan 17 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-5
+- Patch read_function() to handle size_t from read() correctly (#429207)
+
+* Wed Jan 16 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-4
+- Fix dhclient.lease file parsing problems (#428785)
+- Disable IPv6 support for now as we already ship dhcpv6 (#428987)
+
+* Tue Jan 15 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-3
+- Fix segfault in next_iface4() and next_iface6() (#428870)
+
+* Mon Jan 14 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-2
+- -fvisibility fails me again
+
+* Mon Jan 14 2008 David Cantrell <dcantrell@redhat.com> - 12:4.0.0-1
+- Upgrade to ISC dhcp-4.0.0 (#426634)
+     - first ISC release to incorporate DHCPv6 protocol support
+     - source tree now uses GNU autoconf/automake
+- Removed the libdhcp4client-static package
+
+* Tue Dec 04 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-12
+- Requires line fixes
+
+* Tue Dec 04 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-11
+- Postinstall script fixes
+
+* Mon Nov 19 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-10
+- Remove dhcdbd check from dhcpd init script
+
+* Thu Nov 15 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-9
+- Fix chkconfig lines in dhcpd and dhcrelay init scripts (#384431)
+- Improve preun scriptlet
+
+* Mon Nov 12 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-8
+- Put dhcp.schema in /etc/openldap/schema (#330471)
+- Remove manpages patch and keep modified man pages as Source files
+- Improve dhclient.8 man page to list options in a style consistent
+  with most other man pages on the planet
+- Upgrade to latest dhcp LDAP patch, which brings in a new dhcpd-conf-to-ldap
+  script, updated schema file, and other bug fixes including SSL support for
+  LDAP authentication (#375711)
+- Do not run dhcpd and dhcrelay services by default (#362321)
+
+* Fri Oct 26 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-7
+- libdhcp4client-devel requires openldap-devel
+
+* Thu Oct 25 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-6
+- Rename Makefile.dist to Makefile.libdhcp4client
+- Spec file cleanups
+- Include stdarg.h in libdhcp_control.h
+
+* Thu Oct 25 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-5
+- Remove chkconfig usage for ypbind in dhclient-script (#351211)
+- Combine dhcp-static and dhcp-devel packages since there are no shared
+  libraries offered
+- Remove Requires: openldap-devel on dhcp-devel and libdhcp4client-devel
+- Make libdhcp4client-devel require dhcp-devel (for libdhcp_control.h)
+- Do not make dhcp-devel require the dhcp package, those are independent
+
+* Wed Oct 24 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-4
+- Install libdhcp_control.h to /usr/include/isc-dhcp/libdhcp_control.h
+- Update libdhcp4client patch to use new libdhcp_control.h location
+- Remove __fedora_contrib/ subdirectory in /usr/share/doc/dhcp-3.1.0,
+  install those docs to /usr/share/doc/dhcp-3.1.0
+
+* Wed Oct 24 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-3
+- Remove ISC.Cflags variable from libdhcp4client.pc
+
+* Wed Oct 24 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-2
+- Fix 'restart' mode in init script (#349341)
+
+* Tue Oct 23 2007 David Cantrell <dcantrell@redhat.com> - 12:3.1.0-1
+- Upgrade to ISC dhcp-3.1.0
+- Remove unnecessary /usr/include/dhcp4client/isc_dhcp headers
+- Make sure restorecon is run on /var/lib/dhcpd/dhcpd.leases (#251688)
+- Install dhcp.schema to /etc/openldap/dhcp.schema (#330471)
+
+* Mon Oct 08 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.6-8
+- Init script fixes (#320761)
+- Removed linux.dbus-example script since we aren't using dhcdbd now
+- Remove dhcdbd leftovers from dhclient-script (#306381)
+
+* Wed Sep 26 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.6-7
+- In dhcp.conf.5, explain that if no next-server statement applies to the
+  requesting client, the address 0.0.0.0 is used (#184484).
+
+* Wed Sep 26 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.6-6
+- Init script fixes for dhcpd and dhcrelay (#278601)
+
+* Mon Sep 10 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.6-5
+- Fix typos in ldap.c and correct LDAP macros (#283391)
+
+* Tue Sep 04 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.6-4
+- Do not override manually configured NTP servers in /etc/ntp.conf (#274761)
+
+* Wed Aug 15 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.6-3
+- Remove the -x switch enabling extended new option info.  If given to
+  dhclient now, it's ignored.
+
+* Wed Jul 18 2007 Florian La Roche <laroche@redhat.com> - 12:3.0.6-2
+- use a new macro name vendor -> vvendor to not overwrite the
+  RPMTAG_VENDOR setting
+
+* Tue Jul 10 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.6-1
+- Upgrade to ISC dhcp-3.0.6
+- Remove the -TERM option from killproc command (#245317)
+
+* Wed Jun 20 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-37
+- For init script functions, echo new line after OK or FAIL msg (#244956)
+
+* Fri Jun 15 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-36
+- BOOTP_BROADCAST_ALWAYS is not the same as ATSFP, fixed
+- Added anycast mac support to dhclient for OLPC
+
+* Tue May 22 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-35
+- Disable -fvisibility=hidden for now as it breaks dhcpv4_client() from
+  the shared library (#240804)
+
+* Thu Apr 26 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-34
+- Init script fixes (#237985, #237983)
+- Reference correct scripts in dhclient-script.8 man page (#238036)
+
+* Fri Apr 20 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-33
+- Rename -devel-static packages to -static (#225691)
+
+* Tue Apr 17 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-32
+- Added missing newline on usage() screen in dhclient
+
+* Thu Apr 12 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-31
+- Spec file cleanups (#225691)
+- Put libdhcpctl.a and libomapi.a in dhcp-devel-static package
+- Put libdhcp4client.a in libdhcp4client-devel-static package
+
+* Wed Apr 11 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-30
+- Enable Xen patch again, kernel bits present (#231444)
+
+* Tue Apr 10 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-29
+- Spec file cleanups (#225691)
+
+* Mon Apr 09 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-28
+- Remove Xen patch (#235649, from RHEL-5, doesn't work correctly for Fedora)
+
+* Sun Apr 01 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-27
+- Ensure that Perl and Perl modules are not added as dependencies (#234688)
+- Reorganize patches by feature/bug per packaging guidelines (#225691)
+- Move the following files from patches to source files:
+     linux.dbus-example, linux, Makefile.dist, dhcp4client.h, libdhcp_control.h
+- Compile with -fno-strict-aliasing as ISC coding standards generally don't
+  agree well with gcc 4.x.x
+
+* Wed Mar 21 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-26
+- Fix formatting problems in dhclient man page (#233076).
+
+* Mon Mar 05 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-25
+- Man pages need 0644 permissions (#222572)
+
+* Thu Mar 01 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-24
+- Include contrib/ subdirectory in /usr/share/doc (#230476)
+- Added back Requires for perl since dhcpd-conf-to-ldap needs it (#225691)
+- Put copies of dhcp-options and dhcp-eval man pages in the dhcp and
+  dhclient packages rather than having the elaborate symlink collection
+- Explicitly name man pages in the %%files listings
+- Use the %%{_sysconfdir} and %%{_initrddir} macros (#225691)
+- Use macros for commands in %%build and %%install
+- Split README.ldap, draft-ietf-dhc-ldap-schema-01.txt, and
+  dhcpd-conf-to-ldap.pl out of the LDAP patch
+- Split linux.dbus-example script out of the extended new option info patch
+- Remove unnecessary changes from the Makefile patch
+
+* Wed Feb 28 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-23
+- Update Xen partial checksums patch
+- Remove perl Requires (#225691)
+- Make dhcp-devel depend on dhcp = e:v-r (#225691)
+- libdhcp4client-devel Requires pkgconfig (#225691)
+- Do not add to RPM_OPT_FLAGS, use COPTS variable instead (#225691)
+- Use %%{buildroot} macro instead of RPM_BUILD_ROOT variable (#225691)
+- Preserve timestamps on all installed data files (#225691)
+- Remove dhcp-options.5.gz and dhcp-eval.5.gz symlinking in post (#225691)
+- Use %%defattr(-,root,root,-) (#225691)
+- Do not flag init scripts as %%config in %%files section (#225691)
+
+* Tue Feb 27 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-22
+- Change license field to say ISC
+
+* Sat Feb 17 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-21
+- Obsoletes dhcpcd <= 1.3.22 (#225691)
+
+* Fri Feb 16 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-20
+- Review cleanups (#225691)
+
+* Fri Feb 09 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-19
+- Require openldap-devel on dhcp-devel and libdhcp4client-devel packages
+
+* Thu Feb 08 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-18
+- Fix libdhcp4client visibility _again_ (#198496)
+
+* Thu Feb 08 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-17
+- Remove period from summary line (package review)
+- Use preferred BuildRoot (package review)
+
+* Sun Feb 04 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-16
+- Disable xen-checksums patch for now as it breaks dhclient (#227266)
+- Updated fix-warnings patch
+
+* Sun Feb 04 2007 David Woodhouse <dwmw2@redhat.com> - 12:3.0.5-15
+- Fix broken file reading due to LDAP patch
+
+* Fri Feb 02 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-14
+- Only export the symbols we want in libdhcp4client (#198496)
+
+* Wed Jan 31 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-13
+- Add support for dhcpd(8) to read dhcpd.conf from an LDAP server (#224352)
+- Remove invalid ja_JP.eucJP man pages from /usr/share/doc
+
+* Wed Jan 31 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-12
+- Rebuild
+
+* Tue Jan 30 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-11
+- Remove FORTIFY_SOURCE=0 leftovers from testing last week (whoops)
+
+* Tue Jan 30 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-10
+- Fix Xen networking problems with partial checksums (#221964)
+
+* Mon Jan 29 2007 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-9
+- Remove dhcptables.pl from the source package
+- Mark libres.a symbols hidden (#198496)
+- Set DT_SONAME on libdhcp4client to libdhcp4client-VERSION.so.0
+- Make function definition for dst_hmac_md5_init() match the prototype
+
+* Wed Nov 29 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-8
+- Roll md5 patch in to libdhcp4client patch since it's related
+- Do not overwrite /etc/ntp/step-tickers (#217663)
+- Resolves: rhbz#217663
+
+* Wed Nov 22 2006 Peter Jones <pjones@redhat.com> - 12:3.0.5-7
+- Build the MD5 functions we link against.
+
+* Thu Nov 16 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-6
+- Set permission of libdhcp4client.so.1 to 0755 (#215910)
+
+* Tue Nov 14 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-5
+- Do not link res_query.o in to libdhcp4client (#215501)
+
+* Mon Nov 13 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-4
+- Enable relinquish_timeouts() and cancel_all_timeouts() even when
+  DEBUG_MEMORY_LEAKAGE_ON_EXIT is not defined
+- Add prototypes for b64_pton() and b64_ntop in dst/
+- Move variable declarations and labels around in the fix-warnings patch
+- Expand the list of objects needed for libdhcp4client (#215328)
+- Use libres.a in libdhcp4client since it gives correct minires objects
+- Remove the dhcp options table in C, Perl, Python, and text format (these
+  were reference files added to /usr/share/doc)
+
+* Mon Nov 13 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-3
+- Remove struct universe *universe from envadd_state in the client patch
+- Add struct universe *universe to envadd_state in the enoi patch
+- Add example dbusified dhclient-script in the enoi patch
+
+* Fri Nov 10 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-2
+- Change the way libdhcp4client is compiled (patch main source, create new
+  Makefile rather than copy and patch code after main patches)
+- Fix up problems generating compiler warnings
+- Use 'gcc' for making dependencies
+- Pass -fPIC instead of -fpie/-fPIE in compiler flags
+- Combine the extended new option info changes in to one patch file (makes
+  it easier for outside projects that want to use dhcdbd and NetworkManager)
+
+* Tue Nov 07 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.5-1
+- Upgrade to ISC dhcp-3.0.5
+
+* Fri Oct 27 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.4-24
+- Put typedef for dhcp_state_e before it's used in libdhcp_control.h (#212612)
+- Remove dhcpctl.3 from minires/Makefile.dist because it's in dhcpctl
+- Remove findptrsize.c and just set compiler flag for ppc64 and s390x
+
+* Sat Oct 14 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.4-23
+- Remove NODEBUGINFO junk from the spec file as well as old/unused code
+- Rolled all 68 patches in to one patch since more than half of them get
+  overridden by later patches anyway.
+
+* Fri Oct 13 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.4-22
+- Send usage() screen in dhclient to stdout rather than the syslog (#210524)
+
+* Mon Sep 11 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.4-21
+- Rebuild (#205505)
+
+* Fri Aug 18 2006 Jesse Keating <jkeating@redhat.com> - 12:3.0.4-20
+- rebuilt with latest binutils to pick up 64K -z commonpagesize on ppc*
+  (#203001)
+
+* Thu Aug 17 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.4-19
+- Fix mkdir problem in libdhcp4client.Makefile
+
+* Thu Aug 17 2006 David Cantrell <dcantrell@redhat.com> - 12:3.0.4-18
+- Fix dhclient on s390x platform (#202911)
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 12:3.0.4-17.1
+- rebuild
+
+* Wed Jun 28 2006 Peter Jones <pjones@redhat.com> - 12:3.0.4-17
+- export timeout cancellation functions in libdhcp4client
+
+* Wed Jun 28 2006 Florian La Roche <laroche@redhat.com> - 12:3.0.4-16
+- add proper coreutils requires for the scripts
+
+* Thu Jun 22 2006 Peter Jones <pjones@redhat.com> - 12:3.0.4-15
+- Make timeout dispatch code not recurse while traversing a linked
+  list, so it doesn't try to free an entries that have been removed.
+  (bz #195723)
+- Don't patch in a makefile, do it in the spec.
+
+* Thu Jun 08 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-14
+- fix bug 191461: preserve ntp.conf local clock fudge statements
+- fix bug 193047: both dhcp and dhclient need to ship common
+                  man-pages: dhcp-options(5) dhcp-eval(5)
+
+* Tue May 30 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-12
+- Make -R option take effect in per-interface client configs
+
+* Fri May 26 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-10
+- fix bug 193047: allow $METRIC to be specified for dhclient routes
+- add a '-R <request option list>' dhclient argument
+
+* Fri May 26 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-8.1
+- fix a libdhcp4client memory leak (1 strdup) and 
+  fill in client->packet.siaddr before bind_lease() for pump
+  nextServer option.
+
+* Fri May 19 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-8
+- Make libdhcp4client a versioned .so (BZ 192146)
+
+* Wed May 17 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-4
+- Enable libdhcp4client build
+
+* Tue May 16 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-2
+- Fix bug 191470: prevent dhcpd writing 8 byte dhcp-lease-time 
+                  option in packets on 64-bit platforms
+
+* Sun May 14 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-2
+- Add the libdhcp4client library package for use by the new libdhcp 
+  package, which enables dhclient to be invoked by programs in a 
+  single process from the library. The normal dhclient code is
+  unmodified by this.
+
+* Mon May 08 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-2
+- Add new dhclient command line argument:
+  -V <vendor-class-identifier>
+
+* Sat May 06 2006 Jason Vas Dias <jvdias@redhat.com> - 12:3.0.4-1
+- Upgrade to upstream version 3.0.4, released Friday 2006-05-05 .
+- Add new dhclient command line arguments:
+  -H <host-name> : parse as dhclient.conf 'send host-name "<host-name>";'
+  -F <fqdn>      : parse as dhclient.conf 'send fqdn.fqdn "<fqdn>";'
+  -T <timeout>   : parse as dhclient.conf 'timeout <timeout>;'
+
+* Thu Mar 02 2006 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-26
+- fix bug 181908: enable dhclient to operate on IBM zSeries z/OS linux guests:
+  o add -I <dhcp-client-identifier> dhclient command line option
+  o add -B "always broadcast" dhclient command line option
+  o add 'bootp-broadcast-always;' dhclient.conf statement
+
+* Mon Feb 20 2006 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-24
+- Apply upstream fix for bug 176615 / ISC RT#15811
+
+* Tue Feb 14 2006 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-22
+- fix bug 181482: resolv.conf not updated on RENEW :
+  since dhcp-3.0.1rc12-RHScript.patch: "$new_domain_servers" should have
+  been "$new_domain_name_servers" :-(
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 11:3.0.3-21.1.1
+- bump again for double-long bug on ppc(64)
+
+* Mon Feb 06 2006 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-21.1
+- Rebuild for new gcc, glibc and glibc-kernheaders
+
+* Sun Jan 22 2006 Dan Williams <dcbw@redhat.com> - 11:3.0.3-21
+- Fix dhclient-script to use /bin/dbus-send now that all dbus related
+  binaries are in /bin rather than /usr/bin
+
+* Mon Jan 16 2006 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-20
+- fix bug 177845: allow client ip-address as default router 
+- fix bug 176615: fix DDNS update when Windows-NT client sends 
+                  host-name with trailing nul
+
+* Tue Dec 20 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-18
+- fix bug 176270: allow routers with an octet of 255 in their IP address
+
+* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+
+* Mon Dec 05 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-16
+- fix gcc 4.1 compile warnings (-Werror)
+
+* Fri Nov 18 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-12
+- fix bug 173619: dhclient-script should reconfig on RENEW if 
+                  subnet-mask, broadcast-address, mtu, routers, etc.
+                  have changed
+- apply upstream improvements to trailing nul options fix of bug 160655
+
+* Tue Nov 15 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-11
+- Rebuild for FC-5
+- fix bug 167028 - test IBM's unicast bootp patch (from xma@us.ibm.com)
+- fix bug 171312 - silence chkconfig error message if ypbind not installed
+- fix dhcpd.init when -cf arg given to dhcpd
+- make dhcpd init touch /var/lib/dhcpd/dhcpd.leases, not /var/lib/dhcp/dhcpd.leases
+
+* Tue Oct 18 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-10
+- Allow dhclient route metrics to be specified with DHCP options:
+  The dhcp-options(5) man-page states:
+  'option routers ... Routers should be listed in order of preference' 
+  and
+  'option static-routes ... are listed in descending order of priority' .
+  No preference / priority could be set with previous dhclient-script .
+  Now, dhclient-script provides: 
+  Default Gateway (option 'routers') metrics:
+    Instead of allowing only one default gateway, if more than one router 
+    is specified in the routers option, routers following the first router
+    will have a 'metric' of their position in the list (1,...N>1).
+  Option static-routes metrics:
+    If a target appears in the list more than once, routes for duplicate
+    targets will have successively greater metrics, starting at 1.
+
+* Mon Oct 17 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-8
+- further fix for bug 160655 / ISC bug 15293 - upstream patch:
+  do NOT always strip trailing nulls in the dhcpd server
+- handle static-routes option properly in dhclient-script :
+  trailing 0 octets in the 'target' IP specify the class -
+  ie '172.16.0.0 w.x.y.z' specifies '172.16/16 via w.x.y.z'.
+
+* Fri Sep 23 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-7
+- fix bug 169164: separate /var/lib/{dhcpd,dhclient} directories
+- fix bug 167292: update failover port info in dhcpd.conf.5; give
+                  failover ports default values in server/confpars.c
+ 
+* Mon Sep 12 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-6
+- fix bug 167273: time-offset should not set timezone by default
+                  tzdata's Etc/* files are named with reverse sign
+                  for hours west - ie. 'GMT+5' is GMT offset -18000seconds.
+
+* Mon Aug 29 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-4
+- fix bug 166926: make dhclient-script handle interface-mtu option
+  make dhclient-script support /etc/dhclient{,-$IF}-{up,down}-hooks scripts
+  to allow easy customization to support other non-default DHCP options -
+  documented in 'man 8 dhclient-script' .
+- handle the 'time-offset' DHCP option, requested by default.
+
+* Tue Aug 23 2005 Jason Vas Dias <jvdias@redhat.com> - 11:3.0.3-3
+- fix bug 160655: strip trailing '\0' bytes from text options before append
+- fix gcc4 compiler warnings ; now compiles with -Werror
+- add RPM_OPT_FLAGS to link as suggested in gcc man-page on '-pie' option
+- change ISC version string to 'V3.0.3-RedHat' at request of ISC
+
+* Tue Aug  9 2005 Jeremy Katz <katzj@redhat.com> - 11:3.0.3-2
+- don't explicitly require 2.2 era kernel, it's fairly overkill at this point
+
+* Fri Jul 29 2005 Jason Vas Dias <jvdias@redhat.com> 11:3.0.3-1
+- Upgrade to upstream version 3.0.3 
+- Don't apply the 'default boot file server' patch: legacy
+  dhcp behaviour broke RFC 2131, which requires that the siaddr
+  field only be non-zero if the next-server or tftp-server-name
+  options are specified.
+- Try removing the 1-5 second wait on dhclient startup altogether.
+- fix bug 163367: supply default configuration file for dhcpd
+ 
+* Thu Jul 14 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.3rc1-1
+- Upgrade to upstream version 3.0.3rc1
+- fix bug 163203: silence ISC blurb on configtest 
+- fix default 'boot file server' value (packet->siaddr):
+  In dhcp-3.0.2(-), this was defaulted to the server address;
+  now it defaults to 0.0.0.0 (a rather silly default!) and
+  must be specified with the 'next-server' option (not the tftp-boot-server
+  option ?!?) which causes PXE boot clients to fail to load anything after
+  the boot file.
+
+* Fri Jul 08 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-14.FC5
+- Allow package to compile with glibc-headers-2.3.5-11 (tr.c's use of __u16)
+
+* Fri Jun 17 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-14
+- Fix bug 159929: prevent dhclient flooding network on repeated DHCPDECLINE
+- dhclient fast startup:
+   remove dhclient's  random 1-5 second delay on startup if only
+   configuring one interface
+   remove dhclient_script's "sleep 1" on PREINIT
+- fix new gcc-4.0.0-11 compiler warnings for binding_state_t
+
+* Tue May 03 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-12
+- Rebuild for new glibc
+- Fix dhcdbd set for multiple interfaces
+
+* Wed Apr 27 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-11
+- as pointed out by Peter Jones, dhclient-script spews
+- 'chkconfig: Usage' if run in init state 1 (runlevel returns "unknown".)
+- this is now corrected.
+
+* Mon Apr 25 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-10
+- dhclient-script dhcdbd extensions. 
+- Tested to have no effect unless dhcdbd invokes dhclient.
+
+* Thu Apr 21 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-9
+- bugs 153244 & 155143 are now fixed with SELinux policy; 
+  autotrans now works for dhcpc_t, so restorecons are not required,
+  and dhclient runs OK under dhcpc_t with SELinux enforcing.
+- fix bug 155506: 'predhclien' typo (emacs!).
+
+* Mon Apr 18 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-8
+- Fix bugs 153244 & 155143: 
+      o restore dhclient-script 'restorecon's
+      o give dhclient and dhclient-script an exec context of
+        'system_u:object_r:sbin_t' that allows them to run
+        domainname / hostname and to update configuration files
+        in dhclient post script.
+- Prevent dhclient emitting verbose ISC 'blurb' on error exit in -q mode
+
+* Mon Apr 04 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-7
+- Add '-x' "extended option environment" dhclient argument:
+-  When -x option given to dhclient:
+-    dhclient enables arbitrary option processing by writing information
+-    about user or vendor defined option space options to environment.
+-
+- fix bug 153244: dhclient should not use restorecon
+- fix bug 151023: dhclient no 'headers & libraries' 
+- fix bug 149780: add 'DHCLIENT_IGNORE_GATEWAY' variable
+- remove all usage of /sbin/route from dhclient-script
+
+* Thu Mar 24 2005 Florian La Roche <laroche@redhat.com>
+- add "exit 0" to post script
+
+* Mon Mar 07 2005 Jason Vas Dias <jvdias@redhat.com> 10.3.0.2-3
+- rebuild for gcc4/glibc-2.3.4-14; fix bad memset
+
+* Thu Feb 24 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-2
+- Fix bug 143640: do not allow more than one dhclient to configure an interface
+
+* Mon Feb 21 2005 Jason Vas Dias <jvdias@redhat.com> 10:3.0.2-1
+- Upgrade to ISC 3.0.2 Final Release (documentation change only).
+
+* Wed Feb 16 2005 Jason Vas Dias <jvdias@redhat.com> 8:3.0.2rc3-8
+- Add better execshield security link options
+- fix dhcpd.init when no /etc/dhcpd.conf exists and -cf in DHCPDARGS
+
+* Mon Feb 14 2005 Jason Vas Dias <jvdias@redhat.com> 8:3.0.2rc3-4
+- make dhclient-script TIMEOUT mode do exactly the same configuration
+- as BOUND / RENEW / REBIND / REBOOT if router ping succeeds
+
+* Mon Feb 14 2005 Jason Vas Dias <jvdias@redhat.com> 3.0.2rc3-4
+- fix bug 147926: dhclient-script should do restorecon for modified conf files
+- optimize execshield protection
+
+* Thu Feb 10 2005 Jason Vas Dias <jvdias@redhat.com> 8.3.0.4rc3-3
+- fix bug 147375: dhcpd heap corruption on 32-bit 'subnet' masks
+- fix bug 147502: dhclient should honor GATEWAYDEV and GATEWAY settings
+- fix bug 146600: dhclient's timeout mode ping should use -I
+- fix bug 146524: dhcpd.init should discard dhcpd's initial output message
+- fix bug 147739: dhcpd.init configtest should honor -cf in DHCPDARGS
+
+* Mon Jan 24 2005 Jason Vas Dias <jvdias@redhat.com> 8:3.0.2rc3-2
+- fix bug 145997: allow hex 32-bit integers in user specified options
+
+* Thu Jan 06 2005 Jason Vas Dias <jvdias@redhat.com> 8:3.0.2rc3-1
+- still need an epoch to get past nvre test
+
+* Thu Jan 06 2005 Jason Vas Dias <jvdias@redhat.com> 3.0.2rc3-1
+- fix bug 144417: much improved dhclient-script
+
+* Thu Jan 06 2005 Jason Vas Dias <jvdias@redhat.com> 3.0.2rc3-1
+- Upgrade to latest release from ISC, which includes most of our
+- recent patches anyway.
+
+* Thu Jan 06 2005 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-17
+- fix bug 144250: gcc-3.4.3-11 is broken :
+- log_error ("Lease with bogus binding state: %%d size: %%d",
+-   comp -> binding_state,
+-   sizeof(comp->binding_state));
+- prints:    'Lease with bogus binding state: 257 1'    !
+- compiling with gcc33 (compat-gcc-8-3.3.4.2 fixes for now).
+
+* Mon Jan 03 2005 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-16
+- fix bug 143704: dhclient -r does not work if lease held by
+- dhclient run from ifup . dhclient will now look for the pid
+- files created by ifup.
+
+* Wed Nov 17 2004 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-14
+- NTP: fix bug 139715: merge in new ntp servers only rather than replace
+- all the ntp configuration files; restart ntpd if configuration changed.
+
+* Tue Nov 16 2004 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-12
+- fix bug 138181 & bug 139468: do not attempt to listen/send on
+-     unconfigured  loopback, point-to-point or non-broadcast
+-     interfaces (don't generate annoying log messages)
+- fix bug 138869: dhclient-script: check if '$new_routers' is
+-     empty before doing 'set $new_routers;...;ping ... $1'
+
+* Wed Oct 06 2004 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-11
+- dhcp-3.0.2b1 came out today. A diff of the 'ack_lease' function
+- Dave Hankins and I patched exposed a missing '!' on an if clause
+- that got dropped with the 'new-host' patch. Replacing the '!'.
+- Also found one missing host_dereference.
+
+* Wed Oct 06 2004 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-10
+- clean-up last patch: new-host.patch adds host_reference(host)
+- without host_dereference(host) before returns in ack_lease
+- (dhcp-3.0.1-host_dereference.patch)
+ 
+* Mon Sep 27 2004 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-9
+- Fix bug 133522:
+- PXE Boot clients with static leases not given 'file' option
+- 104 by server - PXE booting was disabled for 'fixed-address'
+- clients.
+
+* Fri Sep 10 2004 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-8
+- Fix bug 131212:
+- If "deny booting" is defined for some group of hosts,
+- then after one of those hosts is denied booting, all
+- hosts are denied booting, because of a pointer not being
+- cleared in the lease record. 
+- An upstream patch was obtained which will be in dhcp-3.0.2.
+
+* Mon Aug 16 2004 Jason Vas Dias <jvdias@redhat.com> 7:3.0.1-7
+- Forward DNS update by client was disabled by a bug that I
+- found in code where 'client->sent_options' was being
+- freed too early.
+- Re-enabled it after contacting upstream maintainer
+- who confirmed that this was a bug (bug #130069) -
+- submitted patch dhcp-3.0.1.preserve-sent-options.patch.
+- Upstream maintainer informs me this patch will be in dhcp-3.0.2 .
+
+* Tue Aug 3  2004 Jason Vas Dias <jvdias@redhat.com> 6:3.0.1-6
+- Allow 2.0 kernels to obtain default gateway via dhcp
+
+* Mon Aug 2  2004 Jason Vas Dias <jvdias@redhat.com> 5:3.0.1-5
+- Invoke 'change_resolv_conf' function to change resolv.conf
+
+* Fri Jul 16 2004 Jason Vas Dias <jvdias@redhat.com> 3:3.0.1
+- Upgraded to new ISC 3.0.1 version
+
+* Thu Jun 24 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc14-5
+- Allow dhclient-script to continue without a config file.
+- It will use default values.
+
+* Wed Jun 23 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc14-4
+- fix inherit-leases patch
+
+* Tue Jun 22 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc14-2
+- Turn on inherit-leases patch
+
+* Tue Jun 22 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc14-1
+- User kernelversion instead of uname-r
+- Update to latest package from ISC
+- Remove inherit-leases patch for now.
+
+* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Thu Jun 10 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc13-1
+- Update to latest package from ISC
+
+* Thu Jun 10 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc12-9
+- add route back in after route up call
+
+* Wed Jun 9 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc12-8
+- add alex's dhcp-3.0.1rc12-inherit-leases.patch patch
+
+* Tue Jun  8 2004 Bill Nottingham <notting@redhat.com> 1:3.0.1rc12-7
+- set device on default gateway route
+
+* Mon May 17 2004 Thomas Woerner <twoerner@redhat.com> 1:3.0.1rc12-6
+- compiling dhcpd PIE
+
+* Thu Mar 25 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc12-5
+- Add static routes patch to dhclient-script
+
+* Thu Mar 25 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc12-4
+- Fix init to check config during restart
+
+* Wed Mar 24 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0.1rc12-3
+- Fix init script to create leases file if missing
+
+* Tue Mar 02 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Wed Jan 21 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.20
+- Fix initialization of memory to prevent compiler error
+
+* Mon Jan 5 2004 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.19
+- Close leaseFile before exec, to fix selinux error message
+
+* Mon Dec 29 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.18
+- Add BuildRequires groff
+- Replace resolv.conf if renew and data changes
+
+* Sun Nov 30 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.17
+- Add obsoletes dhcpcd
+
+* Wed Oct 8 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.16
+- Fix location of ntp driftfile
+
+* Fri Sep 5 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.15
+- Bump Release
+
+* Fri Sep 5 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.14
+- Add div0 patch
+
+* Wed Aug 20 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.13
+- Add SEARCH to client script
+
+* Wed Aug 20 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.12
+- Bump Release
+
+* Wed Aug 20 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.11
+- Add configtest
+
+* Fri Aug 1 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.10
+- increment for base
+
+* Fri Aug 1 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.9
+- Don't update resolv.conf on renewals
+
+* Tue Jul  29 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.8
+- increment for base
+
+* Tue Jul  29 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.7
+- Fix name of driftfile
+
+* Tue Jul  29 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.6
+- increment for base
+
+* Tue Jul  29 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.5
+- Change dhcrelay script to check DHCPSERVERS
+
+* Mon Jul  7 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.4
+- increment for base
+
+* Mon Jul  7 2003 Dan Walsh <dwalsh@redhat.com> 1:3.0pl2-6.3
+- Fix dhclient-script to support PEERNTP and PEERNIS flags.
+- patch submitted by aoliva@redhat.com
+
+* Sun Jun  8 2003 Tim Powers <timp@redhat.com> 1:3.0pl2-6.1
+- add epoch to dhcp-devel versioned requires on dhcp
+- build for RHEL
+
+* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Tue May 27 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl2-5
+- Fix memory leak in parser.
+
+* Mon May 19 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl2-4
+- Change Rev for RHEL
+
+* Mon May 19 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl2-3
+- Change example to not give out 255 address.
+
+* Tue Apr 29 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl2-2
+- Change Rev for RHEL
+
+* Mon Apr 28 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl2-1
+- upgrade to 3.0pl2
+
+* Wed Mar 26 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-26
+- add usage for dhcprelay -c
+- add man page for dhcprelay -c
+
+* Fri Mar 7 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-25
+- Fix man dhcpd.conf man page
+
+* Tue Mar 4 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-24
+- Fix man dhcpctl.3 page
+
+* Mon Feb 3 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-23
+- fix script to handle ntp.conf correctly
+
+* Wed Jan 29 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-22
+- Increment release to add to 8.1
+
+* Wed Jan 29 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-21
+- Implement max hops patch
+
+* Wed Jan 29 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-20
+- It has now been decided to just have options within dhclient kit
+
+* Sun Jan 26 2003 Florian La Roche <Florian.LaRoche@redhat.de>
+- add defattr() to have files not owned by root
+
+* Fri Jan 24 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-17
+- require kernel version
+
+* Fri Jan 24 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-16
+- move dhcp-options to separate package
+
+* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
+- rebuilt
+
+* Thu Jan 9 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-15
+- eliminate dhcp-options from dhclient in order to get errata out
+
+* Wed Jan 8 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-14
+- VU#284857 - ISC DHCPD minires library contains multiple buffer overflows
+
+* Mon Jan 6 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-13
+- Fix when ntp is not installed.
+
+* Mon Jan 6 2003 Dan Walsh <dwalsh@redhat.com> 3.0pl1-12
+- Fix #73079 (dhcpctl man page)
+
+* Thu Nov 14 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-11
+- Use generic PTRSIZE_64BIT detection instead of ifarch.
+
+* Thu Nov 14 2002 Preston Brown <pbrown@redhat.com> 3.0pl1-10
+- fix parsing of command line args in dhclient.  It was missing a few.
+
+* Mon Oct 07 2002 Florian La Roche <Florian.LaRoche@redhat.de>
+- work on 64bit archs
+
+* Wed Aug 28 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-9
+- Fix #72795
+
+* Mon Aug 26 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-8
+- More #68650 (modify requested options)
+- Fix #71453 (dhcpctl man page) and #71474 (include libdst.a) and
+  #72622 (hostname setting)
+
+* Thu Aug 15 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-7
+- More #68650 (modify existing patch to also set NIS domain)
+
+* Tue Aug 13 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-6
+- Patch102 (dhcp-3.0pl1-dhcpctlman-69731.patch) to fix #69731
+
+* Tue Aug 13 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-5
+- Patch101 (dhcp-3.0pl1-dhhostname-68650.patch) to fix #68650
+
+* Fri Jul 12 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-4
+- Fix unaligned accesses when decoding a UDP packet
+
+* Thu Jul 11 2002 Elliot Lee <sopwith@redhat.com> 3.0pl1-3
+- No apparent reason for the dhclient -> dhcp dep mentioned in #68001,
+  so removed it
+
+* Thu Jun 27 2002 David Sainty <saint@redhat.com> 3.0pl1-2
+- Move dhclient.conf.sample from dhcp to dhclient
+
+* Tue Jun 25 2002 David Sainty <saint@redhat.com> 3.0pl1-1
+- Change to dhclient, dhcp, dhcp-devel packaging
+- Move to 3.0pl1, do not strip binaries
+- Drop in sysconfig-enabled dhclient-script
+
+* Thu May 23 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Sat Jan 26 2002 Florian La Roche <Florian.LaRoche@redhat.de>
+- prereq chkconfig
+
+* Tue Jan 22 2002 Elliot Lee <sopwith@redhat.com> 3.0-5
+- Split headers/libs into a devel subpackage (#58656)
+
+* Wed Jan 09 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Fri Dec 28 2001 Elliot Lee <sopwith@redhat.com> 3.0-3
+- Fix the #52856 nit.
+- Include dhcrelay scripts from #49186
+
+* Thu Dec 20 2001 Elliot Lee <sopwith@redhat.com> 3.0-2
+- Update to 3.0, include devel files installed by it (as part of the main
+  package).
+
+* Sun Aug 26 2001 Elliot Lee <sopwith@redhat.com> 2.0pl5-8
+- Fix #26446
+
+* Mon Aug 20 2001 Elliot Lee <sopwith@redhat.com>
+- Fix #5405 for real - it is dhcpd.leases not dhcp.leases.
+
+* Mon Jul 16 2001 Elliot Lee <sopwith@redhat.com>
+- /etc/sysconfig/dhcpd
+- Include dhcp.leases file (#5405)
+
+* Sun Jun 24 2001 Elliot Lee <sopwith@redhat.com>
+- Bump release + rebuild.
+
+* Wed Feb 14 2001 Tim Waugh <twaugh@redhat.com>
+- Fix initscript typo (bug #27624).
+
+* Wed Feb  7 2001 Trond Eivind Glomsrød <teg@redhat.com>
+- Improve spec file i18n
+
+* Mon Feb  5 2001 Bernhard Rosenkraenzer <bero@redhat.com>
+- i18nize init script (#26084)
+
+* Sun Sep 10 2000 Florian La Roche <Florian.LaRoche@redhat.de>
+- update to 2.0pl5
+- redo buildroot patch
+
+* Wed Aug 30 2000 Matt Wilson <msw@redhat.com>
+- rebuild to cope with glibc locale binary incompatibility, again
+
+* Mon Aug 14 2000 Preston Brown <pbrown@redhat.com>
+- check for existence of /var/lib/dhcpd.leases in initscript before starting
+
+* Wed Jul 19 2000 Jakub Jelinek <jakub@redhat.com>
+- rebuild to cope with glibc locale binary incompatibility
+
+* Sat Jul 15 2000 Bill Nottingham <notting@redhat.com>
+- move initscript back
+
+* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
+- automatic rebuild
+
+* Fri Jul  7 2000 Florian La Roche <Florian.LaRoche@redhat.com>
+- /etc/rc.d/init.d -> /etc/init.d
+- fix /var/state/dhcp -> /var/lib/dhcp
+
+* Fri Jun 16 2000 Preston Brown <pbrown@redhat.com>
+- condrestart for initscript, graceful upgrades.
+
+* Thu Feb 03 2000 Erik Troan <ewt@redhat.com>
+- gzipped man pages
+- marked /etc/rc.d/init.d/dhcp as a config file
+
+* Mon Jan 24 2000 Jakub Jelinek <jakub@redhat.com>
+- fix booting of JavaStations
+  (reported by Pete Zaitcev <zaitcev@metabyte.com>).
+- fix SIGBUS crashes on SPARC (apparently gcc is too clever).
+
+* Fri Sep 10 1999 Bill Nottingham <notting@redhat.com>
+- chkconfig --del in %%preun, not %%postun
+
+* Mon Aug 16 1999 Bill Nottingham <notting@redhat.com>
+- initscript munging
+
+* Fri Jun 25 1999 Jeff Johnson <jbj@redhat.com>
+- update to 2.0.
+
+* Fri Jun 18 1999 Bill Nottingham <notting@redhat.com>
+- don't run by default
+
+* Wed Jun  2 1999 Jeff Johnson <jbj@redhat.com>
+- update to 2.0b1pl28.
+
+* Tue Apr 06 1999 Preston Brown <pbrown@redhat.com>
+- strip binaries
+
+* Mon Apr 05 1999 Cristian Gafton <gafton@redhat.com>
+- copy the source file in prep, not move
+
+* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com> 
+- auto rebuild in the new build environment (release 4)
+
+* Mon Jan 11 1999 Erik Troan <ewt@redhat.com>
+- added a sample dhcpd.conf file
+- we don't need to dump rfc's in /usr/doc
+
+* Sun Sep 13 1998 Cristian Gafton <gafton@redhat.com>
+- modify dhcpd.init to exit if /etc/dhcpd.conf is not present
+
+* Sat Jun 27 1998 Jeff Johnson <jbj@redhat.com>
+- Upgraded to 2.0b1pl6 (patch1 no longer needed).
+
+* Thu Jun 11 1998 Erik Troan <ewt@redhat.com>
+- applied patch from Chris Evans which makes the server a bit more paranoid
+  about dhcp requests coming in from the wire
+
+* Mon Jun 01 1998 Erik Troan <ewt@redhat.com>
+- updated to dhcp 2.0b1pl1
+- got proper man pages in the package
+
+* Tue Mar 31 1998 Erik Troan <ewt@redhat.com>
+- updated to build in a buildroot properly
+- don't package up the client, as it doens't work very well <sigh>
+
+* Tue Mar 17 1998 Bryan C. Andregg <bandregg@redhat.com>
+- Build rooted and corrected file listing.
+
+* Mon Mar 16 1998 Mike Wangsmo <wanger@redhat.com>
+- removed the actual inet.d links (chkconfig takes care of this for us)
+  and made the %%postun section handle upgrades.
+
+* Mon Mar 16 1998 Bryan C. Andregg <bandregg@redhat.com>
+- First package.