diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py
index d5d1add3cdf4e5bba588c15825d9f0d86b20418d..7262736ff3e5ceace629bfaeb814d5b440d43a3a 100644
--- a/scapy/asn1fields.py
+++ b/scapy/asn1fields.py
@@ -367,7 +367,7 @@ class ASN1F_SEQUENCE_OF(ASN1F_field):
         return self.i2m(pkt, s)
 
     def randval(self):
-        return packet.fuzz(self.asn1pkt())
+        return packet.fuzz(self.cls())
     def __repr__(self):
         return "<%s %s>" % (self.__class__.__name__, self.name)
 
@@ -488,7 +488,16 @@ class ASN1F_CHOICE(ASN1F_field):
                                     explicit_tag=exp)
         return BER_tagging_enc(s, explicit_tag=self.explicit_tag)
     def randval(self):
-        return RandChoice(*(packet.fuzz(x()) for x in self.choices.itervalues()))
+        randchoices = []
+        for p in self.choices.itervalues():
+            if hasattr(p, "ASN1_root"):   # should be ASN1_Packet class
+                randchoices.append(packet.fuzz(p()))
+            elif hasattr(p, "ASN1_tag"):
+                if type(p) is type:       # should be (basic) ASN1F_field class
+                    randchoices.append(p("dummy", None).randval())
+                else:                     # should be ASN1F_PACKET instance
+                    randchoices.append(p.randval())
+        return RandChoice(*randchoices)
 
 class ASN1F_PACKET(ASN1F_field):
     holds_packets = 1
@@ -520,6 +529,8 @@ class ASN1F_PACKET(ASN1F_field):
             s = str(x)
         return BER_tagging_enc(s, implicit_tag=self.implicit_tag,
                                explicit_tag=self.explicit_tag)
+    def randval(self):
+        return packet.fuzz(self.cls())
 
 class ASN1F_BIT_STRING_ENCAPS(ASN1F_BIT_STRING):
     """
diff --git a/test/x509.uts b/test/x509.uts
index 8b42ac5382abc1b2bcf3bc49ea74397f9fb7e8f2..d61e2445dd239b0a6b473c70bb4a03c45ccd688e 100644
--- a/test/x509.uts
+++ b/test/x509.uts
@@ -190,3 +190,17 @@ s = str(X509_CRL())
 str(X509_CRL(s)) == s
 
 
+############ Randval tests ###############################################
+
+= Randval tests : ASN1F_SEQUENCE_OF
+random.seed(42)
+r = ASN1F_SEQUENCE_OF("test", [], ASN1P_INTEGER).randval().number
+assert(isinstance(r, RandNum))
+int(r) == -16393048219351680611L
+
+= Randval tests : ASN1F_PACKET
+random.seed(0xcafecafe)
+r = ASN1F_PACKET("otherName", None, X509_OtherName).randval()
+assert(isinstance(r, X509_OtherName))
+str(r.type_id) == '171.184.10.271'
+