diff --git a/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala b/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala
index 0f2eed5d1b30e96cb36d9cc6f3936e93a87364f2..c260f4561de8eb1ab46d3d7b8f8fcdb20a4d14b5 100644
--- a/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala
+++ b/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala
@@ -41,7 +41,7 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript {
     var outputSnps: FastaOutput = _
 
     protected def addJobs(): Unit = {
-      addLibsJobs()
+      addPerLibJobs()
       output = addGenerateFasta(sampleId, sampleDir)
       outputSnps = addGenerateFasta(sampleId, sampleDir, snpsOnly = true)
     }
@@ -56,11 +56,13 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript {
     gatkPipeline.biopetScript
     addAll(gatkPipeline.functions)
 
+    addSamplesJobs()
+  }
+
+  def addMultiSampleJobs(): Unit = {
     val refVariants = addGenerateFasta(null, outputDir + "reference/", outputName = "reference")
     val refVariantSnps = addGenerateFasta(null, outputDir + "reference/", outputName = "reference", snpsOnly = true)
 
-    addSamplesJobs()
-
     val catVariants = Cat(this, refVariants.variants :: samples.map(_._2.output.variants).toList, outputDir + "fastas/variant.fasta")
     add(catVariants)
     val catVariantsSnps = Cat(this, refVariantSnps.variants :: samples.map(_._2.outputSnps.variants).toList, outputDir + "fastas/variant.snps_only.fasta")
@@ -129,6 +131,7 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript {
 
     addTreeJobs(catVariantsSnps.output, catConsensusVariantsSnps.output, outputDir + "trees" + File.separator + "snps_only", "snps_only")
     addTreeJobs(catVariants.output, catConsensusVariants.output, outputDir + "trees" + File.separator + "snps_indels", "snps_indels")
+
   }
 
   def addGenerateFasta(sampleName: String, outputDir: String, outputName: String = null,
diff --git a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
index 8ea6f9706b0e675b3f4fa1271c72038b1b2c3d6f..88600e576f4a1f622d64df4db09d4896f8e607bb 100644
--- a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
+++ b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
@@ -127,7 +127,7 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri
     gatkVariantcalling.outputDir = sampleDir + "/variantcalling/"
 
     protected def addJobs(): Unit = {
-      addLibsJobs()
+      addPerLibJobs()
       gatkVariantcalling.inputBams = libraries.map(_._2.mapping.finalBamFile).toList
       gatkVariantcalling.preProcesBams = false
       if (!singleSampleCalling) {
@@ -150,10 +150,11 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri
     override def configPath: List[String] = super.configPath ::: "multisample" :: Nil
   }
 
-  def biopetScript() {
-    addSamplesJobs
+  def biopetScript(): Unit = {
+    addSamplesJobs()
+  }
 
-    //SampleWide jobs
+  def addMultiSampleJobs(): Unit = {
     val gvcfFiles: List[File] = if (mergeGvcfs && externalGvcfs.size + samples.size > 1) {
       val newFile = outputDir + "merged.gvcf.vcf.gz"
       add(CombineGVCFs(this, externalGvcfs ++ samples.map(_._2.gatkVariantcalling.scriptOutput.gvcfFile), newFile))
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
index 67f108b3ae0eac140729632d703d5f533862054f..0217615d1bedf61bdac37f878f7f1fcdf698b0ec 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
@@ -26,7 +26,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Argument }
  */
 trait MultiSampleQScript extends BiopetQScript {
   @Argument(doc = "Only Sample", shortName = "sample", required = false)
-  val onlySample: List[String] = Nil
+  private val onlySamples: List[String] = Nil
 
   require(Config.global.map.contains("samples"), "No Samples found in config")
 
@@ -94,7 +94,7 @@ trait MultiSampleQScript extends BiopetQScript {
     protected def addJobs()
 
     /** function add all libraries in one call */
-    protected final def addLibsJobs(): Unit = {
+    protected final def addPerLibJobs(): Unit = {
       for ((libraryId, library) <- libraries) {
         library.addAndTrackJobs()
       }
@@ -125,17 +125,24 @@ trait MultiSampleQScript extends BiopetQScript {
   val samples: Map[String, Sample] = sampleIds.map(id => id -> makeSample(id)).toMap
 
   /** Returns a list of all sampleIDs */
-  protected def sampleIds: Set[String] = if (onlySample != Nil) onlySample.toSet else {
-    ConfigUtils.any2map(Config.global.map("samples")).keySet
-  }
+  protected def sampleIds: Set[String] = ConfigUtils.any2map(Config.global.map("samples")).keySet
 
   /** Runs addAndTrackJobs method for each sample */
   final def addSamplesJobs() {
-    for ((sampleId, sample) <- samples) {
-      sample.addAndTrackJobs()
-    }
+    if (onlySamples.isEmpty) {
+      samples.foreach { case (sampleId, sample) => sample.addAndTrackJobs() }
+      addMultiSampleJobs()
+    } else onlySamples.foreach(sampleId => samples.get(sampleId) match {
+      case Some(sample) => sample.addAndTrackJobs()
+      case None         => logger.warn("sampleId '" + sampleId + "' not found")
+    })
   }
 
+  /**
+   * Method where the multisample jobs should be added, this will be executed only when running the -sample argument is not given
+   */
+  def addMultiSampleJobs()
+
   /** Stores sample state */
   private var currentSample: Option[String] = None
 
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala
index 1ccf16f428e6cd2482648f4e9f2cc030696c9799..271c06085ddd086a5f015c88d84e29a008272c89 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala
@@ -37,6 +37,9 @@ class MultisamplePipelineTemplate(val root: Configurable) extends QScript with M
     }
   }
 
+  def addMultiSampleJobs(): Unit = {
+  }
+
   def init(): Unit = {
   }
 
diff --git a/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala b/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala
index cd883186af6bc835ce278887f9beacda29acdf42..b06c01f57488b2a8a1b4dd493ab9d47625a4d206 100644
--- a/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala
+++ b/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala
@@ -67,7 +67,7 @@ class Carp(val root: Configurable) extends QScript with MultiSampleQScript {
     val controls: List[String] = config("control", default = Nil)
 
     def addJobs(): Unit = {
-      addLibsJobs()
+      addPerLibJobs()
       val bamFiles = libraries.map(_._2.mapping.finalBamFile).toList
       if (bamFiles.length == 1) {
         add(Ln(qscript, bamFiles.head, bamFile))
@@ -102,8 +102,10 @@ class Carp(val root: Configurable) extends QScript with MultiSampleQScript {
     // Third step is calling peaks on the bam files produced with the mapping pipeline, this will be done with MACS2
     logger.info("Starting CArP pipeline")
 
-    addSamplesJobs
+    addSamplesJobs()
+  }
 
+  def addMultiSampleJobs(): Unit = {
     for ((sampleId, sample) <- samples) {
       for (controlId <- sample.controls) {
         if (!samples.contains(controlId))
diff --git a/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala b/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala
index 3b503759c6979faa83fac1fc7608bb557cb1c20f..5360b4ac78824c2e26649a12e1cc3c35262a8b50 100644
--- a/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala
+++ b/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala
@@ -25,31 +25,29 @@ class Kopisu(val root: Configurable) extends QScript with MultiSampleQScript {
   @Input(doc = "Input bamfile", required = true)
   var bamFile: File = config("bam")
 
-  class LibraryOutput extends AbstractLibraryOutput {
-  }
-
-  class SampleOutput extends AbstractSampleOutput {
-  }
-
   def init() {
     if (!outputDir.endsWith("/")) outputDir += "/"
   }
 
   def biopetScript() {
-    runSamplesJobs
+    addSamplesJobs()
   }
 
-  // Called for each sample
-  def runSingleSampleJobs(sampleConfig: Map[String, Any]): SampleOutput = {
-    val sampleOutput = new SampleOutput
+  def makeSample(id: String) = new Sample(id)
+  class Sample(sampleId: String) extends AbstractSample(sampleId) {
+    def makeLibrary(id: String) = new Library(id)
+    class Library(libraryId: String) extends AbstractLibrary(libraryId) {
+      def addJobs(): Unit = {
+
+      }
+    }
+
+    def addJobs(): Unit = {
 
-    return sampleOutput
+    }
   }
 
-  // Called for each run from a sample
-  def runSingleLibraryJobs(runConfig: Map[String, Any], sampleConfig: Map[String, Any]): LibraryOutput = {
-    val libraryOutput = new LibraryOutput
-    return libraryOutput
+  def addMultiSampleJobs(): Unit = {
   }
 }
 
diff --git a/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala b/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala
index 851e8481c5da2eff863760e1a9dfcaef180cc369..03be2ded6a42a0845830fcfd27ff1d119a3326c4 100644
--- a/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala
+++ b/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala
@@ -103,7 +103,7 @@ class Sage(val root: Configurable) extends QScript with MultiSampleQScript {
     }
 
     protected def addJobs(): Unit = {
-      addLibsJobs()
+      addPerLibJobs()
       val libraryBamfiles = libraries.map(_._2.mapping.finalBamFile).toList
       val libraryFastqFiles = libraries.map(_._2.prefixFastq).toList
 
@@ -151,7 +151,10 @@ class Sage(val root: Configurable) extends QScript with MultiSampleQScript {
       tagsLibrary = cdl.output
     }
 
-    addSamplesJobs
+    addSamplesJobs()
+  }
+
+  def addMultiSampleJobs(): Unit = {
   }
 
   def addBedtoolsCounts(bamFile: File, outputPrefix: String, outputDir: String) {