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 506b3433ebd76e783012ab8829d95bc7e20b71e7..4ae4dc3c23b3c607d6f765125c9a370a3a9599e1 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
@@ -31,10 +31,24 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript {
 
   var gatkPipeline: GatkPipeline = new GatkPipeline(qscript)
 
+  def summaryFile: File = new File(outputDir, "Sage.summary.json")
+
+  def summaryFiles: Map[String, File] = Map()
+
+  def summarySettings: Map[String, Any] = Map()
+
   def makeSample(id: String) = new Sample(id)
   class Sample(sampleId: String) extends AbstractSample(sampleId) {
+    def summaryFiles: Map[String, File] = Map()
+
+    def summaryStats: Map[String, Any] = Map()
+
     def makeLibrary(id: String) = new Library(id)
     class Library(libId: String) extends AbstractLibrary(libId) {
+      def summaryFiles: Map[String, File] = Map()
+
+      def summaryStats: Map[String, Any] = Map()
+
       protected def addJobs(): Unit = {}
     }
 
@@ -56,6 +70,7 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript {
   def biopetScript() {
     gatkPipeline.biopetScript
     addAll(gatkPipeline.functions)
+    addSummaryQScript(gatkPipeline)
 
     addSamplesJobs()
   }
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 54370bf2f4638868d88c722065e0597a1b0b0379..c33f8318feb3fe28664810f9abafe9a5a17c854d 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
@@ -49,8 +49,16 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri
 
   def makeSample(id: String) = new Sample(id)
   class Sample(sampleId: String) extends AbstractSample(sampleId) {
+    def summaryFiles: Map[String, File] = Map()
+
+    def summaryStats: Map[String, Any] = Map()
+
     def makeLibrary(id: String) = new Library(id)
     class Library(libId: String) extends AbstractLibrary(libId) {
+      def summaryFiles: Map[String, File] = Map()
+
+      def summaryStats: Map[String, Any] = Map()
+
       val mapping = new Mapping(qscript)
       mapping.sampleId = Some(sampleId)
       mapping.libId = Some(libId)
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 c93cfa7a4c550ea34842e0f1d812eaac332f21d8..c153011bb168a67e31c32e20d330b39bbf57f1df 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
@@ -18,13 +18,16 @@ package nl.lumc.sasc.biopet.core
 import java.io.File
 
 import nl.lumc.sasc.biopet.core.config.{ Config }
+import nl.lumc.sasc.biopet.core.summary.{ SummaryQScript, Summarizable }
 import nl.lumc.sasc.biopet.utils.ConfigUtils
 import org.broadinstitute.gatk.utils.commandline.{ Argument }
 
 /**
  * This trait creates a structured way of use multisample pipelines
  */
-trait MultiSampleQScript extends BiopetQScript {
+trait MultiSampleQScript extends SummaryQScript {
+  qscript =>
+
   @Argument(doc = "Only Sample", shortName = "sample", required = false)
   private val onlySamples: List[String] = Nil
 
@@ -34,7 +37,7 @@ trait MultiSampleQScript extends BiopetQScript {
    * Sample class with basic functions build in
    * @param sampleId
    */
-  abstract class AbstractSample(val sampleId: String) {
+  abstract class AbstractSample(val sampleId: String) extends Summarizable {
     /** Overrules config of qscript with default sample */
     val config = new ConfigFunctions(defaultSample = sampleId)
 
@@ -42,7 +45,7 @@ trait MultiSampleQScript extends BiopetQScript {
      * Library class with basic functions build in
      * @param libId
      */
-    abstract class AbstractLibrary(val libId: String) {
+    abstract class AbstractLibrary(val libId: String) extends Summarizable {
       /** Overrules config of qscript with default sample and default library */
       val config = new ConfigFunctions(defaultSample = sampleId, defaultLibrary = libId)
 
@@ -51,6 +54,7 @@ trait MultiSampleQScript extends BiopetQScript {
         currentSample = Some(sampleId)
         currentLib = Some(libId)
         addJobs()
+        addSummarizable(this, "pipeline", Some(sampleId), Some(libId))
         currentLib = None
         currentSample = None
       }
@@ -87,6 +91,7 @@ trait MultiSampleQScript extends BiopetQScript {
     final def addAndTrackJobs(): Unit = {
       currentSample = Some(sampleId)
       addJobs()
+      addSummarizable(this, "pipeline", Some(sampleId))
       currentSample = 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 7d46c4b8fb910398f61e9fb3b873f682efaf023f..b3233ecfecbf070a36cf5db6aaf73f0a8cf4aa07 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
@@ -22,11 +22,25 @@ import org.broadinstitute.gatk.queue.QScript
 class MultisamplePipelineTemplate(val root: Configurable) extends QScript with MultiSampleQScript {
   def this() = this(null)
 
+  def summaryFile: File = new File(outputDir, "MultisamplePipelineTemplate.summary.json")
+
+  def summaryFiles: Map[String, File] = Map()
+
+  def summarySettings: Map[String, Any] = Map()
+
   def makeSample(id: String) = new Sample(id)
+
   class Sample(sampleId: String) extends AbstractSample(sampleId) {
+    def summaryFiles: Map[String, File] = Map()
+
+    def summaryStats: Map[String, Any] = Map()
 
     def makeLibrary(id: String) = new Library(id)
     class Library(libId: String) extends AbstractLibrary(libId) {
+      def summaryFiles: Map[String, File] = Map()
+
+      def summaryStats: Map[String, Any] = Map()
+
       protected def addJobs(): Unit = {
         // Library jobs
       }
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 d23fa37b98f768c7484cb92c3ede9c5377c2cd13..dff7842238b1cd345ff40785fb8dec759070f1f4 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
@@ -51,8 +51,16 @@ class Carp(val root: Configurable) extends QScript with MultiSampleQScript with
 
   def makeSample(id: String) = new Sample(id)
   class Sample(sampleId: String) extends AbstractSample(sampleId) {
+    def summaryFiles: Map[String, File] = Map()
+
+    def summaryStats: Map[String, Any] = Map()
+
     def makeLibrary(id: String) = new Library(id)
     class Library(libId: String) extends AbstractLibrary(libId) {
+      def summaryFiles: Map[String, File] = Map()
+
+      def summaryStats: Map[String, Any] = Map()
+
       val mapping = new Mapping(qscript)
       mapping.libId = Some(libId)
       mapping.sampleId = Some(sampleId)
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 94b3bcbe619ee5b01bd29bea6aa9b9e707934a6d..ee755a384446d8b06ef139387e14416146845ece 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
@@ -33,10 +33,24 @@ class Kopisu(val root: Configurable) extends QScript with MultiSampleQScript {
     addSamplesJobs()
   }
 
+  def summaryFile: File = new File(outputDir, "Kopisu.summary.json")
+
+  def summaryFiles: Map[String, File] = Map()
+
+  def summarySettings: Map[String, Any] = Map()
+
   def makeSample(id: String) = new Sample(id)
   class Sample(sampleId: String) extends AbstractSample(sampleId) {
+    def summaryFiles: Map[String, File] = Map()
+
+    def summaryStats: Map[String, Any] = Map()
+
     def makeLibrary(id: String) = new Library(id)
     class Library(libId: String) extends AbstractLibrary(libId) {
+      def summaryFiles: Map[String, File] = Map()
+
+      def summaryStats: Map[String, Any] = Map()
+
       def addJobs(): 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 a3a148331ba7181d06ce5b7ad4c769d6a05044fe..de8cb8f5d15ec1dac873ba44e241b96111bd7096 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
@@ -58,10 +58,24 @@ class Sage(val root: Configurable) extends QScript with MultiSampleQScript {
   )
   ), super.defaults)
 
+  def summaryFile: File = new File(outputDir, "Sage.summary.json")
+
+  def summaryFiles: Map[String, File] = Map()
+
+  def summarySettings: Map[String, Any] = Map()
+
   def makeSample(id: String) = new Sample(id)
   class Sample(sampleId: String) extends AbstractSample(sampleId) {
+    def summaryFiles: Map[String, File] = Map()
+
+    def summaryStats: Map[String, Any] = Map()
+
     def makeLibrary(id: String) = new Library(id)
     class Library(libId: String) extends AbstractLibrary(libId) {
+      def summaryFiles: Map[String, File] = Map()
+
+      def summaryStats: Map[String, Any] = Map()
+
       val inputFastq: File = config("R1")
       val prefixFastq: File = createFile(".prefix.fastq")