diff --git a/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/Reference.scala b/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/Reference.scala
index b4574503dcb2368529f597196e49aabd381716eb..fae232c879a7a06e5922fa7aea94138992a95acf 100644
--- a/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/Reference.scala
+++ b/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/Reference.scala
@@ -18,7 +18,7 @@ import java.io.File
 
 import htsjdk.samtools.reference.IndexedFastaSequenceFile
 import nl.lumc.sasc.biopet.core.summary.{ Summarizable, SummaryQScript }
-import nl.lumc.sasc.biopet.utils.config.{Config, Configurable}
+import nl.lumc.sasc.biopet.utils.config.{ Config, Configurable }
 import nl.lumc.sasc.biopet.utils.{ ConfigUtils, FastaUtils, Logging }
 
 import scala.collection.JavaConversions._
diff --git a/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/cnmops.R b/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/cnmops.R
index b2a4be982f897a9555da631a9602d0c9ac37cc45..89e816f41daeed17f2e8590563a31f86d7cdbe27 100644
--- a/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/cnmops.R
+++ b/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/cnmops.R
@@ -1,6 +1,6 @@
 #!/usr/bin/env Rscript
-suppressPackageStartupMessages(library('cn.mops'))
-suppressPackageStartupMessages(library('optparse'))
+suppressWarnings(suppressPackageStartupMessages(library('cn.mops')))
+suppressWarnings(suppressPackageStartupMessages(library('optparse')))
 
 # Script from  https://git.lumc.nl/lgtc-bioinformatics/gapss3/blob/master/src/CNV/makeCnmops.sh
 # modified to take arguments
@@ -10,7 +10,9 @@ option_list <- list(
     make_option(c("--cnv"), dest="cnv"),
     make_option(c("--cnr"), dest="cnr"),
     make_option(c("--chr"), dest="chr"),
-    make_option(c("--threads"), dest="threads", default=8, type="integer")
+    make_option(c("--threads"), dest="threads", default=8, type="integer"),
+    make_option(c("--wl"), dest="wl", default=1000, type="integer"),
+    make_option(c("--version"), action="store_true", default=FALSE)
     )
 
 parser <- OptionParser(usage = "%prog [options] file", option_list=option_list)
@@ -18,13 +20,32 @@ arguments = parse_args(parser, positional_arguments=TRUE)
 opt = arguments$options
 args = arguments$args
 
+if (opt$version) {
+    cat(toString(packageVersion('cn.mops')))
+    quit("no")
+}
+
 chromosome <- opt$chr
 CNVoutput <- opt$cnv
 CNRoutput <- opt$cnr
+windowLength <- opt$wl
 bamFile <- args
 
-BAMFiles <- c(bamFile)
-bamDataRanges <- getReadCountsFromBAM(BAMFiles, mode="paired", refSeqName=chromosome, WL=1000, parallel=opt$threads)
+BAMFiles <- strsplit(c(bamFile), " ")[[1]]
+bamDataRanges <- tryCatch(
+    {
+        getReadCountsFromBAM(BAMFiles, mode="paired", refSeqName=chromosome, WL=windowLength, parallel=opt$threads)
+    },
+    error = function(e) {
+        quit("no")
+    },
+    warning = function(w) {
+        quit("no")
+    },
+    finally = {
+
+    }
+)
 
 write.table(as.data.frame( bamDataRanges ), quote = FALSE, opt$rawoutput, row.names=FALSE)
 
@@ -43,7 +64,7 @@ dir.create(chromosome, showWarnings=FALSE, recursive=TRUE, mode="0744")
 
 # Plot chromosome per sample.
 for ( i in 1:length(BAMFiles)){
-  png(file=paste(chromosome,"/",chromosome,"-segplot-",i,".png", sep=""),
+  png(file=paste(dirname(opt$rawoutput),"/",chromosome,"-segplot-",i,".png", sep=""),
   width = 16 * ppi, height = 10 * ppi,
     res=ppi, bg = "white"
   )
@@ -56,7 +77,7 @@ for ( i in 1:length(BAMFiles)){
 
 # Plot cnvr regions.
 for ( i in 1:nrow(as.data.frame(cnvr(res)))) {
-  png(file=paste(chromosome,"/",chromosome,"-cnv-",i,".png",sep=""),
+  png(file=paste(dirname(opt$rawoutput),"/",chromosome,"-cnv-",i,".png",sep=""),
   width = 16 * ppi, height = 10 * ppi,
     res=ppi, bg = "white")
     par(mfrow = c(1,1))
diff --git a/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.R b/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.R
index a0061bc68b46953a34ba06923ee0d7478dd6618b..9742591e40fbb825835024f4215a93447ab978a5 100644
--- a/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.R
+++ b/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.R
@@ -4,7 +4,6 @@ library('naturalsort')
 # Script taken from  http://bioinfo-out.curie.fr/projects/freec/tutorial.html and modified for biopet
 
 option_list <- list(
-    make_option(c("-m", "--mappability"), dest="mappability"),
     make_option(c("-p", "--ploidy"), default=2, type="integer", dest="ploidy"),
     make_option(c("-i", "--input"), dest="input"),
     make_option(c("-o", "--output"), dest="output")
@@ -14,17 +13,6 @@ parser <- OptionParser(usage = "%prog [options] file", option_list=option_list)
 opt = parse_args(parser)
 
 
-#
-# Load mappability track
-#
-
-mappabilityFile <- opt$mappability
-mappabilityTrack <- read.table(mappabilityFile, header=FALSE, col.names=c("chrom", "start", "end", "score"))
-
-mappabilityTrack$Start <- mappabilityTrack$start+1
-mappabilityTrack$Chromosome <- gsub("chr", "", mappabilityTrack$chrom)
-
-
 #
 # Load Data
 #
@@ -37,9 +25,7 @@ chromosomes <- naturalsort(levels(input_ratio$Chromosome))
 input_ratio$Chromosome <- factor(input_ratio$Chromosome, levels=chromosomes, ordered=T)
 
 sorted_ratio <- input_ratio[order(input_ratio$Chromosome),]
-ratio <- merge(sorted_ratio, mappabilityTrack, sort=TRUE)
-ratio <- ratio[order(ratio$Chromosome, ratio$Start),]
-
+ratio <- input_ratio[order(input_ratio$Chromosome, input_ratio$Start),]
 
 ploidy <- opt$ploidy
 ppi <- 300
@@ -99,15 +85,6 @@ for (i in chromosomes) {
     dev.off()
 }
 
-
-
-
-
-
-
-
-
-
 png(filename = paste(opt$output, ".png",sep=""), width = 16 * ppi, height = 10 * ppi,
     res=ppi, bg = "white")
 par(mfrow = c(6,4))
@@ -151,7 +128,7 @@ dev.off()
 
 # Export the whole genome graph
 
-png(filename = paste(opt$output, ".wg.png",sep=""), width = 16 * ppi, height = 10 * ppi,
+png(filename = paste(opt$output, ".wg.png",sep=""), width = 50 * ppi, height = 10 * ppi,
 res=ppi, bg = "white")
 
 plot_margins <- c(3,4,2,2)+0.1
diff --git a/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.py b/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.py
new file mode 100644
index 0000000000000000000000000000000000000000..60053153943f1685a88bf7aa49c6503013adc4ab
--- /dev/null
+++ b/biopet-extensions/src/main/resources/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.py
@@ -0,0 +1,126 @@
+import argparse
+from os.path import join
+
+import numpy as np
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+
+
+class BamRatioReader(object):
+    """
+    Reader object for bam_ratio.txt files
+    """
+
+    def __init__(self, filename):
+        self.filename = filename
+        self.__handle = open(filename)
+
+
+    def __reset_handle(self):
+        self.__handle.close()
+        self.__handle = open(self.filename)
+
+
+    def get_chromosome(self, chromosome):
+        self.__reset_handle()
+        lines = []
+        for line in self.__handle:
+            if line.split("\t")[0] == chromosome:
+                lines.append(line)
+        return lines
+
+    @property
+    def chromosomes(self):
+        self.__reset_handle()
+        chrs = []
+        for x in self.__handle:
+            if "Chromosome" not in x:
+                chrs.append(x.split("\t")[0])
+        return list(set(chrs))
+
+
+
+def get_cn_lines(lines, cn_type="diploid" ,ploidy=2):
+    """
+    For a list if lines, return those lines belonging to a certain cn_typle
+    :param lines: list of lines
+    :param cn_type: either "normal" (cn= ploidy), "loss" (cn < ploidy) or "gain" (cn > ploidy)
+    :return: list of lines
+    """
+    n_lines = []
+    for line in lines:
+        cn = line.strip().split("\t")[-1]
+        if cn_type == "normal" and int(cn) == ploidy:
+            n_lines.append(line)
+        elif cn_type == "loss" and int(cn) < ploidy:
+            n_lines.append(line)
+        elif cn_type == "gain" and int(cn) > ploidy:
+            n_lines.append(line)
+    return n_lines
+
+
+def lines_to_array(lines, ploidy=2):
+    """
+    Convert list of lines to numpy array of [start, ratio]
+    """
+    tmp = []
+    for x in lines:
+        start = x.split("\t")[1]
+        ratio = x.split("\t")[2]
+        tmp.append([int(start), float(ratio)*ploidy])
+    return np.array(tmp)
+
+
+def plot_chromosome(lines, chromosome, output_file, ploidy):
+    """
+    Plot lines belonging to a chromosome
+    green = where CN = ploidy
+    red = where CN > ploidy
+    blue = where CN < ploidy
+    """
+    fig = plt.figure(figsize=(8,6))
+    ax = fig.add_subplot(111)
+    normals = lines_to_array(get_cn_lines(lines, "normal", ploidy), ploidy)
+    losses = lines_to_array(get_cn_lines(lines, "loss", ploidy), ploidy)
+    gains = lines_to_array(get_cn_lines(lines, "gain", ploidy), ploidy)
+    print("Plotting chromosome {0}".format(chromosome))
+    all_x = []
+
+    if len(normals) > 0:
+        ax.scatter(normals[:, 0], normals[:,1], color="g")
+        for x in normals[:, 0]:
+            all_x += [x]
+    if len(losses) > 0:
+        ax.scatter(losses[:, 0], losses[:,1], color="b")
+        for x in losses[:, 0]:
+            all_x += [x]
+    if len(gains) > 0:
+        for x in gains[:, 0]:
+            all_x += [x]
+        ax.scatter(gains[:,0], gains[:,1], color="r")
+
+    ax.set_ylim(0, ploidy*3)
+    ax.set_xlim(int(0-(max(all_x)*0.1)), int(max(all_x)+(max(all_x)*0.1)))
+
+    ax.set_xlabel("chromosome position")
+    ax.set_ylabel("CN")
+    ax.set_title("Chromosome {0}".format(chromosome))
+
+    plt.savefig(output_file)
+    plt.close()
+
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-I', "--input", required=True, help="Input bam_ratio.txt file")
+    parser.add_argument('-O', '--output-prefix', required=True, help="Path to output prefix")
+    parser.add_argument("-p", "--ploidy", type=int, default=2, help="Ploidy of sample")
+
+    args = parser.parse_args()
+
+    reader = BamRatioReader(args.input)
+    for chromosome in reader.chromosomes:
+        ofile = args.output_prefix + "." + "chr{0}.png".format(chromosome)
+        lines = reader.get_chromosome(chromosome)
+        plot_chromosome(lines, chromosome, ofile, args.ploidy)
\ No newline at end of file
diff --git a/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cnmops.scala b/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cnmops.scala
index ad0f1e68b01b3fb5b744763da0cd377c35d24e71..1407f45c4d668fdeb8c79f4dc0cee6def8669ad6 100644
--- a/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cnmops.scala
+++ b/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/Cnmops.scala
@@ -16,43 +16,102 @@ package nl.lumc.sasc.biopet.extensions
 
 import java.io.File
 
+import nl.lumc.sasc.biopet.core.Version
 import nl.lumc.sasc.biopet.core.extensions.RscriptCommandLineFunction
 import nl.lumc.sasc.biopet.utils.config.Configurable
-import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
+import org.broadinstitute.gatk.utils.commandline._
+
+import nl.lumc.sasc.biopet.utils.getSemanticVersion
 
 /**
  * Wrapper for the Cnmops command line tool.
  * Written based on Cnmops version v2.2.1.
  */
-class Cnmops(val root: Configurable) extends RscriptCommandLineFunction {
+class Cnmops(val root: Configurable) extends RscriptCommandLineFunction with Version {
+
+  override def defaultThreads = 4
+  override def defaultCoreMemory: Double = 4.0
 
   protected var script: File = new File("/nl/lumc/sasc/biopet/extensions/cnmops.R")
 
+  def versionCommand = {
+    val v = super.cmdLine + "--version"
+    v.trim.replace("'", "")
+  }
+  def versionRegex = "(\\d+\\.\\d+\\.\\d+)".r
+
+  private def stringToInt(s: String): Option[Int] = {
+    try {
+      Some(s.toInt)
+    } catch {
+      case e: Exception => None
+    }
+  }
+
+  /**
+   * Check whether version of cn mops is at least 1.18.0
+   *
+   * @return
+   */
+  def versionCheck: Boolean = {
+    getVersion.flatMap(getSemanticVersion(_)) match {
+      case Some(version) => (version.major == 1 && version.minor >= 18) || version.major >= 2
+      case _             => false
+    }
+  }
+
   @Input(doc = "Input file BAM", required = true)
   var input: List[File] = List()
 
+  @Argument(doc = "Chromsomosome to query", required = true)
+  var chromosome: String = _
+
+  @Argument(doc = "Window length", required = false)
+  var windowLength: Int = config("window_length", namespace = "kopisu", default = 1000)
+
   // output files, computed automatically from output directory
   @Output(doc = "Output CNV file")
-  private lazy val outputCnv: File = {
-    require(outputDir == null, "Unexpected error when trying to set cn.MOPS CNV output")
-    new File(outputDir, "cnv.txt")
+  lazy val outputCnv: File = {
+    outputDir match {
+      case Some(dir) => new File(dir, "cnv.txt")
+      case _         => throw new IllegalArgumentException("Unexpected error when trying to set cn.MOPS CNV output")
+    }
   }
 
   @Output(doc = "Output CNR file")
-  private lazy val outputCnr: File = {
-    require(outputDir == null, "Unexpected error when trying to set cn.MOPS CNR output")
-    new File(outputDir, "cnr.txt")
+  lazy val outputCnr: File = {
+    outputDir match {
+      case Some(dir) => new File(dir, "cnr.txt")
+      case _         => throw new IllegalArgumentException("Unexpected error when trying to set cn.MOPS CNR output")
+    }
+  }
+
+  @Output(doc = "Raw output")
+  lazy val rawOutput: File = {
+    outputDir match {
+      case Some(dir) => new File(dir, "rawoutput.txt")
+      case _         => throw new IllegalArgumentException("Unexpected error when trying to set cn.MOPS raw output")
+    }
   }
 
   /** write all output files to this directory [./] */
-  var outputDir: String = _
+  var outputDir: Option[File] = None
 
   override def beforeGraph = {
     super.beforeGraph
-    require(!outputDir.isEmpty, "Outputdir for cn.MOPS should not be empty")
+    require(outputDir.isDefined, "Outputdir for cn.MOPS should not be empty")
     require(input.length >= 2, "Please supply at least 2 BAM files for cn.MOPS")
+    if (!versionCheck) {
+      logger.warn("cn.mops version is below 1.18.0. Contigs containing little to no reads WILL fail")
+    }
   }
 
   override def cmdLine = super.cmdLine +
-    required(input.foreach(f => f.getAbsolutePath).toString.mkString(" "))
+    required("--cnr", outputCnr) +
+    required("--cnv", outputCnv) +
+    required("--chr", chromosome) +
+    required("--rawoutput", rawOutput) +
+    required("--threads", threads) +
+    optional("--wl", windowLength) +
+    repeat(input)
 }
diff --git a/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeC.scala b/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeC.scala
index dd752e1542895191f8a66910758343f4f3560b9c..47fe9ab9a8daadd7a17a884480ab1b5e5e8e7820 100644
--- a/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeC.scala
+++ b/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeC.scala
@@ -22,6 +22,8 @@ import org.broadinstitute.gatk.utils.commandline._
 
 class FreeC(val root: Configurable) extends BiopetCommandLineFunction with Reference with Version {
 
+  override def defaults = Map("max_walltime_limit" -> 7200)
+
   @Input(doc = "BAMfile", required = true)
   var input: File = _
 
@@ -125,7 +127,7 @@ class FreeC(val root: Configurable) extends BiopetCommandLineFunction with Refer
   override def versionCommand = executable
   override def versionRegex = """Control-FREEC v([0-9\.]+) : .*""".r
   override def defaultThreads = 4
-  override def defaultCoreMemory = 4.0
+  override def defaultCoreMemory = 50
 
   private var configFile: File = _
 
diff --git a/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeCCNVPlot.scala b/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeCCNVPlot.scala
index 248f590af8972d347f7e232122b79432a3430a3e..1505c067123e24308edc147c08bb3c0355d14400 100644
--- a/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeCCNVPlot.scala
+++ b/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/freec/FreeCCNVPlot.scala
@@ -16,12 +16,12 @@ package nl.lumc.sasc.biopet.extensions.freec
 
 import java.io.File
 
-import nl.lumc.sasc.biopet.core.extensions.RscriptCommandLineFunction
+import nl.lumc.sasc.biopet.core.extensions.{ PythonCommandLineFunction, RscriptCommandLineFunction }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
-class FreeCCNVPlot(val root: Configurable) extends RscriptCommandLineFunction {
-  protected var script: File = new File("/nl/lumc/sasc/biopet/extensions/freec/freec_CNVPlot.R")
+class FreeCCNVPlot(val root: Configurable) extends PythonCommandLineFunction {
+  setPythonScript("freec_CNVPlot.py")
 
   @Input(doc = "Output file from FreeC. *_CNV", required = true)
   var input: File = null
@@ -29,12 +29,7 @@ class FreeCCNVPlot(val root: Configurable) extends RscriptCommandLineFunction {
   @Output(doc = "Destination for the PNG file", required = true)
   var output: File = null
 
-  /**
-   * cmdLine to execute R-script and with arguments
-   * Arguments should be pasted in the same order as the script is expecting it.
-   * Unless some R library is used for named arguments
-   */
-  override def cmdLine = super.cmdLine +
-    required("-i", input) +
-    required("-o", output)
+  override def cmdLine = getPythonCommand +
+    required("-I", input) +
+    required("-O", output)
 }
diff --git a/biopet-extensions/src/test/scala/nl/lumc/sasc/biopet/extensions/CnmopsTest.scala b/biopet-extensions/src/test/scala/nl/lumc/sasc/biopet/extensions/CnmopsTest.scala
new file mode 100644
index 0000000000000000000000000000000000000000..0d877dfaade015bb7870a05cf4a4f0f90957e2fe
--- /dev/null
+++ b/biopet-extensions/src/test/scala/nl/lumc/sasc/biopet/extensions/CnmopsTest.scala
@@ -0,0 +1,19 @@
+package nl.lumc.sasc.biopet.extensions
+
+import org.scalatest.Matchers
+import org.scalatest.testng.TestNGSuite
+import org.testng.annotations.Test
+
+/**
+ * Created by Sander Bollen on 17-10-16.
+ */
+class CnmopsTest extends TestNGSuite with Matchers {
+
+  @Test
+  def testVersionCommand() = {
+    val cn = new Cnmops(null)
+    cn.versionCommand.endsWith("--version") shouldBe true
+    cn.versionCommand.split(" ").head.endsWith("Rscript") shouldBe true
+  }
+
+}
diff --git a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala
index 0a0e50a5ef560cd72bad1a9fd5612db559aaa2c8..f0c2865ad8416fdb42d9701f07bb1218533d6c2f 100644
--- a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala
+++ b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala
@@ -16,7 +16,7 @@ package nl.lumc.sasc.biopet.pipelines.kopisu
 
 import nl.lumc.sasc.biopet.core.summary.SummaryQScript
 import nl.lumc.sasc.biopet.core.{ PipelineCommand, Reference }
-import nl.lumc.sasc.biopet.pipelines.kopisu.methods.{ ConiferMethod, FreecMethod }
+import nl.lumc.sasc.biopet.pipelines.kopisu.methods.{ CnmopsMethod, ConiferMethod, FreecMethod }
 import nl.lumc.sasc.biopet.utils.{ BamUtils, Logging }
 import nl.lumc.sasc.biopet.utils.config.Configurable
 import org.broadinstitute.gatk.queue.QScript
@@ -45,9 +45,13 @@ class Kopisu(val root: Configurable) extends QScript with SummaryQScript with Re
     Some(new ConiferMethod(this))
   } else None
 
+  lazy val cnMopsMethod = if (config("use_cnmops_method", default = false)) {
+    Some(new CnmopsMethod(this))
+  } else None
+
   // This script is in fact FreeC only.
   def biopetScript() {
-    if (freecMethod.isEmpty && coniferMethod.isEmpty) Logging.addError("No method selected")
+    if (freecMethod.isEmpty && coniferMethod.isEmpty && cnMopsMethod.isEmpty) Logging.addError("No CNV method selected")
 
     freecMethod.foreach { method =>
       method.inputBams = inputBams
@@ -61,13 +65,21 @@ class Kopisu(val root: Configurable) extends QScript with SummaryQScript with Re
       add(method)
     }
 
+    cnMopsMethod.foreach { method =>
+      method.inputBams = inputBams
+      method.outputDir = new File(outputDir, "cnmops_method")
+      add(method)
+    }
+
     addSummaryJobs()
   }
 
   /** Must return a map with used settings for this pipeline */
   def summarySettings: Map[String, Any] = Map(
     "reference" -> referenceSummary,
-    "freec_method" -> freecMethod.isDefined
+    "freec_method" -> freecMethod.isDefined,
+    "conifer_method" -> coniferMethod.isDefined,
+    "cnmops_method" -> cnMopsMethod.isDefined
   )
 
   /** File to put in the summary for thie pipeline */
diff --git a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/CnmopsMethod.scala b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/CnmopsMethod.scala
new file mode 100644
index 0000000000000000000000000000000000000000..81779c4dab5017cb02577a52f2bb67f22462f046
--- /dev/null
+++ b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/CnmopsMethod.scala
@@ -0,0 +1,39 @@
+package nl.lumc.sasc.biopet.pipelines.kopisu.methods
+
+import htsjdk.samtools.{ SAMSequenceDictionary, SamReaderFactory }
+import nl.lumc.sasc.biopet.core.Reference
+import nl.lumc.sasc.biopet.extensions.Cnmops
+import nl.lumc.sasc.biopet.utils.config.Configurable
+
+import scala.collection.JavaConversions._
+
+/**
+ * Created by wyleung on 2-6-16.
+ */
+class CnmopsMethod(val root: Configurable) extends CnvMethod with Reference {
+  def name = "cnmops"
+
+  def biopetScript: Unit = {
+
+    // we repeat running cnmops for all chromosomes
+    val cnmopsJobs = referenceDict.getSequences.map(contig => {
+      val cnmops = new Cnmops(this)
+      cnmops.chromosome = contig.getSequenceName
+      cnmops.input = inputBams.flatMap {
+        case (sampleName, bamFile) => Some(bamFile)
+        case _                     => None
+      }.toList
+      cnmops.outputDir = Some(new File(outputDir, contig.getSequenceName))
+      cnmops.beforeGraph
+      cnmops
+    }).toList
+
+    addAll(cnmopsJobs)
+    // adding output files to the outputSummary
+    cnmopsJobs.foreach(job => {
+      addOutput(job.chromosome, job.rawOutput)
+    })
+
+    addSummaryJobs()
+  }
+}
diff --git a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/CnvMethod.scala b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/CnvMethod.scala
index f15ba0836c72ee2bff9f152f3bdeea3320c15a70..a9a4e8f439220ef8204a254c650ec89b02d1918a 100644
--- a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/CnvMethod.scala
+++ b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/CnvMethod.scala
@@ -37,7 +37,15 @@ trait CnvMethod extends QScript with SummaryQScript with Reference {
   def summarySettings: Map[String, Any] = Map()
 
   /** File to put in the summary for thie pipeline */
-  def summaryFiles: Map[String, File] = inputBams.map(x => s"inputbam_${x._1}" -> x._2)
+  def summaryFiles: Map[String, File] = inputBams.map(x => s"inputbam_${x._1}" -> x._2) ++ cnvOutputFiles
 
   def init() = {}
+
+  protected var cnvOutputFiles: Map[String, File] = Map.empty
+
+  def getCnvOutputFiles: Map[String, File] = cnvOutputFiles
+
+  protected def addOutput(sample: String, outputFile: File) = {
+    cnvOutputFiles += (sample -> outputFile)
+  }
 }
diff --git a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/ConiferMethod.scala b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/ConiferMethod.scala
index 392bbac2178318b1c582c84b301bfb408c1c63c4..25663b38954b55ff93ba0fd3f76ddd298b540438 100644
--- a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/ConiferMethod.scala
+++ b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/ConiferMethod.scala
@@ -67,6 +67,7 @@ class ConiferMethod(val root: Configurable) extends CnvMethod {
         coniferCall.input = coniferAnalyze.output
         coniferCall.output = new File(sampleDir, s"${sampleName}.calls.txt")
         add(coniferCall)
+        addOutput(sampleName, coniferCall.output)
     }
 
     addSummaryJobs()
diff --git a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/FreecMethod.scala b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/FreecMethod.scala
index c592cc824f5273c751e7d573d13b1936829dc168..3e726fb3689299e5eadad9e6aead870fcdffb775 100644
--- a/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/FreecMethod.scala
+++ b/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/methods/FreecMethod.scala
@@ -50,6 +50,7 @@ class FreecMethod(val root: Configurable) extends CnvMethod {
         fcAssessSignificancePlot.ratios = freec.ratioOutput
         fcAssessSignificancePlot.output = new File(sampleOutput, sampleName + ".freec_significant_calls.txt")
         add(fcAssessSignificancePlot)
+        addOutput(sampleName, fcAssessSignificancePlot.output)
 
         val fcCnvPlot = new FreeCCNVPlot(this)
         fcCnvPlot.input = freec.ratioOutput