diff --git a/modules.json b/modules.json
index 4a090fd6e6f1a31b03ba0a8e2fbe9ea1f2633747..d7443e6bb4a6189effd0c714a08fcbc4dcd6c291 100644
--- a/modules.json
+++ b/modules.json
@@ -2,24 +2,83 @@
     "name": "nf-core/hic",
     "homePage": "https://github.com/nf-core/hic",
     "repos": {
-        "nf-core/modules": {
-            "bowtie2/align": {
-                "git_sha": "61f68913fefc20241ceccb671b104230b2d775d7"
+        "https://github.com/nf-core/modules.git": {
+            "modules": {
+                "nf-core": {
+                    "bowtie2/align": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "bowtie2/build": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "cooler/balance": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "cooler/cload": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "cooler/dump": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "cooler/makebins": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "cooler/zoomify": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "custom/dumpsoftwareversions": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "custom/getchromsizes": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    },
+                    "fastqc": {
+                        "branch": "master",
+                        "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
+                        "installed_by": [
+                            "modules"
+                        ]
+                    }
+                }
             },
-            "bowtie2/build": {
-                "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d"
-            },
-            "cooler/zoomify": {
-                "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d"
-            },
-            "custom/dumpsoftwareversions": {
-                "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d"
-            },
-            "custom/getchromsizes": {
-                "git_sha": "213403187932dbbdd936a04474cc8cd8abae7a08"
-            },
-            "fastqc": {
-                "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe"
+            "subworkflows": {
+                "nf-core": {}
             }
         }
     }
diff --git a/modules/nf-core/bowtie2/align/main.nf b/modules/nf-core/bowtie2/align/main.nf
new file mode 100644
index 0000000000000000000000000000000000000000..3d851866a30b4f629881864516f0789f6cae9443
--- /dev/null
+++ b/modules/nf-core/bowtie2/align/main.nf
@@ -0,0 +1,71 @@
+process BOWTIE2_ALIGN {
+    tag "$meta.id"
+    label "process_high"
+
+    conda "bioconda::bowtie2=2.4.4 bioconda::samtools=1.16.1 conda-forge::pigz=2.6"
+    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+        'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:a0ffedb52808e102887f6ce600d092675bf3528a-0' :
+        'quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:a0ffedb52808e102887f6ce600d092675bf3528a-0' }"
+
+    input:
+    tuple val(meta) , path(reads)
+    tuple val(meta2), path(index)
+    val   save_unaligned
+    val   sort_bam
+
+    output:
+    tuple val(meta), path("*.bam")    , emit: bam
+    tuple val(meta), path("*.log")    , emit: log
+    tuple val(meta), path("*fastq.gz"), emit: fastq, optional:true
+    path  "versions.yml"              , emit: versions
+
+    when:
+    task.ext.when == null || task.ext.when
+
+    script:
+    def args = task.ext.args ?: ""
+    def args2 = task.ext.args2 ?: ""
+    def prefix = task.ext.prefix ?: "${meta.id}"
+
+    def unaligned = ""
+    def reads_args = ""
+    if (meta.single_end) {
+        unaligned = save_unaligned ? "--un-gz ${prefix}.unmapped.fastq.gz" : ""
+        reads_args = "-U ${reads}"
+    } else {
+        unaligned = save_unaligned ? "--un-conc-gz ${prefix}.unmapped.fastq.gz" : ""
+        reads_args = "-1 ${reads[0]} -2 ${reads[1]}"
+    }
+
+    def samtools_command = sort_bam ? 'sort' : 'view'
+
+    """
+    INDEX=`find -L ./ -name "*.rev.1.bt2" | sed "s/\\.rev.1.bt2\$//"`
+    [ -z "\$INDEX" ] && INDEX=`find -L ./ -name "*.rev.1.bt2l" | sed "s/\\.rev.1.bt2l\$//"`
+    [ -z "\$INDEX" ] && echo "Bowtie2 index files not found" 1>&2 && exit 1
+
+    bowtie2 \\
+        -x \$INDEX \\
+        $reads_args \\
+        --threads $task.cpus \\
+        $unaligned \\
+        $args \\
+        2> ${prefix}.bowtie2.log \\
+        | samtools $samtools_command $args2 --threads $task.cpus -o ${prefix}.bam -
+
+    if [ -f ${prefix}.unmapped.fastq.1.gz ]; then
+        mv ${prefix}.unmapped.fastq.1.gz ${prefix}.unmapped_1.fastq.gz
+    fi
+
+    if [ -f ${prefix}.unmapped.fastq.2.gz ]; then
+        mv ${prefix}.unmapped.fastq.2.gz ${prefix}.unmapped_2.fastq.gz
+    fi
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//')
+        samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//')
+        pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' )
+    END_VERSIONS
+    """
+}
diff --git a/modules/nf-core/modules/bowtie2/align/meta.yml b/modules/nf-core/bowtie2/align/meta.yml
similarity index 74%
rename from modules/nf-core/modules/bowtie2/align/meta.yml
rename to modules/nf-core/bowtie2/align/meta.yml
index f80421eca42c51c7238770d44466f9de978e01ae..c8e9a001290d0feddaa121424a5a9c65ae568396 100644
--- a/modules/nf-core/modules/bowtie2/align/meta.yml
+++ b/modules/nf-core/bowtie2/align/meta.yml
@@ -2,7 +2,9 @@ name: bowtie2_align
 description: Align reads to a reference genome using bowtie2
 keywords:
   - align
+  - map
   - fasta
+  - fastq
   - genome
   - reference
 tools:
@@ -25,10 +27,24 @@ input:
       description: |
         List of input FastQ files of size 1 and 2 for single-end and paired-end data,
         respectively.
+  - meta2:
+      type: map
+      description: |
+        Groovy Map containing reference information
+        e.g. [ id:'test', single_end:false ]
   - index:
       type: file
       description: Bowtie2 genome index files
       pattern: "*.ebwt"
+  - save_unaligned:
+      type: boolean
+      description: |
+        Save reads that do not map to the reference (true) or discard them (false)
+        (default: false)
+  - sort_bam:
+      type: boolean
+      description: use samtools sort (true) or samtools view (false)
+      pattern: "true or false"
 output:
   - bam:
       type: file
diff --git a/modules/nf-core/modules/bowtie2/build/main.nf b/modules/nf-core/bowtie2/build/main.nf
similarity index 80%
rename from modules/nf-core/modules/bowtie2/build/main.nf
rename to modules/nf-core/bowtie2/build/main.nf
index a4da62d073b5353cfdd6bff727cc12a86692706b..551893af3b3bb1a3955f1cc7c0b50735c6fded8d 100644
--- a/modules/nf-core/modules/bowtie2/build/main.nf
+++ b/modules/nf-core/bowtie2/build/main.nf
@@ -2,17 +2,17 @@ process BOWTIE2_BUILD {
     tag "$fasta"
     label 'process_high'
 
-    conda (params.enable_conda ? 'bioconda::bowtie2=2.4.4' : null)
+    conda "bioconda::bowtie2=2.4.4"
     container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
         'https://depot.galaxyproject.org/singularity/bowtie2:2.4.4--py39hbb4e92a_0' :
         'quay.io/biocontainers/bowtie2:2.4.4--py39hbb4e92a_0' }"
 
     input:
-    path fasta
+    tuple val(meta), path(fasta)
 
     output:
-    path 'bowtie2'      , emit: index
-    path "versions.yml" , emit: versions
+    tuple val(meta), path('bowtie2')    , emit: index
+    path "versions.yml"                 , emit: versions
 
     when:
     task.ext.when == null || task.ext.when
diff --git a/modules/nf-core/modules/bowtie2/build/meta.yml b/modules/nf-core/bowtie2/build/meta.yml
similarity index 74%
rename from modules/nf-core/modules/bowtie2/build/meta.yml
rename to modules/nf-core/bowtie2/build/meta.yml
index 2da9a217163fae0e1b392af5ce6473c62e074c25..0240224d532af842d762c5c947fff6e84e5be113 100644
--- a/modules/nf-core/modules/bowtie2/build/meta.yml
+++ b/modules/nf-core/bowtie2/build/meta.yml
@@ -16,10 +16,20 @@ tools:
       doi: 10.1038/nmeth.1923
       licence: ["GPL-3.0-or-later"]
 input:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing reference information
+        e.g. [ id:'test', single_end:false ]
   - fasta:
       type: file
       description: Input genome fasta file
 output:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing reference information
+        e.g. [ id:'test', single_end:false ]
   - index:
       type: file
       description: Bowtie2 genome index files
diff --git a/modules/nf-core/cooler/balance/main.nf b/modules/nf-core/cooler/balance/main.nf
new file mode 100644
index 0000000000000000000000000000000000000000..4173a3c1291df7e25e3529d9ab8f2b6f8d1240b7
--- /dev/null
+++ b/modules/nf-core/cooler/balance/main.nf
@@ -0,0 +1,39 @@
+process COOLER_BALANCE {
+    tag "$meta.id"
+    label 'process_high'
+
+    conda "bioconda::cooler=0.8.11"
+    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+        'https://depot.galaxyproject.org/singularity/cooler:0.8.11--pyh3252c3a_0':
+        'quay.io/biocontainers/cooler:0.8.11--pyh3252c3a_0' }"
+
+    input:
+    tuple val(meta), path(cool), val(resolution)
+
+    output:
+    tuple val(meta), path("${prefix}.${extension}"), emit: cool
+    path "versions.yml"                            , emit: versions
+
+    when:
+    task.ext.when == null || task.ext.when
+
+    script:
+    def args = task.ext.args ?: ''
+    prefix = task.ext.prefix ?: "${meta.id}"
+    suffix = resolution ? "::/resolutions/$resolution" : ""
+    extension = cool.getExtension()
+    if ("$cool" == "${prefix}.${extension}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!"
+    """
+    cp ${cool} ${prefix}.${extension}
+
+    cooler balance \\
+        $args \\
+        -p ${task.cpus} \\
+        ${prefix}.${extension}${suffix}
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //')
+    END_VERSIONS
+    """
+}
diff --git a/modules/nf-core/cooler/balance/meta.yml b/modules/nf-core/cooler/balance/meta.yml
new file mode 100644
index 0000000000000000000000000000000000000000..af1a780002701ad6bbf7d64105e5e8153098f5ec
--- /dev/null
+++ b/modules/nf-core/cooler/balance/meta.yml
@@ -0,0 +1,45 @@
+name: "cooler_balance"
+description: Run matrix balancing on a cool file
+keywords:
+  - balance
+tools:
+  - "cooler":
+      description: Sparse binary format for genomic interaction matrices
+      homepage: https://open2c.github.io/cooler/
+      documentation: https://cooler.readthedocs.io/en/latest/index.html
+      tool_dev_url: https://github.com/open2c/cooler
+      doi: "10.1093/bioinformatics/btz540"
+      licence: ["BSD-3-Clause"]
+
+input:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
+  - cool:
+      type: file
+      description: Path to COOL file
+      pattern: "*.{cool,mcool}"
+  - resolution:
+      type: value
+      description: Resolution
+
+output:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
+  - versions:
+      type: file
+      description: File containing software versions
+      pattern: "versions.yml"
+  - cool:
+      type: file
+      description: Output COOL file balancing weigths
+      pattern: "*.cool"
+
+authors:
+  - "@nservant"
+  - "@muffato"
diff --git a/modules/nf-core/cooler/cload/main.nf b/modules/nf-core/cooler/cload/main.nf
new file mode 100644
index 0000000000000000000000000000000000000000..80d61f07336f81233a6bd8ffb116e5a25e57048d
--- /dev/null
+++ b/modules/nf-core/cooler/cload/main.nf
@@ -0,0 +1,39 @@
+process COOLER_CLOAD {
+    tag "$meta.id"
+    label 'process_high'
+
+    conda "bioconda::cooler=0.8.11"
+    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+        'https://depot.galaxyproject.org/singularity/cooler:0.8.11--pyh3252c3a_0' :
+        'quay.io/biocontainers/cooler:0.8.11--pyh3252c3a_0' }"
+
+    input:
+    tuple val(meta), path(pairs), path(index), val(cool_bin)
+    path chromsizes
+
+    output:
+    tuple val(meta), path("*.cool"), val(cool_bin), emit: cool
+    path "versions.yml"                           , emit: versions
+
+    when:
+    task.ext.when == null || task.ext.when
+
+    script:
+    def args = task.ext.args ?: ''
+    def prefix = task.ext.prefix ?: "${meta.id}"
+    def nproc  = args.contains('pairix') || args.contains('tabix')? "--nproc $task.cpus" : ''
+
+    """
+    cooler cload \\
+        $args \\
+        $nproc \\
+        ${chromsizes}:${cool_bin} \\
+        $pairs \\
+        ${prefix}.cool
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //')
+    END_VERSIONS
+    """
+}
diff --git a/modules/nf-core/cooler/cload/meta.yml b/modules/nf-core/cooler/cload/meta.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8513aaec1ed8558f850367f453ee55eb9d378b11
--- /dev/null
+++ b/modules/nf-core/cooler/cload/meta.yml
@@ -0,0 +1,53 @@
+name: cooler_cload
+description: Create a cooler from genomic pairs and bins
+keywords:
+  - cool
+tools:
+  - cooler:
+      description: Sparse binary format for genomic interaction matrices
+      homepage: https://open2c.github.io/cooler/
+      documentation: https://cooler.readthedocs.io/en/latest/index.html
+      tool_dev_url: https://github.com/open2c/cooler
+      doi: "10.1093/bioinformatics/btz540"
+      licence: ["BSD-3-clause"]
+
+input:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
+  - pairs:
+      type: file
+      description: Path to contacts (i.e. read pairs) file.
+  - index:
+      type: file
+      description: Path to index file of the contacts.
+  - cool_bin:
+      type: value
+      description: Bins size in bp
+  - chromsizes:
+      type: file
+      description: Path to a chromsizes file.
+
+output:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
+  - version:
+      type: file
+      description: File containing software version
+      pattern: "versions.yml"
+  - cool:
+      type: file
+      description: Output COOL file path
+      pattern: "*.cool"
+  - cool_bin:
+      type: value
+      description: Bins size in bp
+
+authors:
+  - "@jianhong"
+  - "@muffato"
diff --git a/modules/nf-core/cooler/dump/main.nf b/modules/nf-core/cooler/dump/main.nf
new file mode 100644
index 0000000000000000000000000000000000000000..b46c78cf35ec6b40276e2d792635f97b9909ab55
--- /dev/null
+++ b/modules/nf-core/cooler/dump/main.nf
@@ -0,0 +1,35 @@
+process COOLER_DUMP {
+    tag "$meta.id"
+    label 'process_high'
+
+    conda "bioconda::cooler=0.8.11"
+    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+        'https://depot.galaxyproject.org/singularity/cooler:0.8.11--pyh3252c3a_0' :
+        'quay.io/biocontainers/cooler:0.8.11--pyh3252c3a_0' }"
+
+    input:
+    tuple val(meta), path(cool), val(resolution)
+
+    output:
+    tuple val(meta), path("*.bedpe"), emit: bedpe
+    path "versions.yml"             , emit: versions
+
+    when:
+    task.ext.when == null || task.ext.when
+
+    script:
+    def args = task.ext.args ?: ''
+    def prefix = task.ext.prefix ?: "${meta.id}"
+    def suffix = resolution ? "::/resolutions/$resolution" : ""
+    """
+    cooler dump \\
+        $args \\
+        -o ${prefix}.bedpe \\
+        $cool$suffix
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //')
+    END_VERSIONS
+    """
+}
diff --git a/modules/nf-core/cooler/dump/meta.yml b/modules/nf-core/cooler/dump/meta.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fe60523eb3556a6bb2187be0563c3fd6f2cbf5cf
--- /dev/null
+++ b/modules/nf-core/cooler/dump/meta.yml
@@ -0,0 +1,45 @@
+name: cooler_dump
+description: Dump a cooler’s data to a text stream.
+keywords:
+  - dump
+tools:
+  - cooler:
+      description: Sparse binary format for genomic interaction matrices
+      homepage: https://open2c.github.io/cooler/
+      documentation: https://cooler.readthedocs.io/en/latest/index.html
+      tool_dev_url: https://github.com/open2c/cooler
+      doi: "10.1093/bioinformatics/btz540"
+      licence: ["BSD-3-Clause"]
+
+input:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
+  - cool:
+      type: file
+      description: Path to COOL file
+      pattern: "*.{cool,mcool}"
+  - resolution:
+      type: value
+      description: Resolution
+
+output:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
+  - versions:
+      type: file
+      description: File containing software versions
+      pattern: "versions.yml"
+  - bedpe:
+      type: file
+      description: Output text file
+      pattern: "*.bedpe"
+
+authors:
+  - "@jianhong"
+  - "@muffato"
diff --git a/modules/nf-core/cooler/makebins/main.nf b/modules/nf-core/cooler/makebins/main.nf
new file mode 100644
index 0000000000000000000000000000000000000000..7f0826197e99e9e79107359a8c65d7d60346dc49
--- /dev/null
+++ b/modules/nf-core/cooler/makebins/main.nf
@@ -0,0 +1,34 @@
+process COOLER_MAKEBINS {
+    tag "${meta.id}}"
+    label 'process_low'
+
+    conda "bioconda::cooler=0.8.11"
+    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+        'https://depot.galaxyproject.org/singularity/cooler:0.8.11--pyh3252c3a_0':
+        'quay.io/biocontainers/cooler:0.8.11--pyh3252c3a_0' }"
+
+    input:
+    tuple val(meta), path(chromsizes), val(cool_bin)
+
+    output:
+    tuple val(meta), path("*.bed"), emit: bed
+    path "versions.yml"           , emit: versions
+
+    when:
+    task.ext.when == null || task.ext.when
+
+    script:
+    def args   = task.ext.args   ?: ''
+    def prefix = task.ext.prefix ?: "${meta.id}"
+    """
+    cooler makebins \\
+        $args \\
+        ${chromsizes} \\
+        ${cool_bin} > ${prefix}.bed
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //')
+    END_VERSIONS
+    """
+}
diff --git a/modules/nf-core/cooler/makebins/meta.yml b/modules/nf-core/cooler/makebins/meta.yml
new file mode 100644
index 0000000000000000000000000000000000000000..33fd8eb63f4a3225d3d03eb028578b2c1eeeaa5d
--- /dev/null
+++ b/modules/nf-core/cooler/makebins/meta.yml
@@ -0,0 +1,34 @@
+name: "cooler_makebins"
+description: Generate fixed-width genomic bins
+keywords:
+  - makebins
+tools:
+  - "cooler":
+      description: Sparse binary format for genomic interaction matrices
+      homepage: https://open2c.github.io/cooler/
+      documentation: https://cooler.readthedocs.io/en/latest/index.html
+      tool_dev_url: https://github.com/open2c/cooler
+      doi: "10.1093/bioinformatics/btz540"
+      licence: ["BSD-3-Clause"]
+
+input:
+  - chromsize:
+      type: file
+      description: Path to chromosome size file
+  - cool_bin:
+      type: value
+      description: Resolution (bin size) in base pairs
+
+output:
+  - versions:
+      type: file
+      description: File containing software versions
+      pattern: "versions.yml"
+  - bed:
+      type: file
+      description: Genome segmentation at a fixed resolution as a BED file.
+      pattern: "*.bed"
+
+authors:
+  - "@nservant"
+  - "@muffato"
diff --git a/modules/nf-core/modules/cooler/zoomify/main.nf b/modules/nf-core/cooler/zoomify/main.nf
similarity index 93%
rename from modules/nf-core/modules/cooler/zoomify/main.nf
rename to modules/nf-core/cooler/zoomify/main.nf
index 942282c0d6a8ab161502a375863185579bae9f47..f1cd8df79d02b8630c31de0620521cef0cdd6df0 100644
--- a/modules/nf-core/modules/cooler/zoomify/main.nf
+++ b/modules/nf-core/cooler/zoomify/main.nf
@@ -2,7 +2,7 @@ process COOLER_ZOOMIFY {
     tag "$meta.id"
     label 'process_high'
 
-    conda (params.enable_conda ? "bioconda::cooler=0.8.11" : null)
+    conda "bioconda::cooler=0.8.11"
     container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
         'https://depot.galaxyproject.org/singularity/cooler:0.8.11--pyh3252c3a_0' :
         'quay.io/biocontainers/cooler:0.8.11--pyh3252c3a_0' }"
diff --git a/modules/nf-core/modules/cooler/zoomify/meta.yml b/modules/nf-core/cooler/zoomify/meta.yml
similarity index 93%
rename from modules/nf-core/modules/cooler/zoomify/meta.yml
rename to modules/nf-core/cooler/zoomify/meta.yml
index d9e12b0587d3500e9592402bd5788615cad9d17a..57f554861b25d4ca9edac66c73ff306a4d9f9390 100644
--- a/modules/nf-core/modules/cooler/zoomify/meta.yml
+++ b/modules/nf-core/cooler/zoomify/meta.yml
@@ -5,7 +5,7 @@ keywords:
 tools:
   - cooler:
       description: Sparse binary format for genomic interaction matrices
-      homepage: https://cooler.readthedocs.io/en/latest/index.html
+      homepage: https://open2c.github.io/cooler/
       documentation: https://cooler.readthedocs.io/en/latest/index.html
       tool_dev_url: https://github.com/open2c/cooler
       doi: "10.1093/bioinformatics/btz540"
diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf
similarity index 79%
rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf
rename to modules/nf-core/custom/dumpsoftwareversions/main.nf
index 327d5100560d84eb0020b60acf0db2922497991b..3df21765b90921413962c3bb5ca44d117d829297 100644
--- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf
+++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf
@@ -1,11 +1,11 @@
 process CUSTOM_DUMPSOFTWAREVERSIONS {
-    label 'process_low'
+    label 'process_single'
 
     // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container
-    conda (params.enable_conda ? "bioconda::multiqc=1.11" : null)
+    conda "bioconda::multiqc=1.13"
     container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
-        'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' :
-        'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }"
+        'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' :
+        'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }"
 
     input:
     path versions
diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml
similarity index 100%
rename from modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml
rename to modules/nf-core/custom/dumpsoftwareversions/meta.yml
diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
new file mode 100755
index 0000000000000000000000000000000000000000..da03340857c4c90957c79c9f892030bc1bb397a3
--- /dev/null
+++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+
+
+"""Provide functions to merge multiple versions.yml files."""
+
+
+import yaml
+import platform
+from textwrap import dedent
+
+
+def _make_versions_html(versions):
+    """Generate a tabular HTML output of all versions for MultiQC."""
+    html = [
+        dedent(
+            """\\
+            <style>
+            #nf-core-versions tbody:nth-child(even) {
+                background-color: #f2f2f2;
+            }
+            </style>
+            <table class="table" style="width:100%" id="nf-core-versions">
+                <thead>
+                    <tr>
+                        <th> Process Name </th>
+                        <th> Software </th>
+                        <th> Version  </th>
+                    </tr>
+                </thead>
+            """
+        )
+    ]
+    for process, tmp_versions in sorted(versions.items()):
+        html.append("<tbody>")
+        for i, (tool, version) in enumerate(sorted(tmp_versions.items())):
+            html.append(
+                dedent(
+                    f"""\\
+                    <tr>
+                        <td><samp>{process if (i == 0) else ''}</samp></td>
+                        <td><samp>{tool}</samp></td>
+                        <td><samp>{version}</samp></td>
+                    </tr>
+                    """
+                )
+            )
+        html.append("</tbody>")
+    html.append("</table>")
+    return "\\n".join(html)
+
+
+def main():
+    """Load all version files and generate merged output."""
+    versions_this_module = {}
+    versions_this_module["${task.process}"] = {
+        "python": platform.python_version(),
+        "yaml": yaml.__version__,
+    }
+
+    with open("$versions") as f:
+        versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module
+
+    # aggregate versions by the module name (derived from fully-qualified process name)
+    versions_by_module = {}
+    for process, process_versions in versions_by_process.items():
+        module = process.split(":")[-1]
+        try:
+            if versions_by_module[module] != process_versions:
+                raise AssertionError(
+                    "We assume that software versions are the same between all modules. "
+                    "If you see this error-message it means you discovered an edge-case "
+                    "and should open an issue in nf-core/tools. "
+                )
+        except KeyError:
+            versions_by_module[module] = process_versions
+
+    versions_by_module["Workflow"] = {
+        "Nextflow": "$workflow.nextflow.version",
+        "$workflow.manifest.name": "$workflow.manifest.version",
+    }
+
+    versions_mqc = {
+        "id": "software_versions",
+        "section_name": "${workflow.manifest.name} Software Versions",
+        "section_href": "https://github.com/${workflow.manifest.name}",
+        "plot_type": "html",
+        "description": "are collected at run time from the software output.",
+        "data": _make_versions_html(versions_by_module),
+    }
+
+    with open("software_versions.yml", "w") as f:
+        yaml.dump(versions_by_module, f, default_flow_style=False)
+    with open("software_versions_mqc.yml", "w") as f:
+        yaml.dump(versions_mqc, f, default_flow_style=False)
+
+    with open("versions.yml", "w") as f:
+        yaml.dump(versions_this_module, f, default_flow_style=False)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/modules/nf-core/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf
new file mode 100644
index 0000000000000000000000000000000000000000..580f87feade7280bb8d520551aa61f0021b3b88d
--- /dev/null
+++ b/modules/nf-core/custom/getchromsizes/main.nf
@@ -0,0 +1,44 @@
+process CUSTOM_GETCHROMSIZES {
+    tag "$fasta"
+    label 'process_single'
+
+    conda "bioconda::samtools=1.16.1"
+    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+        'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' :
+        'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }"
+
+    input:
+    tuple val(meta), path(fasta)
+
+    output:
+    tuple val(meta), path ("*.sizes"), emit: sizes
+    tuple val(meta), path ("*.fai")  , emit: fai
+    tuple val(meta), path ("*.gzi")  , emit: gzi, optional: true
+    path  "versions.yml"             , emit: versions
+
+    when:
+    task.ext.when == null || task.ext.when
+
+    script:
+    def args = task.ext.args ?: ''
+    """
+    samtools faidx $fasta
+    cut -f 1,2 ${fasta}.fai > ${fasta}.sizes
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        getchromsizes: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//')
+    END_VERSIONS
+    """
+
+    stub:
+    """
+    touch ${fasta}.fai
+    touch ${fasta}.sizes
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        getchromsizes: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//')
+    END_VERSIONS
+    """
+}
diff --git a/modules/nf-core/modules/custom/getchromsizes/meta.yml b/modules/nf-core/custom/getchromsizes/meta.yml
similarity index 62%
rename from modules/nf-core/modules/custom/getchromsizes/meta.yml
rename to modules/nf-core/custom/getchromsizes/meta.yml
index ee6c257185a41746801ae1cccaaef1d31379ddd7..219ca1d8e07166c23e28089ae5067b5937cc6f8d 100644
--- a/modules/nf-core/modules/custom/getchromsizes/meta.yml
+++ b/modules/nf-core/custom/getchromsizes/meta.yml
@@ -14,12 +14,22 @@ tools:
       licence: ["MIT"]
 
 input:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
   - fasta:
       type: file
       description: FASTA file
-      pattern: "*.{fasta}"
+      pattern: "*.{fa,fasta,fna,fas}"
 
 output:
+  - meta:
+      type: map
+      description: |
+        Groovy Map containing sample information
+        e.g. [ id:'test', single_end:false ]
   - sizes:
       type: file
       description: File containing chromosome lengths
@@ -28,11 +38,16 @@ output:
       type: file
       description: FASTA index file
       pattern: "*.{fai}"
+  - gzi:
+      type: file
+      description: Optional gzip index file for compressed inputs
+      pattern: "*.gzi"
   - versions:
       type: file
-      description: File containing software version
+      description: File containing software versions
       pattern: "versions.yml"
 
 authors:
   - "@tamara-hodgetts"
   - "@chris-cheshire"
+  - "@muffato"
diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf
new file mode 100644
index 0000000000000000000000000000000000000000..9ae5838158b28d2ae49270133fbbfe0ea673e991
--- /dev/null
+++ b/modules/nf-core/fastqc/main.nf
@@ -0,0 +1,51 @@
+process FASTQC {
+    tag "$meta.id"
+    label 'process_medium'
+
+    conda "bioconda::fastqc=0.11.9"
+    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
+        'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' :
+        'quay.io/biocontainers/fastqc:0.11.9--0' }"
+
+    input:
+    tuple val(meta), path(reads)
+
+    output:
+    tuple val(meta), path("*.html"), emit: html
+    tuple val(meta), path("*.zip") , emit: zip
+    path  "versions.yml"           , emit: versions
+
+    when:
+    task.ext.when == null || task.ext.when
+
+    script:
+    def args = task.ext.args ?: ''
+    def prefix = task.ext.prefix ?: "${meta.id}"
+    // Make list of old name and new name pairs to use for renaming in the bash while loop
+    def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] }
+    def rename_to = old_new_pairs*.join(' ').join(' ')
+    def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ')
+    """
+    printf "%s %s\\n" $rename_to | while read old_name new_name; do
+        [ -f "\${new_name}" ] || ln -s \$old_name \$new_name
+    done
+    fastqc $args --threads $task.cpus $renamed_files
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
+    END_VERSIONS
+    """
+
+    stub:
+    def prefix = task.ext.prefix ?: "${meta.id}"
+    """
+    touch ${prefix}.html
+    touch ${prefix}.zip
+
+    cat <<-END_VERSIONS > versions.yml
+    "${task.process}":
+        fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
+    END_VERSIONS
+    """
+}
diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml
similarity index 100%
rename from modules/nf-core/modules/fastqc/meta.yml
rename to modules/nf-core/fastqc/meta.yml
diff --git a/modules/nf-core/modules/bowtie2/align/main.nf b/modules/nf-core/modules/bowtie2/align/main.nf
deleted file mode 100644
index c233f955d10b8812541b80725939b4d1768e0d32..0000000000000000000000000000000000000000
--- a/modules/nf-core/modules/bowtie2/align/main.nf
+++ /dev/null
@@ -1,81 +0,0 @@
-process BOWTIE2_ALIGN {
-    tag "$meta.id"
-    label 'process_high'
-
-    conda (params.enable_conda ? 'bioconda::bowtie2=2.4.4 bioconda::samtools=1.15.1 conda-forge::pigz=2.6' : null)
-    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
-        'https://depot.galaxyproject.org/singularity/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0' :
-        'quay.io/biocontainers/mulled-v2-ac74a7f02cebcfcc07d8e8d1d750af9c83b4d45a:1744f68fe955578c63054b55309e05b41c37a80d-0' }"
-
-    input:
-    tuple val(meta), path(reads)
-    path  index
-    val   save_unaligned
-
-    output:
-    tuple val(meta), path('*.bam')    , emit: bam
-    tuple val(meta), path('*.log')    , emit: log
-    tuple val(meta), path('*fastq.gz'), emit: fastq, optional:true
-    path  "versions.yml"              , emit: versions
-
-    when:
-    task.ext.when == null || task.ext.when
-
-    script:
-    def args = task.ext.args ?: ''
-    def args2 = task.ext.args2 ?: ''
-    def prefix = task.ext.prefix ?: "${meta.id}"
-    if (meta.single_end) {
-        def unaligned = save_unaligned ? "--un-gz ${prefix}.unmapped.fastq.gz" : ''
-        """
-        INDEX=`find -L ./ -name "*.rev.1.bt2" | sed 's/.rev.1.bt2//'`
-        [ -z "\$INDEX" ] && INDEX=`find -L ./ -name "*.rev.1.bt2l" | sed 's/.rev.1.bt2l//'`
-        [ -z "\$INDEX" ] && echo "BT2 index files not found" 1>&2 && exit 1
-        bowtie2 \\
-            -x \$INDEX \\
-            -U $reads \\
-            --threads $task.cpus \\
-            $unaligned \\
-            $args \\
-            2> ${prefix}.bowtie2.log \\
-            | samtools view -@ $task.cpus $args2 -bhS -o ${prefix}.bam -
-
-        cat <<-END_VERSIONS > versions.yml
-        "${task.process}":
-            bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//')
-            samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//')
-            pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' )
-        END_VERSIONS
-        """
-    } else {
-        def unaligned = save_unaligned ? "--un-conc-gz ${prefix}.unmapped.fastq.gz" : ''
-        """
-        INDEX=`find -L ./ -name "*.rev.1.bt2" | sed 's/.rev.1.bt2//'`
-        [ -z "\$INDEX" ] && INDEX=`find -L ./ -name "*.rev.1.bt2l" | sed 's/.rev.1.bt2l//'`
-        [ -z "\$INDEX" ] && echo "BT2 index files not found" 1>&2 && exit 1
-        bowtie2 \\
-            -x \$INDEX \\
-            -1 ${reads[0]} \\
-            -2 ${reads[1]} \\
-            --threads $task.cpus \\
-            $unaligned \\
-            $args \\
-            2> ${prefix}.bowtie2.log \\
-            | samtools view -@ $task.cpus $args2 -bhS -o ${prefix}.bam -
-
-        if [ -f ${prefix}.unmapped.fastq.1.gz ]; then
-            mv ${prefix}.unmapped.fastq.1.gz ${prefix}.unmapped_1.fastq.gz
-        fi
-        if [ -f ${prefix}.unmapped.fastq.2.gz ]; then
-            mv ${prefix}.unmapped.fastq.2.gz ${prefix}.unmapped_2.fastq.gz
-        fi
-
-        cat <<-END_VERSIONS > versions.yml
-        "${task.process}":
-            bowtie2: \$(echo \$(bowtie2 --version 2>&1) | sed 's/^.*bowtie2-align-s version //; s/ .*\$//')
-            samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//')
-            pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' )
-        END_VERSIONS
-        """
-    }
-}
diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
deleted file mode 100644
index d13903925467e97e353f0a4e6bcf9f6cdb8a3664..0000000000000000000000000000000000000000
--- a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env python
-
-import yaml
-import platform
-from textwrap import dedent
-
-
-def _make_versions_html(versions):
-    html = [
-        dedent(
-            """\\
-            <style>
-            #nf-core-versions tbody:nth-child(even) {
-                background-color: #f2f2f2;
-            }
-            </style>
-            <table class="table" style="width:100%" id="nf-core-versions">
-                <thead>
-                    <tr>
-                        <th> Process Name </th>
-                        <th> Software </th>
-                        <th> Version  </th>
-                    </tr>
-                </thead>
-            """
-        )
-    ]
-    for process, tmp_versions in sorted(versions.items()):
-        html.append("<tbody>")
-        for i, (tool, version) in enumerate(sorted(tmp_versions.items())):
-            html.append(
-                dedent(
-                    f"""\\
-                    <tr>
-                        <td><samp>{process if (i == 0) else ''}</samp></td>
-                        <td><samp>{tool}</samp></td>
-                        <td><samp>{version}</samp></td>
-                    </tr>
-                    """
-                )
-            )
-        html.append("</tbody>")
-    html.append("</table>")
-    return "\\n".join(html)
-
-
-versions_this_module = {}
-versions_this_module["${task.process}"] = {
-    "python": platform.python_version(),
-    "yaml": yaml.__version__,
-}
-
-with open("$versions") as f:
-    versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module
-
-# aggregate versions by the module name (derived from fully-qualified process name)
-versions_by_module = {}
-for process, process_versions in versions_by_process.items():
-    module = process.split(":")[-1]
-    try:
-        assert versions_by_module[module] == process_versions, (
-            "We assume that software versions are the same between all modules. "
-            "If you see this error-message it means you discovered an edge-case "
-            "and should open an issue in nf-core/tools. "
-        )
-    except KeyError:
-        versions_by_module[module] = process_versions
-
-versions_by_module["Workflow"] = {
-    "Nextflow": "$workflow.nextflow.version",
-    "$workflow.manifest.name": "$workflow.manifest.version",
-}
-
-versions_mqc = {
-    "id": "software_versions",
-    "section_name": "${workflow.manifest.name} Software Versions",
-    "section_href": "https://github.com/${workflow.manifest.name}",
-    "plot_type": "html",
-    "description": "are collected at run time from the software output.",
-    "data": _make_versions_html(versions_by_module),
-}
-
-with open("software_versions.yml", "w") as f:
-    yaml.dump(versions_by_module, f, default_flow_style=False)
-with open("software_versions_mqc.yml", "w") as f:
-    yaml.dump(versions_mqc, f, default_flow_style=False)
-
-with open("versions.yml", "w") as f:
-    yaml.dump(versions_this_module, f, default_flow_style=False)
diff --git a/modules/nf-core/modules/custom/getchromsizes/main.nf b/modules/nf-core/modules/custom/getchromsizes/main.nf
deleted file mode 100644
index 0eabf3a4c3cdd9a862154859e1241990052dc2d4..0000000000000000000000000000000000000000
--- a/modules/nf-core/modules/custom/getchromsizes/main.nf
+++ /dev/null
@@ -1,32 +0,0 @@
-process CUSTOM_GETCHROMSIZES {
-    tag "$fasta"
-    label 'process_low'
-
-    conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null)
-    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
-        'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' :
-        'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }"
-
-    input:
-    path fasta
-
-    output:
-    path '*.sizes'      , emit: sizes
-    path '*.fai'        , emit: fai
-    path  "versions.yml", emit: versions
-
-    when:
-    task.ext.when == null || task.ext.when
-
-    script:
-    def args = task.ext.args ?: ''
-    """
-    samtools faidx $fasta
-    cut -f 1,2 ${fasta}.fai > ${fasta}.sizes
-
-    cat <<-END_VERSIONS > versions.yml
-    "${task.process}":
-        custom: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//')
-    END_VERSIONS
-    """
-}
diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf
deleted file mode 100644
index 05730368b2d43e0eaac6b13a69f07ed54d1ed2cb..0000000000000000000000000000000000000000
--- a/modules/nf-core/modules/fastqc/main.nf
+++ /dev/null
@@ -1,59 +0,0 @@
-process FASTQC {
-    tag "$meta.id"
-    label 'process_medium'
-
-    conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null)
-    container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
-        'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' :
-        'quay.io/biocontainers/fastqc:0.11.9--0' }"
-
-    input:
-    tuple val(meta), path(reads)
-
-    output:
-    tuple val(meta), path("*.html"), emit: html
-    tuple val(meta), path("*.zip") , emit: zip
-    path  "versions.yml"           , emit: versions
-
-    when:
-    task.ext.when == null || task.ext.when
-
-    script:
-    def args = task.ext.args ?: ''
-    // Add soft-links to original FastQs for consistent naming in pipeline
-    def prefix = task.ext.prefix ?: "${meta.id}"
-    if (meta.single_end) {
-        """
-        [ ! -f  ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz
-        fastqc $args --threads $task.cpus ${prefix}.fastq.gz
-
-        cat <<-END_VERSIONS > versions.yml
-        "${task.process}":
-            fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
-        END_VERSIONS
-        """
-    } else {
-        """
-        [ ! -f  ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz
-        [ ! -f  ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz
-        fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz
-
-        cat <<-END_VERSIONS > versions.yml
-        "${task.process}":
-            fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
-        END_VERSIONS
-        """
-    }
-
-    stub:
-    def prefix = task.ext.prefix ?: "${meta.id}"
-    """
-    touch ${prefix}.html
-    touch ${prefix}.zip
-
-    cat <<-END_VERSIONS > versions.yml
-    "${task.process}":
-        fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" )
-    END_VERSIONS
-    """
-}