diff --git a/src/packet/BOOTP.py b/src/packet/BOOTP.py
index 805562bf35f3aa5beb3f7d8ebc294c0007d3b4ce..075697b5efabeb72d3ffe750ffe464fb4b880db7 100644
--- a/src/packet/BOOTP.py
+++ b/src/packet/BOOTP.py
@@ -91,7 +91,7 @@ class BOOTP(Packet):
             self.set_dhcp_option(field, new_value)  # Set new value for field
 
         # Update checksums
-        self.update_checksums()
+        self.update_fields()
 
         # Return value: dictionary containing tweak information
         return self.get_dict_log(field, old_value, new_value)
diff --git a/src/packet/CoAP.py b/src/packet/CoAP.py
index 9d79806abd578c06d9c999a900734f3e768928ab..1d1d9e0b231d6f30634cf8de78fd949437d25f3c 100644
--- a/src/packet/CoAP.py
+++ b/src/packet/CoAP.py
@@ -101,7 +101,7 @@ class CoAP(Packet):
             self.layer.setfieldval("options", result["new_options"])
         
         # Update checksums
-        self.update_checksums()
+        self.update_fields()
 
         # Return value: dictionary containing tweak information
         return self.get_dict_log(field, old_value, new_value)
diff --git a/src/packet/DNS.py b/src/packet/DNS.py
index 7b2de66ab943bdca163ed71d4c025a6bf92d0e98..6e9d750cb4a44c6f4f61506b874462d0ff976dda 100644
--- a/src/packet/DNS.py
+++ b/src/packet/DNS.py
@@ -110,7 +110,7 @@ class DNS(Packet):
                 question_record.setfieldval("qname", new_value_single)
         
         # Update checksums
-        self.update_checksums()
+        self.update_fields()
 
         # Return value: dictionary containing tweak information
         return self.get_dict_log(field, old_value, new_value)
diff --git a/src/packet/IGMPv3mr.py b/src/packet/IGMPv3mr.py
index 2015bf3f6b2a061064c52c26ac609c3f04913bf6..2f1cfc019dd99a9e5e1954fbfc4f6df78c6c22b9 100644
--- a/src/packet/IGMPv3mr.py
+++ b/src/packet/IGMPv3mr.py
@@ -33,14 +33,9 @@ class IGMPv3mr(Packet):
             new_value += new_address
             group.setfieldval("maddr", new_address)
             i += 1
-        
-        logging.info(f"Packet {self.id}: randomized all IGMPv3 group addresses.")
 
         # Update checksums
-        del self.packet.getlayer("IGMPv3").chksum
-        del self.packet.getlayer("IP").len
-        del self.packet.getlayer("IP").chksum
-        self.packet = scapy.Ether(self.packet.build())
+        self.update_fields()
 
         # Return value: dictionary containing tweak information
         return self.get_dict_log("maddr", old_value, new_value)
diff --git a/src/packet/Packet.py b/src/packet/Packet.py
index 9c60a96c7ecbee8eb20abd0e91e1897ff498fcfc..d739cff576eda2160db4aab77e09b9f3442015a6 100644
--- a/src/packet/Packet.py
+++ b/src/packet/Packet.py
@@ -194,19 +194,29 @@ class Packet:
         self.packet.time = timestamp
     
 
-    def update_checksums(self) -> None:
+    def update_fields(self) -> None:
         """
-        Update packet checksums, if needed.
+        Update checksum and length fields on all relevant layers,
+        and rebuild packet.
         """
-        if self.packet.haslayer("IP"):
-            ip_layer = self.packet.getlayer("IP")
-            ip_layer.delfieldval("len")
-            ip_layer.delfieldval("chksum")
-            transport_layer = self.packet.getlayer(2)
-            if hasattr(transport_layer, "len"):
-                transport_layer.delfieldval("len")
-            if hasattr(transport_layer, "chksum"):
-                transport_layer.delfieldval("chksum")
+        # Loop on all packet layers
+        i = 0
+        while True:
+            layer = self.packet.getlayer(i)
+            if layer is None:
+                break
+            
+            # Delete checksum field
+            if hasattr(layer, "chksum") and layer.getfieldval("chksum") is not None:
+                layer.delfieldval("chksum")
+
+            # Delete length field
+            if hasattr(layer, "len") and layer.getfieldval("len") is not None:
+                layer.delfieldval("len")
+            
+            i += 1
+
+        # Rebuild packet, to update deleted fields
         self.rebuild()
 
         
@@ -305,7 +315,7 @@ class Packet:
         self.layer.setfieldval(field, new_value)
 
         # Update checksums
-        self.update_checksums()
+        self.update_fields()
 
         # Return value: dictionary containing tweak information
         return self.get_dict_log(field, old_value, new_value)
diff --git a/src/packet/Transport.py b/src/packet/Transport.py
index 9109baca31060a1f57382fad35ef4856181c4322..433d82c73f08d4d5d7b648f64bba19e3381f5be2 100644
--- a/src/packet/Transport.py
+++ b/src/packet/Transport.py
@@ -50,7 +50,7 @@ class Transport(Packet):
         self.layer.setfieldval(field, new_value)
 
         # Update checksums, if needed
-        self.update_checksums()
+        self.update_fields()
 
         # Return value: dictionary containing tweak information
         return self.get_dict_log(field, old_value, new_value)