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/ToolCommandFuntion.scala
index 81220f9cb9d56703dfd7bebcddc0c14fa9966e0d..da411ebdf91a21eef9e770d4de75dff08c075ce7 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/ToolCommandFuntion.scala
@@ -5,9 +5,12 @@ import nl.lumc.sasc.biopet.FullVersion
 /**
  * Created by pjvanthof on 11/09/15.
  */
-trait ToolCommandFuntion extends BiopetJavaCommandLineFunction {
+trait ToolCommandFuntion 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/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/Kraken.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/kraken/Kraken.scala
index ae475e2ca9fe24775af0d017ca7df42e1905cd09..5b448c458aa98079a099e910abd7998bd8bfd597 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/kraken/Kraken.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/kraken/Kraken.scala
@@ -18,12 +18,12 @@ 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 Kraken(val root: Configurable) extends BiopetCommandLineFunction {
+class Kraken(val root: Configurable) extends BiopetCommandLineFunction with Version {
 
   @Input(doc = "Input: FastQ or FastA")
   var input: List[File] = _
@@ -51,9 +51,9 @@ class Kraken(val root: Configurable) extends BiopetCommandLineFunction {
   var paired: Boolean = config("paired", default = false)
 
   executable = config("exe", default = "kraken")
-  override def versionRegex = """Kraken version ([\d\w\-\.]+)\n.*""".r
+  def versionRegex = """Kraken version ([\d\w\-\.]+)\n.*""".r
   override def versionExitcode = List(0, 1)
-  override def versionCommand = executable + " --version"
+  def versionCommand = executable + " --version"
 
   override def defaultCoreMemory = 8.0
   override def defaultThreads = 4
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 01d0cb731e361c35c98ea515e2fbcb749025d4b4..e63beea4198f4f73c367756dda932db51d6584c2 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/sambamba/Sambamba.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/sambamba/Sambamba.scala
index 161d320297ec11ac2865a5fa5e7fbaf1d6c7329d..d862076f0b8861e032832584a07d77df7c2508ca 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/sambamba/Sambamba.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/sambamba/Sambamba.scala
@@ -15,17 +15,17 @@
  */
 package nl.lumc.sasc.biopet.extensions.sambamba
 
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.{ Version, BiopetCommandLineFunction }
 
 /** General Sambamba extension */
-abstract class Sambamba extends BiopetCommandLineFunction {
+abstract class Sambamba extends BiopetCommandLineFunction with Version {
   override def defaultCoreMemory = 2.0
   override def defaultThreads = 2
 
   override def subPath = "sambamba" :: super.subPath
 
   executable = config("exe", default = "sambamba", freeVar = false)
-  override def versionCommand = executable
-  override def versionRegex = """sambamba v(.*)""".r
+  def versionCommand = executable
+  def versionRegex = """sambamba v(.*)""".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/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/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..9182b3141d55db1714a358cca25a1273466686d1 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
@@ -214,6 +214,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