diff --git a/biopet.wdl b/biopet.wdl
index aabad202af2499cbcfc79e5fd3d402f9e1cddaf1..89293a9a5cbffd680e72dcf4ccfe397f397bd159 100644
--- a/biopet.wdl
+++ b/biopet.wdl
@@ -35,11 +35,12 @@ task ScatterRegions {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         mkdir -p ${outputDirPath}
-        java -Xmx${select_first([memory, 2])}G -jar ${tool_jar} \
+        java -Xmx${mem}G -jar ${tool_jar} \
           -R ${ref_fasta} \
           -o ${outputDirPath} \
           ${"-s " + scatterSize} \
@@ -51,7 +52,7 @@ task ScatterRegions {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 2.0]) * select_first([memoryMultiplier, 2.0]))
+        memory: ceil(mem * select_first([memoryMultiplier, 2.0]))
     }
 }
 
@@ -68,11 +69,12 @@ task SampleConfig {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         mkdir -p . ${"$(dirname " + jsonOutputPath + ")"} ${"$(dirname " + tsvOutputPath + ")"}
-        java -Xmx${select_first([memory, 4])}G -jar ${tool_jar} \
+        java -Xmx${mem}G -jar ${tool_jar} \
         -i ${sep="-i " inputFiles} \
         ${"--sample " + sample} \
         ${"--library " + library} \
@@ -89,7 +91,7 @@ task SampleConfig {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 2.0]))
+        memory: ceil(mem * select_first([memoryMultiplier, 2.0]))
     }
 }
 
@@ -104,11 +106,12 @@ task BaseCounter {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 12.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         mkdir -p ${outputDir}
-        java -Xmx${select_first([memory, 12])}G -jar ${tool_jar} \
+        java -Xmx${mem}G -jar ${tool_jar} \
         -b ${bam} \
         -r ${refFlat} \
         -o ${outputDir} \
@@ -153,6 +156,6 @@ task BaseCounter {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 12.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
diff --git a/fastqc.wdl b/fastqc.wdl
index 7211cbc89241cf0596d01db8565fa9c2bffcadc8..72b4a538358a5fac7c27f6d004ff7a9a026fe4e8 100644
--- a/fastqc.wdl
+++ b/fastqc.wdl
@@ -66,11 +66,11 @@ task extractAdapters {
     Float? memory
     Float? memoryMultiplier
 
-
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
     set -e
     mkdir -p ${outputDir}
-    java -Xmx${select_first([memory, 4])}G -jar ${extractAdaptersFastqcJar} \
+    java -Xmx${mem}G -jar ${extractAdaptersFastqcJar} \
     --inputFile ${inputFile} \
     ${"--adapterOutputFile " + adapterOutputFilePath } \
     ${"--contamsOutputFile " + contamsOutputFilePath } \
@@ -89,7 +89,7 @@ task extractAdapters {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 2.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 2.5]))
     }
 }
 
diff --git a/gatk.wdl b/gatk.wdl
index fcac6948aa936ce00809b022488a734cfbebb226..3b07d9be084dad51509bab30520eb810b7905ce0 100644
--- a/gatk.wdl
+++ b/gatk.wdl
@@ -15,10 +15,11 @@ task BaseRecalibrator {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
-        java -Xms${select_first([memory, 4])}G -jar ${gatk_jar} \
+        java -Xms${mem}G -jar ${gatk_jar} \
           BaseRecalibrator \
           -R ${ref_fasta} \
           -I ${input_bam} \
@@ -33,7 +34,7 @@ task BaseRecalibrator {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -53,11 +54,12 @@ task ApplyBQSR {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         java ${"-Dsamjdk.compression_level=" + compression_level} \
-        -Xms${select_first([memory, 4])}G -jar ${gatk_jar} \
+        -Xms${mem}G -jar ${gatk_jar} \
           ApplyBQSR \
           --create-output-bam-md5 \
           --add-output-sam-program-record \
@@ -76,7 +78,7 @@ task ApplyBQSR {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -90,10 +92,11 @@ task GatherBqsrReports {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
-        java -Xms${select_first([memory, 4])}G -jar ${gatk_jar} \
+        java -Xms${mem}G -jar ${gatk_jar} \
         GatherBQSRReports \
         -I ${sep=' -I ' input_bqsr_reports} \
         -O ${output_report_filepath}
@@ -104,7 +107,7 @@ task GatherBqsrReports {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -125,11 +128,12 @@ task HaplotypeCallerGvcf {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         java ${"-Dsamjdk.compression_level=" + compression_level} \
-        -Xmx${select_first([memory, 4])}G -jar ${gatk_jar} \
+        -Xmx${mem}G -jar ${gatk_jar} \
           HaplotypeCaller \
           -R ${ref_fasta} \
           -O ${gvcf_basename}.vcf.gz \
@@ -145,7 +149,7 @@ task HaplotypeCallerGvcf {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -170,12 +174,13 @@ task GenotypeGVCFs {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
 
         java ${"-Dsamjdk.compression_level=" + compression_level} \
-        -Xmx${select_first([memory, 4])}G -jar ${gatk_jar} \
+        -Xmx${mem}G -jar ${gatk_jar} \
          GenotypeGVCFs \
          -R ${ref_fasta} \
          -O ${output_basename + ".vcf.gz"} \
@@ -193,7 +198,7 @@ task GenotypeGVCFs {
     }
 
     runtime{
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -215,13 +220,14 @@ task CombineGVCFs {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
 
         if [ ${length(gvcf_files)} -gt 1 ]; then
             java ${"-Dsamjdk.compression_level=" + compression_level} \
-            -Xmx${select_first([memory, 4])}G -jar ${gatk_jar} \
+            -Xmx${mem}G -jar ${gatk_jar} \
              CombineGVCFs \
              -R ${ref_fasta} \
              -O ${output_basename + ".vcf.gz"} \
@@ -239,7 +245,7 @@ task CombineGVCFs {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -257,10 +263,11 @@ task SplitNCigarReads {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
-        java -Xms${select_first([memory, 4])}G -jar ${gatk_jar} \
+        java -Xms${mem}G -jar ${gatk_jar} \
         -I ${input_bam} \
         -R ${ref_fasta} \
         -O ${output_bam} # might have to be -o depending on GATK version \
@@ -273,6 +280,6 @@ task SplitNCigarReads {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
diff --git a/picard.wdl b/picard.wdl
index 9c9af5a95205a1ae2723055837404f7ce78cfa71..104261816f42dea6126dc5c645ab7871e618fe1e 100644
--- a/picard.wdl
+++ b/picard.wdl
@@ -7,11 +7,12 @@ task ScatterIntervalList {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         mkdir scatter_list
-        java -Xmx${select_first([memory, 4])}G -jar ${picard_jar} \
+        java -Xmx${mem}G -jar ${picard_jar} \
           IntervalListTools \
           SCATTER_COUNT=${scatter_count} \
           SUBDIVISION_MODE=BALANCING_WITHOUT_INTERVAL_SUBDIVISION_WITH_OVERFLOW \
@@ -27,7 +28,7 @@ task ScatterIntervalList {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -42,11 +43,12 @@ task GatherBamFiles {
     Float? memory
     Float? memoryMultiplier
 
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         java ${"-Dsamjdk.compression_level=" + compression_level} \
-        -Xmx${select_first([memory, 4])}G -jar ${picard_jar} \
+        -Xmx${mem}G -jar ${picard_jar} \
           GatherBamFiles \
           INPUT=${sep=' INPUT=' input_bams} \
           OUTPUT=${output_bam_path} \
@@ -61,7 +63,7 @@ task GatherBamFiles {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -85,12 +87,13 @@ task MarkDuplicates {
     # Task is assuming query-sorted input so that the Secondary and Supplementary reads get marked correctly
     # This works because the output of BWA is query-grouped and therefore, so is the output of MergeBamAlignment.
     # While query-grouped isn't actually query-sorted, it's good enough for MarkDuplicates with ASSUME_SORT_ORDER="queryname"
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         mkdir -p $(dirname ${output_bam_path})
         java ${"-Dsamjdk.compression_level=" + compression_level} \
-        -Xmx${select_first([memory, 4])}G -jar ${picard_jar} \
+        -Xmx${mem}G -jar ${picard_jar} \
           MarkDuplicates \
           INPUT=${sep=' INPUT=' input_bams} \
           OUTPUT=${output_bam_path} \
@@ -110,7 +113,7 @@ task MarkDuplicates {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 8.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
 
@@ -128,11 +131,12 @@ task MergeVCFs {
 
     # Using MergeVcfs instead of GatherVcfs so we can create indices
     # See https://github.com/broadinstitute/picard/issues/789 for relevant GatherVcfs ticket
+    Int mem = ceil(select_first([memory, 4.0]))
     command {
         set -e -o pipefail
         ${preCommand}
         java ${"-Dsamjdk.compression_level=" + compression_level} \
-        -Xmx${select_first([memory, 4])}G -jar ${picard_jar} \
+        -Xmx${mem}G -jar ${picard_jar} \
           MergeVcfs \
           INPUT=${sep=' INPUT=' input_vcfs} \
           OUTPUT=${output_vcf_path}
@@ -144,6 +148,6 @@ task MergeVCFs {
     }
 
     runtime {
-        memory: ceil(select_first([memory, 4.0]) * select_first([memoryMultiplier, 1.5]))
+        memory: ceil(mem * select_first([memoryMultiplier, 1.5]))
     }
 }
\ No newline at end of file