diff --git a/skeletons/converter-example.c b/skeletons/converter-example.c
index a1dc8f4..ec1cc10 100644
--- a/skeletons/converter-example.c
+++ b/skeletons/converter-example.c
@@ -58,14 +58,35 @@
 static int opt_onepdu;  /* -1 (decode single PDU) */
 
 #ifdef    JUNKTEST        /* Enable -J <probability> */
-#define    JUNKOPT    "J:"
+#define JUNKOPT "J:"
 static double opt_jprob;    /* Junk bit probability */
 static int    junk_failures;
 static void   junk_bytes_with_probability(uint8_t *, size_t, double prob);
-#else
-#define    JUNKOPT
+
+#define RANDOPT "R:"
+static ssize_t random_max_size = 0; /* Size of the random data */
+
+#if !defined(__FreeBSD__) && !(defined(__APPLE__) && defined(__MACH__))
+static void
+srandomdev(void) {
+    FILE *f = fopen("/dev/urandom", "rb");
+    unsigned seed;
+    if(f) {
+        if(fread(&seed, 1, sizeof(seed), f) != sizeof(seed)) {
+            seed = time(NULL);
+        }
+        fclose(f);
+    } else {
+        seed = time(NULL);
+    }
+    srandom(seed);
+}
 #endif
 
+#else   /* !JUNKTEST */
+#define    JUNKOPT
+#endif  /* JUNKTEST */
+
 /* Debug output function */
 static void
 DEBUG(const char *fmt, ...) {
@@ -195,7 +216,7 @@
     /*
      * Pocess the command-line argments.
      */
-    while((ch = getopt(ac, av, "i:o:1b:cdn:p:hs:" JUNKOPT)) != -1)
+    while((ch = getopt(ac, av, "i:o:1b:cdn:p:hs:" JUNKOPT RANDOPT)) != -1)
     switch(ch) {
     case 'i':
         sel = ats_by_name(optarg, pduType, input_encodings);
@@ -296,6 +317,17 @@
             exit(EX_UNAVAILABLE);
         }
         break;
+    case 'R':
+        isyntax = ATS_RANDOM;
+        random_max_size = atoi(optarg);
+        if(random_max_size < 0) {
+            fprintf(stderr,
+                "-R %s: Non-negative value expected\n",
+                optarg);
+            exit(EX_UNAVAILABLE);
+        }
+        srandomdev();
+        break;
 #endif    /* JUNKTEST */
     case 'h':
     default:
@@ -339,6 +371,8 @@
         "  -s <size>    Set the stack usage limit (default is %d)\n"
 #ifdef    JUNKTEST
         "  -J <prob>    Set random junk test bit garbaging probability\n"
+        "  -R <size>    Generate a random value of roughly the given size,\n"
+        "               instead of parsing the value from file.\n"
 #endif
         , (long)suggested_bufsize, ASN__DEFAULT_STACK_MAX);
         exit(EX_USAGE);
@@ -347,7 +381,7 @@
     ac -= optind;
     av += optind;
 
-    if(ac < 1) {
+    if(ac < 1 && isyntax != ATS_RANDOM) {
         fprintf(stderr, "%s: No input files specified. "
                 "Try '-h' for more information\n",
                 av[-optind]);
@@ -378,19 +412,39 @@
       /*
        * Process all files in turn.
        */
-      for(ac_i = 0; ac_i < ac; ac_i++) {
+      for(ac_i = (isyntax == ATS_RANDOM) ? -1 : 0; ac_i < ac; ac_i++) {
         asn_enc_rval_t erv;
         void *structure;    /* Decoded structure */
-        FILE *file = argument_to_file(av, ac_i);
-        char *name = argument_to_name(av, ac_i);
+        FILE *file;
+        char *name;
         int first_pdu;
 
+        if(ac_i == -1) {
+            file = NULL;
+            name = "<random value generator>";
+            opt_onepdu = 1;
+        } else {
+            file = argument_to_file(av, ac_i);
+            name = argument_to_name(av, ac_i);
+        }
+
         for(first_pdu = 1; (first_pdu || !opt_onepdu); first_pdu = 0) {
             /*
              * Decode the encoded structure from file.
              */
-            structure = data_decode_from_file(isyntax, pduType, file, name,
-                                              suggested_bufsize, first_pdu);
+            if(isyntax == ATS_RANDOM) {
+                structure = NULL;
+                if(asn_random_fill(pduType, &structure, random_max_size) != 0) {
+                    fprintf(stderr,
+                            "Cannot generate a random value.\n",
+                            random_max_size);
+                    assert(structure == NULL);
+                    errno = EINVAL;
+                }
+            } else {
+                structure = data_decode_from_file(isyntax, pduType, file, name,
+                                                  suggested_bufsize, first_pdu);
+            }
             if(!structure) {
                 if(errno) {
                     /* Error message is already printed */
@@ -429,6 +483,8 @@
                 if(erv.encoded == -1) {
                     fprintf(stderr, "%s: Cannot convert %s into %s\n", name,
                             pduType->name, ats_simple_name(osyntax));
+                    DEBUG("Conversion failed for %s:\n", pduType->name);
+                    asn_fprint(stderr, pduType, structure);
                     exit(EX_UNAVAILABLE);
                 }
                 DEBUG("Encoded in %zd bytes of %s", erv.encoded,
