diff --git a/scapy/asn1packet.py b/scapy/asn1packet.py
index 460decb33be0c001d8e7f178219e117239580d8e..4c476d2a5f52e66f701450ffc4aefb475f10c0cc 100644
--- a/scapy/asn1packet.py
+++ b/scapy/asn1packet.py
@@ -17,6 +17,8 @@ class ASN1_Packet(Packet):
         self.do_init_fields(flist)
         self.fields_desc = flist    
     def self_build(self):
+        if self.raw_packet_cache is not None:
+            return self.raw_packet_cache
         return self.ASN1_root.build(self)    
     def do_dissect(self, x):
         return self.ASN1_root.dissect(self, x)
diff --git a/scapy/packet.py b/scapy/packet.py
index 1c530ba43332007d21f12dc0b9083d46fbd61ad6..6c2094f27b2000de5923ffe0ec19e351f79de8da 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -296,6 +296,8 @@ class Packet(BasePacket):
     def __len__(self):
         return len(self.__str__())
     def self_build(self, field_pos_list=None):
+        if self.raw_packet_cache is not None:
+            return self.raw_packet_cache
         p=""
         for f in self.fields_desc:
             val = self.getfieldval(f.name)
@@ -314,10 +316,7 @@ class Packet(BasePacket):
     def do_build(self):
         if not self.explicit:
             self = self.__iter__().next()
-        if self.raw_packet_cache is None:
-            pkt = self.self_build()
-        else:
-            pkt = self.raw_packet_cache
+        pkt = self.self_build()
         for t in self.post_transforms:
             pkt = t(pkt)
         pay = self.do_build_payload()
@@ -1148,7 +1147,8 @@ class Padding(Raw):
     def self_build(self):
         return ""
     def build_padding(self):
-        return self.load+self.payload.build_padding()
+        return (self.load if self.raw_packet_cache is None
+                else self.raw_packet_cache) + self.payload.build_padding()
 
 conf.raw_layer = Raw
 conf.padding_layer = Padding