diff -Naurb grub-2.02~beta2/grub-core/net/bootp.c grub-2.02~beta2-pxe2-jtm/grub-core/net/bootp.c
--- grub-2.02~beta2/grub-core/net/bootp.c	2013-12-24 11:40:31.000000000 -0500
+++ grub-2.02~beta2-pxe2-jtm/grub-core/net/bootp.c	2014-05-01 20:13:26.398208600 -0400
@@ -161,33 +161,14 @@
 
 #define OFFSET_OF(x, y) ((grub_size_t)((grub_uint8_t *)((y)->x) - (grub_uint8_t *)(y)))
 
-struct grub_net_network_level_interface *
-grub_net_configure_by_dhcp_ack (const char *name,
-				struct grub_net_card *card,
-				grub_net_interface_flags_t flags,
+void
+grub_net_process_dhcp_ack (struct grub_net_network_level_interface *inter,
 				const struct grub_net_bootp_packet *bp,
 				grub_size_t size,
 				int is_def, char **device, char **path)
 {
-  grub_net_network_level_address_t addr;
-  grub_net_link_level_address_t hwaddr;
-  struct grub_net_network_level_interface *inter;
   int mask = -1;
 
-  addr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
-  addr.ipv4 = bp->your_ip;
-
-  if (device)
-    *device = 0;
-  if (path)
-    *path = 0;
-
-  grub_memcpy (hwaddr.mac, bp->mac_addr,
-	       bp->hw_len < sizeof (hwaddr.mac) ? bp->hw_len
-	       : sizeof (hwaddr.mac));
-  hwaddr.type = GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET;
-
-  inter = grub_net_add_addr (name, card, &addr, &hwaddr, flags);
   if (bp->gateway_ip)
     {
       grub_net_network_level_netaddress_t target;
@@ -199,7 +180,7 @@
       target.ipv4.masksize = 32;
       gw.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
       gw.ipv4 = bp->gateway_ip;
-      rname = grub_xasprintf ("%s:gw", name);
+      rname = grub_xasprintf ("%s:gw", inter->name);
       if (rname)
 	grub_net_add_route_gw (rname, target, gw);
       grub_free (rname);
@@ -207,14 +188,12 @@
       target.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
       target.ipv4.base = bp->gateway_ip;
       target.ipv4.masksize = 32;
-      grub_net_add_route (name, target, inter);
+      grub_net_add_route (inter->name, target, inter);
     }
 
   if (size > OFFSET_OF (boot_file, bp))
-    set_env_limn_ro (name, "boot_file", (char *) bp->boot_file,
+    set_env_limn_ro (inter->name, "boot_file", (char *) bp->boot_file,
 		     sizeof (bp->boot_file));
-  if (is_def)
-    grub_net_default_server = 0;
   if (is_def && !grub_net_default_server && bp->server_ip)
     {
       grub_net_default_server = grub_xasprintf ("%d.%d.%d.%d",
@@ -225,12 +204,6 @@
       grub_print_error ();
     }
 
-  if (is_def)
-    {
-      grub_env_set ("net_default_interface", name);
-      grub_env_export ("net_default_interface");
-    }
-
   if (device && !*device && bp->server_ip)
     {
       *device = grub_xasprintf ("tftp,%d.%d.%d.%d",
@@ -243,7 +216,7 @@
   if (size > OFFSET_OF (server_name, bp)
       && bp->server_name[0])
     {
-      set_env_limn_ro (name, "dhcp_server_name", (char *) bp->server_name,
+      set_env_limn_ro (inter->name, "dhcp_server_name", (char *) bp->server_name,
 		       sizeof (bp->server_name));
       if (is_def && !grub_net_default_server)
 	{
@@ -257,7 +230,8 @@
 	}
     }
 
-  if (size > OFFSET_OF (boot_file, bp) && path)
+  if (size > OFFSET_OF (boot_file, bp) && path && !*path
+      && bp->boot_file[0])
     {
       *path = grub_strndup (bp->boot_file, sizeof (bp->boot_file));
       grub_print_error ();
@@ -272,8 +246,46 @@
 	}
     }
   if (size > OFFSET_OF (vendor, bp))
-    parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask);
+    parse_dhcp_vendor (inter->name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask);
   grub_net_add_ipv4_local (inter, mask);
+}
+
+
+struct grub_net_network_level_interface *
+grub_net_configure_by_dhcp_ack (const char *name,
+				struct grub_net_card *card,
+				grub_net_interface_flags_t flags,
+				const struct grub_net_bootp_packet *bp,
+				grub_size_t size,
+				int is_def, char **device, char **path)
+{
+  grub_net_network_level_address_t addr;
+  grub_net_link_level_address_t hwaddr;
+  struct grub_net_network_level_interface *inter;
+
+  addr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
+  addr.ipv4 = bp->your_ip;
+
+  if (device)
+    *device = 0;
+  if (path)
+    *path = 0;
+
+  grub_memcpy (hwaddr.mac, bp->mac_addr,
+	       bp->hw_len < sizeof (hwaddr.mac) ? bp->hw_len
+	       : sizeof (hwaddr.mac));
+  hwaddr.type = GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET;
+
+  inter = grub_net_add_addr (name, card, &addr, &hwaddr, flags);
+
+  if (is_def)
+    {
+      grub_env_set ("net_default_interface", name);
+      grub_env_export ("net_default_interface");
+      grub_net_default_server = 0;
+    }
+
+  grub_net_process_dhcp_ack (inter, bp, size, is_def, device, path);
   
   inter->dhcp_ack = grub_malloc (size);
   if (inter->dhcp_ack)
diff -Naurb grub-2.02~beta2/grub-core/net/drivers/efi/efinet.c grub-2.02~beta2-pxe2-jtm/grub-core/net/drivers/efi/efinet.c
--- grub-2.02~beta2/grub-core/net/drivers/efi/efinet.c	2013-12-24 11:29:27.000000000 -0500
+++ grub-2.02~beta2-pxe2-jtm/grub-core/net/drivers/efi/efinet.c	2014-05-01 19:50:06.730208600 -0400
@@ -223,6 +223,7 @@
 {
   struct grub_net_card *card;
   grub_efi_device_path_t *dp;
+  struct grub_net_network_level_interface *inter;
 
   dp = grub_efi_get_device_path (hnd);
   if (! dp)
@@ -245,11 +246,19 @@
     if (! pxe)
       continue;
     pxe_mode = pxe->mode;
-    grub_net_configure_by_dhcp_ack (card->name, card, 0,
+    inter = grub_net_configure_by_dhcp_ack (card->name, card, 0,
 				    (struct grub_net_bootp_packet *)
 				    &pxe_mode->dhcp_ack,
 				    sizeof (pxe_mode->dhcp_ack),
 				    1, device, path);
+
+  /* Boot server PXE options add and override boot file/server */
+   if (pxe_mode->proxy_offer_received)
+     grub_net_process_dhcp_ack (inter,
+				(struct grub_net_bootp_packet *)
+				&pxe_mode->proxy_offer,
+				sizeof (pxe_mode->proxy_offer),
+				1, device, path);
     return;
   }
 }
diff -Naurb grub-2.02~beta2/grub-core/net/drivers/i386/pc/pxe.c grub-2.02~beta2-pxe2-jtm/grub-core/net/drivers/i386/pc/pxe.c
--- grub-2.02~beta2/grub-core/net/drivers/i386/pc/pxe.c	2013-12-24 11:29:27.000000000 -0500
+++ grub-2.02~beta2-pxe2-jtm/grub-core/net/drivers/i386/pc/pxe.c	2014-05-01 19:50:06.726208600 -0400
@@ -360,15 +360,24 @@
 grub_pc_net_config_real (char **device, char **path)
 {
   struct grub_net_bootp_packet *bp;
+  struct grub_net_network_level_interface *inter;
 
   bp = grub_pxe_get_cached (GRUB_PXENV_PACKET_TYPE_DHCP_ACK);
 
   if (!bp)
     return;
-  grub_net_configure_by_dhcp_ack ("pxe", &grub_pxe_card, 0,
+  inter = grub_net_configure_by_dhcp_ack ("pxe", &grub_pxe_card, 0,
 				  bp, GRUB_PXE_BOOTP_SIZE,
 				  1, device, path);
 
+
+  /* Boot server PXE options add and override boot file/server */
+  bp = grub_pxe_get_cached (GRUB_PXENV_PACKET_TYPE_CACHED_REPLY);
+
+
+  if (bp)
+    grub_net_process_dhcp_ack (inter, bp, GRUB_PXE_BOOTP_SIZE,
+			       1, device, path);
 }
 
 static struct grub_preboot *fini_hnd;
diff -Naurb grub-2.02~beta2/include/grub/efi/api.h grub-2.02~beta2-pxe2-jtm/include/grub/efi/api.h
--- grub-2.02~beta2/include/grub/efi/api.h	2013-12-24 12:04:54.000000000 -0500
+++ grub-2.02~beta2-pxe2-jtm/include/grub/efi/api.h	2014-05-01 19:50:06.730208600 -0400
@@ -526,7 +526,7 @@
 typedef grub_uint8_t grub_efi_mac_address_t[32];
 typedef grub_uint8_t grub_efi_ipv4_address_t[4];
 typedef grub_uint16_t grub_efi_ipv6_address_t[8];
-typedef grub_uint8_t grub_efi_ip_address_t[8] __attribute__ ((aligned(4)));
+typedef grub_uint8_t grub_efi_ip_address_t[16] __attribute__ ((aligned(4)));
 typedef grub_efi_uint64_t grub_efi_physical_address_t;
 typedef grub_efi_uint64_t grub_efi_virtual_address_t;
 
@@ -1342,12 +1342,33 @@
 
 typedef struct grub_efi_pxe_mode
 {
-  grub_uint8_t unused[52];
+  grub_uint8_t started;
+  grub_uint8_t ipv6_available;
+  grub_uint8_t ipv6_supported;
+  grub_uint8_t using_ipv6;
+  grub_uint8_t bis_supported;
+  grub_uint8_t bis_detected;
+  grub_uint8_t auto_arp;
+  grub_uint8_t send_guid;
+  grub_uint8_t dhcp_discover_valid;
+  grub_uint8_t dhcp_ack_received;
+  grub_uint8_t proxy_offer_received;
+  grub_uint8_t pxe_discover_valid;
+  grub_uint8_t pxe_reply_received;
+  grub_uint8_t pxe_bis_reply_received;
+  grub_uint8_t icmp_error_received;
+  grub_uint8_t tftp_error_received;
+  grub_uint8_t make_callbacks;
+  grub_uint8_t ttl;
+  grub_uint8_t tos;
+  grub_efi_ip_address_t station_ip;
+  grub_efi_ip_address_t subnet_mask;
   grub_efi_pxe_packet_t dhcp_discover;
   grub_efi_pxe_packet_t dhcp_ack;
   grub_efi_pxe_packet_t proxy_offer;
   grub_efi_pxe_packet_t pxe_discover;
   grub_efi_pxe_packet_t pxe_reply;
+  grub_efi_pxe_packet_t pxe_bis_reply;
 } grub_efi_pxe_mode_t;
 
 typedef struct grub_efi_pxe
diff -Naurb grub-2.02~beta2/include/grub/net.h grub-2.02~beta2-pxe2-jtm/include/grub/net.h
--- grub-2.02~beta2/include/grub/net.h	2013-12-24 11:40:31.000000000 -0500
+++ grub-2.02~beta2-pxe2-jtm/include/grub/net.h	2014-05-01 19:50:06.726208600 -0400
@@ -444,6 +444,12 @@
 				grub_size_t size,
 				int is_def, char **device, char **path);
 
+void
+grub_net_process_dhcp_ack (struct grub_net_network_level_interface *inter,
+			   const struct grub_net_bootp_packet *bp,
+			   grub_size_t size,
+			   int is_def, char **device, char **path);
+
 grub_err_t
 grub_net_add_ipv4_local (struct grub_net_network_level_interface *inf,
 			 int mask);
