diff --git a/.circleci/config.yml b/.circleci/config.yml
index 59d7bbf1..fa7fd824 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -25,7 +25,7 @@ jobs:
       - run:
           name: unit-tests
           command: |
-            ./gradlew :subsonic-api:test :cache:test :ultrasonic:testDebugUnitTest
+            ./gradlew :subsonic-api:test :cache:test :subsonic-api-image-loader:testDebugUnitTest :ultrasonic:testDebugUnitTest
             ./gradlew jacocoFullReport
             bash <(curl -s https://codecov.io/bash)
       - run:
diff --git a/build.gradle b/build.gradle
index b839f789..abcee58c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,9 +12,7 @@ buildscript {
         classpath gradlePlugins.kotlin
         classpath gradlePlugins.ktlintGradle
         classpath gradlePlugins.detekt
-        classpath(gradlePlugins.jacocoAndroid) {
-            exclude group: 'org.codehaus.groovy', module: 'groovy-all'
-        }
+        classpath gradlePlugins.jacoco
     }
 }
 
diff --git a/dependencies.gradle b/dependencies.gradle
index c803fd2e..d3070c20 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -8,8 +8,7 @@ ext.versions = [
         ktlint               : "0.24.0",
         ktlintGradle         : "4.1.0",
         detekt               : "1.0.0.RC6-4",
-        jacoco               : "0.7.9",
-        jacocoAndroid        : "0.1.2",
+        jacoco               : "0.8.2",
 
         androidSupport       : "22.2.1",
 
@@ -37,7 +36,7 @@ ext.gradlePlugins = [
         kotlin        : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin",
         ktlintGradle  : "gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:$versions.ktlintGradle",
         detekt        : "gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$versions.detekt",
-        jacocoAndroid : "com.dicedmelon.gradle:jacoco-android:$versions.jacocoAndroid"
+        jacoco        : "org.jacoco:org.jacoco.core:$versions.jacoco"
 ]
 
 ext.androidSupport = [
diff --git a/gradle_scripts/jacoco.gradle b/gradle_scripts/jacoco.gradle
index c8209068..eef97b49 100644
--- a/gradle_scripts/jacoco.gradle
+++ b/gradle_scripts/jacoco.gradle
@@ -1,17 +1,21 @@
 apply plugin: 'jacoco'
 
+jacoco {
+    toolVersion(versions.jacoco)
+}
+
 task jacocoMergeReports(type: JacocoMerge) {
     group = "Reporting"
     description = "Merge all jacoco reports from projects into one."
 
-    def subsonicApi = project.findProject("subsonic-api")
-    def ultrasonicApp = project.findProject("ultrasonic")
-    def cache = project.findProject("cache")
-    executionData(
-            "${subsonicApi.buildDir}/jacoco/test.exec",
-            "${ultrasonicApp.buildDir}/jacoco/testDebugUnitTest.exec",
-            "${cache.buildDir}/jacoco/test.exec"
-    )
+    List<File> jacocoFiles = new ArrayList<>()
+    project.subprojects { subproject ->
+        File commonModuleReport = new File(subproject.buildDir, "/jacoco/test.exec")
+        if (commonModuleReport.exists()) jacocoFiles.add(commonModuleReport)
+        File androidModuleReport = new File(subproject.buildDir, "/jacoco/testDebugUnitTest.exec")
+        if (androidModuleReport.exists()) jacocoFiles.add(androidModuleReport)
+    }
+    executionData(jacocoFiles.toArray())
     destinationFile(file("${project.buildDir}/jacoco/jacoco.exec"))
 }
 
@@ -20,35 +24,33 @@ def createJacocoFullReportTask() {
         group = "Reporting"
         description = "Generate full Jacoco coverage report including all modules."
 
-        def subsonicApi = project.findProject("subsonic-api")
-        def subsonicApiImageLoader = project.findProject("subsonic-api-image-loader")
-        def ultrasonicApp = project.findProject("ultrasonic")
-        def cache = project.findProject("cache")
-
-        classDirectories = files(
-                fileTree(
-                        dir: "${subsonicApi.buildDir}/classes/main",
-                        excludes: subsonicApi.jacocoExclude
-                ),
-                fileTree(
-                        dir: "${subsonicApiImageLoader.buildDir}/intermediates/classes/debug/org",
-                        excludes: subsonicApiImageLoader.jacocoExclude
-                ),
-                fileTree(
-                        dir: "${ultrasonicApp.buildDir}/intermediates/classes/debug/org",
-                        excludes: ultrasonicApp.jacocoExclude
-                ),
-                fileTree(
-                        dir: "${cache.buildDir}/classes/kotlin/main",
-                        excludes: cache.jacocoExclude
+        List<FileTree> classFileTreeList = new ArrayList<>()
+        List<FileTree> sourceFileTreeList = new ArrayList<>()
+        project.subprojects { subproject ->
+            if (subproject.plugins.hasPlugin("kotlin-android") &&
+                    subproject.hasProperty("jacocoExclude")) {
+                classFileTreeList.add(
+                        fileTree(
+                                dir: "${subproject.buildDir}/tmp/kotlin-classes/debug",
+                                excludes: subproject.jacocoExclude
+                        )
                 )
-        )
-        sourceDirectories = files(
-                subsonicApi.sourceSets.main.getAllSource(),
-                subsonicApiImageLoader.extensions.getByName('android').sourceSets.main.java.sourceFiles,
-                ultrasonicApp.extensions.getByName('android').sourceSets.main.java.sourceFiles,
-                cache.sourceSets.main.getAllSource(),
-        )
+                sourceFileTreeList.add(
+                        subproject.extensions.getByName('android').sourceSets.main.java.sourceFiles
+                )
+            } else if (subproject.hasProperty("jacocoExclude")) {
+                classFileTreeList.add(
+                        fileTree(
+                                dir: "${subproject.buildDir}/classes/kotlin/main",
+                                excludes: subproject.jacocoExclude
+                        )
+                )
+                sourceFileTreeList.add(subproject.sourceSets.main.getAllSource())
+            }
+        }
+
+        classDirectories = files(classFileTreeList.toArray())
+        sourceDirectories = files(sourceFileTreeList.toArray())
         executionData = files("${buildDir}/jacoco/jacoco.exec")
 
         reports {
diff --git a/subsonic-api-image-loader/build.gradle b/subsonic-api-image-loader/build.gradle
index 7f7d3a71..5baa60ce 100644
--- a/subsonic-api-image-loader/build.gradle
+++ b/subsonic-api-image-loader/build.gradle
@@ -1,7 +1,20 @@
 apply plugin: 'com.android.library'
 apply plugin: 'kotlin-android'
-apply plugin: 'jacoco-android'
 apply from: '../gradle_scripts/code_quality.gradle'
+apply plugin: 'jacoco'
+
+
+ext {
+    jacocoExclude = []
+}
+
+jacoco {
+    toolVersion(versions.jacoco)
+}
+
+tasks.withType(Test) {
+    jacoco.includeNoLocationClasses = true
+}
 
 android {
     compileSdkVersion(versions.compileSdk)
@@ -37,19 +50,3 @@ dependencies {
     testImplementation testing.kluent
     testImplementation testing.robolectric
 }
-
-jacoco {
-    toolVersion(versions.jacoco)
-}
-
-ext {
-    jacocoExclude = []
-}
-
-jacocoAndroidUnitTestReport {
-    excludes += jacocoExclude
-}
-
-afterEvaluate {
-    testDebugUnitTest.finalizedBy jacocoTestDebugUnitTestReport
-}
\ No newline at end of file
diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle
index e26e6631..aa7a2ff5 100644
--- a/ultrasonic/build.gradle
+++ b/ultrasonic/build.gradle
@@ -1,6 +1,6 @@
 apply plugin: 'com.android.application'
 apply plugin: 'kotlin-android'
-apply plugin: 'jacoco-android'
+apply plugin: 'jacoco'
 apply from: "../gradle_scripts/code_quality.gradle"
 
 android {
@@ -90,10 +90,11 @@ ext {
             '**/di/**'
     ]
 }
-jacocoAndroidUnitTestReport {
-    excludes += jacocoExclude
+
+jacoco {
+    toolVersion(versions.jacoco)
 }
 
-afterEvaluate {
-    testDebugUnitTest.finalizedBy jacocoTestDebugUnitTestReport
+tasks.withType(Test) {
+    jacoco.includeNoLocationClasses = true
 }