Index: /trunk/src/VBox/NetworkServices/NAT/pxping.c
===================================================================
--- /trunk/src/VBox/NetworkServices/NAT/pxping.c	(revision 51683)
+++ /trunk/src/VBox/NetworkServices/NAT/pxping.c	(revision 51684)
@@ -1211,4 +1211,5 @@
     struct ping_pcb *pcb;
     u16_t guest_id;
+    u16_t oipsum;
     u32_t sum;
 
@@ -1264,17 +1265,31 @@
 
     /* rewrite IP header */
-    sum = (u16_t)~IPH_CHKSUM(iph);
-    sum += chksum_update_32((u32_t *)&iph->dest,
+    oipsum = IPH_CHKSUM(iph);
+    if (oipsum == 0) {
+        /* Solaris doesn't compute checksum for local replies */
+        ip_addr_copy(iph->dest, guest_ip);
+        if (mapped == PXREMAP_MAPPED) {
+            ip_addr_copy(iph->src, target_ip);
+        }
+        else {
+            IPH_TTL_SET(iph, IPH_TTL(iph) - 1);
+        }
+        IPH_CHKSUM_SET(iph, inet_chksum(iph, ntohs(IPH_LEN(iph))));
+    }
+    else {
+        sum = (u16_t)~oipsum;
+        sum += chksum_update_32((u32_t *)&iph->dest,
                                 ip4_addr_get_u32(&guest_ip));
-    if (mapped == PXREMAP_MAPPED) {
-        sum += chksum_update_32((u32_t *)&iph->src,
+        if (mapped == PXREMAP_MAPPED) {
+            sum += chksum_update_32((u32_t *)&iph->src,
                                     ip4_addr_get_u32(&target_ip));
-    }
-    else {
-        IPH_TTL_SET(iph, IPH_TTL(iph) - 1);
-        sum += PP_NTOHS(~0x0100);
-    }
-    sum = FOLD_U32T(sum);
-    IPH_CHKSUM_SET(iph, ~sum);
+        }
+        else {
+            IPH_TTL_SET(iph, IPH_TTL(iph) - 1);
+            sum += PP_NTOHS(~0x0100);
+        }
+        sum = FOLD_U32T(sum);
+        IPH_CHKSUM_SET(iph, ~sum);
+    }
 
     pxping_pmgr_forward_inbound(pxping, iplen);
