         isInitialized = true
     }
     
-    // Import a corpus of programs into this fuzzer.
-    public func importCorpus(_ corpus: [Program], withDropout doDropout: Bool = false) {
-        for program in corpus {
-            core.importProgram(program, withDropout: doDropout)
-        }
-    }
-    
-    // Import a potentially interesting program into this fuzzer.
-    public func importProgram(_ program: Program, withDropout doDropout: Bool = false) {
-        core.importProgram(program, withDropout: doDropout)
-    }
-    
-    // Import a crashing program into this fuzzer.
+    /// Import a potentially interesting program into this fuzzer.
+    ///
+    /// When importing, the program will be treated like one that was generated by this fuzzer. As such it will
+    /// be executed and evaluated to determine whether it results in previously unseen, interesting behaviour.
+    /// When dropout is enabled, a configurable percentage of programs will be ignored during importing. This
+    /// mechanism can help reduce the similarity of different fuzzer instances.
+    public func importProgram(_ program: Program, withDropout applyDropout: Bool = false) {
+        core.importProgram(program, withDropout: applyDropout)
+    }
+    
+    /// Import a crashing program into this fuzzer.
+    ///
+    /// Similar to importProgram, but will make sure to generate a CrashFound event even if the crash does not reproduce.
     public func importCrash(_ program: Program) {
         core.importProgram(program, withDropout: false, isCrash: true)
     }
     
-    // Execution a program.
+    /// Import a corpus of programs into this fuzzer.
+    ///
+    /// This will import each program in the given array into this fuzzer while potentially discarding
+    /// some percentage of the programs if dropout is enabled.
+    public func importCorpus(_ corpus: [Program], withDropout applyDropout: Bool = false) {
+        for program in corpus {
+            core.importProgram(program, withDropout: applyDropout)
+        }
+    }
+    
+    /// Execute a program.
+    ///
+    /// This will first lift the given FuzzIL program to the target language, then use the configured script runner to execute it.
+    ///
+    /// - Parameters:
+    ///   - program: The FuzzIL program to execute.
+    ///   - timeout: The timeout after which to abort execution. If nil, the default timeout of this fuzzer will be used.
+    /// - Returns: An Execution structure representing the execution outcome.
     public func execute(_ program: Program, withTimeout timeout: UInt32? = nil) -> Execution {
         assert(runner.isInitialized)
         

        }
    }
    
    // Initialize this fuzzer.
    //
    // This will initialize all components and modules, causing event listeners to be registerd,
    // timers to be scheduled, communication channels to be established, etc.
    // Essentially, the fuzzer thread will be active after initialization.
    public func initialize() {
        precondition(!isInitialized)
        

    private var maxIterations = -1
    private var iterations = 0

    /// Construct a new fuzzer instance with the provided components.
    public init(id: Int, queue: DispatchQueue, configuration: Configuration, scriptRunner: ScriptRunner, coreFuzzer: FuzzerCore, codeGenerators: WeightedList<CodeGenerator>, evaluator: ProgramEvaluator, environment: Environment, lifter: Lifter, corpus: Corpus, minimizer: Minimizer) {
        self.id = id
        self.queue = queue
