diff --git a/gradle/docker.gradle b/gradle/docker.gradle
index b06c3ba..398dd50 100644
--- a/gradle/docker.gradle
+++ b/gradle/docker.gradle
@@ -39,7 +39,7 @@
  */
 
 ext {
-    dockerRegistry = project.hasProperty('dockerRegistry') && dockerRegistry != '' ? dockerRegistry + '/' : ''
+    dockerRegistry = project.hasProperty('dockerRegistry') ? dockerRegistry + '/' : ''
     dockerImageTag = project.hasProperty('dockerImageTag') ? dockerImageTag : 'latest'
     dockerImagePrefix = project.hasProperty('dockerImagePrefix') ? dockerImagePrefix : 'whisk'
     dockerTimeout = project.hasProperty('dockerTimeout') ? dockerTimeout.toInteger() : 840
@@ -54,32 +54,82 @@
 }
 
 if(project.hasProperty('dockerBuildArgs')) {
-    dockerBuildArg += ['--build-arg', project.dockerBuildArgs]
-}
-
-task distDocker << {
-    def start = new Date()
-    def cmd = dockerBinary + dockerBuildArg + ['-t', dockerImageName, project.buildscript.sourceFile.getParentFile().getAbsolutePath()]
-    retry(cmd, dockerRetries, dockerTimeout)
-    println("Building '${dockerImageName}' took ${TimeCategory.minus(new Date(), start)}")
-}
-task tagImage << {
-    def versionString = (dockerBinary + ['-v']).execute().text
-    def matched = (versionString =~ /(\d+)\.(\d+)\.(\d+)/)
-
-    def major = matched[0][1] as int
-    def minor = matched[0][2] as int
-
-    def dockerCmd = ['tag']
-    if(major == 1 && minor < 12) {
-        dockerCmd += ['-f']
+    dockerBuildArgs.each { arg  ->
+        dockerBuildArg += ['--build-arg', arg]
     }
-    retry(dockerBinary + dockerCmd + [dockerImageName, dockerTaggedImageName], dockerRetries, dockerTimeout)
 }
 
-task pushImage << {
-    def cmd = dockerBinary + ['push', dockerTaggedImageName]
-    retry(cmd, dockerRetries, dockerTimeout)
+task distDocker {
+    doLast {
+        def start = new Date()
+        def cmd = dockerBinary + dockerBuildArg + ['-t', dockerImageName, project.buildscript.sourceFile.getParentFile().getAbsolutePath()]
+        retry(cmd, dockerRetries, dockerTimeout)
+        println("Building '${dockerImageName}' took ${TimeCategory.minus(new Date(), start)}")
+    }
+}
+
+task distDockerCoverage() {
+    doLast {
+        def start = new Date()
+        //Copy the scoverage runtime jars
+        copy {from configurations.scoverage - configurations.compile; into "build/tmp/docker-coverage/ext-lib"}
+        //Copy the scoverage prepared jars
+        coverageDirs.each {dir ->
+            copy {from file(dir); into "build/tmp/docker-coverage/classes"}
+        }
+
+        def buildArgs = [
+                "OW_ROOT_DIR=${project.rootProject.projectDir.absolutePath}"
+        ]
+        def dockerImageNameOrig = dockerImageName
+        dockerImageName = "$dockerImageName-cov"
+
+        //Use absolute paths for dockerFile and build directory
+        String dockerFileDir = project.buildscript.sourceFile.getParentFile().getAbsolutePath()
+        String dockerFile = "$dockerFileDir/Dockerfile.cov"
+
+        def cmd = dockerBinary + prepareBuildArgs(buildArgs) + ['-f', dockerFile, '-t', dockerImageName, dockerFileDir]
+        retry(cmd, dockerRetries, dockerTimeout)
+        println("Building '${dockerImageName}' took ${TimeCategory.minus(new Date(), start)}")
+
+        //Replace the original image with coverage one
+        project.ext.dockerTaggedImageName = dockerImagePrefix + '/' + dockerImageNameOrig + ':' + "cov"
+    }
+    finalizedBy('tagImage')
+}
+
+def prepareBuildArgs(List buildArgs) {
+    def result = ['build']
+    if(project.hasProperty('dockerBuildArgs')) {
+        buildArgs.addAll(dockerBuildArgs)
+    }
+    buildArgs.each {arg ->
+        result += ['--build-arg', arg]
+    }
+    result
+}
+
+task tagImage {
+    doLast {
+        def versionString = (dockerBinary + ['-v']).execute().text
+        def matched = (versionString =~ /(\d+)\.(\d+)\.(\d+)/)
+
+        def major = matched[0][1] as int
+        def minor = matched[0][2] as int
+
+        def dockerCmd = ['tag']
+        if(major == 1 && minor < 12) {
+            dockerCmd += ['-f']
+        }
+        retry(dockerBinary + dockerCmd + [dockerImageName, dockerTaggedImageName], dockerRetries, dockerTimeout)
+    }
+}
+
+task pushImage {
+    doLast {
+        def cmd = dockerBinary + ['push', dockerTaggedImageName]
+        retry(cmd, dockerRetries, dockerTimeout)
+    }
 }
 pushImage.dependsOn tagImage
 pushImage.onlyIf { dockerRegistry != '' }
