diff --git a/SOURCES/dhcp-4.2.4-dhclient-options.patch b/SOURCES/dhcp-4.2.4-dhclient-options.patch
index 40c3271..d6ed322 100644
--- a/SOURCES/dhcp-4.2.4-dhclient-options.patch
+++ b/SOURCES/dhcp-4.2.4-dhclient-options.patch
@@ -161,7 +161,7 @@ diff -up dhcp-4.2.4-P2/client/dhclient.c.options dhcp-4.2.4-P2/client/dhclient.c
  char *mockup_relay = NULL;
 +int bootp_broadcast_always = 0;
 +
-+extern u_int32_t default_requested_options[];
++extern struct option *default_requested_options[];
  
  void run_stateless(int exit_mode);
  
diff --git a/SOURCES/dhcp-4.2.4-improved-xid.patch b/SOURCES/dhcp-4.2.4-improved-xid.patch
index f353fb0..06ef278 100644
--- a/SOURCES/dhcp-4.2.4-improved-xid.patch
+++ b/SOURCES/dhcp-4.2.4-improved-xid.patch
@@ -59,10 +59,10 @@ diff -up dhcp-4.2.4b1/client/dhclient.c.improved-xid dhcp-4.2.4b1/client/dhclien
 +		}
 +		/* we only use seed and no current time as a broadcast reply */
 +		/* will certainly be used by the hwaddrless interface */
-+		srandom(seed);
++		srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid());
 +	}
 +	else
-+	        srandom(seed + cur_time + (unsigned)getpid());
++	        srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid());
  
  	/* Setup specific Infiniband options */
  	for (ip = interfaces; ip; ip = ip->next) {
diff --git a/SOURCES/dhcp-4.2.5-centos-branding.patch b/SOURCES/dhcp-4.2.5-centos-branding.patch
deleted file mode 100644
index f3e7113..0000000
--- a/SOURCES/dhcp-4.2.5-centos-branding.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff -uNrp dhcp-4.1.1-P1.orig/omapip/errwarn.c dhcp-4.1.1-P1/omapip/errwarn.c
---- dhcp-4.1.1-P1.orig/omapip/errwarn.c 2012-08-15 14:04:33.149141000 +0000
-+++ dhcp-4.1.1-P1/omapip/errwarn.c      2012-08-15 14:13:05.582416057 +0000
-@@ -81,8 +81,8 @@ void log_fatal (const char * fmt, ... )
-   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 for this software via the Red Hat Bugzilla site:");
--  log_error ("    http://bugzilla.redhat.com");
-+  log_error ("Please report for this software via the CentOS Bugs Database:");
-+  log_error ("    http://bugs.centos.org/");
-   log_error ("%s", "");
-   log_error ("exiting.");
- #endif
diff --git a/SOURCES/dhcp-4.2.5-lpf-ib.patch b/SOURCES/dhcp-4.2.5-lpf-ib.patch
index 58b924a..132af50 100644
--- a/SOURCES/dhcp-4.2.5-lpf-ib.patch
+++ b/SOURCES/dhcp-4.2.5-lpf-ib.patch
@@ -1,6 +1,6 @@
 diff -up dhcp-4.2.5/client/dhclient.c.lpf-ib dhcp-4.2.5/client/dhclient.c
---- dhcp-4.2.5/client/dhclient.c.lpf-ib	2013-08-26 12:13:31.509170257 +0200
-+++ dhcp-4.2.5/client/dhclient.c	2013-08-26 12:13:31.515170176 +0200
+--- dhcp-4.2.5/client/dhclient.c.lpf-ib	2015-06-05 16:18:03.387948658 +0200
++++ dhcp-4.2.5/client/dhclient.c	2015-06-05 16:18:03.391948646 +0200
 @@ -113,6 +113,8 @@ static int check_domain_name_list(const
  static int check_option_values(struct universe *universe, unsigned int opt,
  			       const char *ptr, size_t len);
@@ -56,8 +56,8 @@ diff -up dhcp-4.2.5/client/dhclient.c.lpf-ib dhcp-4.2.5/client/dhclient.c
   *
   * Each routine is called from the dhclient_state_machine() in one of
 diff -up dhcp-4.2.5/common/bpf.c.lpf-ib dhcp-4.2.5/common/bpf.c
---- dhcp-4.2.5/common/bpf.c.lpf-ib	2013-08-26 12:13:31.503170337 +0200
-+++ dhcp-4.2.5/common/bpf.c	2013-08-26 12:13:31.515170176 +0200
+--- dhcp-4.2.5/common/bpf.c.lpf-ib	2015-06-05 16:18:03.384948667 +0200
++++ dhcp-4.2.5/common/bpf.c	2015-06-05 16:18:03.392948643 +0200
 @@ -198,11 +198,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
  	BPF_STMT(BPF_RET+BPF_K, 0),
  };
@@ -104,8 +104,8 @@ diff -up dhcp-4.2.5/common/bpf.c.lpf-ib dhcp-4.2.5/common/bpf.c
  struct bpf_insn dhcp_bpf_tr_filter [] = {
          /* accept all token ring packets due to variable length header */
 diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c
---- dhcp-4.2.5/common/lpf.c.lpf-ib	2013-08-26 12:13:31.503170337 +0200
-+++ dhcp-4.2.5/common/lpf.c	2013-08-26 12:14:00.196783751 +0200
+--- dhcp-4.2.5/common/lpf.c.lpf-ib	2015-06-05 16:18:03.384948667 +0200
++++ dhcp-4.2.5/common/lpf.c	2015-06-05 16:33:15.183955199 +0200
 @@ -43,6 +43,7 @@
  #include "includes/netinet/udp.h"
  #include "includes/netinet/if_ether.h"
@@ -395,7 +395,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c
  
  	if (strlen(name) >= sizeof(tmp.ifr_name)) {
  		log_fatal("Device name too long: \"%s\"", name);
-@@ -480,16 +632,62 @@ get_hw_addr(const char *name, struct har
+@@ -480,16 +632,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) {
@@ -415,8 +415,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c
 +	memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
 +	switch (sll->sll_hatype) {
 +		case ARPHRD_INFINIBAND:
-+			/* ioctl limits hardware addresses to 8 bytes */
-+			sll->sll_halen = 8;
++			sll->sll_halen = HARDWARE_ADDR_LEN_IOCTL;
 +			break;
 +		default:
 +			break;
@@ -461,7 +460,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c
  			break;
  		case ARPHRD_IEEE802:
  #ifdef ARPHRD_IEEE802_TR
-@@ -497,18 +695,48 @@ get_hw_addr(const char *name, struct har
+@@ -497,18 +694,50 @@ get_hw_addr(const char *name, struct har
  #endif /* ARPHRD_IEEE802_TR */
  			hw->hlen = 7;
  			hw->hbuf[0] = HTYPE_IEEE802;
@@ -500,9 +499,11 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c
 +				       20);
 +			}
 +
-+			hw->hlen = 1;
++			hw->hlen = HARDWARE_ADDR_LEN_IOCTL + 1;
 +			hw->hbuf[0] = HTYPE_INFINIBAND;
-+			memcpy(&hw->hbuf[1], &sll->sll_addr[sll->sll_halen - 8], 8);
++			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:
@@ -514,7 +515,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c
  			hw->hlen = 0;
  			hw->hbuf[0] = HTYPE_RESERVED;
  			/* 0xdeadbeef should never occur on the wire,
-@@ -521,10 +749,13 @@ get_hw_addr(const char *name, struct har
+@@ -521,10 +750,13 @@ get_hw_addr(const char *name, struct har
  			break;
  #endif
  		default:
@@ -533,7 +534,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c
  #endif
 diff -up dhcp-4.2.5/common/socket.c.lpf-ib dhcp-4.2.5/common/socket.c
 --- dhcp-4.2.5/common/socket.c.lpf-ib	2013-01-03 01:02:24.000000000 +0100
-+++ dhcp-4.2.5/common/socket.c	2013-08-26 12:13:31.516170162 +0200
++++ dhcp-4.2.5/common/socket.c	2015-06-05 16:18:03.392948643 +0200
 @@ -325,7 +325,7 @@ void if_register_send (info)
  	info->wfdesc = if_register_socket(info, AF_INET, 0);
  	/* If this is a normal IPv4 address, get the hardware address. */
@@ -562,9 +563,19 @@ diff -up dhcp-4.2.5/common/socket.c.lpf-ib dhcp-4.2.5/common/socket.c
  	if (!quiet_interface_discovery) {
  		if (info->shared_network != NULL) {
 diff -up dhcp-4.2.5/includes/dhcpd.h.lpf-ib dhcp-4.2.5/includes/dhcpd.h
---- dhcp-4.2.5/includes/dhcpd.h.lpf-ib	2013-08-26 12:13:31.510170243 +0200
-+++ dhcp-4.2.5/includes/dhcpd.h	2013-08-26 12:13:31.517170149 +0200
-@@ -1249,6 +1249,7 @@ struct interface_info {
+--- dhcp-4.2.5/includes/dhcpd.h.lpf-ib	2015-06-05 16:18:03.388948655 +0200
++++ dhcp-4.2.5/includes/dhcpd.h	2015-06-05 16:33:58.988803266 +0200
+@@ -440,6 +440,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];
+@@ -1249,6 +1252,7 @@ struct interface_info {
  	struct shared_network *shared_network;
  				/* Networks connected to this interface. */
  	struct hardware hw_address;	/* Its physical address. */
@@ -572,7 +583,7 @@ diff -up dhcp-4.2.5/includes/dhcpd.h.lpf-ib dhcp-4.2.5/includes/dhcpd.h
  	struct in_addr *addresses;	/* Addresses associated with this
  					 * interface.
  					 */
-@@ -2372,7 +2373,7 @@ void print_dns_status (int, struct dhcp_
+@@ -2372,7 +2376,7 @@ void print_dns_status (int, struct dhcp_
  #endif
  const char *print_time(TIME);
  
diff --git a/SOURCES/dhcp-IPoIB-log-id.patch b/SOURCES/dhcp-IPoIB-log-id.patch
index 4b4f71b..8517ab4 100644
--- a/SOURCES/dhcp-IPoIB-log-id.patch
+++ b/SOURCES/dhcp-IPoIB-log-id.patch
@@ -1,98 +1,3 @@
-diff -up dhcp-4.2.5/common/lpf.c.IPoIB-log-id dhcp-4.2.5/common/lpf.c
---- dhcp-4.2.5/common/lpf.c.IPoIB-log-id	2014-09-08 14:50:39.000000000 +0200
-+++ dhcp-4.2.5/common/lpf.c	2014-09-08 14:54:43.935612705 +0200
-@@ -158,6 +158,7 @@ int if_register_lpf (info)
- void if_register_send (info)
- 	struct interface_info *info;
- {
-+	int hlen;
- 	/* If we're using the lpf API for sending and receiving,
- 	   we don't need to register this interface twice. */
- #ifndef USE_LPF_RECEIVE
-@@ -165,11 +166,15 @@ void if_register_send (info)
- #else
- 	info -> wfdesc = info -> rfdesc;
- #endif
-+	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND)
-+		hlen = 9;
-+	else
-+		hlen = info -> hw_address.hlen;
- 	if (!quiet_interface_discovery)
- 		log_info ("Sending on   LPF/%s/%s%s%s",
- 		      info -> name,
- 		      print_hw_addr (info -> hw_address.hbuf [0],
--				     info -> hw_address.hlen - 1,
-+				     hlen - 1,
- 				     &info -> hw_address.hbuf [1]),
- 		      (info -> shared_network ? "/" : ""),
- 		      (info -> shared_network ?
-@@ -179,6 +184,9 @@ void if_register_send (info)
- void if_deregister_send (info)
- 	struct interface_info *info;
- {
-+	int hlen = info -> hw_address.hlen;
-+	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND)
-+		hlen = 9;
- 	/* don't need to close twice if we are using lpf for sending and
- 	   receiving */
- #ifndef USE_LPF_RECEIVE
-@@ -191,7 +199,7 @@ void if_deregister_send (info)
- 		log_info ("Disabling output on LPF/%s/%s%s%s",
- 		      info -> name,
- 		      print_hw_addr (info -> hw_address.hbuf [0],
--				     info -> hw_address.hlen - 1,
-+				     hlen - 1,
- 				     &info -> hw_address.hbuf [1]),
- 		      (info -> shared_network ? "/" : ""),
- 		      (info -> shared_network ?
-@@ -218,7 +226,7 @@ static void lpf_gen_filter_setup (struct
- void if_register_receive (info)
- 	struct interface_info *info;
- {
--	int val;
-+	int val, hlen;
- 
- 	/* Open a LPF device and hang it on this interface... */
- 	info -> rfdesc = if_register_lpf (info);
-@@ -230,7 +238,9 @@ void if_register_receive (info)
- 			if (errno != ENOPROTOOPT)
- 				log_fatal ("Failed to set auxiliary packet data: %m");
- 		}
--	}
-+		hlen = info -> hw_address.hlen;
-+	} else
-+		hlen = 9;
- 
- #if defined (HAVE_TR_SUPPORT)
- 	if (info -> hw_address.hbuf [0] == HTYPE_IEEE802)
-@@ -243,7 +253,7 @@ void if_register_receive (info)
- 		log_info ("Listening on LPF/%s/%s%s%s",
- 			  info -> name,
- 			  print_hw_addr (info -> hw_address.hbuf [0],
--					 info -> hw_address.hlen - 1,
-+					 hlen - 1,
- 					 &info -> hw_address.hbuf [1]),
- 			  (info -> shared_network ? "/" : ""),
- 			  (info -> shared_network ?
-@@ -253,6 +263,9 @@ void if_register_receive (info)
- void if_deregister_receive (info)
- 	struct interface_info *info;
- {
-+	int hlen = info -> hw_address.hlen;
-+	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND)
-+		hlen = 9;
- 	/* for LPF this is simple, packet filters are removed when sockets
- 	   are closed */
- 	close (info -> rfdesc);
-@@ -261,7 +274,7 @@ void if_deregister_receive (info)
- 		log_info ("Disabling input on LPF/%s/%s%s%s",
- 			  info -> name,
- 			  print_hw_addr (info -> hw_address.hbuf [0],
--					 info -> hw_address.hlen - 1,
-+					 hlen - 1,
- 					 &info -> hw_address.hbuf [1]),
- 			  (info -> shared_network ? "/" : ""),
- 			  (info -> shared_network ?
 diff -up dhcp-4.2.5/server/dhcp.c.IPoIB-log-id dhcp-4.2.5/server/dhcp.c
 --- dhcp-4.2.5/server/dhcp.c.IPoIB-log-id	2014-09-08 14:50:39.000000000 +0200
 +++ dhcp-4.2.5/server/dhcp.c	2014-09-08 15:06:28.367697349 +0200
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..de8475c
--- /dev/null
+++ b/SOURCES/dhcp-client-request-release-bind-iface.patch
@@ -0,0 +1,61 @@
+diff -up dhcp-4.2.5/client/dhclient.c.bind-iface dhcp-4.2.5/client/dhclient.c
+--- dhcp-4.2.5/client/dhclient.c.bind-iface	2015-02-03 12:24:08.076213363 +0100
++++ dhcp-4.2.5/client/dhclient.c	2015-02-03 12:25:02.399168410 +0100
+@@ -2670,6 +2670,14 @@ void send_request (cpp)
+ 
+ 	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);
+@@ -2679,6 +2687,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. */
+@@ -2758,6 +2773,14 @@ void send_release (cpp)
+ 	      ntohs (destination.sin_port), client -> xid);
+ 
+ 	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);
+@@ -2767,6 +2790,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-dns_client_cancelupdate.patch b/SOURCES/dhcp-dns_client_cancelupdate.patch
new file mode 100644
index 0000000..0258273
--- /dev/null
+++ b/SOURCES/dhcp-dns_client_cancelupdate.patch
@@ -0,0 +1,69 @@
+diff -up dhcp-4.2.5/client/dhclient.c.dns_client_cancelupdate dhcp-4.2.5/client/dhclient.c
+--- dhcp-4.2.5/client/dhclient.c.dns_client_cancelupdate	2015-06-25 14:31:27.309035906 +0200
++++ dhcp-4.2.5/client/dhclient.c	2015-06-25 14:34:26.477642016 +0200
+@@ -121,6 +121,8 @@ static int check_option_values(struct un
+ 			       const char *ptr, size_t len);
+ 
+ static void setup_ib_interface(struct interface_info *ip);
++static void dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb,
++                                   char* file, int line);
+ 
+ int
+ main(int argc, char **argv) {
+@@ -4306,7 +4308,7 @@ client_dns_remove_action(dhcp_ddns_cb_t
+ 	}
+ 
+ 	/* If we are done or have an error clean up */
+-	ddns_cb_free(ddns_cb, MDL);
++	dhclient_ddns_cb_free(ddns_cb, MDL);
+ 	return;
+ }
+ 
+@@ -4335,7 +4337,7 @@ client_dns_remove(struct client_state *c
+ 		result = client_dns_update(client, ddns_cb);
+ 
+ 		if (result != ISC_R_TIMEDOUT) {
+-			ddns_cb_free(ddns_cb, MDL);
++			dhclient_ddns_cb_free(ddns_cb, MDL);
+ 		}
+ 	}
+ }
+@@ -4418,10 +4420,7 @@ client_dns_update_timeout (void *cp)
+ 	 * the control block and should free it.
+ 	 */
+ 	if (status != ISC_R_TIMEDOUT) {
+-		if (client != NULL) {
+-			client->ddns_cb = NULL;
+-		}
+-		ddns_cb_free(ddns_cb, MDL);
++		dhclient_ddns_cb_free(ddns_cb, MDL);
+ 	}
+ }
+ 
+@@ -4510,7 +4509,7 @@ client_dns_update_action(dhcp_ddns_cb_t
+ 		return;
+ 	}
+ 
+-	ddns_cb_free(ddns_cb, MDL);
++	dhclient_ddns_cb_free(ddns_cb, MDL);
+ 	return;
+ }
+ 
+@@ -4873,3 +4872,17 @@ add_reject(struct packet *packet) {
+ 	 */
+ 	log_info("Server added to list of rejected servers.");
+ }
++
++/* Wrapper function around common ddns_cb_free function that ensures
++ * we set the client_state pointer to the control block to NULL. */
++static void
++dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb, char* file, int line) {
++    if (ddns_cb) {
++        struct client_state *client = (struct client_state *)ddns_cb->lease;
++        if (client != NULL) {
++            client->ddns_cb = NULL;
++        }
++
++        ddns_cb_free(ddns_cb, file, line);
++    }
++}
diff --git a/SOURCES/dhcp-option97-pxe-client-id.patch b/SOURCES/dhcp-option97-pxe-client-id.patch
new file mode 100644
index 0000000..64000dc
--- /dev/null
+++ b/SOURCES/dhcp-option97-pxe-client-id.patch
@@ -0,0 +1,207 @@
+diff -up dhcp-4.2.5/common/options.c.option97 dhcp-4.2.5/common/options.c
+--- dhcp-4.2.5/common/options.c.option97	2015-05-20 16:44:34.958765179 +0200
++++ dhcp-4.2.5/common/options.c	2015-05-20 16:44:35.078763436 +0200
+@@ -4222,13 +4222,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.2.5/common/tables.c.option97 dhcp-4.2.5/common/tables.c
+--- dhcp-4.2.5/common/tables.c.option97	2015-05-20 16:44:35.079763422 +0200
++++ dhcp-4.2.5/common/tables.c	2015-05-20 16:47:50.172931400 +0200
+@@ -203,8 +203,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 },
+ 	{ "netinfo-server-address", "Ia",	&dhcp_universe, 112, 1 },
+ 	{ "netinfo-server-tag", "t",		&dhcp_universe, 113, 1 },
+diff -up dhcp-4.2.5/includes/dhcp.h.option97 dhcp-4.2.5/includes/dhcp.h
+--- dhcp-4.2.5/includes/dhcp.h.option97	2015-05-20 16:44:34.975764932 +0200
++++ dhcp-4.2.5/includes/dhcp.h	2015-05-20 16:44:35.079763422 +0200
+@@ -163,6 +163,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.2.5/server/dhcp.c.option97 dhcp-4.2.5/server/dhcp.c
+--- dhcp-4.2.5/server/dhcp.c.option97	2015-05-20 16:44:35.060763698 +0200
++++ dhcp-4.2.5/server/dhcp.c	2015-05-20 16:51:26.718798033 +0200
+@@ -202,6 +205,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);
+@@ -770,6 +777,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,
+@@ -1841,6 +1851,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,
+@@ -2386,6 +2399,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,
+ 				   (struct client_state *)0,
+@@ -3429,6 +3445,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.2.5/server/dhcpd.conf.5.option97 dhcp-4.2.5/server/dhcpd.conf.5
+--- dhcp-4.2.5/server/dhcpd.conf.5.option97	2015-05-20 16:44:34.908765906 +0200
++++ dhcp-4.2.5/server/dhcpd.conf.5	2015-05-20 16:44:35.081763393 +0200
+@@ -1657,10 +1657,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
+@@ -1672,7 +1674,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.2.5/server/dhcpleasequery.c.option97 dhcp-4.2.5/server/dhcpleasequery.c
+--- dhcp-4.2.5/server/dhcpleasequery.c.option97	2013-01-03 01:02:25.000000000 +0100
++++ dhcp-4.2.5/server/dhcpleasequery.c	2015-05-20 16:44:35.082763378 +0200
+@@ -279,7 +279,7 @@ dhcpleasequery(struct packet *packet, in
+ 		 */
+ 
+ 		memset(&uid, 0, sizeof(uid));
+-		if (get_option(&uid, 
++		i = get_option(&uid,
+ 			       &dhcp_universe,
+ 			       packet,
+ 			       NULL,
+@@ -289,8 +289,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.2.5/server/failover.c.option97 dhcp-4.2.5/server/failover.c
+--- dhcp-4.2.5/server/failover.c.option97	2015-05-20 16:44:35.001764555 +0200
++++ dhcp-4.2.5/server/failover.c	2015-05-20 16:44:35.083763364 +0200
+@@ -5875,6 +5875,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.2.5/server/mdb.c.option97 dhcp-4.2.5/server/mdb.c
+--- dhcp-4.2.5/server/mdb.c.option97	2013-01-03 01:02:25.000000000 +0100
++++ dhcp-4.2.5/server/mdb.c	2015-05-20 16:44:35.084763349 +0200
+@@ -127,8 +127,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-vlanfilter.patch b/SOURCES/dhcp-vlanfilter.patch
new file mode 100644
index 0000000..1c62dc7
--- /dev/null
+++ b/SOURCES/dhcp-vlanfilter.patch
@@ -0,0 +1,14 @@
+diff -up dhcp-4.2.5/common/lpf.c.vlan dhcp-4.2.5/common/lpf.c
+--- dhcp-4.2.5/common/lpf.c.vlan	2015-10-13 18:48:35.180447618 +0200
++++ dhcp-4.2.5/common/lpf.c	2015-10-13 18:51:29.797079032 +0200
+@@ -521,6 +521,10 @@ ssize_t receive_packet (interface, buf,
+ 		if (cmsg->cmsg_level == SOL_PACKET &&
+ 		    cmsg->cmsg_type == PACKET_AUXDATA) {
+ 			struct tpacket_auxdata *aux = (void *)CMSG_DATA(cmsg);
++			/* Discard packets with stripped vlan id */
++			/* VLAN ID is only bottom 12-bits of TCI */
++			if (aux->tp_vlan_tci & 0x0fff)
++				return 0;
+ 			nocsum = aux->tp_status & TP_STATUS_CSUMNOTREADY;
+ 		}
+ 	}
diff --git a/SPECS/dhcp.spec b/SPECS/dhcp.spec
index 8f45080..78ac4bb 100644
--- a/SPECS/dhcp.spec
+++ b/SPECS/dhcp.spec
@@ -18,7 +18,7 @@
 Summary:  Dynamic host configuration protocol software
 Name:     dhcp
 Version:  4.2.5
-Release:  36%{?dist}
+Release:  42%{?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.
@@ -86,7 +86,10 @@ Patch52:  dhcp-IPoIB-log-id.patch
 Patch53:  dhcp-dhc6-life.patch
 Patch54:  dhcp-hop-limit.patch
 Patch55:  dhcp-stateless-store-duid.patch
-Patch56:  dhcp-4.2.5-centos-branding.patch
+Patch56:  dhcp-vlanfilter.patch
+Patch57:  dhcp-option97-pxe-client-id.patch
+Patch58:  dhcp-client-request-release-bind-iface.patch
+Patch59:  dhcp-dns_client_cancelupdate.patch
 
 BuildRequires: autoconf
 BuildRequires: automake
@@ -372,7 +375,18 @@ rm -rf includes/isc-dhcp
 
 # Write DUID_LLT even in stateless mode (#1156356)
 %patch55 -p1 -b .stateless-store-duid
-%patch56 -p1
+
+# dhcpd generates spurious responses when seeing requests from vlans on plain interface (#1175350)
+%patch56 -p1 -b .vlan
+
+# option 97 - pxe-client-id (#1175422)
+%patch57 -p1 -b .option97
+
+# send unicast request/release via correct interface (#1177351)
+%patch58 -p1 -b .bind-iface
+
+# dhclient crashes in dns_client_cancelupdate (#1187856)
+%patch59 -p1 -b .dns_client_cancelupdate
 
 # Update paths in all man pages
 for page in client/dhclient.conf.5 client/dhclient.leases.5 \
@@ -640,8 +654,25 @@ done
 
 
 %changelog
-* Thu Mar 05 2015 CentOS Sources <bugs@centos.org> - 4.2.5-36.el7.centos
-- Roll in CentOS Branding
+* Tue Oct 13 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-42
+- regenerate dhcp-vlanfilter.patch (#1175350)
+
+* Thu Sep 03 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-41
+- VLAN ID is only bottom 12-bits of TCI (#1175350)
+
+* Tue Jul 07 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-40
+- rebuilt (#1238461)
+
+* Thu Jun 25 2015 Jiri Popelka - 12:4.2.5-39
+- dhclient crashes in dns_client_cancelupdate (#1187856)
+
+* Wed Jun 24 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-38
+- correctly set IB's hw->hlen and add more randomness into xid generation (#1195693)
+- send unicast request/release via correct interface (#1177351)
+
+* Wed May 20 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-37
+- dhcpd generates spurious responses when seeing requests from vlans on plain interface (#1175350)
+- option 97 - pxe-client-id (#1175422)
 
 * Tue Jan 20 2015 Jiri Popelka <jpopelka@redhat.com> - 12:4.2.5-36
 - use upstream patch for #1147240 (Relay-forward's Hop Limit)