diff --git a/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummarizableTest.scala b/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummarizableTest.scala
index 56d9d56ab76c7fe1d302932cb37227fe9d84756b..1be487ff6d1309685d004d4b2f8f8b5523a93d75 100644
--- a/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummarizableTest.scala
+++ b/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummarizableTest.scala
@@ -7,8 +7,8 @@ import org.scalatest.testng.TestNGSuite
 import org.testng.annotations.Test
 
 /**
-  * Created by pjvanthof on 14/01/16.
-  */
+ * Created by pjvanthof on 14/01/16.
+ */
 class SummarizableTest extends TestNGSuite with Matchers {
   @Test
   def testDefaultMerge: Unit = {
diff --git a/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummaryQScriptTest.scala b/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummaryQScriptTest.scala
index 39afff6b3b3280c858d3c7184f282b06081594ab..a53fe068f9537cdce91a75f45ef9393631377d0d 100644
--- a/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummaryQScriptTest.scala
+++ b/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/SummaryQScriptTest.scala
@@ -4,7 +4,7 @@ import java.io.File
 
 import nl.lumc.sasc.biopet.core.BiopetQScript.InputFile
 import nl.lumc.sasc.biopet.core.extensions.Md5sum
-import nl.lumc.sasc.biopet.utils.config.{Config, Configurable}
+import nl.lumc.sasc.biopet.utils.config.{ Config, Configurable }
 import org.broadinstitute.gatk.queue.QScript
 import org.scalatest.Matchers
 import org.scalatest.testng.TestNGSuite
@@ -12,8 +12,8 @@ import org.testng.annotations.Test
 import SummaryQScriptTest._
 
 /**
-  * Created by pjvanthof on 14/01/16.
-  */
+ * Created by pjvanthof on 14/01/16.
+ */
 class SummaryQScriptTest extends TestNGSuite with Matchers {
   @Test
   def testNoJobs: Unit = {
diff --git a/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/WriteSummaryTest.scala b/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/WriteSummaryTest.scala
index 82d7c6a2957e480ec224e2a194512a7d5b9ab29c..4bb196c162ddb93c85b19d1364d34789fb77e8b9 100644
--- a/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/WriteSummaryTest.scala
+++ b/public/biopet-core/src/test/scala/nl/lumc/sasc/biopet/core/summary/WriteSummaryTest.scala
@@ -1,52 +1,198 @@
 package nl.lumc.sasc.biopet.core.summary
 
-import java.io.File
+import java.io.{ PrintWriter, File }
 
 import com.google.common.io.Files
-import nl.lumc.sasc.biopet.utils.config.{Config, Configurable}
+import nl.lumc.sasc.biopet.core._
+import nl.lumc.sasc.biopet.utils.config.{ Config, Configurable }
 import nl.lumc.sasc.biopet.utils.summary.Summary
-import org.broadinstitute.gatk.queue.{QScript, QSettings}
-import org.broadinstitute.gatk.queue.function.QFunction
+import org.broadinstitute.gatk.queue.function.CommandLineFunction
+import org.broadinstitute.gatk.queue.{ QScript, QSettings }
 import org.scalatest.Matchers
 import org.scalatest.testng.TestNGSuite
 import WriteSummaryTest._
 import org.testng.annotations.Test
 
-import scala.io.Source
+import scala.util.matching.Regex
 
 /**
-  * Created by pjvanthof on 15/01/16.
-  */
+ * Created by pjvanthof on 15/01/16.
+ */
 class WriteSummaryTest extends TestNGSuite with Matchers {
 
-  def testWrongRoot: Unit = {
+  @Test
+  def testWrongRoot(): Unit = {
     intercept[IllegalArgumentException] {
       makeWriter(null)
     }
   }
 
+  /** This is a basic summary test, no matter the content this should always be true */
+  def basicSummaryTest(summary: Summary,
+                       name: String,
+                       sampleId: Option[String] = None,
+                       libId: Option[String] = None): Unit = {
+    summary.getValue(sampleId, libId, name) should not be None
+    summary.getValue(sampleId, libId, name, "files", "pipeline").get shouldBe a[Map[_, _]]
+    summary.getValue(sampleId, libId, name, "settings").get shouldBe a[Map[_, _]]
+    summary.getValue(sampleId, libId, name, "executables").get shouldBe a[Map[_, _]]
+
+    summary.getValue("meta") should not be None
+    summary.getValue("meta", "pipeline_name") shouldBe Some(name)
+    summary.getValue("meta", "last_commit_hash") shouldBe Some(nl.lumc.sasc.biopet.LastCommitHash)
+    summary.getValue("meta", "pipeline_version") shouldBe Some(nl.lumc.sasc.biopet.Version)
+    summary.getValue("meta", "output_dir") shouldBe Some(new File(".").getAbsolutePath)
+    summary.getValue("meta", "summary_creation") should not be None
+  }
+
+  def createFakeCheckSum(file: File): Unit = {
+    file.getParentFile.mkdirs()
+    val writer = new PrintWriter(file)
+    writer.println("checksum  file")
+    writer.close()
+    file.deleteOnExit()
+  }
+
   @Test
-  def testEmpty: Unit = {
-    val qscript = makeQscript()
+  def testEmpty(): Unit = {
+    val qscript = makeQscript(name = "test")
     val writer = makeWriter(qscript)
     writer.freezeFieldValues()
+    writer.deps shouldBe empty
+    writer.run()
 
+    val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test")
+  }
+
+  @Test
+  def testMergeQscript(): Unit = {
+    val qscript = makeQscript(name = "test")
+    val qscript2 = makeQscript(name = "test2")
+    qscript.addSummaryQScript(qscript2)
+    val summaryWriter = new PrintWriter(qscript2.summaryFile)
+    summaryWriter.println("""{ "test2": "value" }""")
+    summaryWriter.close()
+    val writer = makeWriter(qscript)
+    writer.freezeFieldValues()
     writer.run()
 
     val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test")
+    summary.getValue("test2") shouldBe Some("value")
+  }
 
-    summary.getValue("test") should not be None
-    summary.getValue("test", "files") shouldBe Some(Map("pipeline" -> Map()))
-    summary.getValue("test", "settings") shouldBe Some(Map())
-    summary.getValue("test", "executables") shouldBe Some(Map())
+  @Test
+  def testSingleJob(): Unit = {
+    val qscript = makeQscript("test")
+    val writer = makeWriter(qscript)
+    val summarizable = makeSummarizable(files = Map("file_1" -> new File("bla")), stats = Map("key" -> "value"))
+    qscript.addSummarizable(summarizable, "tool_1")
+    qscript.addSummaryJobs()
+    createFakeCheckSum(SummaryQScript.md5sumCache(new File("bla")))
+    writer.freezeFieldValues()
+    writer.run()
 
-    summary.getValue("meta") should not be None
-    summary.getValue("meta", "pipeline_name") shouldBe Some("test")
-    summary.getValue("meta", "last_commit_hash") shouldBe Some(nl.lumc.sasc.biopet.LastCommitHash)
-    summary.getValue("meta", "pipeline_version") shouldBe Some(nl.lumc.sasc.biopet.Version)
-    summary.getValue("meta", "output_dir") shouldBe Some(new File(".").getAbsolutePath)
-    summary.getValue("meta", "summary_creation") should not be None
+    val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test")
+    summary.getValue("test", "stats", "tool_1", "key") shouldBe Some("value")
+    summary.getValue("test", "files", "tool_1", "file_1", "md5") shouldBe Some("checksum")
+  }
+
+  @Test
+  def testSingleJavaJob(): Unit = {
+    val qscript = makeQscript("test")
+    val writer = makeWriter(qscript)
+    val summarizable = makeJavaCommand(files = Map("file_1" -> new File("bla")), stats = Map("key" -> "value"))
+    qscript.add(summarizable)
+    qscript.addSummarizable(summarizable, "tool_1")
+    qscript.addSummaryJobs()
+    createFakeCheckSum(SummaryQScript.md5sumCache(new File("bla")))
+    writer.freezeFieldValues()
+    writer.run()
+
+    val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test")
+    summary.getValue("test", "stats", "tool_1", "key") shouldBe Some("value")
+    summary.getValue("test", "files", "tool_1", "file_1", "md5") shouldBe Some("checksum")
+    summary.getValue("test", "executables", "java_command", "version") shouldBe Some("test version")
+  }
+
+  @Test
+  def testVersion(): Unit = {
+    val qscript = makeQscript("test")
+    val writer = makeWriter(qscript)
+    val summarizable = makeVersionSummarizable(files = Map("file_1" -> new File("bla")), stats = Map("key" -> "value"))
+    qscript.add(summarizable)
+    qscript.addSummarizable(summarizable, "tool_1")
+    qscript.addSummaryJobs()
+    createFakeCheckSum(SummaryQScript.md5sumCache(new File("bla")))
+    writer.freezeFieldValues()
+    writer.run()
+
+    val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test")
+    summary.getValue("test", "stats", "tool_1", "key") shouldBe Some("value")
+    summary.getValue("test", "files", "tool_1", "file_1", "md5") shouldBe Some("checksum")
+    summary.getValue("test", "executables", "version_command", "version") shouldBe Some("test version")
+  }
+
+  @Test
+  def testSampleLibrary(): Unit = {
+    val qscript = makeSampleLibraryQscript("test", s = Some("sampleName"), l = Some("libName"))
+    val writer = makeWriter(qscript)
+    val summarizable = makeSummarizable(files = Map("file_1" -> new File("bla")), stats = Map("key" -> "value"))
+    qscript.addSummarizable(summarizable, "tool_1")
+    qscript.addSummaryJobs()
+    createFakeCheckSum(SummaryQScript.md5sumCache(new File("bla")))
+    writer.freezeFieldValues()
+    writer.deps shouldBe empty
+    writer.run()
+
+    val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test", sampleId = Some("sampleName"), libId = Some("libName"))
+    summary.getValue(Some("sampleName"), Some("libName"), "test", "stats", "tool_1", "key") shouldBe Some("value")
+    summary.getValue(Some("sampleName"), Some("libName"), "test", "files", "tool_1", "file_1", "md5") shouldBe Some("checksum")
+  }
+
+  @Test
+  def testSample(): Unit = {
+    val qscript = makeSampleLibraryQscript("test", s = Some("sampleName"))
+    val writer = makeWriter(qscript)
+    val summarizable = makeSummarizable(files = Map("file_1" -> new File("bla")), stats = Map("key" -> "value"))
+    qscript.addSummarizable(summarizable, "tool_1")
+    qscript.addSummaryJobs()
+    createFakeCheckSum(SummaryQScript.md5sumCache(new File("bla")))
+    writer.freezeFieldValues()
+    writer.deps shouldBe empty
+    writer.run()
+
+    val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test", sampleId = Some("sampleName"), libId = None)
+    summary.getValue(Some("sampleName"), None, "test", "stats", "tool_1", "key") shouldBe Some("value")
+    summary.getValue(Some("sampleName"), None, "test", "files", "tool_1", "file_1", "md5") shouldBe Some("checksum")
   }
+
+  @Test
+  def testMultisampleQscript(): Unit = {
+    val qscript = makeMultisampleQscript("test", multisampleConfig)
+    val writer = makeWriter(qscript)
+    val summarizable = makeSummarizable(files = Map("file_1" -> new File("bla")), stats = Map("key" -> "value"))
+    qscript.addSummarizable(summarizable, "tool_1")
+    qscript.addSummaryJobs()
+    createFakeCheckSum(SummaryQScript.md5sumCache(new File("bla")))
+    writer.freezeFieldValues()
+    writer.deps shouldBe empty
+    writer.run()
+
+    val summary = new Summary(writer.out)
+    basicSummaryTest(summary, "test")
+    summary.getValue("test", "stats", "tool_1", "key") shouldBe Some("value")
+    summary.getValue("test", "files", "tool_1", "file_1", "md5") shouldBe Some("checksum")
+
+    summary.getValue(Some("sampleName"), Some("libName"), "test") should not be None
+  }
+
 }
 
 object WriteSummaryTest {
@@ -63,10 +209,33 @@ object WriteSummaryTest {
     override def absoluteCommandDirectory() {}
   }
 
-  def makeQscript(settings: Map[String, Any] = Map(),
+  def makeQscript(name: String,
+                  settings: Map[String, Any] = Map(),
                   files: Map[String, File] = Map(),
                   c: Map[String, Any] = Map()) =
     new SummaryQScript with QScript {
+      summaryName = name
+      outputDir = new File(".").getAbsoluteFile
+      override def globalConfig = new Config(c)
+      def summarySettings: Map[String, Any] = settings
+      def summaryFiles: Map[String, File] = files
+      val tempFile = File.createTempFile("summary", ".json")
+      tempFile.deleteOnExit()
+      def summaryFile: File = tempFile
+      def init(): Unit = {}
+      def biopetScript(): Unit = {}
+      def root: Configurable = null
+    }
+
+  def makeSampleLibraryQscript(name: String,
+                               settings: Map[String, Any] = Map(),
+                               files: Map[String, File] = Map(),
+                               c: Map[String, Any] = Map(),
+                               s: Option[String] = None,
+                               l: Option[String] = None) =
+    new SummaryQScript with QScript with SampleLibraryTag {
+      sampleId = s
+      libId = l
       summaryName = "test"
       outputDir = new File(".").getAbsoluteFile
       override def globalConfig = new Config(c)
@@ -75,13 +244,103 @@ object WriteSummaryTest {
       val tempFile = File.createTempFile("summary", ".json")
       tempFile.deleteOnExit()
       def summaryFile: File = tempFile
-      def init(): Unit = ???
-      def biopetScript(): Unit = ???
+      def init(): Unit = {}
+      def biopetScript(): Unit = {}
       def root: Configurable = null
     }
 
+  def makeMultisampleQscript(name: String,
+                             c: Map[String, Any],
+                             settings: Map[String, Any] = Map(),
+                             files: Map[String, File] = Map()) =
+    new MultiSampleQScript with QScript {
+      summaryName = "test"
+      outputDir = new File(".").getAbsoluteFile
+      override def globalConfig = new Config(c)
+      def summarySettings: Map[String, Any] = settings
+      def summaryFiles: Map[String, File] = files
+      val tempFile = File.createTempFile("summary", ".json")
+      tempFile.deleteOnExit()
+      def summaryFile: File = tempFile
+      def init(): Unit = {}
+      def biopetScript(): Unit = {}
+      def root: Configurable = null
+
+      class Sample(id: String) extends AbstractSample(id) {
+        class Library(id: String) extends AbstractLibrary(id) {
+          protected def addJobs(): Unit = {}
+          def summaryFiles: Map[String, File] = files
+          def summaryStats: Any = Map()
+        }
+
+        def makeLibrary(id: String): Library = new Library(id)
+        protected def addJobs(): Unit = {}
+        def summaryFiles: Map[String, File] = files
+        def summaryStats: Any = Map()
+      }
+
+      def makeSample(id: String): Sample = new Sample(id)
+
+      def addMultiSampleJobs(): Unit = {}
+    }
+
+  val multisampleConfig = Map("samples" -> Map("sampleName" -> Map("libraries" -> Map("libName" -> Map()))))
+
   def makeSummarizable(files: Map[String, File] = Map(), stats: Map[String, Any] = Map()) = new Summarizable {
     def summaryFiles: Map[String, File] = files
     def summaryStats: Any = stats
   }
+
+  def makeJavaCommand(files: Map[String, File] = Map(),
+                      stats: Map[String, Any] = Map(),
+                      c: Map[String, Any] = Map()) = new BiopetJavaCommandLineFunction with Summarizable with Version {
+    override def globalConfig = new Config(c)
+    override def configName = "java_command"
+    def root: Configurable = null
+    def summaryStats: Map[String, Any] = stats
+    def summaryFiles: Map[String, File] = files
+
+    def versionCommand: String = "echo test version"
+    def versionRegex: Regex = """(.*)""".r
+    override def getVersion = Some("test version")
+
+    override def outputs = Seq()
+    override def inputs = Seq()
+    qSettings = new QSettings {
+      jobName = "test"
+      jobTempDir = Files.createTempDir()
+      jobTempDir.deleteOnExit()
+      jobPriority = Some(1)
+    }
+    override def absoluteCommandDirectory() {}
+  }
+
+  def makeVersionSummarizable(files: Map[String, File] = Map(),
+                              stats: Map[String, Any] = Map(),
+                              c: Map[String, Any] = Map()) =
+    new CommandLineFunction with Configurable with Summarizable with Version {
+      override def globalConfig = new Config(c)
+      override def configName = "version_command"
+      def root: Configurable = null
+
+      def summaryFiles: Map[String, File] = files
+      def summaryStats: Any = stats
+
+      def versionCommand: String = "echo test version"
+      def versionRegex: Regex = """(.*)""".r
+      override def getVersion = Some("test version")
+
+      def commandLine: String = ""
+
+      override def outputs = Seq()
+      override def inputs = Seq()
+      qSettings = new QSettings {
+        jobName = "test"
+        jobTempDir = Files.createTempDir()
+        jobTempDir.deleteOnExit()
+        jobPriority = Some(1)
+      }
+      override def absoluteCommandDirectory() {}
+    }
+
 }
\ No newline at end of file