diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4678476f37a0b90bf6573d240ff645145a02c2c0..f50bf65084a3e88c07a8ac6c35c1c7a7b96ed498 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,13 @@ that users understand how the changes affect the new version.
 
 version 4.0.0-develop
 ---------------------------
++ Default docker images for bwa, bwakit and hisat2 updated to include samtools
+  1.10.
++ Alignment tasks (STAR, Hisat2, BWA) now produce BAM files at level 1 
+  compression.
++ Hisat2 task has added controls for samtools.
++ Alignment tasks no longer produce BAM indexes as these are not needed
+  by the markduplicates step.
 + Picard Markduplicates now uses 7G of RAM just like in GATK's best practice
   example pipeline.
 + Picard SortSam added as a task.
@@ -18,7 +25,7 @@ version 4.0.0-develop
   BAM files.
 + Changed PicardMarkduplicates to use COMPRESSION_LEVEL=1 by default with
   the htsjdk deflater.
-  This makes the task finish in 30% less time at the cost of a 6% larger BAM 
+  This makes the task finish in 32% less time at the cost of a 8% larger BAM 
   file. 
 + Added sambamba markdup and sambamba sort. NOTE: samtools sort is more
   efficient and is recommended.
diff --git a/bcftools.wdl b/bcftools.wdl
index e1ec3059d022a76be71550ff9e993d8f1bc6d445..b99a8cf581517272beeb174dace0c2ed7587f4ce 100644
--- a/bcftools.wdl
+++ b/bcftools.wdl
@@ -22,23 +22,32 @@ version 1.0
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-task Bcf2Vcf {
+task View {
     input {
-        File bcf
-        String outputPath = "./bcftools/SV.vcf"
-        String memory = "2G"
-        Int timeMinutes = 1 + ceil(size(bcf, "G"))
-        String dockerImage = "quay.io/biocontainers/bcftools:1.9--ha228f0b_3"
+        File inputFile
+        String outputPath = "output.vcf.gz"
+        String memory = "256M"
+        Int timeMinutes = 1 + ceil(size(inputFile, "G"))
+        String dockerImage = "quay.io/biocontainers/bcftools:1.10.2--h4f4756c_2"
+        String outputType = "z"
+        Int compressionLevel = 1
     }
 
     command {
         set -e
         mkdir -p "$(dirname ~{outputPath})"
-        bcftools view ~{bcf} -O v -o ~{outputPath}
+        bcftools view \
+        -o ~{outputPath} \
+        -O ~{outputType} \
+        -l ~{compressionLevel} \
+        ~{inputFile}
+        bcftools index --tbi ~{outputPath}
+
     }
 
     output {
         File outputVcf = outputPath
+        File outputVcfIndex = outputPath + ".tbi"
     }
 
     runtime {
@@ -48,9 +57,11 @@ task Bcf2Vcf {
     }
 
     parameter_meta {
-        bcf: {description: "The generated BCF from an SV caller", category: "required"}
+        inputFile: {description: "A vcf or bcf file", category: "required"}
         outputPath: {description: "The location the output VCF file should be written.", category: "common"}
+        outputType: {description: "Output type: v=vcf, z=vcf.gz, b=bcf, u=uncompressed bcf"}
         memory: {description: "The amount of memory this job will use.", category: "advanced"}
+        compressionLevel: {description: "Compression level from 0 (uncompressed) to 9 (best).", category: "advanced"}
         timeMinutes: {description: "The maximum amount of time the job will run in minutes.", category: "advanced"}
         dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
     }
@@ -87,7 +98,7 @@ task Stats {
         Int threads = 0
         Int timeMinutes = 1 + 2* ceil(size(select_all([inputVcf, compareVcf]), "G"))  # TODO: Estimate, 2 minutes per GB, refine later.
         String memory = "256M" 
-        String dockerImage = "quay.io/biocontainers/bcftools:1.9--ha228f0b_3"
+        String dockerImage = "quay.io/biocontainers/bcftools:1.10.2--h4f4756c_2"
     }
     
     command {
diff --git a/chunked-scatter.wdl b/chunked-scatter.wdl
index 3ef0c74784c8fb91e78ecb2055dfa84be9174c88..b54a7d2e909a20d43bbe194d9f28496b7753ce5d 100644
--- a/chunked-scatter.wdl
+++ b/chunked-scatter.wdl
@@ -30,7 +30,7 @@ task ChunkedScatter {
 
         String memory = "256M"
         Int timeMinutes = 2
-        String dockerImage = "quay.io/biocontainers/chunked-scatter:0.2.0--py_0"
+        String dockerImage = "quay.io/biocontainers/chunked-scatter:1.0.0--py_0"
     }
 
     command {
diff --git a/cutadapt.wdl b/cutadapt.wdl
index ad32ff21aff4958f9955628753a7b68468a855cd..d125af43b3039fd2ba9aa2b63b0819d4676fbf41 100644
--- a/cutadapt.wdl
+++ b/cutadapt.wdl
@@ -81,7 +81,7 @@ task Cutadapt {
         Int cores = 4
         String memory = "~{300 + 100 * cores}M"
         Int timeMinutes = 1 + ceil(size([read1, read2], "G")  * 12.0 / cores)
-        String dockerImage = "quay.io/biocontainers/cutadapt:2.8--py37h516909a_0"
+        String dockerImage = "quay.io/biocontainers/cutadapt:2.10--py37h516909a_0"
     }
 
     String realRead2output = select_first([read2output, "cut_r2.fq.gz"])
diff --git a/gatk.wdl b/gatk.wdl
index f20bf70ad54a61de7123fe48e80bdbf538e3e742..e0209a0c4ef0f4b19fde26f3b47f0d0bd2b33fe0 100644
--- a/gatk.wdl
+++ b/gatk.wdl
@@ -35,7 +35,7 @@ task AnnotateIntervals {
         String memory = "3G"
         String javaXmx = "2G"
         Int timeMinutes = 5
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -96,7 +96,7 @@ task ApplyBQSR {
         Int memoryMb = javaXmxMb + 512
         Int javaXmxMb = 2048
         Int timeMinutes = 120 # This will likely be used with intervals, as such size based estimation can't be used.
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -168,7 +168,7 @@ task BaseRecalibrator {
         Int memoryMb = javaXmxMb + 512
         Int javaXmxMb = 1024
         Int timeMinutes = 120 # This will likely be used with intervals, as such size based estimation can't be used.
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -227,7 +227,7 @@ task CalculateContamination {
         String memory = "13G"
         String javaXmx = "12G"
         Int timeMinutes = 180
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.2.0--1"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -271,7 +271,7 @@ task CallCopyRatioSegments {
         String memory = "3G"
         String javaXmx = "2G"
         Int timeMinutes = 2
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -320,7 +320,7 @@ task CollectAllelicCounts {
         String memory = "11G"
         String javaXmx = "10G"
         Int timeMinutes = 120
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -376,7 +376,7 @@ task CollectReadCounts {
         String memory = "8G"
         String javaXmx = "7G"
         Int timeMinutes = 1 + ceil(size(inputBam, "G") * 5)
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -433,7 +433,7 @@ task CombineGVCFs {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 1 + ceil(size(gvcfFiles, "G") * 8)
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -607,7 +607,7 @@ task DenoiseReadCounts {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 5
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -665,7 +665,7 @@ task FilterMutectCalls {
         String memory = "13G"
         String javaXmx = "12G"
         Int timeMinutes = 60
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.2.0--1"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -728,7 +728,7 @@ task GatherBqsrReports {
         Int memoryMb = 256 + javaXmxMb
         Int javaXmxMb = 256
         Int timeMinutes = 1
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -774,7 +774,7 @@ task GenomicsDBImport {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 180
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -833,7 +833,7 @@ task GenotypeGVCFs {
         String memory = "7G"
         String javaXmx = "6G"
         Int timeMinutes = 120 # This will likely be used with intervals, as such size based estimation can't be used.
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -899,7 +899,7 @@ task GetPileupSummaries {
         String memory = "13G"
         String javaXmx = "12G"
         Int timeMinutes = 120
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.2.0--1"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -966,7 +966,7 @@ task HaplotypeCaller {
         # Memory increases with time used. 4G should cover most use cases.
         Int javaXmxMb = 4096
         Int timeMinutes = 400 # This will likely be used with intervals, as such size based estimation can't be used.
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1040,7 +1040,7 @@ task LearnReadOrientationModel {
         String memory = "13G"
         String javaXmx = "12G"
         Int timeMinutes = 120
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.2.0--1"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1079,7 +1079,7 @@ task MergeStats {
         String memory = "15G"
         String javaXmx = "14G"
         Int timeMinutes = 30
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1126,7 +1126,7 @@ task ModelSegments {
         String memory = "11G"
         String javaXmx = "10G"
         Int timeMinutes = 60
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1202,7 +1202,7 @@ task MuTect2 {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 240
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1389,7 +1389,7 @@ task PreprocessIntervals {
         String memory = "4G"
         String javaXmx = "3G"
         Int timeMinutes = 1 + ceil(size(referenceFasta, "G") * 6)
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1447,7 +1447,7 @@ task SelectVariants {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 60
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1507,7 +1507,7 @@ task SplitNCigarReads {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 120 # This will likely be used with intervals, as such size based estimation can't be used.
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1576,7 +1576,7 @@ task VariantEval {
         String javaXmx = "4G"
         # TODO: Refine estimate. For now 4 minutes per GB of input.
         Int timeMinutes = ceil(size(flatten([evalVcfs, comparisonVcfs, select_all([referenceFasta, dbsnpVCF])]), "G") * 20)
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.7.0--py38_0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
@@ -1647,7 +1647,7 @@ task VariantFiltration {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 120
-        String dockerImage = "quay.io/biocontainers/gatk4:4.1.0.0--0"
+        String dockerImage = "quay.io/biocontainers/gatk4:4.1.8.0--py38h37ae868_0"
     }
 
     command {
diff --git a/hisat2.wdl b/hisat2.wdl
index 5937f86d433fd4be82771bc6214e0779fbe48e95..c24610edc6fdc732a70040756b62483d7dc509d4 100644
--- a/hisat2.wdl
+++ b/hisat2.wdl
@@ -34,12 +34,15 @@ task Hisat2 {
         String summaryFilePath = basename(outputBam, ".bam") + ".summary.txt"
 
         Int threads = 4
-        String memory = "~{threads + 5 + ceil(size(indexFiles, "G"))}G"
+        Int sortThreads = 1
+        Int sortMemoryPerThreadGb = 2
+        Int compressionLevel = 1
+        Int memoryGb = 1 + threads + ceil(size(indexFiles, "G") * 1.2) + sortMemoryPerThreadGb * sortThreads
         Int timeMinutes = 1 + ceil(size([inputR1, inputR2], "G") * 180 / threads)
         # quay.io/biocontainers/mulled-v2-a97e90b3b802d1da3d6958e0867610c718cb5eb1
         # is a combination of hisat2 and samtools
-        # hisat2=2.1.0, samtools=1.8
-        String dockerImage = "quay.io/biocontainers/mulled-v2-a97e90b3b802d1da3d6958e0867610c718cb5eb1:2388ff67fc407dad75774291ca5038f40cac4be0-0"
+        # hisat2=2.2.0, samtools=1.10
+        String dockerImage = "quay.io/biocontainers/mulled-v2-a97e90b3b802d1da3d6958e0867610c718cb5eb1:2880dd9d8ad0a7b221d4eacda9a818e92983128d-0"
     }
 
     String bamIndexPath = sub(outputBam, "\.bam$", ".bai")
@@ -59,18 +62,21 @@ task Hisat2 {
         ~{true="--dta" false="" downstreamTranscriptomeAssembly} \
         --new-summary \
         --summary-file ~{summaryFilePath} \
-        | samtools sort > ~{outputBam}
-        samtools index ~{outputBam} ~{bamIndexPath}
+        | samtools sort \
+        ~{"-@ " + sortThreads} \
+        -m ~{sortMemoryPerThreadGb}G \
+        -l ~{compressionLevel} \
+        - \
+        -o ~{outputBam}
     }
 
     output {
         File bamFile = outputBam
-        File bamIndex = bamIndexPath
         File summaryFile = summaryFilePath
     }
 
     runtime {
-        memory: memory
+        memory: "~{memoryGb}G"
         cpu: threads + 1
         time_minutes: timeMinutes
         docker: dockerImage
@@ -88,9 +94,12 @@ task Hisat2 {
         downstreamTranscriptomeAssembly: {description: "Equivalent to hisat2's `--dta` flag.", category: "advanced"}
         summaryFilePath: {description: "Where the summary file should be written.", category: "advanced"}
         threads: {description: "The number of threads to use.", category: "advanced"}
-        memory: {description: "The amount of memory this job will use.", category: "advanced"}
+        memoryGb: {description: "The amount of memory this job will use in gigabytes.", category: "advanced"}
         timeMinutes: {description: "The maximum amount of time the job will run in minutes.", category: "advanced"}
         dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.",
                       category: "advanced"}
+        sortThreads: {description: "The number of threads to use for sorting.", category: "advanced"}
+        sortMemoryPerThreadGb: {description: "The amount of memory for each sorting thread in gigabytes.", category: "advanced"}
+        compressionLevel: {description: "The compression level of the output BAM.", category: "advanced"}
     }
 }
\ No newline at end of file
diff --git a/htseq.wdl b/htseq.wdl
index 35faeef3a1158634cfdbff45f663bab9d40d035e..cbd8e2acded8d7e89157201a548aa6a29768096b 100644
--- a/htseq.wdl
+++ b/htseq.wdl
@@ -25,23 +25,23 @@ task HTSeqCount {
         Array[File]+ inputBams
         File gtfFile
         String outputTable = "output.tsv"
-        String format = "bam"
         String order = "pos"
         String stranded = "no"
         String? featureType
         String? idattr
         Array[String] additionalAttributes = []
 
-        String memory = "40G"
+        Int nprocesses = 1
+        String memory = "8G"
         Int timeMinutes = 10 + ceil(size(inputBams, "G") * 60)
-        String dockerImage = "quay.io/biocontainers/htseq:0.11.2--py37h637b7d7_1"
+        String dockerImage = "quay.io/biocontainers/htseq:0.12.4--py37hb3f55d8_0"
     }
 
     command {
         set -e
         mkdir -p "$(dirname ~{outputTable})"
         htseq-count \
-        -f ~{format} \
+        --nprocesses ~{nprocesses} \
         -r ~{order} \
         -s ~{stranded} \
         ~{"--type " + featureType} \
@@ -49,7 +49,7 @@ task HTSeqCount {
         ~{true="--additional-attr " false="" length(additionalAttributes) > 0 }~{sep=" --additional-attr " additionalAttributes} \
         ~{sep=" " inputBams} \
         ~{gtfFile} \
-        > ~{outputTable}
+        -c ~{outputTable}
     }
 
     output {
@@ -57,6 +57,7 @@ task HTSeqCount {
     }
 
     runtime {
+        cpu: nprocesses
         time_minutes: timeMinutes
         memory: memory
         docker: dockerImage
@@ -66,7 +67,7 @@ task HTSeqCount {
         inputBams: {description: "The input BAM files.", category: "required"}
         gtfFile: {description: "A GTF/GFF file containing the features of interest.", category: "required"}
         outputTable: {description: "The path to which the output table should be written.", category: "common"}
-        format: {description: "Equivalent to the -f option of htseq-count.", category: "advanced"}
+        nprocesses: {description: "Number of processes to run htseq with.", category: "advanced"}
         order: {description: "Equivalent to the -r option of htseq-count.", category: "advanced"}
         stranded: {description: "Equivalent to the -s option of htseq-count.", category: "common"}
         featureType: {description: "Equivalent to the --type option of htseq-count.", category: "advanced"}
diff --git a/picard.wdl b/picard.wdl
index 4dd4d970d7c48cb99ed4b948c6c4ef8313bcc555..adb55b4b52d2dce2bc3ae45a67a02b479dd9c181 100644
--- a/picard.wdl
+++ b/picard.wdl
@@ -89,7 +89,7 @@ task CollectMultipleMetrics {
         Int javaXmxMb = 3072
         # Additional * 2 because picard multiple metrics reads the reference fasta twice.
         Int timeMinutes = 1 + ceil(size(referenceFasta, "G") * 3 * 2) + ceil(size(inputBam, "G") * 6)
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
 
@@ -205,7 +205,7 @@ task CollectRnaSeqMetrics {
         String javaXmx =  "8G"
         # With 6 minutes per G there were several timeouts. 
         Int timeMinutes = 1 + ceil(size(inputBam, "G") * 12)
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     command {
@@ -263,7 +263,7 @@ task CollectTargetedPcrMetrics {
         String memory = "4G"
         String javaXmx = "3G"
         Int timeMinutes = 1 + ceil(size(inputBam, "G") * 6)
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     command {
@@ -322,7 +322,7 @@ task CreateSequenceDictionary {
 
         String memory = "3G"
         String javaXmx = "2G"
-        String dockerImage = "quay.io/biocontainers/picard:2.22.3--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     command {
@@ -370,7 +370,7 @@ task GatherBamFiles {
         Boolean createMd5File = false
         # One minute per input gigabyte.
         Int timeMinutes = 1 + ceil(size(inputBams, "G") * 1)
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     command {
@@ -422,7 +422,7 @@ task GatherVcfs {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 1 + ceil(size(inputVcfs, "G") * 2)
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     command {
@@ -469,6 +469,7 @@ task MarkDuplicates {
         Boolean createMd5File = false
         Boolean useJdkInflater = true  # Slightly faster than the intel one. 
         # Better results for compression level 1 (much smaller). Higher compression levels similar to intel deflater.
+        # NOTE: this might change in the future when the intel deflater is updated!
         Boolean useJdkDeflater = true
 
         # In GATK Best practices pipeline MarkDuplicates is given a 7G VM. 
@@ -477,7 +478,7 @@ task MarkDuplicates {
         String memoryMb = javaXmxMb + 512
 
         Int timeMinutes = 1 + ceil(size(inputBams, "G") * 8)
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
 
         # The program default for READ_NAME_REGEX is appropriate in nearly every case.
         # Sometimes we wish to supply "null" in order to turn off optical duplicate detection
@@ -530,7 +531,10 @@ task MarkDuplicates {
         outputBamPath: {description: "The location where the ouptut BAM file should be written.", category: "required"}
         metricsPath: {description: "The location where the output metrics file should be written.", category: "required"}
         read_name_regex: {description: "Equivalent to the `READ_NAME_REGEX` option of MarkDuplicates.", category: "advanced"}
-
+        createMd5File: {description: "Whether to create a md5 file for the created BAM file.", category: "advanced"}
+        useJdkInflater: {description: "True, uses the java inflater. False, uses the optimized intel inflater.", category: "advanced"}
+        useJdkDeflater: {description: "True, uses the java deflator to compress the BAM files. False uses the optimized intel deflater.", category: "advanced"}
+        compressionLevel: {description: "The compression level at which the BAM files are written", category: "advanced"}
         memoryMb: {description: "The amount of memory this job will use in megabytes.", category: "advanced"}
         javaXmxMb: {description: "The maximum memory available to the program in megabytes. Should be lower than `memoryMb` to accommodate JVM overhead.",
                   category: "advanced"}
@@ -550,7 +554,7 @@ task MergeVCFs {
         String memory = "5G"
         String javaXmx = "4G"
         Int timeMinutes = 1 + ceil(size(inputVCFs, "G"))
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     # Using MergeVcfs instead of GatherVcfs so we can create indices
@@ -599,7 +603,7 @@ task SamToFastq {
 
         String memory = "17G"
         String javaXmx = "16G" # High memory default to avoid crashes.
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
         File? NONE
     }
 
@@ -636,7 +640,7 @@ task ScatterIntervalList {
 
         String memory = "4G"
         String javaXmx = "3G"
-        String dockerImage = "quay.io/biocontainers/picard:2.20.5--0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     command {
@@ -677,9 +681,7 @@ task SortSam {
         # GATK Best practices uses 75000 here: https://github.com/gatk-workflows/broad-prod-wgs-germline-snps-indels/blob/d2934ed656ade44801f9cfe1c0e78d4f80684b7b/PairedEndSingleSampleWf-fc-hg38.wdl#L778
         Int XmxGb = ceil(maxRecordsInRam / 125001.0)
         Int timeMinutes = 1 + ceil(size(inputBam, "G") * 3)
-        # A mulled container is needed to have both picard and bwa in one container.
-        # This container contains: picard (2.18.7), bwa (0.7.17-r1188)
-        String dockerImage = "quay.io/biocontainers/picard:2.23.1--h37ae868_0"
+        String dockerImage = "quay.io/biocontainers/picard:2.23.2--0"
     }
 
     command {
diff --git a/samtools.wdl b/samtools.wdl
index 5daf57ab3375ddb57193b4ad868268c755ddd079..0b8394bff308d65874d03170918569417b1c751e 100644
--- a/samtools.wdl
+++ b/samtools.wdl
@@ -114,7 +114,7 @@ task Fastq {
         Int threads = 1
         String memory = "1G"
         Int timeMinutes = 1 + ceil(size(inputBam) * 2)
-        String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
+        String dockerImage = "quay.io/biocontainers/samtools:1.10--h9402c20_2"
     }
 
     command {
@@ -170,7 +170,7 @@ task FilterShortReadsBam {
         String outputPathBam
         String memory = "1G"
         Int timeMinutes = 1 + ceil(size(bamFile, "G") * 8)
-        String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
+        String dockerImage = "quay.io/biocontainers/samtools:1.10--h9402c20_2"
     }
 
     String outputPathBamIndex = sub(outputPathBam, "\.bam$", ".bai")
@@ -211,7 +211,7 @@ task Flagstat {
 
         String memory = "256M"  # Only 40.5 MiB used for 150G bam file.
         Int timeMinutes = 1 + ceil(size(inputBam, "G"))
-        String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
+        String dockerImage = "quay.io/biocontainers/samtools:1.10--h9402c20_2"
     }
 
     command {
@@ -247,7 +247,7 @@ task Index {
         String? outputBamPath
         String memory = "2G"
         Int timeMinutes = 1 + ceil(size(bamFile, "G") * 4)
-        String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
+        String dockerImage = "quay.io/biocontainers/samtools:1.10--h9402c20_2"
     }
 
     # Select_first is needed, otherwise womtool validate fails.
@@ -296,7 +296,7 @@ task Markdup {
         String outputBamPath
 
         Int timeMinutes = 1 + ceil(size(inputBam, "G") * 2)
-        String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
+        String dockerImage = "quay.io/biocontainers/samtools:1.10--h9402c20_2"
     }
 
     command {
@@ -332,7 +332,7 @@ task Merge {
         Int threads = 1
 
         Int timeMinutes = 1 + ceil(size(bamFiles, "G") * 2)
-        String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
+        String dockerImage = "quay.io/biocontainers/samtools:1.10--h9402c20_2"
     }
     String indexPath = sub(outputBamPath, "\.bam$",".bai")
 
@@ -483,7 +483,7 @@ task View {
         Int threads = 1
         String memory = "1G"
         Int timeMinutes = 1 + ceil(size(inFile, "G") * 5)
-        String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
+        String dockerImage = "quay.io/biocontainers/samtools:1.10--h9402c20_2"
     }
     String outputIndexPath = basename(outputFileName) + ".bai"
 
diff --git a/star.wdl b/star.wdl
index 4da67f72609c3bd27d03301c3cd0ed39c9da4a99..3d0e2eb0e7c0fcfd0518103c962eed2436ee9422 100644
--- a/star.wdl
+++ b/star.wdl
@@ -103,6 +103,7 @@ task Star {
         String? twopassMode = "Basic"
         Array[String]? outSAMattrRGline
         String? outSAMunmapped = "Within KeepPairs"
+        Int outBAMcompression = 1
         Int? limitBAMsortRAM
 
         Int runThreadN = 4
@@ -129,6 +130,7 @@ task Star {
         --outFileNamePrefix ~{outFileNamePrefix} \
         --genomeDir ~{sub(indexFiles[0], basename(indexFiles[0]), "")} \
         --outSAMtype ~{outSAMtype} \
+        --outBAMcompression ~{outBAMcompression} \
         --readFilesCommand ~{readFilesCommand} \
         ~{"--outFilterScoreMin " + outFilterScoreMin} \
         ~{"--outFilterScoreMinOverLread " + outFilterScoreMinOverLread} \
@@ -172,6 +174,7 @@ task Star {
         limitBAMsortRAM: {description: "Equivalent to star's `--limitBAMsortRAM` option.", category: "advanced"}
         runThreadN: {description: "The number of threads to use.", category: "advanced"}
         memory: {description: "The amount of memory this job will use.", category: "advanced"}
+        outBAMcompression: {description: "The compression level of the output BAM.", category: "advanced"}
         timeMinutes: {description: "The maximum amount of time the job will run in minutes.", category: "advanced"}
         dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
     }