diff --git a/scapy/packet.py b/scapy/packet.py
index 6bb4ff3e2aea81baa4a04d84c6c0457c9bbce156..a5dd9f2dbab180664fc7c3a0f5a77d0dfadebdf5 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -302,25 +302,12 @@ class Packet(BasePacket):
     def clone_raw_packet_cache_fields(self):
         if self.raw_packet_cache_fields is None:
             return None
-        result = {}
-        for key, (value, islist,
-                  holds_packets) in self.raw_packet_cache_fields.iteritems():
-            if islist:
-                if holds_packets:
-                    result[key] = ([
-                        p.copy() for p in value
-                    ], 1, 1)
-                else:
-                    # XXX Not ideal since elements themselves can be
-                    # mutable
-                    result[key] = (value[:], 1, 0)
-            else:
-                # if holds_packets:
-                result[key] = (value, 0, 0)
-        return result
+        return {fieldname: self.get_field(fieldname).do_copy(value)
+                for fieldname, value in
+                self.raw_packet_cache_fields.iteritems()}
     def self_build(self, field_pos_list=None):
         if self.raw_packet_cache is not None:
-            for fname, (fval, _, _) in self.raw_packet_cache_fields.iteritems():
+            for fname, fval in self.raw_packet_cache_fields.iteritems():
                 if self.getfieldval(fname) != fval:
                     self.raw_packet_cache = None
                     self.raw_packet_cache_fields = None
@@ -593,20 +580,8 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
             s, fval = f.getfield(self, s)
             # We need to track fields with mutable values to discard
             # .raw_packet_cache when needed.
-            # 
-            # The values in f.raw_packet_cache_fields are three
-            # elements tuples (value, f.islist, f.holds_packets)
-            if f.islist:
-                if f.holds_packets:
-                    self.raw_packet_cache_fields[f.name] = ([
-                        p.copy() for p in fval
-                    ], 1, 1)
-                else:
-                    # XXX Not ideal since elements themselves can be
-                    # mutable
-                    self.raw_packet_cache_fields[f.name] = (fval[:], 1, 0)
-            elif f.holds_packets and fval is not None:
-                self.raw_packet_cache_fields[f.name] = (fval.copy(), 0, 1)
+            if f.islist or f.holds_packets:
+                self.raw_packet_cache_fields[f.name] = f.do_copy(fval)
             self.fields[f.name] = fval
         assert(raw.endswith(s))
         if s: