diff --git a/multisrc/overrides/mangadventure/arcrelight/AndroidManifest.xml b/multisrc/overrides/mangadventure/arcrelight/AndroidManifest.xml
new file mode 100644
index 000000000..49b1edb7f
--- /dev/null
+++ b/multisrc/overrides/mangadventure/arcrelight/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="eu.kanade.tachiyomi.extension">
+  <application>
+    <activity android:name="eu.kanade.tachiyomi.multisrc.mangadventure.MangAdventureActivity"
+              android:theme="@android:style/Theme.NoDisplay"
+              android:excludeFromRecents="true">
+      <intent-filter>
+        <action android:name="android.intent.action.VIEW"/>
+        <category android:name="android.intent.category.DEFAULT"/>
+        <category android:name="android.intent.category.BROWSABLE"/>
+        <data android:host="arc-relight.com"
+              android:pathPattern="/reader/..*"
+              android:scheme="https"/>
+        <data android:host="www.arc-relight.com"
+              android:pathPattern="/reader/..*"
+              android:scheme="https"/>
+      </intent-filter>
+    </activity>
+  </application>
+</manifest>
diff --git a/multisrc/overrides/mangadventure/arcrelight/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..06bc0d4c7
Binary files /dev/null and b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangadventure/arcrelight/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..ec764d715
Binary files /dev/null and b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..1188217d4
Binary files /dev/null and b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..ee3a86327
Binary files /dev/null and b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..6c4608d73
Binary files /dev/null and b/multisrc/overrides/mangadventure/arcrelight/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangadventure/arcrelight/res/web_hi_res_512.png b/multisrc/overrides/mangadventure/arcrelight/res/web_hi_res_512.png
new file mode 100644
index 000000000..dbf855d0a
Binary files /dev/null and b/multisrc/overrides/mangadventure/arcrelight/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangadventure/arcrelight/src/ArcRelight.kt b/multisrc/overrides/mangadventure/arcrelight/src/ArcRelight.kt
new file mode 100644
index 000000000..7eaa0111a
--- /dev/null
+++ b/multisrc/overrides/mangadventure/arcrelight/src/ArcRelight.kt
@@ -0,0 +1,27 @@
+package eu.kanade.tachiyomi.extension.en.arcrelight
+
+import eu.kanade.tachiyomi.multisrc.mangadventure.MangAdventure
+
+/** Arc-Relight source. */
+class ArcRelight : MangAdventure(
+    "Arc-Relight",
+    "https://arc-relight.com",
+    listOf(
+        "4-Koma",
+        "Chaos;Head",
+        "Collection",
+        "Comedy",
+        "Drama",
+        "Jubilee",
+        "Mystery",
+        "Psychological",
+        "Robotics;Notes",
+        "Romance",
+        "Sci-Fi",
+        "Seinen",
+        "Shounen",
+        "Steins;Gate",
+        "Supernatural",
+        "Tragedy"
+    )
+)
diff --git a/src/all/mangadventure/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangadventure/default_res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from src/all/mangadventure/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangadventure/default_res/mipmap-hdpi/ic_launcher.png
diff --git a/src/all/mangadventure/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangadventure/default_res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from src/all/mangadventure/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangadventure/default_res/mipmap-mdpi/ic_launcher.png
diff --git a/src/all/mangadventure/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangadventure/default_res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from src/all/mangadventure/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangadventure/default_res/mipmap-xhdpi/ic_launcher.png
diff --git a/src/all/mangadventure/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangadventure/default_res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from src/all/mangadventure/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangadventure/default_res/mipmap-xxhdpi/ic_launcher.png
diff --git a/src/all/mangadventure/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangadventure/default_res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from src/all/mangadventure/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangadventure/default_res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/src/all/mangadventure/res/web_hi_res_512.png b/multisrc/overrides/mangadventure/default_res/web_hi_res_512.png
similarity index 100%
rename from src/all/mangadventure/res/web_hi_res_512.png
rename to multisrc/overrides/mangadventure/default_res/web_hi_res_512.png
diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventure.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventure.kt
similarity index 95%
rename from src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventure.kt
rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventure.kt
index 0edc54b24..12661b697 100644
--- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventure.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventure.kt
@@ -1,8 +1,8 @@
-package eu.kanade.tachiyomi.extension.all.mangadventure
+package eu.kanade.tachiyomi.multisrc.mangadventure
 
 import android.net.Uri
 import android.os.Build.VERSION
-import eu.kanade.tachiyomi.extension.BuildConfig
+import eu.kanade.tachiyomi.extensions.BuildConfig
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.network.asObservableSuccess
 import eu.kanade.tachiyomi.source.model.Filter
@@ -29,7 +29,7 @@ import java.util.Locale
 abstract class MangAdventure(
     override val name: String,
     override val baseUrl: String,
-    val categories: Array<String> = DEFAULT_CATEGORIES
+    val categories: List<String> = DEFAULT_CATEGORIES
 ) : HttpSource() {
 
     override val versionId = 1
@@ -182,7 +182,7 @@ abstract class MangAdventure(
         private val STATUSES = arrayOf("Any", "Completed", "Ongoing")
 
         /** Manga categories from MangAdventure `categories.xml` fixture. */
-        internal val DEFAULT_CATEGORIES = arrayOf(
+        internal val DEFAULT_CATEGORIES = listOf(
             "4-Koma",
             "Action",
             "Adventure",
@@ -233,7 +233,7 @@ abstract class MangAdventure(
          * @param date The date to convert.
          * @return The timestamp of the date.
          */
-        fun httpDateToTimestamp(date: String) =
+        internal fun httpDateToTimestamp(date: String) =
             SimpleDateFormat(HTTP_DATE, Locale.US).parse(date)?.time ?: 0L
     }
 
@@ -244,7 +244,7 @@ abstract class MangAdventure(
      */
     inner class Status : Filter.Select<String>("Status", STATUSES) {
         /** Returns the [state] as a string. */
-        fun string() = values[state].toLowerCase(Locale(lang))
+        fun string() = values[state].toLowerCase(Locale.ENGLISH)
     }
 
     /**
@@ -268,8 +268,7 @@ abstract class MangAdventure(
      * @constructor Creates a [Filter.Group] object with categories.
      */
     inner class CategoryList : Filter.Group<Category>(
-        "Categories",
-        categories.map(::Category)
+        "Categories", categories.map(::Category)
     )
 
     /**
diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureActivity.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureActivity.kt
similarity index 80%
rename from src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureActivity.kt
rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureActivity.kt
index ef89678a7..689dab5dc 100644
--- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureActivity.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureActivity.kt
@@ -1,4 +1,4 @@
-package eu.kanade.tachiyomi.extension.all.mangadventure
+package eu.kanade.tachiyomi.multisrc.mangadventure
 
 import android.app.Activity
 import android.content.ActivityNotFoundException
@@ -26,13 +26,11 @@ class MangAdventureActivity : Activity() {
             } catch (ex: ActivityNotFoundException) {
                 Log.e("MangAdventureActivity", ex.message, ex)
             }
-        } ?: logInvalidIntent(intent)
+        } ?: Log.e(
+            "MangAdventureActivity",
+            "Failed to parse URI from intent: $intent"
+        )
         finish()
         exitProcess(0)
     }
-
-    private fun logInvalidIntent(intent: Intent) = Log.e(
-        "MangAdventureActivity",
-        "Failed to parse URI from intent: $intent"
-    )
 }
diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureExtensions.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureExtensions.kt
similarity index 98%
rename from src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureExtensions.kt
rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureExtensions.kt
index 1dd793644..14e3596c5 100644
--- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureExtensions.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureExtensions.kt
@@ -1,4 +1,4 @@
-package eu.kanade.tachiyomi.extension.all.mangadventure
+package eu.kanade.tachiyomi.multisrc.mangadventure
 
 import android.net.Uri
 import eu.kanade.tachiyomi.source.model.SChapter
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureGenerator.kt
new file mode 100644
index 000000000..4e7b36884
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangadventure/MangAdventureGenerator.kt
@@ -0,0 +1,21 @@
+package eu.kanade.tachiyomi.multisrc.mangadventure
+
+import eu.kanade.tachiyomi.multisrc.ThemeSourceData.SingleLang
+import eu.kanade.tachiyomi.multisrc.ThemeSourceGenerator
+
+/** [MangAdventure] source generator. */
+class MangAdventureGenerator : ThemeSourceGenerator {
+    override val themePkg = "mangadventure"
+
+    override val themeClass = "MangAdventure"
+
+    override val baseVersionCode = 1
+
+    override val sources = listOf(
+        SingleLang("Arc-Relight", "https://arc-relight.com", "en", className = "ArcRelight"),
+    )
+
+    companion object {
+        @JvmStatic fun main(args: Array<String>) = MangAdventureGenerator().createAll()
+    }
+}
diff --git a/src/all/mangadventure/AndroidManifest.xml b/src/all/mangadventure/AndroidManifest.xml
deleted file mode 100644
index 4f5e7d589..000000000
--- a/src/all/mangadventure/AndroidManifest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="eu.kanade.tachiyomi.extension">
-
-    <application>
-        <activity
-            android:name=".all.mangadventure.MangAdventureActivity"
-            android:excludeFromRecents="true"
-            android:theme="@android:style/Theme.NoDisplay">
-            <intent-filter>
-                <action android:name="android.intent.action.VIEW" />
-
-                <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.BROWSABLE" />
-
-                <!-- MangAdventure sites can be added here. -->
-                <data
-                    android:host="arc-relight.com"
-                    android:pathPattern="/reader/..*"
-                    android:scheme="https" />
-                <data
-                    android:host="reader.decadencescans.com"
-                    android:pathPattern="/reader/..*"
-                    android:scheme="https" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
diff --git a/src/all/mangadventure/build.gradle b/src/all/mangadventure/build.gradle
deleted file mode 100644
index 80bcbdfed..000000000
--- a/src/all/mangadventure/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-
-ext {
-    extName = 'MangAdventure'
-    pkgNameSuffix = 'all.mangadventure'
-    extClass = '.MangAdventureFactory'
-    extVersionCode = 8
-    libVersion = '1.2'
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureFactory.kt b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureFactory.kt
deleted file mode 100644
index 9fe21e1a2..000000000
--- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureFactory.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.mangadventure
-
-import eu.kanade.tachiyomi.source.SourceFactory
-
-/** [MangAdventure] source factory. */
-class MangAdventureFactory : SourceFactory {
-    override fun createSources() = listOf(
-        ArcRelight()
-    )
-
-    /** Arc-Relight source. */
-    class ArcRelight : MangAdventure(
-        "Arc-Relight",
-        "https://arc-relight.com",
-        arrayOf(
-            "4-Koma",
-            "Chaos;Head",
-            "Collection",
-            "Comedy",
-            "Drama",
-            "Jubilee",
-            "Mystery",
-            "Psychological",
-            "Robotics;Notes",
-            "Romance",
-            "Sci-Fi",
-            "Seinen",
-            "Shounen",
-            "Steins;Gate",
-            "Supernatural",
-            "Tragedy"
-        )
-    )
-}