diff --git a/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/GatkGeneral.scala b/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/GatkGeneral.scala
index 147398ac798c077da0722b2078f7ea21c666b7d1..3d1b5585028f69c01934f0ddfc0d54c6a9c25169 100644
--- a/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/GatkGeneral.scala
+++ b/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/GatkGeneral.scala
@@ -13,13 +13,13 @@ trait GatkGeneral extends CommandLineGATK with BiopetJavaCommandLineFunction {
 
   override def subPath = "gatk" :: super.subPath
 
-  jarFile = config("gatk_jar", required = true)
+  jarFile = config("gatk_jar")
 
   override val defaultVmem = "7G"
 
   if (config.contains("intervals")) intervals = config("intervals").asFileList
   if (config.contains("exclude_intervals")) excludeIntervals = config("exclude_intervals").asFileList
-  reference_sequence = config("reference", required = true)
+  reference_sequence = config("reference")
   if (config.contains("gatk_key")) gatk_key = config("gatk_key")
   if (config.contains("pedigree")) pedigree = config("pedigree").asFileList
 }
diff --git a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
index c76139133f23cf434884ad69ccc9dafc69b2cac9..be4566211351a3d077877d1a99cf8be6ba0f58cd 100644
--- a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
+++ b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
@@ -35,7 +35,7 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri
   var jointGenotyping: Boolean = config("joint_genotyping", default = false)
 
   var singleSampleCalling = config("single_sample_calling", default = true)
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
   var useAllelesOption: Boolean = config("use_alleles_option", default = false)
   val externalGvcfs = config("external_gvcfs_files", default = Nil).asFileList
 
diff --git a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala
index 8bac4aaf68c33a245da877d460bc26abb9ebe564..47715e26adb11f0ed73520d2769ca55120a58d93 100644
--- a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala
+++ b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala
@@ -30,7 +30,7 @@ class GatkVariantcalling(val root: Configurable) extends QScript with BiopetQScr
   var rawVcfInput: File = _
 
   @Argument(doc = "Reference", shortName = "R", required = false)
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Argument(doc = "OutputName", required = false)
   var outputName: String = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunctionTrait.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunctionTrait.scala
index 4a5b25f7a5b816fe32ad39897a334a6e13fe1eda..83aa87155236e9b2752407fb4bd39ce21dc36824 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunctionTrait.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunctionTrait.scala
@@ -66,7 +66,7 @@ trait BiopetCommandLineFunctionTrait extends CommandLineFunction with Configurab
     super.freezeFieldValues()
   }
 
-  protected def checkExecutable {
+  protected[core] def checkExecutable {
     if (!BiopetCommandLineFunctionTrait.executableMd5Cache.contains(executable)) {
       try if (executable != null) {
         if (!BiopetCommandLineFunctionTrait.executableCache.contains(executable)) {
@@ -79,8 +79,7 @@ trait BiopetCommandLineFunctionTrait extends CommandLineFunction with Configurab
             val file = new File(executable)
             executable = file.getCanonicalPath
           } else {
-            logger.error("executable: '" + executable + "' not found, please check config")
-            throw new QException("executable: '" + executable + "' not found, please check config")
+            BiopetQScript.addError("executable: '" + executable + "' not found, please check config")
           }
           BiopetCommandLineFunctionTrait.executableCache += oldExecutable -> executable
           BiopetCommandLineFunctionTrait.executableCache += executable -> executable
@@ -101,9 +100,8 @@ trait BiopetCommandLineFunctionTrait extends CommandLineFunction with Configurab
         case ioe: java.io.IOException => logger.warn("Could not use 'which', check on executable skipped: " + ioe)
       }
     }
-    val md5 = BiopetCommandLineFunctionTrait.executableMd5Cache(executable)
-    if (md5 == null) addJobReportBinding("md5sum_exe", md5)
-    else addJobReportBinding("md5sum_exe", "None")
+    val md5 = BiopetCommandLineFunctionTrait.executableMd5Cache.get(executable)
+    addJobReportBinding("md5sum_exe", md5.getOrElse("None"))
   }
 
   final protected def preCmdInternal {
@@ -120,6 +118,8 @@ trait BiopetCommandLineFunctionTrait extends CommandLineFunction with Configurab
   protected val versionExitcode = List(0) // Can select multiple
   private def getVersionInternal: String = {
     if (versionCommand == null || versionRegex == null) return "N/A"
+    val exe = new File(versionCommand.trim.split(" ")(0))
+    if (!exe.exists()) return "N/A"
     val stdout = new StringBuffer()
     val stderr = new StringBuffer()
     def outputLog = "Version command: \n" + versionCommand +
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetQScript.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetQScript.scala
index 1a3f565880dc3a2bd5450efd86cfa188e647eef4..062d725bafb7050258aaf07e0a0a0444e02aafdc 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetQScript.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetQScript.scala
@@ -24,14 +24,16 @@ import org.broadinstitute.gatk.queue.function.QFunction
 import org.broadinstitute.gatk.queue.function.scattergather.ScatterGatherableFunction
 import org.broadinstitute.gatk.queue.util.{ Logging => GatkLogging }
 
+import scala.collection.mutable.ListBuffer
+
 trait BiopetQScript extends Configurable with GatkLogging {
 
   @Argument(doc = "JSON config file(s)", fullName = "config_file", shortName = "config", required = false)
   val configfiles: List[File] = Nil
 
   var outputDir: String = {
-    val temp = Config.getValueFromMap(Config.global.map, ConfigValueIndex(this.configName, configPath, "output_dir"))
-    if (temp.isEmpty) throw new IllegalArgumentException("No output_dir defined in config")
+    val temp = Config.getValueFromMap(globalConfig.map, ConfigValueIndex(this.configName, configPath, "output_dir"))
+    if (temp.isEmpty) ""
     else {
       val t = temp.get.value.toString
       if (!t.endsWith("/")) t + "/" else t
@@ -51,8 +53,9 @@ trait BiopetQScript extends Configurable with GatkLogging {
   var functions: Seq[QFunction]
 
   final def script() {
-    outputDir = config("output_dir", required = true)
-    if (!outputDir.endsWith("/")) outputDir += "/"
+    outputDir = config("output_dir")
+    if (outputDir.isEmpty) outputDir = new File(".").getAbsolutePath()
+    else if (!outputDir.endsWith("/")) outputDir += "/"
     init
     biopetScript
 
@@ -61,11 +64,17 @@ trait BiopetQScript extends Configurable with GatkLogging {
       case _                            =>
     }
     for (function <- functions) function match {
-      case f: BiopetCommandLineFunctionTrait => f.afterGraph
-      case _                                 =>
+      case f: BiopetCommandLineFunctionTrait => {
+        f.checkExecutable
+        f.afterGraph
+      }
+      case _ =>
     }
 
-    Config.global.writeReport(qSettings.runName, outputDir + ".log/" + qSettings.runName)
+    if (new File(outputDir).canWrite) globalConfig.writeReport(qSettings.runName, outputDir + ".log/" + qSettings.runName)
+    else BiopetQScript.addError("Output dir: '" + outputDir + "' is not writeable")
+
+    BiopetQScript.checkErrors
   }
 
   def add(functions: QFunction*) // Gets implemeted at org.broadinstitute.sting.queue.QScript
@@ -73,5 +82,29 @@ trait BiopetQScript extends Configurable with GatkLogging {
     function.isIntermediate = isIntermediate
     add(function)
   }
-
 }
+
+object BiopetQScript extends Logging {
+  private val errors: ListBuffer[Exception] = ListBuffer()
+
+  def addError(error: String, debug: String = null): Unit = {
+    val msg = error + (if (debug != null && logger.isDebugEnabled) "; " + debug else "")
+    errors.append(new Exception(msg))
+  }
+
+  protected def checkErrors: Unit = {
+    if (!errors.isEmpty) {
+      logger.error("*************************")
+      logger.error("Biopet found some errors:")
+      if (logger.isDebugEnabled) {
+        for (e <- errors) {
+          logger.error(e.getMessage)
+          logger.debug(e.getStackTrace.mkString("Stack trace:\n", "\n", "\n"))
+        }
+      } else {
+        errors.map(_.getMessage).sorted.distinct.foreach(logger.error(_))
+      }
+      throw new IllegalStateException("Biopet found errors")
+    }
+  }
+}
\ No newline at end of file
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
index eb76502c8593a9e970ea2c95b9152569dfffb389..4184f29afacc7f6afcf6dc9d0eb45f9eddfc1993 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
@@ -28,7 +28,7 @@ trait MultiSampleQScript extends BiopetQScript {
   @Argument(doc = "Only Sample", shortName = "sample", required = false)
   private val onlySamples: List[String] = Nil
 
-  require(Config.global.map.contains("samples"), "No Samples found in config")
+  require(globalConfig.map.contains("samples"), "No Samples found in config")
 
   /**
    * Sample class with basic functions build in
@@ -80,7 +80,7 @@ trait MultiSampleQScript extends BiopetQScript {
 
     /** returns a set with library names */
     protected def libIds: Set[String] = {
-      ConfigUtils.getMapFromPath(Config.global.map, List("samples", sampleId, "libraries")).getOrElse(Map()).keySet
+      ConfigUtils.getMapFromPath(globalConfig.map, List("samples", sampleId, "libraries")).getOrElse(Map()).keySet
     }
 
     /** Adds sample jobs */
@@ -125,7 +125,7 @@ trait MultiSampleQScript extends BiopetQScript {
   val samples: Map[String, Sample] = sampleIds.map(id => id -> makeSample(id)).toMap
 
   /** Returns a list of all sampleIDs */
-  protected def sampleIds: Set[String] = ConfigUtils.any2map(Config.global.map("samples")).keySet
+  protected def sampleIds: Set[String] = ConfigUtils.any2map(globalConfig.map("samples")).keySet
 
   /** Runs addAndTrackJobs method for each sample */
   final def addSamplesJobs() {
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Config.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Config.scala
index 4ea65cb5a7fc7ceb1226853d47687a0865c818d0..e25e8ef508188adbd5f767b20ca1f688c4eed922 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Config.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Config.scala
@@ -133,11 +133,11 @@ class Config(var map: Map[String, Any]) extends Logging {
    */
   protected[config] def apply(module: String, path: List[String], key: String, default: Any = null, freeVar: Boolean = true): ConfigValue = {
     val requestedIndex = ConfigValueIndex(module, path, key, freeVar)
-    if (contains(requestedIndex)) return foundCache(requestedIndex)
+    if (contains(requestedIndex)) foundCache(requestedIndex)
     else if (default != null) {
       defaultCache += (requestedIndex -> ConfigValue(requestedIndex, null, default, freeVar))
-      return defaultCache(requestedIndex)
-    } else throw new IllegalStateException("Value in config could not be found but it seems required, index: " + requestedIndex)
+      defaultCache(requestedIndex)
+    } else ConfigValue(requestedIndex, null, null, freeVar)
   }
 
   def writeReport(id: String, directory: String): Unit = {
@@ -174,7 +174,7 @@ class Config(var map: Map[String, Any]) extends Logging {
     val fullEffective = ConfigUtils.mergeMaps(effectiveFound, effectiveDefaultFound)
     val fullEffectiveWithNotFound = ConfigUtils.mergeMaps(fullEffective, notFound)
 
-    writeMapToJsonFile(Config.global.map, "input")
+    writeMapToJsonFile(this.map, "input")
     writeMapToJsonFile(found, "found")
     writeMapToJsonFile(effectiveFound, "effective.found")
     writeMapToJsonFile(effectiveDefaultFound, "effective.defaults")
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala
index 54e6dfd170a8cb2e68f5c63dd8ca2675513cee7d..51997ccb8a12fb5c3a234e5e7d95c001dd704b4f 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala
@@ -21,6 +21,7 @@ import nl.lumc.sasc.biopet.utils.ConfigUtils.ImplicitConversions
 trait Configurable extends ImplicitConversions {
   /** Should be object of parant object */
   val root: Configurable
+  val globalConfig: Config = if (root != null) root.globalConfig else Config.global
 
   /** subfix to the path */
   def subPath: List[String] = Nil
@@ -79,7 +80,6 @@ trait Configurable extends ImplicitConversions {
      * @param key Name of value
      * @param default Default value if not found
      * @param submodule Adds to the path
-     * @param required Default false, if true and value is not found this function will raise an exception
      * @param freeVar Default true, if set false value must exist in module
      * @param sample Default null, when set path is prefixed with "samples" -> "sampleID"
      * @param library Default null, when set path is prefixed with "libraries" -> "libraryID"
@@ -88,7 +88,6 @@ trait Configurable extends ImplicitConversions {
     def apply(key: String,
               default: Any = null,
               submodule: String = null,
-              required: Boolean = false,
               freeVar: Boolean = true,
               sample: String = null,
               library: String = null): ConfigValue = {
@@ -100,14 +99,8 @@ trait Configurable extends ImplicitConversions {
         val value = Config.getValueFromMap(defaults.toMap, ConfigValueIndex(m, p, key, freeVar))
         if (value.isDefined) value.get.value else default
       }
-      if (!contains(key, submodule, freeVar, sample = s, library = l) && d == null) {
-        if (required) {
-          Logging.logger.error("Value in config could not be found but it is required, key: " + key + "   module: " + m + "   path: " + p)
-          throw new IllegalStateException("Value in config could not be found but it is required, key: " + key + "   module: " + m + "   path: " + p)
-        } else return null
-      }
-      if (d == null) return Config.global(m, p, key, freeVar = freeVar)
-      else return Config.global(m, p, key, d, freeVar)
+      if (d == null) globalConfig(m, p, key, freeVar = freeVar)
+      else globalConfig(m, p, key, d, freeVar)
     }
 
     /**
@@ -129,7 +122,7 @@ trait Configurable extends ImplicitConversions {
       val m = if (submodule != null) submodule else configName
       val p = path(s, l, submodule)
 
-      Config.global.contains(m, p, key, freeVar) || !(Config.getValueFromMap(defaults.toMap, ConfigValueIndex(m, p, key, freeVar)) == None)
+      globalConfig.contains(m, p, key, freeVar) || !(Config.getValueFromMap(defaults.toMap, ConfigValueIndex(m, p, key, freeVar)) == None)
     }
   }
 }
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/workaround/BiopetQCommandLine.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/workaround/BiopetQCommandLine.scala
index e7467ced6086d1f6cc88d46dc110dc77bafc3809..a2ca78b4c52e0a0faa5a4a67ebd7998096a68cf9 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/workaround/BiopetQCommandLine.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/workaround/BiopetQCommandLine.scala
@@ -81,19 +81,15 @@ object BiopetQCommandLine extends GatkLogging {
 
     Runtime.getRuntime.addShutdownHook(shutdownHook)
 
+    CommandLineProgram.start(qCommandLine, argv)
     try {
-      CommandLineProgram.start(qCommandLine, argv)
-      try {
-        Runtime.getRuntime.removeShutdownHook(shutdownHook)
-        qCommandLine.shutdown()
-      } catch {
-        case e: Exception => /* ignore, example 'java.lang.IllegalStateException: Shutdown in progress' */
-      }
-      if (CommandLineProgram.result != 0)
-        System.exit(CommandLineProgram.result)
+      Runtime.getRuntime.removeShutdownHook(shutdownHook)
+      qCommandLine.shutdown()
     } catch {
-      case e: Exception => CommandLineProgram.exitSystemWithError(e)
+      case e: Exception => /* ignore, example 'java.lang.IllegalStateException: Shutdown in progress' */
     }
+    if (CommandLineProgram.result != 0)
+      System.exit(CommandLineProgram.result)
   }
 }
 
@@ -114,21 +110,28 @@ class BiopetQCommandLine extends CommandLineProgram with Logging {
   private var qScriptClasses: File = _
   private var shuttingDown = false
 
+  /**
+   * we modified this in Biopet to skip compiling and show full stacktrace again
+   */
   private lazy val qScriptPluginManager = {
     qScriptClasses = IOUtils.tempDir("Q-Classes-", "", settings.qSettings.tempDirectory)
-    //qScriptManager.loadScripts(scripts, qScriptClasses)
-    //var temp: Seq[URL] = Seq()
     for (t <- scripts) {
       val is = getClass.getResourceAsStream(t.getAbsolutePath)
       val os = new FileOutputStream(qScriptClasses.getAbsolutePath + "/" + t.getName)
       org.apache.commons.io.IOUtils.copy(is, os)
       os.close()
-      //temp :+= this.getClass.getResource(t.toString)
-      //logger.info(this.getClass.getResource(t.toString))
       val s = if (t.getName.endsWith("/")) t.getName.substring(0, t.getName.length - 1) else t.getName
       pipelineName = s.substring(0, s.lastIndexOf(".")) + "." + System.currentTimeMillis
     }
-    new PluginManager[QScript](qPluginType, List(qScriptClasses.toURI.toURL))
+
+    // override createByType to pass the correct exceptions
+    new PluginManager[QScript](qPluginType, List(qScriptClasses.toURI.toURL)) {
+      override def createByType(plugintype: Class[_ <: QScript]) = {
+        val noArgsConstructor = plugintype.getDeclaredConstructor()
+        noArgsConstructor.setAccessible(true)
+        noArgsConstructor.newInstance()
+      }
+    }
   }
 
   private lazy val qCommandPlugin = {
@@ -186,12 +189,7 @@ class BiopetQCommandLine extends CommandLineProgram with Logging {
         //if (settings.run)
         script.pullInputs()
         script.qSettings = settings.qSettings
-        try {
-          script.script()
-        } catch {
-          case e: Exception =>
-            throw new UserException.CannotExecuteQScript(script.getClass.getSimpleName + ".script() threw the following exception: " + e, e)
-        }
+        script.script()
 
         if (remoteFileConverter != null) {
           if (remoteFileConverter.convertToRemoteEnabled)
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala
index e192a845be6db96d2a754d2d2ff6a5e393d136ca..9ac74448e880d7be01063a3f12bdd613141b34a4 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala
@@ -29,7 +29,7 @@ class Bowtie(val root: Configurable) extends BiopetCommandLineFunction {
   var R2: File = _
 
   @Input(doc = "The reference file for the bam files.", shortName = "R")
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Output(doc = "Output file SAM", shortName = "output")
   var output: File = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala
index fed5e514be34618f41d2e8348eba6d15e67fab29..7bda8792544eea2d863ab06192b51b55ae900077 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala
@@ -51,7 +51,7 @@ class Fastqc(val root: Configurable) extends BiopetCommandLineFunction {
   override def afterGraph {
     this.checkExecutable
 
-    val fastqcDir = executable.substring(0, executable.lastIndexOf("/"))
+    val fastqcDir = new File(executable).getParent
 
     contaminants = contaminants match {
       // user-defined contaminants file take precedence
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala
index a7bfeab78447e62eee1634c73ca09c880679327e..1db8f6d67c8d892e6188aa750efb40b814fbbf1e 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala
@@ -29,13 +29,13 @@ class Stampy(val root: Configurable) extends BiopetCommandLineFunction {
   var R2: File = _
 
   @Input(doc = "The reference file for the bam files.", shortName = "ref")
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Input(doc = "The genome prefix.")
-  var genome: File = config("genome", required = true)
+  var genome: File = config("genome")
 
   @Input(doc = "The hash prefix")
-  var hash: File = config("hash", required = true)
+  var hash: File = config("hash")
 
   @Output(doc = "Output file SAM", shortName = "output")
   var output: File = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/TopHat.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/TopHat.scala
index e0b8bd68bda46a6b3dc6915a54482b093cfd43d6..98ee6de521d499710e186bb2c196d9d471c6aa5d 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/TopHat.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/TopHat.scala
@@ -29,7 +29,7 @@ class TopHat(val root: Configurable) extends BiopetCommandLineFunction {
   var R2: File = _
 
   @Input(doc = "Bowtie index", shortName = "bti")
-  var bowtie_index: File = config("bowtie_index", required = true)
+  var bowtie_index: File = config("bowtie_index")
 
   @Argument(doc = "Output Directory")
   var outputDir: String = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaAln.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaAln.scala
index bfd0a5846e6531b47f285453a2d848b1b7f1bafe..3298702fcfd5cd98e1eaf0bae8f6b059d353d2c9 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaAln.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaAln.scala
@@ -13,7 +13,7 @@ class BwaAln(val root: Configurable) extends Bwa {
   var fastq: File = _
 
   @Input(doc = "The reference file for the bam files.", required = true)
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Output(doc = "Output file SAM", required = false)
   var output: File = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaMem.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaMem.scala
index fc790b183b5bae2922a1b5f89ec66fcf4f5b85b2..74cdad0cea290e5a8cdcc2b360fa3fa32444791c 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaMem.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaMem.scala
@@ -29,7 +29,7 @@ class BwaMem(val root: Configurable) extends Bwa {
   var R2: File = _
 
   @Input(doc = "The reference file for the bam files.", shortName = "R")
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Output(doc = "Output file SAM", shortName = "output")
   var output: File = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSampe.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSampe.scala
index b857eea014ac52acb9608debb94db9cd75cef929..255811561e732b229b1417c95d866fad4694c0c9 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSampe.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSampe.scala
@@ -26,7 +26,7 @@ class BwaSampe(val root: Configurable) extends Bwa {
   var saiR2: File = _
 
   @Input(doc = "The reference file for the bam files.", required = true)
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Output(doc = "Output file SAM", required = false)
   var output: File = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSamse.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSamse.scala
index 51f9a0f30eaf73a897fefaa2b6cf69d4e3386b62..8bbf918474e21d2e2837ce01d5bc4490e13bd087 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSamse.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/BwaSamse.scala
@@ -16,7 +16,7 @@ class BwaSamse(val root: Configurable) extends Bwa {
   var sai: File = _
 
   @Input(doc = "The reference file for the bam files.", required = true)
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Output(doc = "Output file SAM", required = false)
   var output: File = _
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectGcBiasMetrics.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectGcBiasMetrics.scala
index 7ffcb50d8fec02138c07e4fc95d7608e8bfba72e..9cab9bfc90298f243f6cfdc8e051e7d451a4cf90 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectGcBiasMetrics.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectGcBiasMetrics.scala
@@ -35,7 +35,7 @@ class CollectGcBiasMetrics(val root: Configurable) extends Picard {
   var outputSummary: File = _
 
   @Argument(doc = "Reference file", required = false)
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
 
   @Argument(doc = "Window size", required = false)
   var windowSize: Option[Int] = config("windowsize")
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala
index 9f1cddb7913cf7846daa72c7b9e695988b3a14c6..2c9165036824f135f9552b69fa3b4085be25fc93 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala
@@ -16,6 +16,7 @@
 package nl.lumc.sasc.biopet.utils
 
 import java.io.File
+import nl.lumc.sasc.biopet.core.BiopetQScript
 import nl.lumc.sasc.biopet.core.Logging
 import nl.lumc.sasc.biopet.core.config.ConfigValue
 import argonaut._, Argonaut._
@@ -330,14 +331,27 @@ object ConfigUtils extends Logging {
   trait ImplicitConversions {
     import scala.language.implicitConversions
 
+    private def requiredValue(value: ConfigValue): Boolean = {
+      val exist = valueExists(value)
+      if (!exist)
+        BiopetQScript.addError("Value does not exist but is required, key: " + value.requestIndex.key +
+          "  module: " + value.requestIndex.module,
+          (if (value.requestIndex.path != Nil) "  path: " + value.requestIndex.path.mkString("->") else null))
+      exist
+    }
+
+    private def valueExists(value: ConfigValue): Boolean = {
+      value != null && value.value != null && value.value != None
+    }
+
     /**
      * Convert ConfigValue to File
      * @param value Input ConfigValue
      * @return
      */
     implicit def configValue2file(value: ConfigValue): File = {
-      if (value != null && value.value != null && value.value != None) new File(any2string(value.value))
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) new File(any2string(value.value))
+      else new File("")
     }
 
     /**
@@ -346,7 +360,7 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2optionFile(value: ConfigValue): Option[File] = {
-      if (value != null && value.value != null && value.value != None) Some(new File(any2string(value.value)))
+      if (valueExists(value)) Some(new File(any2string(value.value)))
       else None
     }
 
@@ -356,8 +370,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2string(value: ConfigValue): String = {
-      if (value != null && value.value != null && value.value != None) any2string(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2string(value.value)
+      else ""
     }
 
     /**
@@ -366,7 +380,7 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2optionString(value: ConfigValue): Option[String] = {
-      if (value != null && value.value != null && value.value != None) Some(any2string(value.value))
+      if (valueExists(value)) Some(any2string(value.value))
       else None
     }
 
@@ -376,8 +390,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2long(value: ConfigValue): Long = {
-      if (value != null && value.value != null && value.value != None) any2long(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2long(value.value)
+      else 0L
     }
 
     /**
@@ -386,7 +400,7 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2optionLong(value: ConfigValue): Option[Long] = {
-      if (value != null && value.value != null && value.value != None) Option(any2long(value.value))
+      if (valueExists(value)) Option(any2long(value.value))
       else None
     }
 
@@ -396,8 +410,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2int(value: ConfigValue): Int = {
-      if (value != null && value.value != null && value.value != None) any2int(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2int(value.value)
+      else 0
     }
 
     /**
@@ -406,7 +420,7 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2optionInt(value: ConfigValue): Option[Int] = {
-      if (value != null && value.value != null && value.value != None) Option(any2int(value.value))
+      if (valueExists(value)) Option(any2int(value.value))
       else None
     }
 
@@ -416,8 +430,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2double(value: ConfigValue): Double = {
-      if (value != null && value.value != null && value.value != None) any2double(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2double(value.value)
+      else 0.0
     }
 
     /**
@@ -426,7 +440,7 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2optionDouble(value: ConfigValue): Option[Double] = {
-      if (value != null && value.value != null && value.value != None) Option(any2double(value.value))
+      if (valueExists(value)) Option(any2double(value.value))
       else None
     }
 
@@ -436,8 +450,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2float(value: ConfigValue): Float = {
-      if (value != null && value.value != null && value.value != None) any2float(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2float(value.value)
+      else 0f
     }
 
     /**
@@ -446,7 +460,7 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2optionFloat(value: ConfigValue): Option[Float] = {
-      if (value != null && value.value != null && value.value != None) Option(any2float(value.value))
+      if (valueExists(value)) Option(any2float(value.value))
       else None
     }
 
@@ -456,8 +470,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2boolean(value: ConfigValue): Boolean = {
-      if (value != null && value.value != null && value.value != None) any2boolean(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2boolean(value.value)
+      else false
     }
 
     /**
@@ -466,7 +480,7 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2optionBoolean(value: ConfigValue): Option[Boolean] = {
-      if (value != null && value.value != null && value.value != None) Option(any2boolean(value.value))
+      if (valueExists(value)) Option(any2boolean(value.value))
       else None
     }
 
@@ -476,8 +490,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2list(value: ConfigValue): List[Any] = {
-      if (value != null && value.value != null && value.value != None) any2list(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2list(value.value)
+      else Nil
     }
 
     /**
@@ -486,8 +500,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2stringList(value: ConfigValue): List[String] = {
-      if (value != null && value.value != null && value.value != None) any2stringList(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2stringList(value.value)
+      else Nil
     }
 
     /**
@@ -496,8 +510,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2stringSet(value: ConfigValue): Set[String] = {
-      if (value != null && value.value != null && value.value != None) any2stringList(value.value).toSet
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2stringList(value.value).toSet
+      else Set()
     }
 
     /**
@@ -506,8 +520,8 @@ object ConfigUtils extends Logging {
      * @return
      */
     implicit def configValue2map(value: ConfigValue): Map[String, Any] = {
-      if (value != null && value.value != null && value.value != None) any2map(value.value)
-      else throw new IllegalStateException("Value does not exist")
+      if (requiredValue(value)) any2map(value.value)
+      else Map()
     }
   }
 }
diff --git a/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigTest.scala b/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigTest.scala
index 92d0b9f63f60ad1a6c9489ba1d71fd3f25ab6828..b7353b2ad1d4a91cd05340edbd7a61a51e64e266 100644
--- a/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigTest.scala
+++ b/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigTest.scala
@@ -30,9 +30,6 @@ class ConfigTest extends TestNGSuite with Matchers with ConfigUtils.ImplicitConv
   @Test def testApply: Unit = {
     ConfigTest.config("m1", Nil, "k1").asString shouldBe "v2"
     ConfigTest.config("m1", Nil, "notexist", default = "default").asString shouldBe "default"
-    intercept[IllegalStateException] {
-      ConfigTest.config("m1", Nil, "notexist")
-    }
   }
 
   @Test def testMergeConfigs: Unit = {
diff --git a/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigurableTest.scala b/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigurableTest.scala
index 1b493f2e14df822b75534fed3722f88917882fe1..19940fde2ecb2c923cdbed79b9fcb85bd1ab4e39 100644
--- a/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigurableTest.scala
+++ b/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/core/config/ConfigurableTest.scala
@@ -11,10 +11,10 @@ import org.testng.annotations.Test
  */
 class ConfigurableTest extends TestNGSuite with Matchers {
   @Test def testConfigurable: Unit = {
-    Config.global.map = Map()
-    Config.global.loadConfigFile(ConfigurableTest.file)
-
-    val classC = new ClassC
+    val classC = new ClassC {
+      override def configName = "classc"
+      override val globalConfig = new Config(ConfigurableTest.map)
+    }
 
     classC.configPath shouldBe Nil
     classC.configFullPath shouldBe List("classc")
@@ -27,10 +27,6 @@ class ConfigurableTest extends TestNGSuite with Matchers {
     classC.classB.get("k1").asString shouldBe "c1"
     classC.classB.classA.get("k1").asString shouldBe "c1"
 
-    classC.get("notexist") shouldBe null
-    intercept[IllegalStateException] {
-      classC.get("notexist", required = true)
-    }
     classC.get("notexist", default = "default").asString shouldBe "default"
 
     classC.get("k1", freeVar = false).asString shouldBe "c1"
@@ -47,23 +43,24 @@ abstract class Cfg extends Configurable {
   def get(key: String,
           default: String = null,
           submodule: String = null,
-          required: Boolean = false,
           freeVar: Boolean = true,
           sample: String = null,
           library: String = null) = {
-    config(key, default, submodule, required, freeVar = freeVar, sample = sample, library = library)
+    config(key, default, submodule, freeVar = freeVar, sample = sample, library = library)
   }
 }
 
 class ClassA(val root: Configurable) extends Cfg
 
 class ClassB(val root: Configurable) extends Cfg {
-  val classA = new ClassA(this)
+  lazy val classA = new ClassA(this)
+  // Why this needs to be lazy?
 }
 
 class ClassC(val root: Configurable) extends Cfg {
   def this() = this(null)
-  val classB = new ClassB(this)
+  lazy val classB = new ClassB(this)
+  // Why this needs to be lazy?
 }
 
 object ConfigurableTest {
@@ -85,6 +82,4 @@ object ConfigurableTest {
       )
     )
   )
-
-  val file = ConfigUtilsTest.writeTemp(ConfigUtils.mapToJson(map).spaces2)
 }
diff --git a/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/utils/ConfigUtilsTest.scala b/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/utils/ConfigUtilsTest.scala
index 26f989c5369c4e138ded82620d1d03f0c076ce7c..ddcf887d819eb0edc09bfc5b6a42954115e62192 100644
--- a/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/utils/ConfigUtilsTest.scala
+++ b/public/biopet-framework/src/test/scala/nl/lumc/sasc/biopet/utils/ConfigUtilsTest.scala
@@ -4,6 +4,7 @@ import java.io.{ PrintWriter, File }
 
 import argonaut.Argonaut._
 import argonaut.Json
+import nl.lumc.sasc.biopet.core.BiopetQScript
 import nl.lumc.sasc.biopet.core.config.{ ConfigValueIndex, ConfigValue }
 import org.scalatest.Matchers
 import org.scalatest.mock.MockitoSugar
@@ -170,79 +171,23 @@ class ConfigUtilsTest extends TestNGSuite with Matchers {
     val index = ConfigValueIndex("test", Nil, "test")
     new ImplicitConversions {
       configValue2list(ConfigValue(index, index, List(""))) shouldBe List("")
-      intercept[IllegalStateException] {
-        configValue2list(ConfigValue(index, index, null))
-      }
-
       configValue2stringList(ConfigValue(index, index, List(""))) shouldBe List("")
-      intercept[IllegalStateException] {
-        configValue2stringList(ConfigValue(index, index, null))
-      }
-
       configValue2stringSet(ConfigValue(index, index, List(""))) shouldBe Set("")
-      intercept[IllegalStateException] {
-        configValue2stringSet(ConfigValue(index, index, null))
-      }
 
       var int: Int = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        int = ConfigValue(index, index, null)
-      }
-
       var long: Long = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        long = ConfigValue(index, index, null)
-      }
-
       var double: Double = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        double = ConfigValue(index, index, null)
-      }
-
       var float: Float = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        float = ConfigValue(index, index, null)
-      }
-
       var boolean: Boolean = ConfigValue(index, index, true)
-      intercept[IllegalStateException] {
-        boolean = ConfigValue(index, index, null)
-      }
-
       var intOption: Option[Int] = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        int = ConfigValue(index, index, null)
-      }
-
       var longOption: Option[Long] = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        long = ConfigValue(index, index, null)
-      }
-
       var doubleOption: Option[Double] = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        double = ConfigValue(index, index, null)
-      }
-
       var floatOption: Option[Float] = ConfigValue(index, index, 1)
-      intercept[IllegalStateException] {
-        float = ConfigValue(index, index, null)
-      }
-
       var booleanOption: Option[Boolean] = ConfigValue(index, index, true)
-      intercept[IllegalStateException] {
-        boolean = ConfigValue(index, index, null)
-      }
-
       var string: String = ConfigValue(index, index, "test")
-      intercept[IllegalStateException] {
-        string = ConfigValue(index, index, null)
-      }
-
       var file: File = ConfigValue(index, index, "test")
-      intercept[IllegalStateException] {
-        file = ConfigValue(index, index, null)
-      }
+
+      //TODO: test BiopetQScript error message
     }
   }
 }
diff --git a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Fastqc.scala b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Fastqc.scala
index 50ee00b2c5625226a00e0985bbe761ded375237c..21cb069d658623ab5a7b8986e454db6000f927fa 100644
--- a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Fastqc.scala
+++ b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Fastqc.scala
@@ -52,10 +52,7 @@ class Fastqc(root: Configurable) extends nl.lumc.sasc.biopet.extensions.Fastqc(r
    * @throws FileNotFoundException if the FastQC data file can not be found.
    * @throws IllegalStateException if the module lines have no content or mapping is empty.
    */
-  @throws(classOf[FileNotFoundException])
-  @throws(classOf[IllegalStateException])
   def qcModules: Map[String, FastQCModule] = {
-
     val fqModules = Source.fromFile(dataFile)
       // drop all the characters before the first module delimiter (i.e. '>>')
       .dropWhile(_ != '>')
@@ -93,14 +90,16 @@ class Fastqc(root: Configurable) extends nl.lumc.sasc.biopet.extensions.Fastqc(r
    * @throws NoSuchElementException when the "Basic Statistics" key does not exist in the mapping or
    *                                when a line starting with "Encoding" does not exist.
    */
-  @throws(classOf[NoSuchElementException])
-  def encoding: String =
-    qcModules("Basic Statistics")
-      .lines
-      .dropWhile(!_.startsWith("Encoding"))
-      .head
-      .stripPrefix("Encoding\t")
-      .stripSuffix("\t")
+  def encoding: String = {
+    if (dataFile.exists) // On a dry run this file does not yet exist
+      qcModules("Basic Statistics") //FIXME: not save
+        .lines
+        .dropWhile(!_.startsWith("Encoding"))
+        .head
+        .stripPrefix("Encoding\t")
+        .stripSuffix("\t")
+    else ""
+  }
 
   /** Case class representing a known adapter sequence */
   protected case class AdapterSequence(name: String, seq: String)
@@ -111,32 +110,33 @@ class Fastqc(root: Configurable) extends nl.lumc.sasc.biopet.extensions.Fastqc(r
    * @return a [[Set]] of [[AdapterSequence]] objects.
    */
   def foundAdapters: Set[AdapterSequence] = {
+    if (dataFile.exists) { // On a dry run this file does not yet exist
+      /** Returns a list of adapter and/or contaminant sequences known to FastQC */
+      def getFastqcSeqs(file: Option[File]): Set[AdapterSequence] = file match {
+        case None => Set.empty[AdapterSequence]
+        case Some(f) =>
+          (for {
+            line <- Source.fromFile(f).getLines()
+            if !line.startsWith("#")
+            values = line.split("\t+")
+            if values.size >= 2
+          } yield AdapterSequence(values(0), values(1))).toSet
+      }
+
+      val found = qcModules.get("Overrepresented sequences") match {
+        case None => Seq.empty[String]
+        case Some(qcModule) =>
+          for (
+            line <- qcModule.lines if !(line.startsWith("#") || line.startsWith(">"));
+            values = line.split("\t") if values.size >= 4
+          ) yield values(3)
+      }
 
-    /** Returns a list of adapter and/or contaminant sequences known to FastQC */
-    def getFastqcSeqs(file: Option[File]): Set[AdapterSequence] = file match {
-      case None => Set.empty[AdapterSequence]
-      case Some(f) =>
-        (for {
-          line <- Source.fromFile(f).getLines()
-          if !line.startsWith("#")
-          values = line.split("\t+")
-          if values.size >= 2
-        } yield AdapterSequence(values(0), values(1))).toSet
-    }
-
-    val found = qcModules.get("Overrepresented sequences") match {
-      case None => Seq.empty[String]
-      case Some(qcModule) =>
-        for (
-          line <- qcModule.lines if !(line.startsWith("#") || line.startsWith(">"));
-          values = line.split("\t") if values.size >= 4
-        ) yield values(3)
-    }
-
-    // select full sequences from known adapters and contaminants
-    // based on overrepresented sequences results
-    (getFastqcSeqs(adapters) ++ getFastqcSeqs(contaminants))
-      .filter(x => found.exists(_.startsWith(x.name)))
+      // select full sequences from known adapters and contaminants
+      // based on overrepresented sequences results
+      (getFastqcSeqs(adapters) ++ getFastqcSeqs(contaminants))
+        .filter(x => found.exists(_.startsWith(x.name)))
+    } else Set()
   }
 
   /** Summary of the FastQC run, stored in a [[Json]] object */
diff --git a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/SeqtkSeq.scala b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/SeqtkSeq.scala
index 0fdeee289de9672d917264e3e9dc2d556f6bc48b..05236e13cacae24e5b5dffb408e1aa01b1c297e4 100644
--- a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/SeqtkSeq.scala
+++ b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/SeqtkSeq.scala
@@ -27,11 +27,12 @@ class SeqtkSeq(root: Configurable) extends nl.lumc.sasc.biopet.extensions.seqtk.
     if (fastqc != null && Q == None) {
       val encoding = fastqc.encoding
       Q = encoding match {
-        case null                                       => None
+        case null => None
         case s if (s.contains("Sanger / Illumina 1.9")) => None
-        case s if (s.contains("Illumina <1.3"))         => Option(64)
-        case s if (s.contains("Illumina 1.3"))          => Option(64)
-        case s if (s.contains("Illumina 1.5"))          => Option(64)
+        case s if (s.contains("Illumina <1.3")) => Option(64)
+        case s if (s.contains("Illumina 1.3")) => Option(64)
+        case s if (s.contains("Illumina 1.5")) => Option(64)
+        case _ => None
       }
       if (Q != None) V = true
     }
diff --git a/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala b/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala
index ed55ca382d13346b3cbb7bb4862941ef4da591f5..77dba4b1469eba2d75bedafc9f53be7c23acb557 100644
--- a/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala
+++ b/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala
@@ -60,7 +60,7 @@ class Sage(val root: Configurable) extends QScript with MultiSampleQScript {
   class Sample(sampleId: String) extends AbstractSample(sampleId) {
     def makeLibrary(id: String) = new Library(id)
     class Library(libId: String) extends AbstractLibrary(libId) {
-      val inputFastq: File = config("R1", required = true)
+      val inputFastq: File = config("R1")
       val prefixFastq: File = createFile(".prefix.fastq")
 
       val flexiprep = new Flexiprep(qscript)
diff --git a/public/yamsvp/src/main/scala/nl/lumc/sasc/biopet/pipelines/yamsvp/Yamsvp.scala b/public/yamsvp/src/main/scala/nl/lumc/sasc/biopet/pipelines/yamsvp/Yamsvp.scala
index 206c92a69453105fb2034d6cd72cce00f5ab75cd..6e7257c7d94967eac350fc212e7c7b37ebf5dc58 100644
--- a/public/yamsvp/src/main/scala/nl/lumc/sasc/biopet/pipelines/yamsvp/Yamsvp.scala
+++ b/public/yamsvp/src/main/scala/nl/lumc/sasc/biopet/pipelines/yamsvp/Yamsvp.scala
@@ -35,7 +35,7 @@ import org.broadinstitute.gatk.queue.engine.JobRunInfo
 class Yamsvp(val root: Configurable) extends QScript with BiopetQScript { //with MultiSampleQScript {
   def this() = this(null)
 
-  var reference: File = config("reference", required = true)
+  var reference: File = config("reference")
   var finalBamFiles: List[File] = Nil
   /*
   class LibraryOutput extends AbstractLibraryOutput {