diff --git a/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/broad/GatkGeneral.scala b/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/broad/GatkGeneral.scala
index f0073f0116b99a92fcace99ec1979a907e29eb14..1c557e5223634fdc14d992313e006bca6b141c90 100644
--- a/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/broad/GatkGeneral.scala
+++ b/protected/biopet-gatk-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/broad/GatkGeneral.scala
@@ -5,11 +5,11 @@
  */
 package nl.lumc.sasc.biopet.extensions.gatk.broad
 
-import nl.lumc.sasc.biopet.core.{ CommandLineResources, Reference, BiopetJavaCommandLineFunction }
+import nl.lumc.sasc.biopet.core.{ Version, CommandLineResources, Reference, BiopetJavaCommandLineFunction }
 import org.broadinstitute.gatk.engine.phonehome.GATKRunReport
 import org.broadinstitute.gatk.queue.extensions.gatk.CommandLineGATK
 
-trait GatkGeneral extends CommandLineGATK with CommandLineResources with Reference {
+trait GatkGeneral extends CommandLineGATK with CommandLineResources with Reference with Version {
   memoryLimit = Option(3)
 
   override def subPath = "gatk" :: super.subPath
@@ -35,9 +35,9 @@ trait GatkGeneral extends CommandLineGATK with CommandLineResources with Referen
   if (config.contains("gatk_key")) gatk_key = config("gatk_key")
   if (config.contains("pedigree")) pedigree = config("pedigree")
 
-  //override def versionRegex = """(.*)""".r
-  //override def versionExitcode = List(0, 1)
-  //override def versionCommand = executable + " -jar " + jarFile + " -version"
+  def versionRegex = """(.*)""".r
+  override def versionExitcode = List(0, 1)
+  def versionCommand = "java" + " -jar " + jarFile + " -version"
 
-  //override def getVersion = super.getVersion.collect { case v => "Gatk " + v }
+  override def getVersion = super.getVersion.collect { case v => "Gatk " + v }
 }
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunction.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunction.scala
index 254e783cb9e31718a8b0759e7ce0d55c152d203d..45dbe227c72cd10243b38ea9865ed01f4ad493bc 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunction.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetCommandLineFunction.scala
@@ -146,59 +146,6 @@ trait BiopetCommandLineFunction extends CommandLineResources { biopetFunction =>
       case Some(n) if n > 0 => n
       case _                => 1
     })
-    addJobReportBinding("version", getVersion)
-  }
-
-  /** Command to get version of executable */
-  protected[core] def versionCommand: String = null
-
-  /** Regex to get version from version command output */
-  protected[core] def versionRegex: Regex = null
-
-  /** Allowed exit codes for the version command */
-  protected[core] def versionExitcode = List(0)
-
-  /** Executes the version command */
-  private[core] def getVersionInternal: Option[String] = {
-    if (versionCommand == null || versionRegex == null) None
-    else getVersionInternal(versionCommand, versionRegex)
-  }
-
-  /** Executes the version command */
-  private[core] def getVersionInternal(versionCommand: String, versionRegex: Regex): Option[String] = {
-    if (versionCommand == null || versionRegex == null) return None
-    val exe = new File(versionCommand.trim.split(" ")(0))
-    if (!exe.exists()) return None
-    val stdout = new StringBuffer()
-    val stderr = new StringBuffer()
-    def outputLog = "Version command: \n" + versionCommand +
-      "\n output log: \n stdout: \n" + stdout.toString +
-      "\n stderr: \n" + stderr.toString
-    val process = Process(versionCommand).run(ProcessLogger(stdout append _ + "\n", stderr append _ + "\n"))
-    if (!versionExitcode.contains(process.exitValue())) {
-      logger.warn("getVersion give exit code " + process.exitValue + ", version not found \n" + outputLog)
-      return None
-    }
-    for (line <- stdout.toString.split("\n") ++ stderr.toString.split("\n")) {
-      line match {
-        case versionRegex(m) => return Some(m)
-        case _               =>
-      }
-    }
-    logger.warn("getVersion give a exit code " + process.exitValue + " but no version was found, executable correct? \n" + outputLog)
-    None
-  }
-
-  /** Get version from cache otherwise execute the version command  */
-  def getVersion: Option[String] = {
-    if (!BiopetCommandLineFunction.executableCache.contains(executable))
-      preProcessExecutable()
-    if (!BiopetCommandLineFunction.versionCache.contains(versionCommand))
-      getVersionInternal match {
-        case Some(version) => BiopetCommandLineFunction.versionCache += versionCommand -> version
-        case _             =>
-      }
-    BiopetCommandLineFunction.versionCache.get(versionCommand)
   }
 
   private[core] var _inputAsStdin = false
@@ -284,7 +231,6 @@ trait BiopetCommandLineFunction extends CommandLineResources { biopetFunction =>
 
 /** stores global caches */
 object BiopetCommandLineFunction {
-  private[core] val versionCache: mutable.Map[String, String] = mutable.Map()
   private[core] val executableMd5Cache: mutable.Map[String, String] = mutable.Map()
   private[core] val executableCache: mutable.Map[String, String] = mutable.Map()
 }
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetFifoPipe.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetFifoPipe.scala
index ee06edb0a666a543c108c891092d5ac8ca7e23a6..7d38c60b2966c62e76e42c77922828ada9cbb897 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetFifoPipe.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetFifoPipe.scala
@@ -51,6 +51,9 @@ class BiopetFifoPipe(val root: Configurable,
 
     deps :::= inputs.values.toList.flatten.filter(!fifoFiles.contains(_))
     deps = deps.distinct
+
+    pipesJobs :::= commands
+    pipesJobs = pipesJobs.distinct
   }
 
   override def beforeCmd(): Unit = {
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetJavaCommandLineFunction.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetJavaCommandLineFunction.scala
index 3f75cb92128b26bfb2681a2a25cfb5436c9ac5f6..86e97f4c7dff893869eb8d8c7eec94c4389b9146 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetJavaCommandLineFunction.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/BiopetJavaCommandLineFunction.scala
@@ -55,12 +55,12 @@ trait BiopetJavaCommandLineFunction extends JavaCommandLineFunction with BiopetC
   def getJavaVersion: Option[String] = {
     if (!BiopetCommandLineFunction.executableCache.contains(executable))
       preProcessExecutable()
-    if (!BiopetCommandLineFunction.versionCache.contains(javaVersionCommand))
-      getVersionInternal(javaVersionCommand, """java version "(.*)"""".r) match {
-        case Some(version) => BiopetCommandLineFunction.versionCache += javaVersionCommand -> version
+    if (!Version.versionCache.contains(javaVersionCommand))
+      Version.getVersionInternal(javaVersionCommand, """java version "(.*)"""".r) match {
+        case Some(version) => Version.versionCache += javaVersionCommand -> version
         case _             =>
       }
-    BiopetCommandLineFunction.versionCache.get(javaVersionCommand)
+    Version.versionCache.get(javaVersionCommand)
   }
 
   override def setupRetry(): Unit = {
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
index 17631709f12db8a3e3b25253afc49fadd3820e32..f60aeeca83c20ad810ad2183a8938137200a0ee3 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
@@ -18,7 +18,7 @@ package nl.lumc.sasc.biopet.core
 import java.io.File
 
 import nl.lumc.sasc.biopet.core.summary.{ Summarizable, SummaryQScript }
-import nl.lumc.sasc.biopet.utils.ConfigUtils
+import nl.lumc.sasc.biopet.utils.{ Logging, ConfigUtils }
 import org.broadinstitute.gatk.utils.commandline.Argument
 
 /** This trait creates a structured way of use multisample pipelines */
@@ -47,6 +47,8 @@ trait MultiSampleQScript extends SummaryQScript {
 
       /** Adds the library jobs */
       final def addAndTrackJobs(): Unit = {
+        if (nameRegex.findFirstIn(libId) == None)
+          Logging.addError(s"Library '$libId' $nameError")
         currentSample = Some(sampleId)
         currentLib = Some(libId)
         addJobs()
@@ -90,6 +92,8 @@ trait MultiSampleQScript extends SummaryQScript {
 
     /** Adds sample jobs */
     final def addAndTrackJobs(): Unit = {
+      if (nameRegex.findFirstIn(sampleId) == None)
+        Logging.addError(s"Sample '$sampleId' $nameError")
       currentSample = Some(sampleId)
       addJobs()
       qscript.addSummarizable(this, "pipeline", Some(sampleId))
@@ -129,6 +133,12 @@ trait MultiSampleQScript extends SummaryQScript {
   /** Returns a list of all sampleIDs */
   protected def sampleIds: Set[String] = ConfigUtils.any2map(globalConfig.map("samples")).keySet
 
+  protected lazy val nameRegex = """^[a-zA-Z0-9][a-zA-Z0-9-_]+[a-zA-Z0-9]$""".r
+  protected lazy val nameError = " name invalid." +
+    "Name must have at least 3 characters," +
+    "must begin and end with an alphanumeric character, " +
+    "and must not have whitespace."
+
   /** Runs addAndTrackJobs method for each sample */
   final def addSamplesJobs() {
     if (onlySamples.isEmpty || samples.forall(x => onlySamples.contains(x._1))) {
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommandFuntion.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommandFunction.scala
similarity index 78%
rename from public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommandFuntion.scala
rename to public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommandFunction.scala
index 81220f9cb9d56703dfd7bebcddc0c14fa9966e0d..c29332656ca730eb91c84514f4d1e64c939b02a7 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommandFuntion.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommandFunction.scala
@@ -5,9 +5,12 @@ import nl.lumc.sasc.biopet.FullVersion
 /**
  * Created by pjvanthof on 11/09/15.
  */
-trait ToolCommandFuntion extends BiopetJavaCommandLineFunction {
+trait ToolCommandFunction extends BiopetJavaCommandLineFunction with Version {
   def toolObject: Object
 
+  def versionCommand = ""
+  def versionRegex = "".r
+
   override def getVersion = Some("Biopet " + FullVersion)
 
   override def beforeGraph(): Unit = {
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/Version.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/Version.scala
new file mode 100644
index 0000000000000000000000000000000000000000..d283729b2c5a853461d7d75a56eb8d5cb8125c0f
--- /dev/null
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/Version.scala
@@ -0,0 +1,80 @@
+package nl.lumc.sasc.biopet.core
+
+import java.io.File
+
+import nl.lumc.sasc.biopet.utils.Logging
+import org.broadinstitute.gatk.queue.function.QFunction
+
+import scala.collection.mutable
+import scala.sys.process.{ Process, ProcessLogger }
+import scala.util.matching.Regex
+
+/**
+ * Created by pjvan_thof on 10/13/15.
+ */
+trait Version extends QFunction {
+  /** Command to get version of executable */
+  def versionCommand: String
+
+  /** Regex to get version from version command output */
+  def versionRegex: Regex
+
+  /** Allowed exit codes for the version command */
+  protected[core] def versionExitcode = List(0)
+
+  /** Executes the version command */
+  private[core] def getVersionInternal: Option[String] = {
+    if (versionCommand == null || versionRegex == null) None
+    else Version.getVersionInternal(versionCommand, versionRegex, versionExitcode)
+  }
+
+  /** Get version from cache otherwise execute the version command  */
+  def getVersion: Option[String] = {
+    if (!Version.versionCache.contains(versionCommand))
+      getVersionInternal match {
+        case Some(version) => Version.versionCache += versionCommand -> version
+        case _             =>
+      }
+    Version.versionCache.get(versionCommand)
+  }
+
+  override def freezeFieldValues(): Unit = {
+    super.freezeFieldValues()
+    addJobReportBinding("version", getVersion.getOrElse("NA"))
+  }
+}
+
+object Version extends Logging {
+  private[core] val versionCache: mutable.Map[String, String] = mutable.Map()
+
+  /** Executes the version command */
+  private[core] def getVersionInternal(versionCommand: String,
+                                       versionRegex: Regex,
+                                       versionExitcode: List[Int] = List(0)): Option[String] = {
+    if (versionCache.contains(versionCommand)) return versionCache.get(versionCommand)
+    else if (versionCommand == null || versionRegex == null) return None
+    else {
+      val exe = new File(versionCommand.trim.split(" ")(0))
+      if (!exe.exists()) return None
+      val stdout = new StringBuffer()
+      val stderr = new StringBuffer()
+      def outputLog = "Version command: \n" + versionCommand +
+        "\n output log: \n stdout: \n" + stdout.toString +
+        "\n stderr: \n" + stderr.toString
+      val process = Process(versionCommand).run(ProcessLogger(stdout append _ + "\n", stderr append _ + "\n"))
+      if (!versionExitcode.contains(process.exitValue())) {
+        logger.warn("getVersion give exit code " + process.exitValue + ", version not found \n" + outputLog)
+        return None
+      }
+      for (line <- stdout.toString.split("\n") ++ stderr.toString.split("\n")) {
+        line match {
+          case versionRegex(m) => return Some(m)
+          case _               =>
+        }
+      }
+      logger.warn("getVersion give a exit code " + process.exitValue + " but no version was found, executable correct? \n" + outputLog)
+      None
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/extensions/Md5sum.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/extensions/Md5sum.scala
index 90e577e01804ac1884d71de9613e3416d837fc92..c3af260a84733c1c90fda13353b7391b7893d136 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/extensions/Md5sum.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/extensions/Md5sum.scala
@@ -17,12 +17,12 @@ package nl.lumc.sasc.biopet.core.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /** Extension for md5sum */
-class Md5sum(val root: Configurable) extends BiopetCommandLineFunction {
+class Md5sum(val root: Configurable) extends BiopetCommandLineFunction with Version {
   @Input(doc = "Input")
   var input: File = _
 
@@ -31,8 +31,8 @@ class Md5sum(val root: Configurable) extends BiopetCommandLineFunction {
 
   executable = config("exe", default = "md5sum")
 
-  override def versionRegex = """md5sum \(GNU coreutils\) (.*)""".r
-  override def versionCommand = executable + " --version"
+  def versionRegex = """md5sum \(GNU coreutils\) (.*)""".r
+  def versionCommand = executable + " --version"
 
   /** return commandline to execute */
   def cmdLine = required(executable) + required(input) + " > " + required(output)
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/report/ReportBuilder.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/report/ReportBuilder.scala
index b4f7b3c31c48a8d8a52d3128d4ea5eb6b825dbca..311e3e928ba2919ff15ce0cee5529b9f0d28c9e8 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/report/ReportBuilder.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/report/ReportBuilder.scala
@@ -16,7 +16,7 @@
 package nl.lumc.sasc.biopet.core.report
 
 import java.io._
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.summary.Summary
 import nl.lumc.sasc.biopet.utils.{ ToolCommand, Logging, IoUtils }
 import org.broadinstitute.gatk.utils.commandline.Input
@@ -28,7 +28,7 @@ import scala.collection.mutable
  *
  * @author pjvan_thof
  */
-trait ReportBuilderExtension extends ToolCommandFuntion {
+trait ReportBuilderExtension extends ToolCommandFunction {
 
   /** Report builder object */
   val builder: ReportBuilder
diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/summary/WriteSummary.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/summary/WriteSummary.scala
index 6e7f8248c0693ed0df4c3a372b8885e1908187a7..7b8f34ecbb8108d53c342df2f4112df973f702c3 100644
--- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/summary/WriteSummary.scala
+++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/summary/WriteSummary.scala
@@ -18,7 +18,7 @@ package nl.lumc.sasc.biopet.core.summary
 import java.io.{ File, PrintWriter }
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, BiopetJavaCommandLineFunction, SampleLibraryTag }
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction, BiopetJavaCommandLineFunction, SampleLibraryTag }
 import nl.lumc.sasc.biopet.utils.ConfigUtils
 import nl.lumc.sasc.biopet.{ LastCommitHash, Version }
 import org.broadinstitute.gatk.queue.function.{ InProcessFunction, QFunction }
@@ -71,21 +71,32 @@ class WriteSummary(val root: Configurable) extends InProcessFunction with Config
       val files = parseFiles(qscript.summaryFiles)
       val settings = qscript.summarySettings
       val executables: Map[String, Any] = {
-        (for (f <- qscript.functions if f.isInstanceOf[BiopetCommandLineFunction]) yield {
+
+        def fetchVersion(f: QFunction): Option[(String, Any)] = {
           f match {
-            case f: BiopetJavaCommandLineFunction =>
-              f.configName -> Map("version" -> f.getVersion.getOrElse(None),
+            case f: BiopetJavaCommandLineFunction with Version =>
+              Some(f.configName -> Map("version" -> f.getVersion.getOrElse(None),
                 "java_md5" -> BiopetCommandLineFunction.executableMd5Cache.getOrElse(f.executable, None),
                 "java_version" -> f.getJavaVersion,
-                "jar_path" -> f.jarFile)
-            case f: BiopetCommandLineFunction =>
-              f.configName -> Map("version" -> f.getVersion.getOrElse(None),
+                "jar_path" -> f.jarFile))
+            case f: BiopetCommandLineFunction with Version =>
+              Some(f.configName -> Map("version" -> f.getVersion.getOrElse(None),
                 "md5" -> BiopetCommandLineFunction.executableMd5Cache.getOrElse(f.executable, None),
-                "path" -> f.executable)
-            case _ => throw new IllegalStateException("This should not be possible")
+                "path" -> f.executable))
+            case f: Configurable with Version =>
+              Some(f.configName -> Map("version" -> f.getVersion.getOrElse(None)))
+            case _ => None
           }
-
-        }).toMap
+        }
+
+        (
+          qscript.functions.flatMap(fetchVersion(_)) ++
+          qscript.functions
+          .flatMap {
+            case f: BiopetCommandLineFunction => f.pipesJobs
+            case _                            => Nil
+          }.flatMap(fetchVersion(_))
+        ).toMap
       }
 
       val map = Map(qscript.summaryName -> ((if (settings.isEmpty) Map[String, Any]() else Map("settings" -> settings)) ++
@@ -113,7 +124,7 @@ class WriteSummary(val root: Configurable) extends InProcessFunction with Config
     }).foldRight(jobsMap)((a, b) => ConfigUtils.mergeMaps(a, b)) ++
       Map("meta" -> Map(
         "last_commit_hash" -> LastCommitHash,
-        "pipeline_version" -> Version,
+        "pipeline_version" -> nl.lumc.sasc.biopet.Version,
         "pipeline_name" -> qscript.summaryName,
         "output_dir" -> qscript.outputDir,
         "run_name" -> config("run_name", default = qSettings.runName).asString,
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala
index fc2f95e4e33f54dca689568bb48cb8489ed3e65d..21dcc313ce1e4ff0f20b253d81651cf1369f3cab 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Bowtie.scala
@@ -18,7 +18,7 @@ package nl.lumc.sasc.biopet.extensions
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, Reference }
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction, Reference }
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /**
@@ -26,7 +26,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  *
  * Based on version 1.1.1
  */
-class Bowtie(val root: Configurable) extends BiopetCommandLineFunction with Reference {
+class Bowtie(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
   @Input(doc = "Fastq file R1", shortName = "R1")
   var R1: File = null
 
@@ -40,9 +40,9 @@ class Bowtie(val root: Configurable) extends BiopetCommandLineFunction with Refe
   var output: File = null
 
   executable = config("exe", default = "bowtie", freeVar = false)
-  override def versionRegex = """.*[Vv]ersion:? (.*)""".r
+  def versionRegex = """.*[Vv]ersion:? (.*)""".r
   override def versionExitcode = List(0, 1)
-  override def versionCommand = executable + " --version"
+  def versionCommand = executable + " --version"
 
   override def defaultCoreMemory = 4.0
   override def defaultThreads = 8
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cufflinks.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cufflinks.scala
index 30a1ca0f418ac0e5f3495ef75ba7478a28f5adc7..9177b7a6b8a7c6828c574d3d88b2d4610137e998 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cufflinks.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cufflinks.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -25,7 +25,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  * Wrapper for the cufflinks command line tool.
  * Written based on cufflinks version v2.2.1 (md5: 07c831c4f8b4e161882731ea5694ff80)
  */
-class Cufflinks(val root: Configurable) extends BiopetCommandLineFunction {
+class Cufflinks(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   /** default executable */
   executable = config("exe", default = "cufflinks")
@@ -185,8 +185,8 @@ class Cufflinks(val root: Configurable) extends BiopetCommandLineFunction {
   /** do not contact server to check for update availability [FALSE] */
   var no_update_check: Boolean = config("no_update_check", default = false)
 
-  override def versionRegex = """cufflinks v(.*)""".r
-  override def versionCommand = executable
+  def versionRegex = """cufflinks v(.*)""".r
+  def versionCommand = executable
   override def versionExitcode = List(0, 1)
 
   def cmdLine =
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cuffquant.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cuffquant.scala
index ffadc5d2dfc6fd8bbb4c22ea099d96be344b8cdf..d7ead689a92b19dbb38dccee1eb8b96312736923 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cuffquant.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cuffquant.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -25,7 +25,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  * Wrapper for the cuffquant command line tool.
  * Written based on cuffquant version v2.2.1 (md5: 0765b82b11db9256f5be341a7da884d6)
  */
-class Cuffquant(val root: Configurable) extends BiopetCommandLineFunction {
+class Cuffquant(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   /** default executable */
   executable = config("exe", default = "cuffquant")
@@ -117,8 +117,8 @@ class Cuffquant(val root: Configurable) extends BiopetCommandLineFunction {
   /** Disable SCV correction */
   var no_scv_correction: Boolean = config("no_scv_correction", default = false)
 
-  override def versionRegex = """cuffquant v(.*)""".r
-  override def versionCommand = executable
+  def versionRegex = """cuffquant v(.*)""".r
+  def versionCommand = executable
   override def versionExitcode = List(0, 1)
 
   def cmdLine =
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cutadapt.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cutadapt.scala
index 43dd6826912c4390f0ac30148081536ac3ac7d05..e8f9c2caf43ff1163218a5814bfa0ba45f0b6ceb 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cutadapt.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cutadapt.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import nl.lumc.sasc.biopet.core.summary.Summarizable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
@@ -29,7 +29,7 @@ import scala.io.Source
  * Extension for cutadept
  * Based on version 1.5
  */
-class Cutadapt(val root: Configurable) extends BiopetCommandLineFunction with Summarizable {
+class Cutadapt(val root: Configurable) extends BiopetCommandLineFunction with Summarizable with Version {
   @Input(doc = "Input fastq file")
   var fastq_input: File = _
 
@@ -40,8 +40,8 @@ class Cutadapt(val root: Configurable) extends BiopetCommandLineFunction with Su
   var stats_output: File = _
 
   executable = config("exe", default = "cutadapt")
-  override def versionCommand = executable + " --version"
-  override def versionRegex = """(.*)""".r
+  def versionCommand = executable + " --version"
+  def versionRegex = """(.*)""".r
 
   var default_clip_mode: String = config("default_clip_mode", default = "3")
   var opt_adapter: Set[String] = config("adapter", default = Nil)
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala
index 6f0eea34bde472b7be68ba275244681974776b64..8906bf134cfef63df8aa86620eea51ab9e918893 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Fastqc.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -25,7 +25,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  * Extension for fastqc
  * Based on version 0.10.1 and 0.11.2
  */
-class Fastqc(val root: Configurable) extends BiopetCommandLineFunction {
+class Fastqc(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   @Input(doc = "Contaminants", required = false)
   var contaminants: Option[File] = None
@@ -47,8 +47,8 @@ class Fastqc(val root: Configurable) extends BiopetCommandLineFunction {
   var nogroup: Boolean = config("nogroup", default = false)
   var extract: Boolean = config("extract", default = true)
 
-  override def versionRegex = """FastQC (.*)""".r
-  override def versionCommand = executable + " --version"
+  def versionRegex = """FastQC (.*)""".r
+  def versionCommand = executable + " --version"
   override def defaultThreads = 4
 
   /** Sets contaminants and adapters when not yet set */
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Freebayes.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Freebayes.scala
index 0e7cc1077a5a14f6ce8f829f6fb9009bd8930e40..f2a387a08b50e37f44dcb21911acff65bab808c3 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Freebayes.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Freebayes.scala
@@ -18,7 +18,7 @@ package nl.lumc.sasc.biopet.extensions
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, Reference }
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction, Reference }
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /**
@@ -26,7 +26,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  *
  * Created by pjvan_thof on 3/3/15.
  */
-class Freebayes(val root: Configurable) extends BiopetCommandLineFunction with Reference {
+class Freebayes(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
 
   @Input(required = true)
   var bamfiles: List[File] = Nil
@@ -41,8 +41,8 @@ class Freebayes(val root: Configurable) extends BiopetCommandLineFunction with R
   var haplotypeLength: Option[Int] = config("haplotype_length")
 
   executable = config("exe", default = "freebayes")
-  override def versionRegex = """version:  (.*)""".r
-  override def versionCommand = executable + " --version"
+  def versionRegex = """version:  (.*)""".r
+  def versionCommand = executable + " --version"
 
   override def beforeGraph(): Unit = {
     super.beforeGraph()
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gsnap.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gsnap.scala
index 8604639800a0bf93620c9fe790a1cbccd5b32874..721ba8575bc8c7edff7854163fba57a0afe3e474 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gsnap.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gsnap.scala
@@ -18,14 +18,14 @@ package nl.lumc.sasc.biopet.extensions
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, Reference }
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction, Reference }
 import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
 
 /**
  * Wrapper for the gsnap command line tool
  * Written based on gsnap version 2014-05-15
  */
-class Gsnap(val root: Configurable) extends BiopetCommandLineFunction with Reference {
+class Gsnap(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
 
   /** default executable */
   executable = config("exe", default = "gsnap", freeVar = false)
@@ -328,8 +328,8 @@ class Gsnap(val root: Configurable) extends BiopetCommandLineFunction with Refer
   /** value to put into read-group library (rg-pl) field */
   var read_group_platform: Option[String] = config("read_group_platform")
 
-  override def versionRegex = """.* version (.*)""".r
-  override def versionCommand = executable + " --version"
+  def versionRegex = """.* version (.*)""".r
+  def versionCommand = executable + " --version"
 
   def cmdLine = {
     required(executable) +
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gzip.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gzip.scala
index 98bd00339c83e2a955372da3344c7a1f5debb257..7969ae1bc18210fab5a36658b8fb93ac7ff9a712 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gzip.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Gzip.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class Gzip(val root: Configurable) extends BiopetCommandLineFunction {
+class Gzip(val root: Configurable) extends BiopetCommandLineFunction with Version {
   @Input(doc = "Input file", required = true)
   var input: List[File] = Nil
 
@@ -30,8 +30,8 @@ class Gzip(val root: Configurable) extends BiopetCommandLineFunction {
 
   executable = config("exe", default = "gzip", freeVar = false)
 
-  override def versionRegex = """gzip (.*)""".r
-  override def versionCommand = executable + " --version"
+  def versionRegex = """gzip (.*)""".r
+  def versionCommand = executable + " --version"
 
   def cmdLine = required(executable) + " -c " +
     (if (inputAsStdin) "" else repeat(input)) +
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/HtseqCount.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/HtseqCount.scala
index adf25ba3cf1caf2b159950c0457c85d2ac4c71f0..9e632272c1b1d28a29bd535783be00722922847d 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/HtseqCount.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/HtseqCount.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -25,7 +25,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  * Wrapper for the htseq-count command line tool
  * Written based on htseq-count version 0.6.1p1
  */
-class HtseqCount(val root: Configurable) extends BiopetCommandLineFunction {
+class HtseqCount(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   /** default executable */
   executable = config("exe", default = "htseq-count")
@@ -70,8 +70,8 @@ class HtseqCount(val root: Configurable) extends BiopetCommandLineFunction {
   /** suppress progress report */
   var quiet: Boolean = config("quiet", default = false)
 
-  override def versionRegex = """.*, version (.*)\.""".r
-  override def versionCommand = executable + " --help"
+  def versionRegex = """.*, version (.*)\.""".r
+  def versionCommand = executable + " --help"
 
   def cmdLine = {
     required(executable) +
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Raxml.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Raxml.scala
index f2f6eb21b9eaa2dc9956429906723f72f4400ee4..94fe47c338a366b126fb4c7a5dacccec93e047a5 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Raxml.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Raxml.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
 
@@ -27,11 +27,11 @@ import scalaz.std.boolean.option
  * extension for raxml
  * based on version 8.1.3
  */
-class Raxml(val root: Configurable) extends BiopetCommandLineFunction {
+class Raxml(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   override def defaultThreads = 1
-  override def versionCommand = executable + " -v"
-  override def versionRegex = """.*version ([\w\.]*) .*""".r
+  def versionCommand = executable + " -v"
+  def versionRegex = """.*version ([\w\.]*) .*""".r
 
   @Input(doc = "Input phy/fasta file", required = true)
   var input: File = _
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Sickle.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Sickle.scala
index fe88be1adc2bda814157a0578ff9e4bfa622fb0a..f6571f22065809adacdee46f345997b344897018 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Sickle.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Sickle.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import nl.lumc.sasc.biopet.core.summary.Summarizable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
@@ -29,7 +29,7 @@ import scala.io.Source
  * Extension for sickle
  * Based on version 1.33
  */
-class Sickle(val root: Configurable) extends BiopetCommandLineFunction with Summarizable {
+class Sickle(val root: Configurable) extends BiopetCommandLineFunction with Summarizable with Version {
   @Input(doc = "R1 input")
   var input_R1: File = _
 
@@ -56,8 +56,8 @@ class Sickle(val root: Configurable) extends BiopetCommandLineFunction with Summ
   var discardN: Boolean = config("discardN", default = false)
   var quiet: Boolean = config("quiet", default = false)
   var defaultQualityType: String = config("defaultqualitytype", default = "sanger")
-  override def versionRegex = """sickle version (.*)""".r
-  override def versionCommand = executable + " --version"
+  def versionRegex = """sickle version (.*)""".r
+  def versionCommand = executable + " --version"
 
   /** Sets qualityType is still empty */
   override def beforeGraph() {
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala
index 0ae011df060922f88fd22c22e20c45bdcee13801..8f18001f7acd4acbae269f1fcebaf0c97b6b2bd0 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Stampy.scala
@@ -18,11 +18,11 @@ package nl.lumc.sasc.biopet.extensions
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, Reference }
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction, Reference }
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /** Extension for stampy */
-class Stampy(val root: Configurable) extends BiopetCommandLineFunction with Reference {
+class Stampy(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
   @Input(doc = "FastQ file R1", shortName = "R1")
   var R1: File = _
 
@@ -60,14 +60,14 @@ class Stampy(val root: Configurable) extends BiopetCommandLineFunction with Refe
   var logfile: Option[String] = config("logfile")
 
   executable = config("exe", default = "stampy.py", freeVar = false)
-  override def versionRegex = """stampy v(.*) \(.*\), .*""".r
+  def versionRegex = """stampy v(.*) \(.*\), .*""".r
   override def versionExitcode = List(0, 1)
 
   /// Stampy uses approx factor 1.1 times the size of the genome in memory.
   override def defaultCoreMemory = 4.0
   override def defaultThreads = 8
 
-  override def versionCommand = executable + " --help"
+  def versionCommand = executable + " --help"
 
   /** Sets readgroup when not set yet */
   override def beforeGraph(): Unit = {
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tabix.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tabix.scala
index 4a80600c52cb602c579c5b09ba27931c09f2c338..4b9bf4a37779ed6f3390c6890d43136809c6cb6f 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tabix.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tabix.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
 
@@ -27,7 +27,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
  * Note that tabix can either index a file (no stdout stream) or retrieve regions from an indexed file (stdout stream)
  *
  */
-class Tabix(val root: Configurable) extends BiopetCommandLineFunction {
+class Tabix(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   @Input(doc = "Input bgzipped file", required = true)
   var input: File = null
@@ -59,8 +59,8 @@ class Tabix(val root: Configurable) extends BiopetCommandLineFunction {
 
   executable = config("exe", default = "tabix")
 
-  override def versionCommand = executable
-  override def versionRegex = """Version: (.*)""".r
+  def versionCommand = executable
+  def versionRegex = """Version: (.*)""".r
   override def versionExitcode = List(0, 1)
 
   /** Formats that tabix can handle */
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tophat.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tophat.scala
index 98379193eec3008a2545bd2dc3001713b1df0083..495049da762dee0509e4f8ecb4e208ac0c3dfe3a 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tophat.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Tophat.scala
@@ -17,20 +17,20 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.{ Reference, BiopetCommandLineFunction }
+import nl.lumc.sasc.biopet.core.{ Version, Reference, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
 
 /**
  * Extension for Tophat
  */
-class Tophat(val root: Configurable) extends BiopetCommandLineFunction with Reference {
+class Tophat(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
 
   executable = config("exe", default = "tophat", freeVar = false)
 
-  override def versionRegex = """TopHat v(.*)""".r
+  def versionRegex = """TopHat v(.*)""".r
   override def versionExitcode = List(0, 1)
-  override def versionCommand = executable + " --version"
+  def versionCommand = executable + " --version"
 
   override def defaultCoreMemory = 4.0
   override def defaultThreads = 8
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/VariantEffectPredictor.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/VariantEffectPredictor.scala
index 7a9efb0ff7087fcca7462dd6efc9d0ac7432f1b4..e9878f9808abb1f6a875e9c35412db6c2ac38d23 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/VariantEffectPredictor.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/VariantEffectPredictor.scala
@@ -18,14 +18,14 @@ package nl.lumc.sasc.biopet.extensions
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, Reference }
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction, Reference }
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /**
  * Extension for VariantEffectPredictor
  * Created by ahbbollen on 15-1-15.
  */
-class VariantEffectPredictor(val root: Configurable) extends BiopetCommandLineFunction with Reference {
+class VariantEffectPredictor(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
 
   executable = config("exe", submodule = "perl", default = "perl")
   var vepScript: String = config("vep_script")
@@ -36,8 +36,8 @@ class VariantEffectPredictor(val root: Configurable) extends BiopetCommandLineFu
   @Output(doc = "output file", required = true)
   var output: File = null
 
-  override def versionRegex = """version (\d*)""".r
-  override def versionCommand = executable + " " + vepScript + " --help"
+  def versionRegex = """version (\d*)""".r
+  def versionCommand = executable + " " + vepScript + " --help"
 
   //Boolean vars
   var v: Boolean = config("v", default = true)
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Zcat.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Zcat.scala
index be5eb6700c6c1610c33c0e1f0fa132089db81bfc..a72b7a84aa7083293e505b4dd975bfcf35f6374a 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Zcat.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Zcat.scala
@@ -17,12 +17,12 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /** Extension for zcat */
-class Zcat(val root: Configurable) extends BiopetCommandLineFunction {
+class Zcat(val root: Configurable) extends BiopetCommandLineFunction with Version {
   @Input(doc = "Zipped file", required = true)
   var input: List[File] = _
 
@@ -31,8 +31,8 @@ class Zcat(val root: Configurable) extends BiopetCommandLineFunction {
 
   executable = config("exe", default = "zcat")
 
-  override def versionRegex = """zcat \(gzip\) (.*)""".r
-  override def versionCommand = executable + " --version"
+  def versionRegex = """zcat \(gzip\) (.*)""".r
+  def versionCommand = executable + " --version"
 
   /** Returns command to execute */
   def cmdLine = required(executable) +
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/Bcftools.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/Bcftools.scala
index 5071c3aefe7092e2660ac9051ff34c8d90435e74..6e7bf4146464e9c6f69e7759569985fce7204e23 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/Bcftools.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/Bcftools.scala
@@ -15,12 +15,12 @@
  */
 package nl.lumc.sasc.biopet.extensions.bcftools
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
-abstract class Bcftools extends BiopetCommandLineFunction {
+abstract class Bcftools extends BiopetCommandLineFunction with Version {
   override def subPath = "bcftools" :: super.subPath
   executable = config("exe", default = "bcftools")
-  override def versionCommand = executable
-  override def versionRegex = """Version: (.*)""".r
+  def versionCommand = executable
+  def versionRegex = """Version: (.*)""".r
   override def versionExitcode = List(0, 1)
 }
\ No newline at end of file
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/Bedtools.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/Bedtools.scala
index 96b073ffe9390e9802e59eb42095546ef79c7344..1933cbea798a11c314f267df611aa09bccb5f92c 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/Bedtools.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/Bedtools.scala
@@ -15,12 +15,12 @@
  */
 package nl.lumc.sasc.biopet.extensions.bedtools
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
 /** General abstract class for bedtools extensions */
-abstract class Bedtools extends BiopetCommandLineFunction {
+abstract class Bedtools extends BiopetCommandLineFunction with Version {
   override def subPath = "bedtools" :: super.subPath
   executable = config("exe", default = "bedtools", submodule = "bedtools")
-  override def versionCommand = executable + " --version"
-  override def versionRegex = """bedtools (.*)""".r
+  def versionCommand = executable + " --version"
+  def versionRegex = """bedtools (.*)""".r
 }
\ No newline at end of file
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/breakdancer/BreakdancerCaller.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/breakdancer/BreakdancerCaller.scala
index a760c10b1be47f7e5414dee9a2cf7f7aa9e4a416..8247686aeea0eca56d0aae9b7716c0367c2ab2b9 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/breakdancer/BreakdancerCaller.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/breakdancer/BreakdancerCaller.scala
@@ -17,18 +17,18 @@ package nl.lumc.sasc.biopet.extensions.breakdancer
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class BreakdancerCaller(val root: Configurable) extends BiopetCommandLineFunction {
+class BreakdancerCaller(val root: Configurable) extends BiopetCommandLineFunction with Version {
   executable = config("exe", default = "breakdancer-max", freeVar = false)
 
   override def defaultThreads = 1 // breakdancer can only work on 1 single thread
 
-  override def versionRegex = """.*[Vv]ersion:? (.*)""".r
+  def versionRegex = """.*[Vv]ersion:? (.*)""".r
   override def versionExitcode = List(1)
-  override def versionCommand = executable
+  def versionCommand = executable
 
   @Input(doc = "The breakdancer configuration file")
   var input: File = _
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/Bwa.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/Bwa.scala
index a2cc17fae2c565dc8674a644afa3934423ef4378..7454020b508b143e36dce4aa30cc770938e3a501 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/Bwa.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bwa/Bwa.scala
@@ -15,17 +15,17 @@
  */
 package nl.lumc.sasc.biopet.extensions.bwa
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
 /**
  * General bwa extension
  *
  * Created by pjvan_thof on 1/16/15.
  */
-abstract class Bwa extends BiopetCommandLineFunction {
+abstract class Bwa extends BiopetCommandLineFunction with Version {
   override def subPath = "bwa" :: super.subPath
   executable = config("exe", default = "bwa")
-  override def versionRegex = """Version: (.*)""".r
+  def versionRegex = """Version: (.*)""".r
   override def versionExitcode = List(0, 1)
-  override def versionCommand = executable
+  def versionCommand = executable
 }
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/clever/CleverCaller.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/clever/CleverCaller.scala
index 02a0afec29287b3cda576842b36db9316ad0b401..ff670a33138847c3bb28b1c36d40cd3568e18364 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/clever/CleverCaller.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/clever/CleverCaller.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.clever
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.{ Reference, BiopetCommandLineFunction }
+import nl.lumc.sasc.biopet.core.{ Version, Reference, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
 
-class CleverCaller(val root: Configurable) extends BiopetCommandLineFunction with Reference {
+class CleverCaller(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
   executable = config("exe", default = "clever")
 
   private lazy val versionExecutable: File = config("version_exe", default = new File(executable).getParent + "/ctk-version")
@@ -29,8 +29,8 @@ class CleverCaller(val root: Configurable) extends BiopetCommandLineFunction wit
   override def defaultThreads = 8
   override def defaultCoreMemory = 3.0
 
-  override def versionCommand = versionExecutable.getAbsolutePath
-  override def versionRegex = """(.*)""".r
+  def versionCommand = versionExecutable.getAbsolutePath
+  def versionRegex = """(.*)""".r
   override def versionExitcode = List(0, 1)
 
   @Input(doc = "Input file (bam)")
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/conifer/Conifer.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/conifer/Conifer.scala
index 1488cabc468071702f4b2c748e2a2363dac9d810..5f517d7b338f0236fe051edd320ea9e4d4775fdb 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/conifer/Conifer.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/conifer/Conifer.scala
@@ -15,15 +15,16 @@
  */
 package nl.lumc.sasc.biopet.extensions.conifer
 
+import nl.lumc.sasc.biopet.core.Version
 import nl.lumc.sasc.biopet.core.extensions.PythonCommandLineFunction
 
-abstract class Conifer extends PythonCommandLineFunction {
+abstract class Conifer extends PythonCommandLineFunction with Version {
   override def subPath = "conifer" :: super.subPath
   //  executable = config("exe", default = "conifer")
   setPythonScript(config("script", default = "conifer"))
-  override def versionRegex = """(.*)""".r
+  def versionRegex = """(.*)""".r
   override def versionExitcode = List(0)
-  override def versionCommand = executable + " " + python_script + " --version"
+  def versionCommand = executable + " " + python_script + " --version"
 
   override def defaultCoreMemory = 5.0
   override def defaultThreads = 1
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/delly/DellyCaller.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/delly/DellyCaller.scala
index 8863baa50114a0c33c8d4e1d3df5c07101168284..137165f2bbe8d755240a95b1a84cf639110c4b79 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/delly/DellyCaller.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/delly/DellyCaller.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.delly
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
 
-class DellyCaller(val root: Configurable) extends BiopetCommandLineFunction {
+class DellyCaller(val root: Configurable) extends BiopetCommandLineFunction with Version {
   executable = config("exe", default = "delly")
 
   private lazy val versionexecutable: File = new File(executable)
@@ -29,8 +29,8 @@ class DellyCaller(val root: Configurable) extends BiopetCommandLineFunction {
   override def defaultThreads = 1
   override def defaultCoreMemory = 4.0
 
-  override def versionCommand = versionexecutable.getAbsolutePath
-  override def versionRegex = """DELLY \(Version: (.*)\)""".r
+  def versionCommand = versionexecutable.getAbsolutePath
+  def versionRegex = """DELLY \(Version: (.*)\)""".r
   override def versionExitcode = List(0, 1)
 
   @Input(doc = "Input file (bam)")
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/Gatk.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/Gatk.scala
index 108253762bab534ab7740512da5ec692158dd0d4..4bffa97fe173c113697803257e7cd1f206e97027 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/Gatk.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/gatk/Gatk.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions.gatk
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.{ BiopetJavaCommandLineFunction, Reference }
+import nl.lumc.sasc.biopet.core.{ Version, BiopetJavaCommandLineFunction, Reference }
 import org.broadinstitute.gatk.utils.commandline.Input
 
 /**
@@ -25,7 +25,7 @@ import org.broadinstitute.gatk.utils.commandline.Input
  *
  * Created by pjvan_thof on 2/26/15.
  */
-abstract class Gatk extends BiopetJavaCommandLineFunction with Reference {
+abstract class Gatk extends BiopetJavaCommandLineFunction with Reference with Version {
   override def subPath = "gatk" :: super.subPath
 
   jarFile = config("gatk_jar")
@@ -51,9 +51,9 @@ abstract class Gatk extends BiopetJavaCommandLineFunction with Reference {
 
   var et: Option[String] = config("et")
 
-  override def versionRegex = """(.*)""".r
+  def versionRegex = """(.*)""".r
   override def versionExitcode = List(0, 1)
-  override def versionCommand = executable + " -jar " + jarFile + " -version"
+  def versionCommand = executable + " -jar " + jarFile + " -version"
 
   override def getVersion = super.getVersion.collect { case version => "Gatk " + version }
   override def dictRequired = true
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/igvtools/IGVTools.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/igvtools/IGVTools.scala
index 81ce9868bcbbc8a64b4af04bb82c58fe01b18974..a509f2e7b77149501091170b36087ed067971797 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/igvtools/IGVTools.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/igvtools/IGVTools.scala
@@ -16,16 +16,16 @@
 
 package nl.lumc.sasc.biopet.extensions.igvtools
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
 /**
  * General igvtools extension
  *
  * Created by wyleung on 5-1-15
  */
-abstract class IGVTools extends BiopetCommandLineFunction {
+abstract class IGVTools extends BiopetCommandLineFunction with Version {
   executable = config("exe", default = "igvtools", submodule = "igvtools", freeVar = false)
-  override def versionCommand = executable + " version"
-  override def versionRegex = """IGV Version:? ([\w\.]*) .*""".r
+  def versionCommand = executable + " version"
+  def versionRegex = """IGV Version:? ([\w\.]*) .*""".r
   override def versionExitcode = List(0)
 }
\ No newline at end of file
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/kraken/KrakenReport.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/kraken/KrakenReport.scala
index e7f0426c1d0e496ca99ba3ccad0f64caf2ad2b9e..0919728a08ccbd466f7dc1ae1d3f385e49294162 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/kraken/KrakenReport.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/kraken/KrakenReport.scala
@@ -18,21 +18,21 @@ package nl.lumc.sasc.biopet.extensions.kraken
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /** Extension for Kraken */
-class KrakenReport(val root: Configurable) extends BiopetCommandLineFunction {
+class KrakenReport(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   executable = config("exe", default = "kraken-report")
-  override def versionRegex = """Kraken version (.*)""".r
+  def versionRegex = """Kraken version (.*)""".r
   override def versionExitcode = List(0, 1)
 
   override def defaultCoreMemory = 4.0
   override def defaultThreads = 1
 
-  override def versionCommand = new File(new File(executable).getParent, "kraken").getAbsolutePath + " --version"
+  def versionCommand = new File(new File(executable).getParent, "kraken").getAbsolutePath + " --version"
 
   var db: File = config("db")
   var show_zeros: Boolean = config("show_zeros", default = false)
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/macs2/Macs2.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/macs2/Macs2.scala
index 7a95d648d3deb549a5206eb71820898773279db2..5f8365efc793ca1903ee6eba609d6b87f3ebbf65 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/macs2/Macs2.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/macs2/Macs2.scala
@@ -15,16 +15,16 @@
  */
 package nl.lumc.sasc.biopet.extensions.macs2
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
 /**
  * General igvtools extension
  *
  * Created by sajvanderzeeuw on 12/19/14.
  */
-abstract class Macs2 extends BiopetCommandLineFunction {
+abstract class Macs2 extends BiopetCommandLineFunction with Version {
   executable = config("exe", default = "macs2", submodule = "macs2", freeVar = false)
-  override def versionCommand = executable + " --version"
-  override def versionRegex = """macs2 (.*)""".r
+  def versionCommand = executable + " --version"
+  def versionRegex = """macs2 (.*)""".r
   override def versionExitcode = List(0, 1)
 }
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/Picard.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/Picard.scala
index 02678aac229d0113b19b8e2d3dfbb4eca53793ad..1517e3d936afff135d0747b1d5ceb1f2df2cf897 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/Picard.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/Picard.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions.picard
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.BiopetJavaCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetJavaCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.{ Logging, tryToParseNumber }
 import org.broadinstitute.gatk.utils.commandline.Argument
 
@@ -28,7 +28,7 @@ import scala.io.Source
  *
  * This is based on using class files directly from the jar, if needed other picard jar can be used
  */
-abstract class Picard extends BiopetJavaCommandLineFunction {
+abstract class Picard extends BiopetJavaCommandLineFunction with Version {
   override def subPath = "picard" :: super.subPath
 
   if (config.contains("picard_jar")) jarFile = config("picard_jar")
@@ -54,11 +54,11 @@ abstract class Picard extends BiopetJavaCommandLineFunction {
   @Argument(doc = "CREATE_MD5_FILE", required = false)
   var createMd5: Boolean = config("createmd5", default = false)
 
-  override def versionCommand = {
+  def versionCommand = {
     if (jarFile != null) executable + " -cp " + jarFile + " " + javaMainClass + " -h"
     else null
   }
-  override def versionRegex = """Version: (.*)""".r
+  def versionRegex = """Version: (.*)""".r
   override def versionExitcode = List(0, 1)
 
   override def defaultCoreMemory = 3.0
@@ -95,15 +95,15 @@ object Picard extends Logging {
 
         logger.debug("dependencies: " + dependencies)
 
-        val htsjdk = dependencies.find(dep => dep("groupId") == "samtools" && dep("artifactId") == "htsjdk").collect {
-          case dep =>
-            "samtools htsjdk " + dep("version")
-        }
+        val htsjdk = dependencies.find(dep =>
+          (dep("groupId") == "com.github.samtools" || dep("groupId") == "samtools") &&
+            dep("artifactId") == "htsjdk")
+          .collect { case dep => "samtools htsjdk " + dep("version") }
 
-        dependencies.find(dep => dep("groupId") == "picard" && dep("artifactId") == "picard").collect {
-          case dep =>
-            "Picard " + dep("version") + " using " + htsjdk.getOrElse("unknown htsjdk")
-        }
+        dependencies.find(dep =>
+          (dep("groupId") == "com.github.broadinstitute" || dep("groupId") == "picard") &&
+            dep("artifactId") == "picard")
+          .collect { case dep => "Picard " + dep("version") + " using " + htsjdk.getOrElse("unknown htsjdk") }
       case otherwise => None
     }
   }
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/Samtools.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/Samtools.scala
index a00f08718e40634e4da7e9173b4870ead9f8f72e..b1f545fb321f79ab2b5605a6e454dee0586ff2eb 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/Samtools.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/Samtools.scala
@@ -15,13 +15,13 @@
  */
 package nl.lumc.sasc.biopet.extensions.samtools
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
 /** General class for samtools extensions */
-abstract class Samtools extends BiopetCommandLineFunction {
+abstract class Samtools extends BiopetCommandLineFunction with Version {
   override def subPath = "samtools" :: super.subPath
   executable = config("exe", default = "samtools")
-  override def versionCommand = executable
-  override def versionRegex = """Version: (.*)""".r
+  def versionCommand = executable
+  def versionRegex = """Version: (.*)""".r
   override def versionExitcode = List(0, 1)
 }
\ No newline at end of file
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/Seqtk.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/Seqtk.scala
index dfdf82ae466348aa188d4f59ab8b39916837293d..d145cbe3cb85c7f80d6b5fefcabe1c043e8a9ecf 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/Seqtk.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/Seqtk.scala
@@ -15,13 +15,13 @@
  */
 package nl.lumc.sasc.biopet.extensions.seqtk
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
 /** Abstract class for all seqtk wrappers. */
-abstract class Seqtk extends BiopetCommandLineFunction {
+abstract class Seqtk extends BiopetCommandLineFunction with Version {
   override def subPath = "seqtk" :: super.subPath
   executable = config("exe", default = "seqtk", freeVar = true)
-  override def versionCommand = executable
-  override def versionRegex = """Version: (.*)""".r
+  def versionCommand = executable
+  def versionRegex = """Version: (.*)""".r
   override def versionExitcode = List(0, 1)
 }
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BastyGenerateFasta.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BastyGenerateFasta.scala
index bc1d672269421ce7be6d64d15d0f8841c81332a1..32749f119664c9f76a634cdb9c722373acc28fc3 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BastyGenerateFasta.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BastyGenerateFasta.scala
@@ -18,10 +18,10 @@ package nl.lumc.sasc.biopet.extensions.tools
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.{ Reference, ToolCommandFuntion }
+import nl.lumc.sasc.biopet.core.{ Reference, ToolCommandFunction }
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class BastyGenerateFasta(val root: Configurable) extends ToolCommandFuntion with Reference {
+class BastyGenerateFasta(val root: Configurable) extends ToolCommandFunction with Reference {
   def toolObject = nl.lumc.sasc.biopet.tools.BastyGenerateFasta
 
   @Input(doc = "Input vcf file", required = false)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedToInterval.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedToInterval.scala
index f7f00d0f94d43dcc45724c3ed4b61715072b88c1..99a9d2d3dddf30f1909de53e3dd85afb71793de7 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedToInterval.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedToInterval.scala
@@ -17,14 +17,14 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /**
  * @deprecated Use picard.util.BedToIntervalList instead
  */
-class BedToInterval(val root: Configurable) extends ToolCommandFuntion {
+class BedToInterval(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.BedToInterval
 
   @Input(doc = "Input Bed file", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedtoolsCoverageToCounts.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedtoolsCoverageToCounts.scala
index 00a77a5e9d9ac4ec1e5c2d02ed350cdf53b10d5d..23ff81605b11a4b084801c0db6556149e9916f91 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedtoolsCoverageToCounts.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BedtoolsCoverageToCounts.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class BedtoolsCoverageToCounts(val root: Configurable) extends ToolCommandFuntion {
+class BedtoolsCoverageToCounts(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.BedtoolsCoverageToCounts
 
   @Input(doc = "Input fasta", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BiopetFlagstat.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BiopetFlagstat.scala
index 5dc69cb07a34f04ed2cc32e7069875649c3aa32b..39c2ea0ca3fc0ac2c83678363c7d5d7ddeace3e3 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BiopetFlagstat.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/BiopetFlagstat.scala
@@ -17,13 +17,13 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.core.summary.Summarizable
 import nl.lumc.sasc.biopet.utils.ConfigUtils
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class BiopetFlagstat(val root: Configurable) extends ToolCommandFuntion with Summarizable {
+class BiopetFlagstat(val root: Configurable) extends ToolCommandFunction with Summarizable {
   def toolObject = nl.lumc.sasc.biopet.tools.BiopetFlagstat
 
   @Input(doc = "Input bam", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSplitter.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSplitter.scala
index 7348048447ca6c614b3b43ba915b228e042e9a37..bf759c9e8abb07d6442551d97b209798a06f7736 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSplitter.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSplitter.scala
@@ -18,14 +18,14 @@ package nl.lumc.sasc.biopet.extensions.tools
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /**
  * Queue extension for the FastqSplitter
  * @param root Parent object
  */
-class FastqSplitter(val root: Configurable) extends ToolCommandFuntion {
+class FastqSplitter(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.FastqSplitter
 
   @Input(doc = "Input fastq", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSync.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSync.scala
index f7829bb8e96cf7f09c318f61a59695d5c11a3a47..e58ba3442c212e6976ed64d0f2f3c5ba1cb434e6 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSync.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/FastqSync.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, ToolCommandFuntion }
+import nl.lumc.sasc.biopet.core.{ BiopetCommandLineFunction, ToolCommandFunction }
 import nl.lumc.sasc.biopet.core.summary.Summarizable
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
@@ -30,7 +30,7 @@ import scala.util.matching.Regex
  *
  * @param root Configuration object for the pipeline
  */
-class FastqSync(val root: Configurable) extends ToolCommandFuntion with Summarizable {
+class FastqSync(val root: Configurable) extends ToolCommandFunction with Summarizable {
 
   def toolObject = nl.lumc.sasc.biopet.tools.FastqSync
 
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeAlleles.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeAlleles.scala
index 504c7cb7c830cf8d1fa067b9048e7f23f4e3fe06..138b1d16ba92d074cd12f6f8e0c6a274d7683c96 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeAlleles.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeAlleles.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class MergeAlleles(val root: Configurable) extends ToolCommandFuntion {
+class MergeAlleles(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.MergeAlleles
 
   @Input(doc = "Input vcf files", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeTables.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeTables.scala
index 15ca55b6a524b283418ad67476d41b384541beb7..f4e0946588d94fed1b9829ce1f66935a0530c532 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeTables.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MergeTables.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -28,7 +28,7 @@ import scala.collection.mutable.{ Set => MutSet }
  *
  * @param root [[Configurable]] object
  */
-class MergeTables(val root: Configurable) extends ToolCommandFuntion {
+class MergeTables(val root: Configurable) extends ToolCommandFunction {
 
   def toolObject = nl.lumc.sasc.biopet.tools.MergeTables
 
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala
index 60797ce9ca7f491a9dff0cf3a2379570cc6d91f5..3d77acdd67979a849c4bd59defdbe13bbe59e790 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala
@@ -18,7 +18,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 import java.io.File
 
 import htsjdk.samtools.SamReaderFactory
-import nl.lumc.sasc.biopet.core.{ Reference, ToolCommandFuntion }
+import nl.lumc.sasc.biopet.core.{ Reference, ToolCommandFunction }
 import nl.lumc.sasc.biopet.extensions.samtools.SamtoolsMpileup
 import nl.lumc.sasc.biopet.utils.ConfigUtils
 import nl.lumc.sasc.biopet.utils.config.Configurable
@@ -26,7 +26,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 import scala.collection.JavaConversions._
 
-class MpileupToVcf(val root: Configurable) extends ToolCommandFuntion with Reference {
+class MpileupToVcf(val root: Configurable) extends ToolCommandFunction with Reference {
   def toolObject = nl.lumc.sasc.biopet.tools.MpileupToVcf
 
   @Input(doc = "Input mpileup file", shortName = "mpileup", required = false)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/PrefixFastq.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/PrefixFastq.scala
index dca36baf399c3f90725f61843ead5ed4416a08ab..407dadd18fe622b2716d151af6fee238712bf35c 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/PrefixFastq.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/PrefixFastq.scala
@@ -18,7 +18,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 import java.io.File
 
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
 
 /**
@@ -26,7 +26,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Argument, Input, Output }
  *
  * Created by pjvan_thof on 1/13/15.
  */
-class PrefixFastq(val root: Configurable) extends ToolCommandFuntion {
+class PrefixFastq(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.PrefixFastq
 
   override def defaultCoreMemory = 1.0
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCountFastq.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCountFastq.scala
index 0e71324dba7091729f044ff6b0815c04d5c937dd..ff50716c6074e65282ac8d4458dce68de1e153bf 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCountFastq.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCountFastq.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class SageCountFastq(val root: Configurable) extends ToolCommandFuntion {
+class SageCountFastq(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.SageCountFastq
 
   @Input(doc = "Input fasta", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateLibrary.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateLibrary.scala
index a2d79430f008d0a5818d98ae6ded6258ab74be0a..384a6268745600962a8ca61a32d608453b75cb6a 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateLibrary.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateLibrary.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class SageCreateLibrary(val root: Configurable) extends ToolCommandFuntion {
+class SageCreateLibrary(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.SageCreateLibrary
 
   @Input(doc = "Input fasta", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateTagCounts.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateTagCounts.scala
index 30e7f524f65000789653085e4c6443a4e8a6d4a8..a8f6805e136ca290e70436840b36b488db8c87ce 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateTagCounts.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SageCreateTagCounts.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class SageCreateTagCounts(val root: Configurable) extends ToolCommandFuntion {
+class SageCreateTagCounts(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.SageCreateTagCounts
 
   @Input(doc = "Raw count file", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SeqStat.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SeqStat.scala
index 3f1cf95a447f3f13827a27b82073fbf98e628495..f318a6861404c103ad5da426a1f7bbf662daedf3 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SeqStat.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SeqStat.scala
@@ -2,7 +2,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.core.summary.Summarizable
 import nl.lumc.sasc.biopet.utils.ConfigUtils
 import nl.lumc.sasc.biopet.utils.config.Configurable
@@ -13,7 +13,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Output, Input }
  *
  * @param root Configuration object for the pipeline
  */
-class SeqStat(val root: Configurable) extends ToolCommandFuntion with Summarizable {
+class SeqStat(val root: Configurable) extends ToolCommandFunction with Summarizable {
   def toolObject = nl.lumc.sasc.biopet.tools.SeqStat
 
   @Input(doc = "Input FASTQ", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SquishBed.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SquishBed.scala
index f42f635be866d88fd92c9991c93f93afb9e880cd..be50e38932bda4a6dca83983e715f8a313be70e0 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SquishBed.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/SquishBed.scala
@@ -2,14 +2,14 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /**
  * Created by pjvanthof on 22/08/15.
  */
-class SquishBed(val root: Configurable) extends ToolCommandFuntion {
+class SquishBed(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.SquishBed
 
   @Input(doc = "Input Bed file", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfFilter.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfFilter.scala
index 06af56f025692658ad19c4e8375e7b81fbe599fc..0c2639c7b1bc0e79cae7486a1775f1039d350a15 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfFilter.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfFilter.scala
@@ -17,11 +17,11 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class VcfFilter(val root: Configurable) extends ToolCommandFuntion {
+class VcfFilter(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.VcfFilter
 
   @Input(doc = "Input vcf", shortName = "I", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfStats.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfStats.scala
index d0024681b727e6f72fdc31da7483bb7b1c98b4f6..4db2b44745416068a95c0da190a541f9c25479ea 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfStats.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfStats.scala
@@ -18,7 +18,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 import java.io.File
 
 import nl.lumc.sasc.biopet.core.summary.{ Summarizable, SummaryQScript }
-import nl.lumc.sasc.biopet.core.{ Reference, ToolCommandFuntion }
+import nl.lumc.sasc.biopet.core.{ Reference, ToolCommandFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -29,7 +29,7 @@ import scala.io.Source
  *
  * Created by pjvan_thof on 1/10/15.
  */
-class VcfStats(val root: Configurable) extends ToolCommandFuntion with Summarizable with Reference {
+class VcfStats(val root: Configurable) extends ToolCommandFunction with Summarizable with Reference {
   def toolObject = nl.lumc.sasc.biopet.tools.VcfStats
 
   @Input(doc = "Input fastq", shortName = "I", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfWithVcf.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfWithVcf.scala
index e956f5c93f5de3d9243de7bb5c9c1684de8f3fa4..0f507ed21e13b6767b70c422fb3d5c71cb2dccc3 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfWithVcf.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VcfWithVcf.scala
@@ -17,14 +17,14 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /**
  * Biopet extension for tool VcfWithVcf
  */
-class VcfWithVcf(val root: Configurable) extends ToolCommandFuntion {
+class VcfWithVcf(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.VcfWithVcf
 
   @Input(doc = "Input vcf file", shortName = "input", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VepNormalizer.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VepNormalizer.scala
index 229f39628c9d1f8f8e23400b96a4fea957028e71..9ff18d5b95c12b22fead74ad1e8e436745c19ab4 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VepNormalizer.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/VepNormalizer.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -31,7 +31,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  * Created by ahbbollen on 10/27/14.
  */
 
-class VepNormalizer(val root: Configurable) extends ToolCommandFuntion {
+class VepNormalizer(val root: Configurable) extends ToolCommandFunction {
   def toolObject = nl.lumc.sasc.biopet.tools.VepNormalizer
 
   @Input(doc = "Input VCF, may be indexed", shortName = "InputFile", required = true)
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/WipeReads.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/WipeReads.scala
index 1e468bd36ac52bed889ccc0871a092316def63f0..ba09cc7fe9f519cf86e466b35897392e27bd8849 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/WipeReads.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/WipeReads.scala
@@ -17,7 +17,7 @@ package nl.lumc.sasc.biopet.extensions.tools
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.ToolCommandFuntion
+import nl.lumc.sasc.biopet.core.ToolCommandFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -27,7 +27,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
  *
  * @param root Configuration object for the pipeline
  */
-class WipeReads(val root: Configurable) extends ToolCommandFuntion {
+class WipeReads(val root: Configurable) extends ToolCommandFunction {
 
   def toolObject = nl.lumc.sasc.biopet.tools.WipeReads
 
diff --git a/public/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/IoUtils.scala b/public/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/IoUtils.scala
index b9392c40decdb3ce837e0d06e663fcd24fbb9be5..c046e951f9ab605cc3cecfc4f1775ad053a7472a 100644
--- a/public/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/IoUtils.scala
+++ b/public/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/IoUtils.scala
@@ -47,4 +47,26 @@ object IoUtils {
       }
     }
   }
+
+  /** Possible compression extensions to trim from input files. */
+  val zipExtensions = Set(".gz", ".gzip", ".bzip2", ".bz", ".xz", ".zip")
+
+  /**
+   * Given a file object and a set of compression extensions, return the filename without any of the compression
+   * extensions.
+   *
+   * Examples:
+   *  - my_file.fq.gz returns "my_file.fq"
+   *  - my_other_file.fastq returns "my_file.fastq"
+   *
+   * @param f Input file object.
+   * @param exts Possible compression extensions to trim.
+   * @return Filename without compression extension.
+   */
+  def getUncompressedFileName(f: File, exts: Set[String] = zipExtensions): String =
+    exts.foldLeft(f.getName) {
+      (fname, ext) =>
+        if (fname.toLowerCase.endsWith(ext)) fname.dropRight(ext.length)
+        else fname
+    }
 }
diff --git a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala
index e53c55cc53bd4cddab07de2d1fe7a1f5bc25feb9..1f1f2510cc600544c95d8db117bad3c3e888be01 100644
--- a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala
+++ b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala
@@ -19,7 +19,9 @@ import nl.lumc.sasc.biopet.core.summary.SummaryQScript
 import nl.lumc.sasc.biopet.core.{ BiopetFifoPipe, PipelineCommand, SampleLibraryTag }
 import nl.lumc.sasc.biopet.extensions.{ Zcat, Gzip }
 import nl.lumc.sasc.biopet.utils.config.Configurable
+import nl.lumc.sasc.biopet.utils.IoUtils._
 import nl.lumc.sasc.biopet.extensions.tools.{ SeqStat, FastqSync }
+
 import org.broadinstitute.gatk.queue.QScript
 
 class Flexiprep(val root: Configurable) extends QScript with SummaryQScript with SampleLibraryTag {
@@ -53,8 +55,6 @@ class Flexiprep(val root: Configurable) extends QScript with SummaryQScript with
   def summarySettings = Map("skip_trim" -> skipTrim, "skip_clip" -> skipClip, "paired" -> paired)
 
   var paired: Boolean = input_R2.isDefined
-  var R1_ext: String = _
-  var R2_ext: String = _
   var R1_name: String = _
   var R2_name: String = _
 
@@ -85,21 +85,10 @@ class Flexiprep(val root: Configurable) extends QScript with SummaryQScript with
     inputFiles :+= new InputFile(input_R1)
     input_R2.foreach(inputFiles :+= new InputFile(_))
 
-    if (input_R1.endsWith(".gz")) R1_name = input_R1.getName.substring(0, input_R1.getName.lastIndexOf(".gz"))
-    else if (input_R1.endsWith(".gzip")) R1_name = input_R1.getName.substring(0, input_R1.getName.lastIndexOf(".gzip"))
-    else R1_name = input_R1.getName
-    R1_ext = R1_name.substring(R1_name.lastIndexOf("."), R1_name.length)
-    R1_name = R1_name.substring(0, R1_name.lastIndexOf(R1_ext))
-
-    input_R2 match {
-      case Some(fileR2) =>
-        paired = true
-        if (fileR2.endsWith(".gz")) R2_name = fileR2.getName.substring(0, fileR2.getName.lastIndexOf(".gz"))
-        else if (fileR2.endsWith(".gzip")) R2_name = fileR2.getName.substring(0, fileR2.getName.lastIndexOf(".gzip"))
-        else R2_name = fileR2.getName
-        R2_ext = R2_name.substring(R2_name.lastIndexOf("."), R2_name.length)
-        R2_name = R2_name.substring(0, R2_name.lastIndexOf(R2_ext))
-      case _ =>
+    R1_name = getUncompressedFileName(input_R1)
+    input_R2.foreach { fileR2 =>
+      paired = true
+      R2_name = getUncompressedFileName(fileR2)
     }
   }
 
@@ -214,6 +203,7 @@ class Flexiprep(val root: Configurable) extends QScript with SummaryQScript with
           qcCmdR2.beforeCmd()
           fqSync.beforeCmd()
           commands = qcCmdR1.jobs ::: qcCmdR2.jobs ::: fqSync :: Nil
+          commands.foreach(addPipeJob)
           super.beforeCmd()
         }
       }
diff --git a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/QcCommand.scala b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/QcCommand.scala
index 3e516b638398f008435c5c5a982e09efcc335a86..8509b78983f571302ed15265714a62bbb3ab24de 100644
--- a/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/QcCommand.scala
+++ b/public/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/QcCommand.scala
@@ -3,7 +3,7 @@ package nl.lumc.sasc.biopet.pipelines.flexiprep
 import java.io.File
 
 import nl.lumc.sasc.biopet.core.summary.{ SummaryQScript, Summarizable }
-import nl.lumc.sasc.biopet.core.{ BiopetFifoPipe, BiopetCommandLineFunction, BiopetPipe }
+import nl.lumc.sasc.biopet.core.{ BiopetFifoPipe, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.extensions.{ Cat, Gzip, Sickle, Cutadapt }
 import nl.lumc.sasc.biopet.extensions.seqtk.SeqtkSeq
 import nl.lumc.sasc.biopet.utils.config.Configurable
@@ -73,18 +73,20 @@ class QcCommand(val root: Configurable, val fastqc: Fastqc) extends BiopetComman
       case _ => None
     }
     if (seqtk.Q.isDefined) seqtk.V = true
+    addPipeJob(seqtk)
 
     clip = if (!flexiprep.skipClip) {
       val foundAdapters = fastqc.foundAdapters.map(_.seq)
       if (foundAdapters.nonEmpty) {
-        val cutadept = new Cutadapt(root)
-        cutadept.fastq_input = seqtk.output
-        cutadept.fastq_output = new File(output.getParentFile, input.getName + ".cutadept.fq")
-        cutadept.stats_output = new File(flexiprep.outputDir, s"${flexiprep.sampleId.getOrElse("x")}-${flexiprep.libId.getOrElse("x")}.$read.clip.stats")
-        if (cutadept.default_clip_mode == "3") cutadept.opt_adapter ++= foundAdapters
-        else if (cutadept.default_clip_mode == "5") cutadept.opt_front ++= foundAdapters
-        else if (cutadept.default_clip_mode == "both") cutadept.opt_anywhere ++= foundAdapters
-        Some(cutadept)
+        val cutadapt = new Cutadapt(root)
+        cutadapt.fastq_input = seqtk.output
+        cutadapt.fastq_output = new File(output.getParentFile, input.getName + ".cutadapt.fq")
+        cutadapt.stats_output = new File(flexiprep.outputDir, s"${flexiprep.sampleId.getOrElse("x")}-${flexiprep.libId.getOrElse("x")}.$read.clip.stats")
+        if (cutadapt.default_clip_mode == "3") cutadapt.opt_adapter ++= foundAdapters
+        else if (cutadapt.default_clip_mode == "5") cutadapt.opt_front ++= foundAdapters
+        else if (cutadapt.default_clip_mode == "both") cutadapt.opt_anywhere ++= foundAdapters
+        addPipeJob(cutadapt)
+        Some(cutadapt)
       } else None
     } else None
 
@@ -92,17 +94,18 @@ class QcCommand(val root: Configurable, val fastqc: Fastqc) extends BiopetComman
       val sickle = new Sickle(root)
       sickle.output_stats = new File(flexiprep.outputDir, s"${flexiprep.sampleId.getOrElse("x")}-${flexiprep.libId.getOrElse("x")}.$read.trim.stats")
       sickle.input_R1 = clip match {
-        case Some(clip) => clip.fastq_output
-        case _          => seqtk.output
+        case Some(c) => c.fastq_output
+        case _       => seqtk.output
       }
       sickle.output_R1 = new File(output.getParentFile, input.getName + ".sickle.fq")
+      addPipeJob(sickle)
       Some(sickle)
     } else None
 
     val outputFile = (clip, trim) match {
-      case (_, Some(trim)) => trim.output_R1
-      case (Some(clip), _) => clip.fastq_output
-      case _               => seqtk.output
+      case (_, Some(t)) => t.output_R1
+      case (Some(c), _) => c.fastq_output
+      case _            => seqtk.output
     }
 
     if (compress) outputCommand = {
@@ -131,10 +134,10 @@ class QcCommand(val root: Configurable, val fastqc: Fastqc) extends BiopetComman
   def cmdLine = {
 
     val cmd = (clip, trim) match {
-      case (Some(clip), Some(trim)) => new BiopetFifoPipe(root, seqtk :: clip :: trim :: outputCommand :: Nil)
-      case (Some(clip), _)          => new BiopetFifoPipe(root, seqtk :: clip :: outputCommand :: Nil)
-      case (_, Some(trim))          => new BiopetFifoPipe(root, seqtk :: trim :: outputCommand :: Nil)
-      case _                        => new BiopetFifoPipe(root, seqtk :: outputCommand :: Nil)
+      case (Some(c), Some(t)) => new BiopetFifoPipe(root, seqtk :: c :: t :: outputCommand :: Nil)
+      case (Some(c), _)       => new BiopetFifoPipe(root, seqtk :: c :: outputCommand :: Nil)
+      case (_, Some(t))       => new BiopetFifoPipe(root, seqtk :: t :: outputCommand :: Nil)
+      case _                  => new BiopetFifoPipe(root, seqtk :: outputCommand :: Nil)
     }
 
     //val cmds = (Some(seqtk) :: clip :: trim :: Some(new Gzip(root)) :: Nil).flatten