 src/core/ipv4/icmp.c    |  4 ++++
 src/core/ipv4/ip_frag.c |  4 ++++
 src/core/ipv6/icmp6.c   |  8 ++++++--
 src/core/ipv6/mld6.c    |  2 ++
 src/core/ipv6/nd6.c     |  6 ++++++
 src/include/lwip/opt.h  | 28 +++++++++++++++++++++-------
 6 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/src/core/ipv4/icmp.c b/src/core/ipv4/icmp.c
index af47153..1cd63d2 100644
--- a/src/core/ipv4/icmp.c
+++ b/src/core/ipv4/icmp.c
@@ -133,6 +133,7 @@ icmp_input(struct pbuf *p, struct netif *inp)
       LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
       goto lenerr;
     }
+#if CHECKSUM_CHECK_ICMP    
     if (inet_chksum_pbuf(p) != 0) {
       LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n"));
       pbuf_free(p);
@@ -140,6 +141,7 @@ icmp_input(struct pbuf *p, struct netif *inp)
       snmp_inc_icmpinerrors();
       return;
     }
+#endif    
 #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
     if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) {
       /* p is not big enough to contain link headers
@@ -324,7 +326,9 @@ icmp_send_response(struct pbuf *p, u8_t type, u8_t code)
 
   /* calculate checksum */
   icmphdr->chksum = 0;
+#if CHECKSUM_GEN_ICMP  
   icmphdr->chksum = inet_chksum(icmphdr, q->len);
+#endif  
   ICMP_STATS_INC(icmp.xmit);
   /* increase number of messages attempted to send */
   snmp_inc_icmpoutmsgs();
diff --git a/src/core/ipv4/ip_frag.c b/src/core/ipv4/ip_frag.c
index 8d18434..4801cdb 100644
--- a/src/core/ipv4/ip_frag.c
+++ b/src/core/ipv4/ip_frag.c
@@ -579,7 +579,9 @@ ip_reass(struct pbuf *p)
     IPH_OFFSET_SET(fraghdr, 0);
     IPH_CHKSUM_SET(fraghdr, 0);
     /* @todo: do we need to set calculate the correct checksum? */
+#if CHECKSUM_GEN_IP
     IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN));
+#endif /* CHECKSUM_GEN_IP */
 
     p = ipr->p;
 
@@ -811,7 +813,9 @@ ip_frag(struct pbuf *p, struct netif *netif, ip_addr_t *dest)
     IPH_OFFSET_SET(iphdr, htons(tmp));
     IPH_LEN_SET(iphdr, htons(cop + IP_HLEN));
     IPH_CHKSUM_SET(iphdr, 0);
+#if CHECKSUM_GEN_IP
     IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
+#endif /* CHECKSUM_GEN_IP */
 
 #if IP_FRAG_USES_STATIC_BUF
     if (last) {
diff --git a/src/core/ipv6/icmp6.c b/src/core/ipv6/icmp6.c
index ea82682..b79a1f0 100644
--- a/src/core/ipv6/icmp6.c
+++ b/src/core/ipv6/icmp6.c
@@ -95,7 +95,7 @@ icmp6_input(struct pbuf *p, struct netif *inp)
 
   icmp6hdr = (struct icmp6_hdr *)p->payload;
 
-#if LWIP_ICMP6_CHECKSUM_CHECK
+#if CHECKSUM_CHECK_ICMP6
   if (ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->tot_len, ip6_current_src_addr(),
                         ip6_current_dest_addr()) != 0) {
     /* Checksum failed */
@@ -104,7 +104,7 @@ icmp6_input(struct pbuf *p, struct netif *inp)
     ICMP6_STATS_INC(icmp6.drop);
     return;
   }
-#endif /* LWIP_ICMP6_CHECKSUM_CHECK */
+#endif /* CHECKSUM_CHECK_ICMP6 */
 
   switch (icmp6hdr->type) {
   case ICMP6_TYPE_NA: /* Neighbor advertisement */
@@ -178,8 +178,10 @@ icmp6_input(struct pbuf *p, struct netif *inp)
     /* Set fields in reply. */
     ((struct icmp6_echo_hdr *)(r->payload))->type = ICMP6_TYPE_EREP;
     ((struct icmp6_echo_hdr *)(r->payload))->chksum = 0;
+#if CHECKSUM_GEN_ICMP6
     ((struct icmp6_echo_hdr *)(r->payload))->chksum = ip6_chksum_pseudo(r,
         IP6_NEXTH_ICMP6, r->tot_len, reply_src, ip6_current_src_addr());
+#endif /* CHECKSUM_GEN_ICMP6 */
 
     /* Send reply. */
     ICMP6_STATS_INC(icmp6.xmit);
@@ -326,8 +328,10 @@ icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type)
 
   /* calculate checksum */
   icmp6hdr->chksum = 0;
+#if CHECKSUM_GEN_ICMP6
   icmp6hdr->chksum = ip6_chksum_pseudo(q, IP6_NEXTH_ICMP6, q->tot_len,
     reply_src, reply_dest);
+#endif /* CHECKSUM_GEN_ICMP6 */
 
   ICMP6_STATS_INC(icmp6.xmit);
   ip6_output_if(q, reply_src, reply_dest, LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);
diff --git a/src/core/ipv6/mld6.c b/src/core/ipv6/mld6.c
index 1cb2dd9..dc785ad 100644
--- a/src/core/ipv6/mld6.c
+++ b/src/core/ipv6/mld6.c
@@ -562,8 +562,10 @@ mld6_send(struct mld_group *group, u8_t type)
   mld_hdr->reserved = 0;
   ip6_addr_set(&(mld_hdr->multicast_address), &(group->group_address));
 
+#if CHECKSUM_GEN_ICMP6
   mld_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len,
     src_addr, &(group->group_address));
+#endif /* CHECKSUM_GEN_ICMP6 */
 
   /* Add hop-by-hop headers options: router alert with MLD value. */
   ip6_options_add_hbh_ra(p, IP6_NEXTH_ICMP6, IP6_ROUTER_ALERT_VALUE_MLD);
diff --git a/src/core/ipv6/nd6.c b/src/core/ipv6/nd6.c
index 44629db..85be93d 100644
--- a/src/core/ipv6/nd6.c
+++ b/src/core/ipv6/nd6.c
@@ -837,8 +837,10 @@ nd6_send_ns(struct netif * netif, ip6_addr_t * target_addr, u8_t flags)
     target_addr = &multicast_address;
   }
 
+#if CHECKSUM_GEN_ICMP6
   ns_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,
     target_addr);
+#endif /* CHECKSUM_GEN_ICMP6 */
 
   /* Send the packet out. */
   ND6_STATS_INC(nd6.xmit);
@@ -909,8 +911,10 @@ nd6_send_na(struct netif * netif, ip6_addr_t * target_addr, u8_t flags)
     dest_addr = ip6_current_src_addr();
   }
 
+#if CHECKSUM_GEN_ICMP6
   na_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,
     dest_addr);
+#endif /* CHECKSUM_GEN_ICMP6 */
 
   /* Send the packet out. */
   ND6_STATS_INC(nd6.xmit);
@@ -976,8 +980,10 @@ nd6_send_rs(struct netif * netif)
     SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len);
   }
 
+#if CHECKSUM_GEN_ICMP6
   rs_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,
     &multicast_address);
+#endif /* CHECKSUM_GEN_ICMP6 */
 
   /* Send the packet out. */
   ND6_STATS_INC(nd6.xmit);
diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h
index e51f8e5..a9c65f4 100644
--- a/src/include/lwip/opt.h
+++ b/src/include/lwip/opt.h
@@ -1865,6 +1865,13 @@
 #endif
  
 /**
+ * CHECKSUM_GEN_ICMP6==1: Generate checksums in software for outgoing ICMP6 packets.
+ */
+#ifndef CHECKSUM_GEN_ICMP6
+#define CHECKSUM_GEN_ICMP6              1
+#endif
+ 
+/**
  * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.
  */
 #ifndef CHECKSUM_CHECK_IP
@@ -1886,6 +1893,20 @@
 #endif
 
 /**
+ * CHECKSUM_CHECK_ICMP==1: Check checksums in software for incoming ICMP packets.
+ */
+#ifndef CHECKSUM_CHECK_ICMP
+#define CHECKSUM_CHECK_ICMP             1
+#endif
+
+/**
+ * CHECKSUM_CHECK_ICMP6==1: Check checksums in software for incoming ICMPv6 packets
+ */
+#ifndef CHECKSUM_CHECK_ICMP6
+#define CHECKSUM_CHECK_ICMP6            1
+#endif
+
+/**
  * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from
  * application buffers to pbufs.
  */
@@ -1942,13 +1963,6 @@
 #endif
 
 /**
- * LWIP_ICMP6_CHECKSUM_CHECK==1: verify checksum on ICMPv6 packets
- */
-#ifndef LWIP_ICMP6_CHECKSUM_CHECK
-#define LWIP_ICMP6_CHECKSUM_CHECK       1
-#endif
-
-/**
  * LWIP_IPV6_MLD==1: Enable multicast listener discovery protocol.
  */
 #ifndef LWIP_IPV6_MLD
