diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9023fb4ec..ebe62c8fd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -102,16 +102,6 @@ The extension's version name is generated automatically by concatenating `libVer
 
 Extensions rely on [extensions-lib](https://github.com/tachiyomiorg/extensions-lib), which provides some interfaces and stubs from the [app](https://github.com/tachiyomiorg/tachiyomi) for compilation purposes. The actual implementations can be found [here](https://github.com/tachiyomiorg/tachiyomi/tree/dev/app/src/main/java/eu/kanade/tachiyomi/source). Referencing the actual implementation will help with understanding extensions' call flow.
 
-#### Duktape stub
-
-[`duktape-stub`](https://github.com/tachiyomiorg/tachiyomi-extensions/tree/master/lib/duktape-stub) provides stubs for using Duktape functionality without pulling in the full library. Functionality is bundled into the main Tachiyomi app.
-
-```gradle
-dependencies {
-    compileOnly project(':duktape-stub')
-}
-```
-
 #### Rate limiting library
 
 [`lib-ratelimit`](https://github.com/tachiyomiorg/tachiyomi-extensions/tree/master/lib/ratelimit) is a library for adding rate limiting functionality as an [OkHttp interceptor](https://square.github.io/okhttp/interceptors/).
diff --git a/annotations/build.gradle.kts b/annotations/build.gradle.kts
deleted file mode 100644
index 7fada1cc2..000000000
--- a/annotations/build.gradle.kts
+++ /dev/null
@@ -1,7 +0,0 @@
-plugins {
-    id("kotlin")
-}
-
-dependencies {
-    compileOnly(Deps.kotlin.stdlib)
-}
diff --git a/common-dependencies.gradle b/common-dependencies.gradle
index 888a3df16..9e135981f 100644
--- a/common-dependencies.gradle
+++ b/common-dependencies.gradle
@@ -13,6 +13,5 @@ dependencies {
     compileOnly 'com.google.code.gson:gson:2.8.2'
     compileOnly 'com.github.salomonbrys.kotson:kotson:2.5.0'
 
-    implementation project(":annotations")
-    compileOnly project(':duktape-stub')
-}
\ No newline at end of file
+    implementation project(":core")
+}
diff --git a/common.gradle b/common.gradle
index 5dc8a179a..02315cfd8 100644
--- a/common.gradle
+++ b/common.gradle
@@ -56,11 +56,7 @@ repositories {
     mavenCentral()
 }
 
-dependencies {
-    implementation project(":core")
-}
 apply from: "$rootDir/common-dependencies.gradle"
 
-
 preBuild.dependsOn(lintKotlin)
 lintKotlin.dependsOn(formatKotlin)
diff --git a/core/build.gradle.kts b/core/build.gradle.kts
index ac4e9ea6b..2637957fe 100644
--- a/core/build.gradle.kts
+++ b/core/build.gradle.kts
@@ -1,5 +1,6 @@
 plugins {
     id("com.android.library")
+    kotlin("android")
 }
 
 android {
@@ -12,6 +13,7 @@ android {
     sourceSets {
         named("main") {
             manifest.srcFile("AndroidManifest.xml")
+            java.setSrcDirs(listOf("src"))
             res.setSrcDirs(listOf("res"))
         }
     }
@@ -21,4 +23,17 @@ android {
             enabled = false
         }
     }
+
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_1_8
+        targetCompatibility = JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        jvmTarget = JavaVersion.VERSION_1_8.toString()
+    }
+}
+
+dependencies {
+    compileOnly(Deps.kotlin.stdlib)
 }
diff --git a/lib/duktape-stub/src/com/squareup/duktape/Duktape.java b/core/src/com/squareup/duktape/Duktape.java
similarity index 100%
rename from lib/duktape-stub/src/com/squareup/duktape/Duktape.java
rename to core/src/com/squareup/duktape/Duktape.java
diff --git a/annotations/src/main/kotlin/Nsfw.kt b/core/src/eu/kanade/tachiyomi/annotations/Nsfw.kt
similarity index 100%
rename from annotations/src/main/kotlin/Nsfw.kt
rename to core/src/eu/kanade/tachiyomi/annotations/Nsfw.kt
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 62d4c0535..e708b1c02 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 44c889224..656b67ca7 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu Dec 10 21:03:32 EST 2020
+#Sat Feb 06 17:57:54 EST 2021
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip
diff --git a/gradlew b/gradlew
index fbd7c5158..4f906e0c8 100755
--- a/gradlew
+++ b/gradlew
@@ -130,7 +130,7 @@ fi
 if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
     APP_HOME=`cygpath --path --mixed "$APP_HOME"`
     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    
+
     JAVACMD=`cygpath --unix "$JAVACMD"`
 
     # We build the pattern for arguments to be converted via cygpath
diff --git a/gradlew.bat b/gradlew.bat
index a9f778a7a..ac1b06f93 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
 
 set JAVA_EXE=java.exe
 %JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
 
 echo.
 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -54,7 +54,7 @@ goto fail
 set JAVA_HOME=%JAVA_HOME:"=%
 set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
 
 echo.
 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -64,21 +64,6 @@ echo location of your Java installation.
 
 goto fail
 
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
 :execute
 @rem Setup the command line
 
@@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 
 
 @rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
 
 :end
 @rem End local scope for the variables with windows NT shell
diff --git a/lib/duktape-stub/build.gradle.kts b/lib/duktape-stub/build.gradle.kts
deleted file mode 100644
index b07c0af69..000000000
--- a/lib/duktape-stub/build.gradle.kts
+++ /dev/null
@@ -1,16 +0,0 @@
-plugins {
-    java
-}
-
-sourceSets {
-    main {
-        java {
-            srcDirs(listOf("src"))
-        }
-    }
-}
-
-java {
-    sourceCompatibility = JavaVersion.VERSION_1_8
-    targetCompatibility = JavaVersion.VERSION_1_8
-}
diff --git a/multisrc/build.gradle.kts b/multisrc/build.gradle.kts
index 3f128aa7a..bccb47ba5 100644
--- a/multisrc/build.gradle.kts
+++ b/multisrc/build.gradle.kts
@@ -20,8 +20,6 @@ repositories {
 // dependencies
 apply("$rootDir/common-dependencies.gradle")
 
-
-
 tasks.register("runAllGenerators") {
     doLast {
         val isWindows = System.getProperty("os.name").toString().toLowerCase().contains("win")
@@ -31,7 +29,7 @@ tasks.register("runAllGenerators") {
                         "$projectDir/build/intermediates/aar_main_jar/debug/classes.jar" // jar made from this module
                 ))
                 .joinToString(if (isWindows) ";" else ":")
-        val javaPath = System.getProperty("java.home") + "/bin/java" // path of java
+        val javaPath = "${System.getProperty("java.home")}/bin/java"
 
         val mainClass = "eu.kanade.tachiyomi.multisrc.GeneratorMainKt" // Main class we want to execute
 
@@ -43,7 +41,7 @@ tasks.register("runAllGenerators") {
         val javaProcess = Runtime.getRuntime().exec(javaCommand)
         val exitCode = javaProcess.waitFor()
         if (exitCode != 0){
-            throw Exception("Running java failed with exit code: $exitCode")
+            throw Exception("Java process failed with exit code: $exitCode")
         }
     }
 }
diff --git a/multisrc/src/main/AndroidManifest.xml b/multisrc/src/main/AndroidManifest.xml
index 0730970dd..17ee0c14a 100644
--- a/multisrc/src/main/AndroidManifest.xml
+++ b/multisrc/src/main/AndroidManifest.xml
@@ -1,2 +1 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="eu.kanade.tachiyomi.lib.themesources" />
+<manifest package="eu.kanade.tachiyomi.lib.themesources" />
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 77558de40..7971057fb 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,12 +1,8 @@
-include(":annotations")
 include(":core")
 
 include(":lib-ratelimit")
 project(":lib-ratelimit").projectDir = File("lib/ratelimit")
 
-include(":duktape-stub")
-project(":duktape-stub").projectDir = File("lib/duktape-stub")
-
 include(":lib-dataimage")
 project(":lib-dataimage").projectDir = File("lib/dataimage")
 
diff --git a/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt b/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt
index e411bf495..fca74f44c 100644
--- a/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt
+++ b/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt
@@ -63,7 +63,7 @@ private class ManhuaES : WPComics("Manhua ES", "https://manhuaes.com", "en", Sim
                 val showMoreFake = info.select(".detail-content .content-readmore").text()
                 val showMore = info.select(".detail-content .morelink").text()
                 val rawDesc = info.select("div.detail-content").text()
-                
+
                 if (showMoreFake == null || showMoreFake == "") {
                     description = rawDesc.substringAfter(h3).substringAfter(strong).substringBefore(showMore)
                 } else {
diff --git a/src/en/latisbooks/src/eu/kanade/tachiyomi/extension/en/latisbooks/Latisbooks.kt b/src/en/latisbooks/src/eu/kanade/tachiyomi/extension/en/latisbooks/Latisbooks.kt
index 2e01c3e98..b8c34c9f4 100644
--- a/src/en/latisbooks/src/eu/kanade/tachiyomi/extension/en/latisbooks/Latisbooks.kt
+++ b/src/en/latisbooks/src/eu/kanade/tachiyomi/extension/en/latisbooks/Latisbooks.kt
@@ -10,11 +10,11 @@ import eu.kanade.tachiyomi.source.model.SChapter
 import eu.kanade.tachiyomi.source.model.SManga
 import eu.kanade.tachiyomi.source.online.HttpSource
 import eu.kanade.tachiyomi.util.asJsoup
-import java.util.Calendar
 import okhttp3.OkHttpClient
 import okhttp3.Request
 import okhttp3.Response
 import rx.Observable
+import java.util.Calendar
 
 @Nsfw
 class Latisbooks : HttpSource() {
diff --git a/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt b/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt
index 07f04327b..d6c1c185b 100644
--- a/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt
+++ b/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt
@@ -225,5 +225,4 @@ class Scantrad : ParsedHttpSource() {
     override fun imageUrlParse(document: Document) = throw UnsupportedOperationException("Not used")
 
     override fun getFilterList() = FilterList()
-
 }
diff --git a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt
index 5b19de4f3..ade739277 100644
--- a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt
+++ b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt
@@ -106,12 +106,14 @@ open class NewToki(override val name: String, private val defaultBaseUrl: String
         val fullListButton = document.select(".comic-navbar .toon-nav a").last()
 
         val list: List<SManga> = if (firstChapterButton?.text()?.contains("첫회보기")
-                ?: false) { // Check this page is detail page
+            ?: false
+        ) { // Check this page is detail page
             val details = mangaDetailsParse(document)
             details.url = urlPath
             listOf(details)
         } else if (fullListButton?.text()?.contains("전체목록")
-                ?: false) { // Check this page is chapter page
+            ?: false
+        ) { // Check this page is chapter page
             val url = fullListButton.attr("abs:href")
             val details = mangaDetailsParse(client.newCall(GET(url)).execute())
             details.url = getUrlPath(url)
diff --git a/src/zh/copymanga/build.gradle b/src/zh/copymanga/build.gradle
index bf89bf575..8b3a8cdf5 100644
--- a/src/zh/copymanga/build.gradle
+++ b/src/zh/copymanga/build.gradle
@@ -11,6 +11,5 @@ ext {
 apply from: "$rootDir/common.gradle"
 
 dependencies {
-    compileOnly project(':duktape-stub')
     implementation 'com.luhuiguo:chinese-utils:1.0'
 }