diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/varscan/Mpileup2cns.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/varscan/VarscanMpileup2cns.scala
similarity index 74%
rename from public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/varscan/Mpileup2cns.scala
rename to public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/varscan/VarscanMpileup2cns.scala
index 0379c36d9ace680b7833bf226912504bb619f8e2..9dc5b91a8dc7adc9fa7dfc7a241d0de838563ede 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/varscan/Mpileup2cns.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/varscan/VarscanMpileup2cns.scala
@@ -20,7 +20,7 @@ import java.io.File
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class Mpileup2cns(val root: Configurable) extends Varscan {
+class VarscanMpileup2cns(val root: Configurable) extends Varscan {
 
   @Input(doc = "Input mpileup file", required = false) // if not defined, input is stdin
   var input: Option[File] = None
@@ -47,22 +47,17 @@ class Mpileup2cns(val root: Configurable) extends Varscan {
     variants.foreach { case v => require(validValues.contains(v), "variants value must be either 0 or 1") }
   }
 
-  override def cmdLine = {
-    val baseCommand = super.cmdLine + required("mpileup2cns") +
-      required("", input) +
-      required("--min-coverage", minCoverage) +
-      required("--min-reads2", minReads2) +
-      required("--min-avg-qual", minAvgQual) +
-      required("--min-var-freq", minVarFreq) +
-      required("--min-freq-for-hom", minFreqForHom) +
-      required("--p-value", pValue) +
-      required("--strand-filter", strandFilter) +
-      required("--output-vcf", outputVcf) +
-      required("--vcf-sample-list", vcfSampleList) +
-      required("--variants", variants)
-
-    if (output.isDefined) baseCommand + " > " + required(output)
-    else baseCommand
-  }
-
+  override def cmdLine = super.cmdLine + required("mpileup2cns") +
+    required(input) +
+    optional("--min-coverage", minCoverage) +
+    optional("--min-reads2", minReads2) +
+    optional("--min-avg-qual", minAvgQual) +
+    optional("--min-var-freq", minVarFreq) +
+    optional("--min-freq-for-hom", minFreqForHom) +
+    optional("--p-value", pValue) +
+    optional("--strand-filter", strandFilter) +
+    optional("--output-vcf", outputVcf) +
+    optional("--vcf-sample-list", vcfSampleList) +
+    optional("--variants", variants) +
+    (if (outputAsStsout) "" else " > " + required(output))
 }
diff --git a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala
index f2f11a03e775ebe5a7fa4161813a0157c8f7976a..2d1f270c680338c099baf27c6325551d8f0dd590 100644
--- a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala
+++ b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala
@@ -21,7 +21,7 @@ import nl.lumc.sasc.biopet.core.{ Reference, BiopetCommandLineFunction }
 import nl.lumc.sasc.biopet.core.extensions.PythonCommandLineFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import nl.lumc.sasc.biopet.extensions.samtools.SamtoolsMpileup
-import nl.lumc.sasc.biopet.extensions.varscan.Mpileup2cns
+import nl.lumc.sasc.biopet.extensions.varscan.VarscanMpileup2cns
 import nl.lumc.sasc.biopet.extensions.{ Bgzip, Tabix }
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
@@ -65,7 +65,7 @@ class CustomVarScan(val root: Configurable) extends BiopetCommandLineFunction wi
     override def cmdLine: String = required(executable) + required("-vP") + required("""\t\t""")
   }
 
-  private val varscan = new Mpileup2cns(wrapper.root) {
+  private val varscan = new VarscanMpileup2cns(wrapper.root) {
     override def configName = wrapper.configName
     strandFilter = Option(0)
     outputVcf = Option(1)
diff --git a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
index 31ba0a53f0fc034b406cca237656722ca9de9d6f..f08b4cc18402e995375f14f1095e922883b8dc98 100644
--- a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
+++ b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
@@ -156,7 +156,12 @@ trait ShivaVariantcallingTrait extends SummaryQScript
   }
 
   /** Will generate all available variantcallers */
-  protected def callersList: List[Variantcaller] = List(new Freebayes(this), new RawVcf(this), new Bcftools(this), new BcftoolsSingleSample(this))
+  protected def callersList: List[Variantcaller] = List(
+    new Freebayes(this),
+    new RawVcf(this),
+    new Bcftools(this),
+    new BcftoolsSingleSample(this),
+    new VarscanCnsSingleSample(this))
 
   /** Location of summary file */
   def summaryFile = new File(outputDir, "ShivaVariantcalling.summary.json")
diff --git a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/variantcallers/VarscanCnsSingleSample.scala b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/variantcallers/VarscanCnsSingleSample.scala
new file mode 100644
index 0000000000000000000000000000000000000000..c74d7e54d3f61687ca9f3d3106cf243cdad4e9c2
--- /dev/null
+++ b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/variantcallers/VarscanCnsSingleSample.scala
@@ -0,0 +1,63 @@
+package nl.lumc.sasc.biopet.pipelines.shiva.variantcallers
+
+import java.io.PrintWriter
+
+import nl.lumc.sasc.biopet.extensions.gatk.CombineVariants
+import nl.lumc.sasc.biopet.extensions.{ Ln, Tabix, Bgzip }
+import nl.lumc.sasc.biopet.extensions.samtools.SamtoolsMpileup
+import nl.lumc.sasc.biopet.extensions.varscan.VarscanMpileup2cns
+import nl.lumc.sasc.biopet.utils.config.Configurable
+
+/**
+ * Created by sajvanderzeeuw on 15-1-16.
+ */
+class VarscanCnsSingleSample(val root: Configurable) extends Variantcaller {
+  val name = "varscan_cns_singlesample"
+  protected def defaultPrio = 25
+
+  override def defaults = Map(
+    "samtoolsmpileup" -> Map(
+      "disable_baq" -> true,
+      "depth" -> 1000000
+    ),
+    "mpileup2cns" -> Map("strand_filter" -> 0)
+  )
+
+  override def fixedValues = Map(
+    "samtoolsmpileup" -> Map("output_mapping_quality" -> true),
+    "mpileup2cns" -> Map("output_vcf" -> 1)
+  )
+
+  def biopetScript: Unit = {
+    val sampleVcfs = for ((sample, inputBam) <- inputBams.toList) yield {
+      val mpileup = new SamtoolsMpileup(this)
+      mpileup.input = List(inputBam)
+
+      val sampleVcf = new File(outputDir, s"${name}_$sample.vcf.gz")
+
+      val sampleFile = new File(outputDir, s"$sample.name.txt")
+      sampleFile.deleteOnExit()
+      val writer = new PrintWriter(sampleFile)
+      writer.println(sample)
+      writer.close()
+
+      val varscan = new VarscanMpileup2cns(this)
+      varscan.vcfSampleList = Some(sampleVcf)
+
+      add(mpileup | varscan | new Bgzip(this) > sampleVcf)
+      add(Tabix(this, sampleVcf))
+
+      sampleVcf
+    }
+
+    if (sampleVcfs.size > 1) {
+      val cv = new CombineVariants(this)
+      cv.inputFiles = sampleVcfs
+      cv.outputFile = outputFile
+      cv.setKey = "null"
+      cv.excludeNonVariants = true
+      add(cv)
+    } else add(Ln.apply(this, sampleVcfs.head, outputFile))
+    add(Tabix(this, outputFile))
+  }
+}