diff --git a/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala b/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala
index 93055136e8cb5d89a0fa5840d72302e24b8af1e1..d0ec70ad7889ce00a45e0ced22c5bfc99e4eff5e 100644
--- a/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala
+++ b/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala
@@ -6,9 +6,9 @@ import nl.lumc.sasc.biopet.core.{ BiopetQScript, PipelineCommand }
 import java.io.File
 import nl.lumc.sasc.biopet.core.apps.{ BedToInterval, BiopetFlagstat }
 import nl.lumc.sasc.biopet.core.config.Configurable
-import nl.lumc.sasc.biopet.function.bedtools.{ BedtoolsCoverage, BedtoolsIntersect }
-import nl.lumc.sasc.biopet.function.picard.{ CollectInsertSizeMetrics, CollectGcBiasMetrics, CalculateHsMetrics, CollectAlignmentSummaryMetrics }
-import nl.lumc.sasc.biopet.function.samtools.SamtoolsFlagstat
+import nl.lumc.sasc.biopet.extensions.bedtools.{ BedtoolsCoverage, BedtoolsIntersect }
+import nl.lumc.sasc.biopet.extensions.picard.{ CollectInsertSizeMetrics, CollectGcBiasMetrics, CalculateHsMetrics, CollectAlignmentSummaryMetrics }
+import nl.lumc.sasc.biopet.extensions.samtools.SamtoolsFlagstat
 
 class BamMetrics(val root: Configurable) extends QScript with BiopetQScript {
   def this() = this(null)
diff --git a/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala b/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala
index 053eb84924e8a0167c5be0f3f1b21440113e1590..4039b900c45d19ca03c4bdb6f33fd12f51e385d7 100644
--- a/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala
+++ b/bam-metrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala
@@ -1,7 +1,7 @@
 package nl.lumc.sasc.biopet.pipelines.bammetrics.scripts
 
 import nl.lumc.sasc.biopet.core.config.Configurable
-import nl.lumc.sasc.biopet.function.PythonCommandLineFunction
+import nl.lumc.sasc.biopet.extensions.PythonCommandLineFunction
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 import java.io.File
 
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Cat.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Cat.scala
similarity index 94%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Cat.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Cat.scala
index ed3bf4ff3976a58b460d3e18fd1669bcbb17de24..01fe397d47787db53ebc757fd3a0cd09c067a2e7 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Cat.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Cat.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function
+package nl.lumc.sasc.biopet.extensions
 
 import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Ln.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Ln.scala
similarity index 98%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Ln.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Ln.scala
index d0e432ba31d95c68f94b1a49526b4458c316b1ef..a1117f9f50803516d4e9c5249bf5fbdb04d6bf3b 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Ln.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Ln.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function
+package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 import scala.sys.process.Process
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Pbzip2.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Pbzip2.scala
similarity index 96%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Pbzip2.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Pbzip2.scala
index f7c4f9a0c083f5e86f5197a91e29812171e6e9b8..2cc36e6273d1d0e967ebe3b10518bda30d4a06c7 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Pbzip2.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Pbzip2.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function
+package nl.lumc.sasc.biopet.extensions
 
 import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/PythonCommandLineFunction.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/PythonCommandLineFunction.scala
similarity index 96%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/PythonCommandLineFunction.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/PythonCommandLineFunction.scala
index 4e298ee6f5a2068413a20ff67655e2a21b5027e4..44ea5884f729e8d3ac3be6285a834e61542eeccc 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/PythonCommandLineFunction.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/PythonCommandLineFunction.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function
+package nl.lumc.sasc.biopet.extensions
 
 import java.io.FileOutputStream
 import java.io.File
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Sha1sum.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Sha1sum.scala
new file mode 100644
index 0000000000000000000000000000000000000000..699151683799e72c17e8ca1ad57d271a835e1458
--- /dev/null
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Sha1sum.scala
@@ -0,0 +1,34 @@
+package nl.lumc.sasc.biopet.extensions
+
+import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
+import nl.lumc.sasc.biopet.core.config.Configurable
+import org.broadinstitute.gatk.utils.commandline._
+import java.io.File
+import argonaut._, Argonaut._
+import scalaz._, Scalaz._
+
+class Sha1sum(val root: Configurable) extends BiopetCommandLineFunction {
+  @Input(doc = "Zipped file")
+  var input: File = _
+
+  @Output(doc = "Unzipped file")
+  var output: File = _
+
+  executable = config("exe", default = "sha1sum")
+
+  def cmdLine = required(executable) + required(input) + " > " + required(output)
+  
+  def getSummary: Json = {
+    return jNull
+  }
+}
+
+object Sha1sum {
+  def apply(root:Configurable, fastqfile: File) : Sha1sum = {
+    val sha1sum = new Sha1sum(root)
+    val ext = fastqfile.getName.substring(fastqfile.getName.lastIndexOf("."))
+    sha1sum.input = fastqfile
+    sha1sum.output = new File(fastqfile.getAbsolutePath.substring(0, fastqfile.getName.lastIndexOf(".")) + ".sha1")
+    return sha1sum
+  }
+}
\ No newline at end of file
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Zcat.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Zcat.scala
similarity index 94%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Zcat.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Zcat.scala
index e342f75a4a6831efb8f439d0dff5d0cc0c7d75b9..9c7edfe04508189ec2434fb9a977094e8f685a9d 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Zcat.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/Zcat.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function
+package nl.lumc.sasc.biopet.extensions
 
 import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/Bedtools.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/Bedtools.scala
similarity index 86%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/Bedtools.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/Bedtools.scala
index abe391d8384492d57816b35d660cb9951b5a2343..21b12aad00aa5675ae7d8cd499465c0012b41d51 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/Bedtools.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/Bedtools.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.bedtools
+package nl.lumc.sasc.biopet.extensions.bedtools
 
 import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
 
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/BedtoolsCoverage.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsCoverage.scala
similarity index 96%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/BedtoolsCoverage.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsCoverage.scala
index fb26be17e342ba54fd5a5b13184f4cbffe760633..63537b2e65083a815b18b1101afadb7fd9d2e019 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/BedtoolsCoverage.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsCoverage.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.bedtools
+package nl.lumc.sasc.biopet.extensions.bedtools
 
 import nl.lumc.sasc.biopet.core.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output, Argument }
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/BedtoolsIntersect.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsIntersect.scala
similarity index 96%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/BedtoolsIntersect.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsIntersect.scala
index 8e0f7c0cafe45e09f91d21ddecba1c5edbb75918..ff8e34f2240255fd849eb8fd979c9e5b7162ce9f 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/bedtools/BedtoolsIntersect.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsIntersect.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.bedtools
+package nl.lumc.sasc.biopet.extensions.bedtools
 
 import nl.lumc.sasc.biopet.core.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output, Argument }
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CalculateHsMetrics.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CalculateHsMetrics.scala
similarity index 98%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CalculateHsMetrics.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CalculateHsMetrics.scala
index a1074791737db6e12805e40224a7c1f7f7ac2b13..f11d9b264647ed40f556e952d47605633999ae07 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CalculateHsMetrics.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CalculateHsMetrics.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.picard
+package nl.lumc.sasc.biopet.extensions.picard
 
 import java.io.File
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectAlignmentSummaryMetrics.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectAlignmentSummaryMetrics.scala
similarity index 98%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectAlignmentSummaryMetrics.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectAlignmentSummaryMetrics.scala
index 013c7ef09bb1ca3b6bed7080fecefad6d8e1a955..719063ca5ee8ca95e0b3fe851a11571a0771781b 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectAlignmentSummaryMetrics.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectAlignmentSummaryMetrics.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.picard
+package nl.lumc.sasc.biopet.extensions.picard
 
 import java.io.File
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectGcBiasMetrics.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectGcBiasMetrics.scala
similarity index 98%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectGcBiasMetrics.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectGcBiasMetrics.scala
index 9ae67794f14262704ab3255ccd6f898c740dae90..162adeb1d62cdc74ab837cbea1ac49de3a72c430 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectGcBiasMetrics.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectGcBiasMetrics.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.picard
+package nl.lumc.sasc.biopet.extensions.picard
 
 import java.io.File
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectInsertSizeMetrics.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectInsertSizeMetrics.scala
similarity index 98%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectInsertSizeMetrics.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectInsertSizeMetrics.scala
index 7420e7fc6453a74c3dfcdea3a83f41af83583436..60b4375c0f5bec0567f19b6e7d10b78d7600332a 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/CollectInsertSizeMetrics.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/CollectInsertSizeMetrics.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.picard
+package nl.lumc.sasc.biopet.extensions.picard
 
 import java.io.File
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/MarkDuplicates.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/MarkDuplicates.scala
similarity index 98%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/MarkDuplicates.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/MarkDuplicates.scala
index 5f0e6a75bf0612e437eac235555cb77a2c85e5b1..0b4169ab138e87135640213e8c3bf224c04ce357 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/MarkDuplicates.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/MarkDuplicates.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.picard
+package nl.lumc.sasc.biopet.extensions.picard
 
 import java.io.File
 import nl.lumc.sasc.biopet.core.config.Configurable
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/Picard.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/Picard.scala
similarity index 97%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/Picard.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/Picard.scala
index 8a04fc69f41a720405b472655461ec6946e7cb9d..d626b602563eacb9522da363c64c99cfaee5c172 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/picard/Picard.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/picard/Picard.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.picard
+package nl.lumc.sasc.biopet.extensions.picard
 
 import nl.lumc.sasc.biopet.core.BiopetJavaCommandLineFunction
 import org.broadinstitute.gatk.utils.commandline.{ Argument }
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/samtools/Samtools.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/Samtools.scala
similarity index 87%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/samtools/Samtools.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/Samtools.scala
index 15fe7fc3599dcb201b7119d78479c20f145ab92d..ce9f54fd665b8a9f35c2d6cab1002fefffae54c4 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/samtools/Samtools.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/Samtools.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.samtools
+package nl.lumc.sasc.biopet.extensions.samtools
 
 import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
 
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/samtools/SamtoolsFlagstat.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/SamtoolsFlagstat.scala
similarity index 96%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/samtools/SamtoolsFlagstat.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/SamtoolsFlagstat.scala
index f4b91043b79b9413946a05292a93b688fc3a5c4c..b1da1dedeb7ab4aa9ca3981d4052b792f339d5f1 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/samtools/SamtoolsFlagstat.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/SamtoolsFlagstat.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.samtools
+package nl.lumc.sasc.biopet.extensions.samtools
 
 import nl.lumc.sasc.biopet.core.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/seqtk/Seqtk.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/Seqtk.scala
similarity index 100%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/seqtk/Seqtk.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/Seqtk.scala
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/seqtk/SeqtkSeq.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/SeqtkSeq.scala
similarity index 100%
rename from biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/seqtk/SeqtkSeq.scala
rename to biopet-framework/src/main/scala/nl/lumc/sasc/biopet/extensions/seqtk/SeqtkSeq.scala
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Sha1sum.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Sha1sum.scala
deleted file mode 100644
index a58be437c8e5e9e187196cae777fde0024cfbe1a..0000000000000000000000000000000000000000
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/function/Sha1sum.scala
+++ /dev/null
@@ -1,18 +0,0 @@
-package nl.lumc.sasc.biopet.function
-
-import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
-import nl.lumc.sasc.biopet.core.config.Configurable
-import org.broadinstitute.gatk.utils.commandline._
-import java.io.File
-
-class Sha1sum(val root: Configurable) extends BiopetCommandLineFunction {
-  @Input(doc = "Zipped file")
-  var input: File = _
-
-  @Output(doc = "Unzipped file")
-  var output: File = _
-
-  executable = config("exe", default = "sha1sum")
-
-  def cmdLine = required(executable) + required(input) + " > " + required(output)
-}
\ No newline at end of file
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Cutadapt.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Cutadapt.scala
similarity index 92%
rename from flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Cutadapt.scala
rename to flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Cutadapt.scala
index bc6c65f0b3edfa87ae7a6892030d94fb4eb824c9..af3af48016bd9f4ddeb040b3dab73964ba0839db 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Cutadapt.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Cutadapt.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.fastq
+package nl.lumc.sasc.biopet.extensions.fastq
 
 import java.io.File
 import scala.io.Source._
@@ -6,6 +6,9 @@ import scala.sys.process._
 
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
+import argonaut._, Argonaut._
+import scalaz._, Scalaz._
+
 import nl.lumc.sasc.biopet.core.BiopetCommandLineFunction
 import nl.lumc.sasc.biopet.core.config.Configurable
 import nl.lumc.sasc.biopet.function.Ln
@@ -82,4 +85,14 @@ class Cutadapt(val root: Configurable) extends BiopetCommandLineFunction {
       } else logger.warn("File : " + contams_file + " does not exist")
     }
   }
+  
+  def getSummary: Json = {
+    return jNull
+  }
+}
+
+object Cutadapt {
+  def mergeSummarys(jsons:List[Json]): Json = {
+    return jNull
+  }
 }
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Fastqc.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Fastqc.scala
similarity index 95%
rename from flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Fastqc.scala
rename to flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Fastqc.scala
index d0ce249e06e65517f3b58c1cccbfb1f47c9cadee..0558025834a46d3d1c1c4b3f8eaff58a4f03eab9 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Fastqc.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Fastqc.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.fastq
+package nl.lumc.sasc.biopet.extensions.fastq
 
 import java.io.File
 import scala.io.Source
@@ -6,6 +6,9 @@ import scala.sys.process._
 
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
+import argonaut._, Argonaut._
+import scalaz._, Scalaz._
+
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
 
@@ -77,6 +80,10 @@ class Fastqc(val root: Configurable) extends BiopetCommandLineFunction {
             return line.stripPrefix("Encoding\t")
     return null // Could be default Sanger with a warning in the log
   }
+  
+  def getSummary: Json = {
+    return jNull
+  }
 }
 
 object Fastqc {
@@ -92,4 +99,4 @@ object Fastqc {
     fastqcCommand.afterGraph
     return fastqcCommand
   }
-}
\ No newline at end of file
+}
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Sickle.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Sickle.scala
similarity index 85%
rename from flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Sickle.scala
rename to flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Sickle.scala
index e29f8a5997cfe333f7bb9691613837ccf86aa564..760e1ad4b941784134fb8dfbcb1647ce1cd2cc63 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/function/fastq/Sickle.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/extensions/fastq/Sickle.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.fastq
+package nl.lumc.sasc.biopet.extensions.fastq
 
 import java.io.File
 import scala.io.Source._
@@ -6,6 +6,9 @@ import scala.sys.process._
 
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output, Argument }
 
+import argonaut._, Argonaut._
+import scalaz._, Scalaz._
+
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
 
@@ -30,15 +33,16 @@ class Sickle(val root: Configurable) extends BiopetCommandLineFunction {
 
   @Output(doc = "stats output")
   var output_stats: File = _
-
+  
+  var fastqc: Fastqc = _
+  
   executable = config("exe", default = "sickle")
   var qualityType: String = config("qualitytype")
 
-  var defaultQualityType: String = _
+  var defaultQualityType: String = config("defaultqualitytype", default = "sanger")
   override val versionRegex = """sickle version (.*)""".r
 
   override def afterGraph {
-    if (defaultQualityType == null) defaultQualityType = config("defaultqualitytype", default = "sanger")
     if (qualityType == null && defaultQualityType != null) qualityType = defaultQualityType
   }
 
@@ -75,4 +79,14 @@ class Sickle(val root: Configurable) extends BiopetCommandLineFunction {
     }
     return null
   }
+  
+  def getSummary: Json = {
+    return jNull
+  }
 }
+
+object Sickle {
+  def mergeSummarys(jsons:List[Json]): Json = {
+    return jNull
+  }
+}
\ No newline at end of file
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala
index ec02c90feded2673a6f7cd2d309b1e02a069fa51..7a4ade0e0792ade2a93c7321b46f443295eb3fc1 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/Flexiprep.scala
@@ -10,8 +10,8 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Argument }
 
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
-import nl.lumc.sasc.biopet.function._
-import nl.lumc.sasc.biopet.function.fastq._
+import nl.lumc.sasc.biopet.extensions._
+import nl.lumc.sasc.biopet.extensions.fastq._
 import nl.lumc.sasc.biopet.pipelines.flexiprep.scripts._
 
 class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
@@ -31,13 +31,26 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
 
   @Argument(doc = "Skip summary", shortName = "skipsummary", required = false)
   var skipSummary: Boolean = false
+  
+  @Argument(doc = "Sample name", shortName = "sample", required = false)
+  var sampleName: String = _
+  
+  @Argument(doc = "Library name", shortName = "library", required = false)
+  var libraryName: String = _
 
   var paired: Boolean = (input_R2 != null)
   var R1_ext: String = _
   var R2_ext: String = _
   var R1_name: String = _
   var R2_name: String = _
-
+  
+  var fastqc_R1: Fastqc = _
+  var fastqc_R2: Fastqc = _
+  var fastqc_R1_after: Fastqc = _
+  var fastqc_R2_after: Fastqc = _
+  
+  val summary = new FlexiprepSummary(this)
+  
   def init() {
     for (file <- configfiles) globalConfig.loadConfigFile(file)
     if (!skipTrim) skipTrim = config("skiptrim", default = false)
@@ -60,6 +73,8 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
       R2_ext = R2_name.substring(R2_name.lastIndexOf("."), R2_name.size)
       R2_name = R2_name.substring(0, R2_name.lastIndexOf(R2_ext))
     }
+    
+    summary.out = outputDir + "new.flexiprep.summary.json"
   }
 
   def biopetScript() {
@@ -75,24 +90,28 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
     outputFiles += ("fastq_input_R1" -> extractIfNeeded(input_R1, outputDir))
     if (paired) outputFiles += ("fastq_input_R2" -> extractIfNeeded(input_R2, outputDir))
 
-    var fastqc_R1 = Fastqc(this, input_R1, outputDir + "/" + R1_name + ".fastqc/")
+    fastqc_R1 = Fastqc(this, input_R1, outputDir + "/" + R1_name + ".fastqc/")
     add(fastqc_R1)
+    summary.addFastqc(fastqc_R1)
     outputFiles += ("fastqc_R1" -> fastqc_R1.output)
     outputFiles += ("qualtype_R1" -> getQualtype(fastqc_R1, R1_name))
     outputFiles += ("contams_R1" -> getContams(fastqc_R1, R1_name))
 
-    addSeqstat(outputFiles("fastq_input_R1"), "seqstat_R1", fastqc_R1)
-    addSha1sum(outputFiles("fastq_input_R1"), "sha1_R1")
+    val sha1sum_R1 = Sha1sum(this, outputFiles("fastq_input_R1"))
+    add(sha1sum_R1)
+    summary.addSha1sum(sha1sum_R1, R2 = false, after = false)
 
     if (paired) {
-      var fastqc_R2 = Fastqc(this, input_R2, outputDir + "/" + R2_name + ".fastqc/")
+      fastqc_R2 = Fastqc(this, input_R2, outputDir + "/" + R2_name + ".fastqc/")
       add(fastqc_R2)
+      summary.addFastqc(fastqc_R2, R2 = true)
       outputFiles += ("fastqc_R2" -> fastqc_R2.output)
       outputFiles += ("qualtype_R2" -> getQualtype(fastqc_R2, R2_name))
       outputFiles += ("contams_R2" -> getContams(fastqc_R2, R2_name))
 
-      addSeqstat(outputFiles("fastq_input_R2"), "seqstat_R2", fastqc_R2)
-      addSha1sum(outputFiles("fastq_input_R2"), "sha1_R2")
+      val sha1sum_R2 = Sha1sum(this, outputFiles("fastq_input_R2"))
+      add(sha1sum_R2)
+      summary.addSha1sum(sha1sum_R2, R2 = true, after = false)
     }
   }
 
@@ -128,7 +147,17 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
 
     var R1: File = new File(R1_in)
     var R2: File = new File(R2_in)
-
+    
+    val seqstat_R1 = Seqstat(this, R1, fastqc_R1)
+    add(seqstat_R1)
+    summary.addSeqstat(seqstat_R1, R2 = false, after = false, chunk)
+    
+    if (paired) {
+      val seqstat_R2 = Seqstat(this, R2, fastqc_R2)
+      add(seqstat_R2)
+      summary.addSeqstat(seqstat_R2, R2 = true, after = false, chunk)
+    }
+    
     if (!skipClip) { // Adapter clipping
 
       val cutadapt_R1 = new Cutadapt(this)
@@ -142,6 +171,7 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
       if (outputFiles.contains("contams_R1")) cutadapt_R1.contams_file = outputFiles("contams_R1")
 
       add(cutadapt_R1)
+      summary.addCutadapt(cutadapt_R1, R2 = false, chunk)
       R1 = cutadapt_R1.fastq_output
 
       if (paired) {
@@ -153,6 +183,7 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
         outputFiles += ("cutadapt_R2_stats" -> cutadapt_R2.stats_output)
         if (outputFiles.contains("contams_R2")) cutadapt_R2.contams_file = outputFiles("contams_R2")
         add(cutadapt_R2)
+        summary.addCutadapt(cutadapt_R2, R2 = true, chunk)
         R2 = cutadapt_R2.fastq_output
         val fastqSync = new FastqSync(this)
         if (!skipTrim) fastqSync.isIntermediate = true
@@ -164,12 +195,13 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
         fastqSync.output_R2 = swapExt(outDir, R2, R2_ext, ".sync" + R2_ext)
         fastqSync.output_stats = swapExt(outDir, R1, R1_ext, ".sync.stats")
         add(fastqSync)
+        summary.addFastqcSync(fastqSync, chunk)
         outputFiles += ("syncStats" -> fastqSync.output_stats)
         R1 = fastqSync.output_R1
         R2 = fastqSync.output_R2
       }
     }
-
+    
     if (!skipTrim) { // Quality trimming
       val sickle = new Sickle(this)
       sickle.input_R1 = R1
@@ -186,10 +218,22 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
       }
       sickle.output_stats = swapExt(outDir, R1, R1_ext, ".trim.stats")
       add(sickle)
+      summary.addSickle(sickle, chunk)
       R1 = sickle.output_R1
       if (paired) R2 = sickle.output_R2
     }
+    
+    val seqstat_R1_after = Seqstat(this, R1, fastqc_R1)
+    add(seqstat_R1_after)
+    summary.addSeqstat(seqstat_R1_after, R2 = false, after = true, chunk)
+    
+    if (paired) {
+      val seqstat_R2_after = Seqstat(this, R2, fastqc_R2)
+      add(seqstat_R2_after)
+      summary.addSeqstat(seqstat_R2_after, R2 = true, after = true, chunk)
+    }
 
+    
     outputFiles += (chunk + "output_R1" -> R1)
     if (paired) outputFiles += (chunk + "output_R2" -> R2)
     return (R1, R2)
@@ -234,18 +278,24 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
     if (paired) outputFiles += ("output_R2" -> R2)
 
     if (!skipTrim || !skipClip) {
-      addSeqstat(R1, "seqstat_qc_R1")
-      if (paired) addSeqstat(R2, "seqstat_qc_R2")
-
-      addSha1sum(R1, "sha1_qc_R1")
-      if (paired) addSha1sum(R2, "sha1_qc_R2")
-      val fastqc_R1 = Fastqc(this, outputFiles("output_R1"), outputDir + "/" + R1_name + ".qc.fastqc/")
-      add(fastqc_R1)
-      outputFiles += ("fastqc_R1_final" -> fastqc_R1.output)
+
+      val sha1sum_R1 = Sha1sum(this, R1)
+      add(sha1sum_R1)
+      summary.addSha1sum(sha1sum_R1, R2 = false, after = true)
+      if (paired) {
+        val sha1sum_R2 = Sha1sum(this, R2)
+        add(sha1sum_R2)
+        summary.addSha1sum(sha1sum_R2, R2 = true, after = true)
+      }
+      fastqc_R1_after = Fastqc(this, outputFiles("output_R1"), outputDir + "/" + R1_name + ".qc.fastqc/")
+      add(fastqc_R1_after)
+      summary.addFastqc(fastqc_R1_after, after = true)
+      outputFiles += ("fastqc_R1_final" -> fastqc_R1_after.output)
       if (paired) {
-        val fastqc_R2 = Fastqc(this, outputFiles("output_R2"), outputDir + "/" + R2_name + ".qc.fastqc/")
-        add(fastqc_R2)
-        outputFiles += ("fastqc_R2_final" -> fastqc_R2.output)
+        fastqc_R2_after = Fastqc(this, outputFiles("output_R2"), outputDir + "/" + R2_name + ".qc.fastqc/")
+        add(fastqc_R2_after)
+        summary.addFastqc(fastqc_R2_after, R2 = true, after = true)
+        outputFiles += ("fastqc_R2_final" -> fastqc_R2_after.output)
       }
     }
 
@@ -279,26 +329,6 @@ class Flexiprep(val root: Configurable) extends QScript with BiopetQScript {
       return newFile
     } else return file
   }
-
-  def addSeqstat(fastq: File, key: String, fastqc: Fastqc = null) {
-    val ext = fastq.getName.substring(fastq.getName.lastIndexOf("."))
-    val seqstat = new Seqstat(this)
-    seqstat.input_fastq = fastq
-    seqstat.fastqc = fastqc
-    seqstat.out = swapExt(outputDir, fastq, ext, ".seqstats.json")
-    if (fastqc != null) seqstat.deps ::= fastqc.output
-    add(seqstat)
-    outputFiles += (key -> seqstat.out)
-  }
-
-  def addSha1sum(fastq: File, key: String) {
-    val ext = fastq.getName.substring(fastq.getName.lastIndexOf("."))
-    val sha1sum = new Sha1sum(this)
-    sha1sum.input = fastq
-    sha1sum.output = swapExt(outputDir, fastq, ext, ".sha1")
-    add(sha1sum)
-    outputFiles += (key -> sha1sum.output)
-  }
 }
 
 object Flexiprep extends PipelineCommand {
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/FlexiprepSummary.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/FlexiprepSummary.scala
new file mode 100644
index 0000000000000000000000000000000000000000..91b7d2f52a33bbb2d8cc543f35376a1a295c8797
--- /dev/null
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/FlexiprepSummary.scala
@@ -0,0 +1,212 @@
+package nl.lumc.sasc.biopet.pipelines.flexiprep
+
+import nl.lumc.sasc.biopet.core.config.Configurable
+import nl.lumc.sasc.biopet.extensions.Sha1sum
+import nl.lumc.sasc.biopet.extensions.fastq.Cutadapt
+import nl.lumc.sasc.biopet.extensions.fastq.Fastqc
+import nl.lumc.sasc.biopet.extensions.fastq.Sickle
+import nl.lumc.sasc.biopet.pipelines.flexiprep.scripts.FastqSync
+import nl.lumc.sasc.biopet.pipelines.flexiprep.scripts.Seqstat
+import org.broadinstitute.gatk.queue.function.InProcessFunction
+import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
+import java.io.File
+import argonaut._, Argonaut._
+import scalaz._, Scalaz._
+
+class FlexiprepSummary(val root: Configurable) extends InProcessFunction with Configurable {
+  this.analysisName = getClass.getSimpleName
+
+  @Input(doc="deps")
+  var deps: List[File] = Nil
+  
+  @Output(doc = "Summary output", required=true)
+  var out: File = _
+  
+  class Chunk {
+    var seqstatR1: Seqstat = _
+    var seqstatR2: Seqstat = _
+    var seqstatR1after: Seqstat = _
+    var seqstatR2after: Seqstat = _
+    
+    var cutadaptR1: Cutadapt = _
+    var cutadaptR2: Cutadapt = _
+
+    var fastqSync: FastqSync = _
+
+    var sickle: Sickle = _
+  }
+  
+  var chunks: Map[String, Chunk] = Map()
+  
+  var sha1R1: Sha1sum = _
+  var sha1R2: Sha1sum = _
+  var sha1R1after: Sha1sum = _
+  var sha1R2after: Sha1sum = _
+  
+  var fastqcR1: Fastqc = _
+  var fastqcR2: Fastqc = _
+  var fastqcR1after: Fastqc = _
+  var fastqcR2after: Fastqc = _
+  
+  var flexiprep: Flexiprep = root.asInstanceOf[Flexiprep]
+    
+  def addFastqc(fastqc:Fastqc, R2:Boolean = false, after:Boolean = false): Fastqc = {
+    if (!R2 && !after) this.fastqcR1 = fastqc
+    else if (!R2 && after) this.fastqcR1after = fastqc
+    else if (R2 && !after) this.fastqcR2 = fastqc
+    else if (R2 && after) this.fastqcR2after = fastqc
+    deps ::= fastqc.output
+    return fastqc
+  }
+  
+  def addSha1sum(sha1sum:Sha1sum, R2:Boolean = false, after:Boolean = false): Sha1sum = {
+    if (!R2 && !after) this.sha1R1 = sha1sum
+    else if (!R2 && after) this.sha1R1after = sha1sum
+    else if (R2 && !after) this.sha1R2 = sha1sum
+    else if (R2 && after) this.sha1R2after = sha1sum
+    deps ::= sha1sum.output
+    return sha1sum
+  }
+  
+  def addSeqstat(seqstat:Seqstat, R2:Boolean = false, after:Boolean = false, chunk:String=""): Seqstat = {
+    if (!chunks.contains(chunk)) chunks += (chunk -> new Chunk)
+    if (!R2 && !after) chunks(chunk).seqstatR1 = seqstat
+    else if (!R2 && after) chunks(chunk).seqstatR1after = seqstat
+    else if (R2 && !after) chunks(chunk).seqstatR2 = seqstat
+    else if (R2 && after) chunks(chunk).seqstatR2after = seqstat
+    deps ::= seqstat.out
+    return seqstat
+  }
+  
+  def addCutadapt(cutadapt:Cutadapt, R2:Boolean = false, chunk:String=""): Cutadapt = {
+    if (!chunks.contains(chunk)) chunks += (chunk -> new Chunk)
+    if (!R2) chunks(chunk).cutadaptR1 = cutadapt
+    else chunks(chunk).cutadaptR2 = cutadapt
+    deps ::= cutadapt.stats_output
+    return cutadapt
+  }
+  
+  def addSickle(sickle:Sickle, chunk:String=""): Sickle = {
+    if (!chunks.contains(chunk)) chunks += (chunk -> new Chunk)
+    chunks(chunk).sickle = sickle
+    deps ::= sickle.output_stats
+    return sickle
+  }
+  
+  def addFastqcSync(fastqSync:FastqSync, chunk:String=""): FastqSync = {
+    if (!chunks.contains(chunk)) chunks += (chunk -> new Chunk)
+    chunks(chunk).fastqSync = fastqSync
+    deps ::= fastqSync.output_stats
+    return fastqSync
+  }
+
+  override def run {
+    logger.debug("Start")
+    val summary = ("flexiprep" := (("clipping" := !flexiprep.skipClip) ->: 
+                                   ("trimming" := !flexiprep.skipTrim) ->: 
+                                   ("paired" := flexiprep.paired) ->: 
+                                   jEmptyObject)) ->:
+                  ("seqstat" := seqstatSummary) ->: 
+                  ("sha1" := sha1Summary) ->:
+                  ("fastqc" := fastqcSummary) ->:
+                  ("clipping" :=? clipstatSummary) ->?:
+                  ("trimming" :=? trimstatSummary) ->?:
+                  jEmptyObject
+    logger.debug(summary.spaces2) // TODO: need output writter
+    logger.debug("Stop")
+  }
+  
+  def seqstatSummary(): Option[Json] = {
+    val R1: Json = if (chunks.size == 1) chunks.head._2.seqstatR1.getSummary
+                            else {
+                              val s = for ((key, value) <- chunks) yield value.seqstatR1.getSummary
+                              Seqstat.mergeSummarys(s.toList)
+                            }
+    val R2: Option[Json] =  if (!flexiprep.paired) None
+                            else if (chunks.size == 1) Option(chunks.head._2.seqstatR2.getSummary)
+                            else {
+                              val s = for ((key, value) <- chunks) yield value.seqstatR2.getSummary
+                              Option(Seqstat.mergeSummarys(s.toList))
+                            }
+    val R1_proc: Option[Json] = if (flexiprep.skipClip && flexiprep.skipTrim) None
+                                else if (chunks.size == 1) Option(chunks.head._2.seqstatR1after.getSummary)
+                                else {
+                                  val s = for ((key, value) <- chunks) yield value.seqstatR1after.getSummary
+                                  Option(Seqstat.mergeSummarys(s.toList))
+                                }
+    val R2_proc: Option[Json] = if (!flexiprep.paired && flexiprep.skipClip && flexiprep.skipTrim) None
+                                else if (chunks.size == 1) Option(chunks.head._2.seqstatR2after.getSummary)
+                                else {
+                                  val s = for ((key, value) <- chunks) yield value.seqstatR2after.getSummary
+                                  Option(Seqstat.mergeSummarys(s.toList))
+                                }
+    return Option(("R1_raw" := R1) ->: 
+                  ("R2_raw" :=? R2) ->?: 
+                  ("R1_proc" :=? R1_proc) ->?: 
+                  ("R2_proc" :=? R2_proc) ->?: 
+                  jEmptyObject)
+  }
+  
+  def sha1Summary: Json = {
+    return  ("R1_raw" := sha1Summary(sha1R1)) ->:
+            ("R2_raw" :=? sha1Summary(sha1R2)) ->?:
+            ("R1_proc" :=? sha1Summary(sha1R1after)) ->?:
+            ("R2_proc" :=? sha1Summary(sha1R2after)) ->?:
+            jEmptyObject
+  }
+  
+  def sha1Summary(sha1sum:Sha1sum): Option[Json] = {
+    if (sha1sum == null) return None
+    else return Option(sha1sum.getSummary)
+  }
+  
+  def fastqcSummary: Json = {
+    return  ("R1_raw" := fastqcSummary(fastqcR1)) ->:
+            ("R2_raw" :=? fastqcSummary(fastqcR2)) ->?:
+            ("R1_proc" :=? fastqcSummary(fastqcR1after)) ->?:
+            ("R2_proc" :=? fastqcSummary(fastqcR2after)) ->?:
+            jEmptyObject
+  }
+  
+  def fastqcSummary(fastqc:Fastqc): Option[Json]  = {
+    if (fastqc == null) return None
+    else return Option(fastqc.getSummary)
+  }
+  
+  def clipstatSummary(): Option[Json] = {
+    if (flexiprep.skipClip) return None
+    val R1: Json =  if (chunks.size == 1) chunks.head._2.cutadaptR1.getSummary
+                            else {
+                              val s = for ((key, value) <- chunks) yield value.cutadaptR1.getSummary
+                              Cutadapt.mergeSummarys(s.toList)
+                            }
+    val R2: Option[Json] =  if (!flexiprep.paired) None
+                            else if (chunks.size == 1) Option(chunks.head._2.cutadaptR2.getSummary)
+                            else {
+                              val s = for ((key, value) <- chunks) yield value.cutadaptR2.getSummary
+                              Option(Cutadapt.mergeSummarys(s.toList))
+                            }
+    return Option(("R1" := R1) ->: 
+                  ("R2" :=? R2) ->?: 
+                  ("fastqSync" :=? syncstatSummary) ->?: 
+                  jEmptyObject)
+  }
+  
+  def syncstatSummary(): Option[Json] = {
+    if (flexiprep.skipClip || !flexiprep.paired) return None
+    if (chunks.size == 1) return Option(chunks.head._2.sickle.getSummary)
+    else {
+      val s = for ((key, value) <- chunks) yield value.fastqSync.getSummary
+      return Option(FastqSync.mergeSummarys(s.toList))
+    }
+  }
+  
+  def trimstatSummary(): Option[Json] = {
+    if (flexiprep.skipTrim) return None
+    if (chunks.size == 1) return Option(chunks.head._2.sickle.getSummary)
+    else {
+      val s = for ((key, value) <- chunks) yield value.sickle.getSummary
+      return Option(Sickle.mergeSummarys(s.toList))
+    }
+  }
+}
\ No newline at end of file
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqSync.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqSync.scala
index 827a92f7c0287b0e5b468624c908e13578c53c35..5af515970de466da50b585d4b3b4027ca0e2f8c4 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqSync.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqSync.scala
@@ -4,8 +4,11 @@ import java.io.File
 
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
+import argonaut._, Argonaut._
+import scalaz._, Scalaz._
+
 import nl.lumc.sasc.biopet.core.config.Configurable
-import nl.lumc.sasc.biopet.function.PythonCommandLineFunction
+import nl.lumc.sasc.biopet.extensions.PythonCommandLineFunction
 
 class FastqSync(val root: Configurable) extends PythonCommandLineFunction {
   setPythonScript("sync_paired_end_reads.py")
@@ -36,4 +39,14 @@ class FastqSync(val root: Configurable) extends PythonCommandLineFunction {
     required(output_R2) +
     " > " +
     required(output_stats)
+    
+  def getSummary: Json = {
+    return jNull
+  }
 }
+
+object FastqSync {
+  def mergeSummarys(jsons:List[Json]): Json = {
+    return jNull
+  }
+}
\ No newline at end of file
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToContams.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToContams.scala
index d12073e3d11d6b9db697e0c8152f64fbfac1dc02..9135d3db517844966c44ad5b34e97943d995e760 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToContams.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToContams.scala
@@ -5,7 +5,7 @@ import java.io.File
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 import nl.lumc.sasc.biopet.core.config.Configurable
-import nl.lumc.sasc.biopet.function.PythonCommandLineFunction
+import nl.lumc.sasc.biopet.extensions.PythonCommandLineFunction
 
 class FastqcToContams(val root: Configurable) extends PythonCommandLineFunction {
   setPythonScript("__init__.py", "pyfastqc/")
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToQualtype.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToQualtype.scala
index c9aa8cd8ffdc9c201cba66b10052b109fb0d3956..7e8cd1668ff4d68aaed3bc4bdc17a0fc1ed929ef 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToQualtype.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/FastqcToQualtype.scala
@@ -5,7 +5,7 @@ import java.io.File
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 import nl.lumc.sasc.biopet.core.config.Configurable
 
-import nl.lumc.sasc.biopet.function.PythonCommandLineFunction
+import nl.lumc.sasc.biopet.extensions.PythonCommandLineFunction
 
 class FastqcToQualtype(val root: Configurable) extends PythonCommandLineFunction {
   setPythonScript("__init__.py", "pyfastqc/")
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Seqstat.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Seqstat.scala
index 83de0e247373724d8cc03229365185a2aa674b97..0396447c2b1dba03c3785d2314011d1b35eacccc 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Seqstat.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Seqstat.scala
@@ -2,11 +2,14 @@ package nl.lumc.sasc.biopet.pipelines.flexiprep.scripts
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.function.fastq.Fastqc
+import nl.lumc.sasc.biopet.extensions.fastq.Fastqc
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
+import argonaut._, Argonaut._
+import scalaz._, Scalaz._
+
 import nl.lumc.sasc.biopet.core.config.Configurable
-import nl.lumc.sasc.biopet.function.PythonCommandLineFunction
+import nl.lumc.sasc.biopet.extensions.PythonCommandLineFunction
 
 class Seqstat(val root: Configurable) extends PythonCommandLineFunction {
   setPythonScript("__init__.py", "pyfastqc/")
@@ -40,4 +43,24 @@ class Seqstat(val root: Configurable) extends PythonCommandLineFunction {
       required("-o", out) +
       required(input_fastq)
   }
+  
+  def getSummary: Json = {
+    return jNull
+  }
+}
+
+object Seqstat {
+  def apply(root:Configurable, fastqfile: File, fastqc:Fastqc): Seqstat = {
+    val seqstat = new Seqstat(root)
+    val ext = fastqfile.getName.substring(fastqfile.getName.lastIndexOf("."))
+    seqstat.input_fastq = fastqfile
+    seqstat.fastqc = fastqc
+    seqstat.out = new File(fastqfile.getAbsolutePath.substring(0, fastqfile.getName.lastIndexOf(".")) + ".seqstats.json")
+    if (fastqc != null) seqstat.deps ::= fastqc.output
+    return seqstat
+  }
+  
+  def mergeSummarys(jsons:List[Json]): Json = {
+    return jNull
+  }
 }
diff --git a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Summarize.scala b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Summarize.scala
index 63f49191a67369ca22e9eb7d28bf7b5ee6479794..590db1c13a8bc324e8703962b25149a0d369975b 100644
--- a/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Summarize.scala
+++ b/flexiprep/src/main/scala/nl/lumc/sasc/biopet/pipelines/flexiprep/scripts/Summarize.scala
@@ -5,7 +5,7 @@ import java.io.File
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 import nl.lumc.sasc.biopet.core.config.Configurable
-import nl.lumc.sasc.biopet.function.PythonCommandLineFunction
+import nl.lumc.sasc.biopet.extensions.PythonCommandLineFunction
 
 class Summarize(val root: Configurable) extends PythonCommandLineFunction {
   setPythonScript("__init__.py", "pyfastqc/")
diff --git a/gatk/gatk-old/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/Gatk.scala b/gatk/gatk-old/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/Gatk.scala
index 27dd498f66a1982529fced0363a6f7bb916a6de5..2badbacb3cd78d9f82d947b12ced587ba7fd9ff5 100644
--- a/gatk/gatk-old/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/Gatk.scala
+++ b/gatk/gatk-old/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/Gatk.scala
@@ -1,12 +1,12 @@
 package nl.lumc.sasc.biopet.pipelines.gatk
 
-import nl.lumc.sasc.biopet.function._
-import nl.lumc.sasc.biopet.function.aligners._
+import nl.lumc.sasc.biopet.extensions._
+import nl.lumc.sasc.biopet.extensions.aligners._
 import java.io.File
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
 import nl.lumc.sasc.biopet.pipelines.mapping._
-import nl.lumc.sasc.biopet.function.picard.MarkDuplicates
+import nl.lumc.sasc.biopet.extensions.picard.MarkDuplicates
 import nl.lumc.sasc.biopet.pipelines.bammetrics.BamMetrics
 import nl.lumc.sasc.biopet.pipelines.flexiprep._
 import org.broadinstitute.gatk.queue.QScript
diff --git a/gatk/gatk-pipeline/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala b/gatk/gatk-pipeline/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
index f3cc125f3294ec88cfb29766561668877eb37fca..852109fe29860b7408f7c5030dd29767b85db421 100644
--- a/gatk/gatk-pipeline/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
+++ b/gatk/gatk-pipeline/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
@@ -4,7 +4,7 @@ import nl.lumc.sasc.biopet.core.MultiSampleQScript
 import nl.lumc.sasc.biopet.core.PipelineCommand
 import nl.lumc.sasc.biopet.core.config.Configurable
 import java.io.File
-import nl.lumc.sasc.biopet.function.picard.MarkDuplicates
+import nl.lumc.sasc.biopet.extensions.picard.MarkDuplicates
 import nl.lumc.sasc.biopet.pipelines.bammetrics.BamMetrics
 import nl.lumc.sasc.biopet.pipelines.mapping.Mapping
 import org.broadinstitute.gatk.queue.QScript
diff --git a/gatk/gatk-variantcalling/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala b/gatk/gatk-variantcalling/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala
index e88a8422e3ed4b4fc5aa6ada5367405d28f4cc46..e6f994a743f1953429cfd4d1cf22f36c5af840da 100644
--- a/gatk/gatk-variantcalling/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala
+++ b/gatk/gatk-variantcalling/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkVariantcalling.scala
@@ -2,7 +2,7 @@ package nl.lumc.sasc.biopet.pipelines.gatk
 
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
-import nl.lumc.sasc.biopet.function._
+import nl.lumc.sasc.biopet.extensions._
 import org.broadinstitute.gatk.queue.QScript
 import org.broadinstitute.gatk.queue.extensions.gatk.{ BaseRecalibrator, CommandLineGATK, HaplotypeCaller, IndelRealigner, PrintReads, RealignerTargetCreator, GenotypeGVCFs, AnalyzeCovariates }
 import org.broadinstitute.gatk.queue.function._
diff --git a/mapping/src/main/scala/nl/lumc/sasc/biopet/function/aligners/Bwa.scala b/mapping/src/main/scala/nl/lumc/sasc/biopet/extensions/aligners/Bwa.scala
similarity index 96%
rename from mapping/src/main/scala/nl/lumc/sasc/biopet/function/aligners/Bwa.scala
rename to mapping/src/main/scala/nl/lumc/sasc/biopet/extensions/aligners/Bwa.scala
index c7e12143610333cdaf8d2d44139c6404dcb2d1da..216bf42566606b08c555aeacd0ffdbece16efa64 100644
--- a/mapping/src/main/scala/nl/lumc/sasc/biopet/function/aligners/Bwa.scala
+++ b/mapping/src/main/scala/nl/lumc/sasc/biopet/extensions/aligners/Bwa.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.aligners
+package nl.lumc.sasc.biopet.extensions.aligners
 
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
diff --git a/mapping/src/main/scala/nl/lumc/sasc/biopet/function/aligners/Star.scala b/mapping/src/main/scala/nl/lumc/sasc/biopet/extensions/aligners/Star.scala
similarity index 98%
rename from mapping/src/main/scala/nl/lumc/sasc/biopet/function/aligners/Star.scala
rename to mapping/src/main/scala/nl/lumc/sasc/biopet/extensions/aligners/Star.scala
index 7c2bfb3ae0b8c19d020654fe6ecfae40cd01ae5a..f0687b6b4980a3a9860971ea80ac6e430324343b 100644
--- a/mapping/src/main/scala/nl/lumc/sasc/biopet/function/aligners/Star.scala
+++ b/mapping/src/main/scala/nl/lumc/sasc/biopet/extensions/aligners/Star.scala
@@ -1,4 +1,4 @@
-package nl.lumc.sasc.biopet.function.aligners
+package nl.lumc.sasc.biopet.extensions.aligners
 
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
diff --git a/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/Mapping.scala b/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/Mapping.scala
index bacd0f3692bffe65d969b5bf5f52aad0c94feca0..53024816a4e756a6314b8981b77907fb2f6b9067 100644
--- a/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/Mapping.scala
+++ b/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/Mapping.scala
@@ -5,8 +5,8 @@ import java.io.File
 import java.util.Date
 import nl.lumc.sasc.biopet.core.{ BiopetQScript, PipelineCommand }
 import nl.lumc.sasc.biopet.core.apps.FastqSplitter
-import nl.lumc.sasc.biopet.function.aligners.{ Bwa, Star }
-import nl.lumc.sasc.biopet.function.picard.MarkDuplicates
+import nl.lumc.sasc.biopet.extensions.aligners.{ Bwa, Star }
+import nl.lumc.sasc.biopet.extensions.picard.MarkDuplicates
 import nl.lumc.sasc.biopet.pipelines.bammetrics.BamMetrics
 import nl.lumc.sasc.biopet.pipelines.flexiprep.Flexiprep
 import org.broadinstitute.gatk.queue.QScript
diff --git a/pipeline-template/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/PipelineTemplate.scala b/pipeline-template/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/PipelineTemplate.scala
index e76a17edb5ec386648276b71793c1d2b8f157fd1..a46aa5cc558e4c1205609c11004ba2c0e935ad56 100644
--- a/pipeline-template/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/PipelineTemplate.scala
+++ b/pipeline-template/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/PipelineTemplate.scala
@@ -2,7 +2,7 @@ package nl.lumc.sasc.biopet.pipelines.pipelinetemplate
 
 import nl.lumc.sasc.biopet.core._
 import nl.lumc.sasc.biopet.core.config._
-import nl.lumc.sasc.biopet.function._
+import nl.lumc.sasc.biopet.extensions._
 import org.broadinstitute.gatk.queue.QScript
 import org.broadinstitute.gatk.queue.function._
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output, Argument }