diff --git a/src/core/ipv6/ip6.c b/src/core/ipv6/ip6.c
index afa69f1..acb239d 100644
--- a/src/core/ipv6/ip6.c
+++ b/src/core/ipv6/ip6.c
@@ -772,15 +772,17 @@ netif_found:
             IP6_STATS_INC(ip6.drop);
             goto ip6_input_cleanup;
           case 2:
-            /* Send ICMP Parameter Problem */
+            /* Send ICMP Parameter Problem, but move payload pointer back to ip header first */
+            pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
             icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
             LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n"));
             pbuf_free(p);
             IP6_STATS_INC(ip6.drop);
             goto ip6_input_cleanup;
           case 3:
-            /* Send ICMP Parameter Problem if destination address is not a multicast address */
+            /* Send ICMP Parameter Problem if destination address is not a multicast address, but move payload pointer back to ip header first */
             if (!ip6_addr_ismulticast(ip6_current_dest_addr())) {
+              pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
               icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
             }
             LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n"));
@@ -866,15 +868,17 @@ netif_found:
             IP6_STATS_INC(ip6.drop);
             goto ip6_input_cleanup;
           case 2:
-            /* Send ICMP Parameter Problem */
+            /* Send ICMP Parameter Problem, but move payload pointer back to ip header first */
+            pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
             icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
             LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n"));
             pbuf_free(p);
             IP6_STATS_INC(ip6.drop);
             goto ip6_input_cleanup;
           case 3:
-            /* Send ICMP Parameter Problem if destination address is not a multicast address */
+            /* Send ICMP Parameter Problem if destination address is not a multicast address, but move payload pointer back to ip header first */
             if (!ip6_addr_ismulticast(ip6_current_dest_addr())) {
+              pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
               icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr);
             }
             LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n"));
@@ -927,7 +931,8 @@ netif_found:
       if (IP6_ROUT_SEG_LEFT(rout_hdr)) {
         /* The length field of routing option header must be even */
         if (rout_hdr->_hlen & 0x1) {
-          /* Discard and send parameter field error */
+          /* Discard and send parameter field error, but move payload pointer back to ip header first */
+          pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
           icmp6_param_problem(p, ICMP6_PP_FIELD, &rout_hdr->_hlen);
           LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid routing type dropped\n"));
           pbuf_free(p);
@@ -943,7 +948,8 @@ netif_found:
         case IP6_ROUT_RPL:
           break;
         default:
-          /* Discard unrecognized routing type and send parameter field error */
+          /* Discard unrecognized routing type and send parameter field error, but move payload pointer back to ip header first */
+          pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
           icmp6_param_problem(p, ICMP6_PP_FIELD, &IP6_ROUT_TYPE(rout_hdr));
           LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid routing type dropped\n"));
           pbuf_free(p);
@@ -984,7 +990,8 @@ netif_found:
 
       /* check payload length is multiple of 8 octets when mbit is set */
       if (IP6_FRAG_MBIT(frag_hdr) && (IP6H_PLEN(ip6hdr) & 0x7)) {
-        /* ipv6 payload length is not multiple of 8 octets */
+        /* ipv6 payload length is not multiple of 8 octets, send parameter field error, but move payload pointer back to ip header first */
+        pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
         icmp6_param_problem(p, ICMP6_PP_FIELD, LWIP_PACKED_CAST(const void *, &ip6hdr->_plen));
         LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid payload length dropped\n"));
         pbuf_free(p);
@@ -1030,7 +1037,8 @@ netif_found:
     }
 
     if (*nexth == IP6_NEXTH_HOPBYHOP) {
-      /* Hop-by-Hop header comes only as a first option */
+      /* Hop-by-Hop header comes only as a first option, send parameter header error, but move payload pointer back to ip header first */
+      pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (const u8_t *)ip6_current_header()));
       icmp6_param_problem(p, ICMP6_PP_HEADER, nexth);
       LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Hop-by-Hop options header dropped (only valid as a first option)\n"));
       pbuf_free(p);
